Halide示例学习三

Halide简介 Halide是用C++作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言,全称领域专用语言。主要的作用为在软硬层面上(与算法本身的设计无关)实现对算法的底层加速,我们有必要对其有一定的了解。因为不论是 传统的图像处理方法亦或是深度学习应用 都使用到了halide的思想。 来自 https://www.codercto.com/a/67796.html ... 阅读详情

改变维度遍历起点

#include "Halide.h"
#include <stdio.h>

using namespace Halide;

int main(int argc, char **argv) {
    Func gradient("gradient");
    Var x("x"), y("y");
    gradient(x, y) = x + y;
    gradient.trace_stores();
    printf("Evaluating gradient from (0, 0) to (7, 7)\n");
    // 普通的起点为0的正方形
    Buffer<int> result(8, 8);
    gradient.realize(result);
    for (int y = 0; y < 8; y++) {
        for (int x = 0; x < 8; x++) {
            if (result(x, y) != x + y) {
                printf("Something went wrong!\n");
                return -1;
            }
        }
    }
    // 现在定义一个起点不为0的长方形
    Buffer<int> shifted(5, 7);  //形状尺寸
    shifted.set_min(100, 50);   //左上角的起点位置
    printf("Evaluating gradient from (100, 50) to (104, 56)\n");
    gradient.realize(shifted);
    // 等效C代码如下所示
    for (int y = 50; y < 57; y++) {
        for (int x = 100; x < 105; x++) {
            if (shifted(x, y) != x + y) {//此刻就无法读取边界外的序号点了
                printf("Something went wrong!\n");
                return -1;
            }
        }
    }
    // Halide只适合矩形的边界数据
    return 0;
}
# 结果如下所示
Begin pipeline gradient.0()
Tag gradient.0() tag = "func_type_and_dim: 1 0 32 1 2 100 5 50 7"
Store gradient.0(100, 50) = 150
Store gradient.0(101, 50) = 151
Store gradient.0(102, 50) = 152
Store gradient.0(103, 50) = 153
Store gradient.0(104, 50) = 154
Store gradient.0(100, 51) = 151
Store gradient.0(101, 51) = 152
Store gradient.0(102, 51) = 153
Store gradient.0(103, 51) = 154
Store gradient.0(104, 51) = 155
Store gradient.0(100, 52) = 152
Store gradient.0(101, 52) = 153
Store gradient.0(102, 52) = 154
Store gradient.0(103, 52) = 155
Store gradient.0(104, 52) = 156
Store gradient.0(100, 53) = 153
Store gradient.0(101, 53) = 154
Store gradient.0(102, 53) = 155
Store gradient.0(103, 53) = 156
Store gradient.0(104, 53) = 157
Store gradient.0(100, 54) = 154
Store gradient.0(101, 54) = 155
Store gradient.0(102, 54) = 156
Store gradient.0(103, 54) = 157
Store gradient.0(104, 54) = 158
Store gradient.0(100, 55) = 155
Store gradient.0(101, 55) = 156
Store gradient.0(102, 55) = 157
Store gradient.0(103, 55) = 158
Store gradient.0(104, 55) = 159
Store gradient.0(100, 56) = 156
Store gradient.0(101, 56) = 157
Store gradient.0(102, 56) = 158
Store gradient.0(103, 56) = 159
Store gradient.0(104, 56) = 160
End pipeline gradient.0()

多计算图组合示例

#include "Halide.h"
#include <stdio.h>
using namespace Halide;
#include "halide_image_io.h"
using namespace Halide::Tools;

int main(int argc, char **argv) {
    Var x("x"), y("y"), c("c");

    // 这里使用多计算图,先垂直后水平
    {
        // 得到一个全彩图片
        Buffer<uint8_t> input = load_image("../../images/vscode.jpg");
        // 提升精度到16bit
        Func input_16("input_16");
        input_16(x, y, c) = cast<uint16_t>(input(x, y, c));
        // 水平模糊:水平方向取邻近像素均值
        Func blur_x("blur_x");
        blur_x(x, y, c) = (input_16(x - 1, y, c) +
                           2 * input_16(x, y, c) +
                           input_16(x + 1, y, c)) / 4;
        // 垂直模糊:垂直方向取邻近像素均值
        Func blur_y("blur_y");
        blur_y(x, y, c) = (blur_x(x, y - 1, c) +
                           2 * blur_x(x, y, c) +
                           blur_x(x, y + 1, c)) / 4;
        // 降低精度为8bit
        Func output("output");
        output(x, y, c) = cast<uint8_t>(blur_y(x, y, c));
        // Halide中,计算图都是前向计算图
        // 下述的实例化代码是需要考虑到边界溢出的问题,所以这里的尺寸需要减2,同时起点需要偏移到(1,1)
        Buffer<uint8_t> result(input.width() - 2, input.height() - 2, 3);
        result.set_min(1, 1);
        output.realize(result);
        save_image(result, "../../images/blurry_parrot_1.png");
    }

    // 一样的操作,但是采用了截断操作来防止边界溢出的报错
    {
        Buffer<uint8_t> input = load_image("../../images/vscode.jpg");
        Func clamped("clamped");
        // 使用Halide::clamp函数,可以把索引限制在边界内
        Expr clamped_x = clamp(x, 0, input.width() - 1);
        Expr clamped_y = clamp(y, 0, input.height() - 1);
        clamped(x, y, c) = input(clamped_x, clamped_y, c);
        Func input_16("input_16");
        input_16(x, y, c) = cast<uint16_t>(clamped(x, y, c));
        Func blur_x("blur_x");
        blur_x(x, y, c) = (input_16(x - 1, y, c) +
                           2 * input_16(x, y, c) +
                           input_16(x + 1, y, c)) / 4;
        Func blur_y("blur_y");
        blur_y(x, y, c) = (blur_x(x, y - 1, c) +
                           2 * blur_x(x, y, c) +
                           blur_x(x, y + 1, c)) / 4;
        Func output("output");
        output(x, y, c) = cast<uint8_t>(blur_y(x, y, c));

        // 此时就不需要继续在实例化的时候再进行边界检查
        Buffer<uint8_t> result = output.realize({input.width(), input.height(), 3});
        save_image(result, "../../images/blurry_parrot_2.png");
    }

    printf("Success!\n");
    return 0;
}

示例图结果如下所示:

  • 原图(112x61)

在这里插入图片描述

  • 不使用截断(110x59)

在这里插入图片描述

  • 使用截断(112x61)

在这里插入图片描述

Halide 构建 hello halide 随着人工智能,VR等领域的发展,我们对于高性能图像处理程序的需求越来越大;当前编程工具开发的高性能图像处理程序牺牲了程序的可读性,模块性,可移植性等;其主要原因是,当前程序将算法描述, 数据存储以及计算糅杂在一起。同时手工编写高性能图像处理程序开发效率较低,难以快速构建大量高性能图像处理代码。 在这样的背景下,MIT的研究人员专门为图像处理设计了一种程序语言——Halid... 阅读详情

相关推荐

windows安装Halide

https://github.com/halide/Halide/releases 下载Halide压缩包,解压 添加环境变量,C:\Opencv3.4\halide\Debug;C:\Opencv3.4\halide\Release ①Linker>general>Adiditional Library Directories release C:\lib\halide\Releas...

勉強 1711

Halide 初步使用

最近开始使用Halide做点事情,说找点资料,结果网上基本都是翻译下官方教程,还得自己摸索。 Halide的目的是更方便地做优化,即不牺牲代码可读性的情况下利用硬件加速代码执行。更详细的说明参考原始论文。这里直接说怎么上手的事情。 Halide的文档确实不如OpenCV,这就是差距吧。就比如说,首先应当介绍下核心的数据结构以及围绕这些数据结构有哪些关键API,《Learning OpenCV》这方面就做得比较好。所以 这篇文章大致按照这个套路来,而不是上来就直奔有哪些优化操作。 看了Tutorial的第一个

haithink的专栏 1630

Halide编译安装与基本数据结构

Overview Halide是为了在现代计算机上编写更高性能的图像处理代码而设计的一种编程语言。目前只吃的目标为: CPU架构:X86, ARM, MIPS, Hexagon, PowerPC 操作系统:Linux, Windows, macOS, Andriod, IOS, Qualcomm QuRT GPU计算API: CUDA,OpenGL, OpenCL, Apple Metal, Microsoft Direction X 12 Halide不是独立的一种编程语言,而是嵌入在C++中,这

亦梦云烟的博客 1745

Halide示例学习二

Halide的调度实操以及说明

Pengcode的博客 587

Halide 高效的图像处理语言 简化图像编程

参考Halide 基本语法Halide 关键字Algorithm部分:Halide :: func 对应图像流水线处理中的一个步骤。这个func定义了一个图像中每一个像素应该是什么值。这里只是一个定义。Halide :: Var 用于定义func的变量。Halide :: Expr 用于定义一个表达式。Halide :: cast 强制类型转换。Halide :: Buffer < T > 用于定义缓存Schedule部分:Vectorize,parallelize,unroll。

实践出真理,接毕设/课设项目开发指导 367

使用Halide后端提高OpenCV效率的方法

通过上述步骤,我们成功地在OpenCV中启用了Halide后端,并使用Halide后端进行了高斯滤波操作。通过上述步骤,我们成功地在OpenCV中启用了Halide后端,并使用Halide后端进行了高斯滤波操作。通过使用Halide后端,你可以进一步优化和并行化你的图像处理算法,以实现更高的性能。通过使用Halide后端,你可以进一步优化和并行化你的图像处理算法,以实现更高的性能。要启用OpenCV的Halide后端,首先确保已经正确安装了OpenCV和Halide,并配置了正确的编译环境。

PixelNovaO的博客 314

halide编程技术指南(连载一)

本文已同步至公众号,欢迎关注。 Halide是一种编程语言,使得在现代机器上编写高性能图像和数组处理代码更加容易。Halide支持如下的平台: CPU体系结构:X86,ARM,MIPS,Hexagon,PowerPC 操作系统:Linux,Windows,macOS,Android,iOS,Qualcomm QuRT GPU计算API:CUDA,OpenCL,OpenGL,...

Aoulun的博客 2105

OpenCV如何启用Halide后端以提高效率

OpenCV如何启用Halide后端以提高效率如何启用Halide后端以提高效率介绍要求LLVM编译器Halide语言使用Halide后端构建OpenCV将Halide设置为首选后端 如何启用Halide后端以提高效率 介绍 本教程指导如何使用Halide语言后端在OpenCV深度学习模块中运行模型。Halide是一个开源项目,可以让我们以易于阅读的格式编写图像处理算法,根据特定设备安排计算时间,并以相当高的效率对其进行评估。 要求 LLVM编译器 LLVM编译可能需要很长时间。 从http://relea

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1006

Halide示例学习一

Halide示例学习一示例学习基本变量和概念操控图片操作debug操作1 示例学习 基本变量和概念 // 使用Halide,我们只需要包含Halide.h这个头文件就可以了 #include "Halide.h" #include <stdio.h> int main(int argc, char **argv) { // Halide::Func代表了一个计算图,代表了每一个像素值需要进行的计算操作 Halide::Func gradient; // Halide::

Pengcode的博客 763

Halide:一种用于快速,便携式数据并行计算的语言

卤化物 Halide是一种编程语言,旨在使在现代机器上编写高性能图像和数组处理代码更加容易。 卤化物目前的目标是: CPU体系结构:X86,ARM,MIPS,Hexagon,PowerPC 操作系统:Linux,Windows,Mac OS X,Android,iOS,Qualcomm QuRT GPU计算API:CUDA,OpenCL,OpenGL计算着色器,Apple Metal,Microsoft Direct X 12 Halide并不是独立的编程语言,而是嵌入C ++中。 这意味着您编写的C ++代码使用Halide的C ++ API构建了Halide管道的内存中表示形式。 然后,您可以将该表示形式编译为目标文件,或对其进行JIT编译并在同一过程中运行。 Halide还提供了Python绑定,该绑定提供了对编写无需C ++的Python中嵌入的Halide的完全支持。 有关Halide是什么的更多详细信息,请参见 。 有关API文档,请参见 要查看一些示例代码,请查看tutorials目录。 如果您已获取完整的源代码发行版并希望构建Halide,请参阅的。 卤

七步设计高频变压器

七步设计高频变压器

m0_71394959的博客 5400

Halide学习

目的:在现代机器上完成高性能的图像处理。 编译器目标:x86/SSE, ARM V7/NEON, CUDA, Native Client, OpenCL, and Metal. 大致流程:用Halide::Var, Halide::Expr, Halide::Func类型的对象完成c++程序,然后调用Halide::Func::compile_to_file来生成对象文件和头文件。或者调用Halide::Func::realize即时编译(JIT)并即刻运行整套pipeline,这有利于测试小的程序。

u011994454的博客 742

MATLAB/Simulink与ThingSpeak集成:打通物联网数据与工业算法仿真的闭环

在工业算法开发与控制系统设计中,模型仿真与真实世界数据的脱节是常见的工程挑战。其核心原理在于构建一个双向数据流闭环,将虚拟的仿真模型与物理世界的传感器网络连接起来。这一技术方案的核心价值在于大幅缩短算法迭代周期,实现数据驱动的设计与验证。典型的应用场景包括数字孪生构建、预测性维护和硬件在环(HIL)测试的云端化。通过将MATLAB/Simulink这一强大的模型化设计环境,与ThingSpeak物联网云平台进行深度集成,工程师能够轻松地将实时或历史的物联网数据流直接注入仿真模型作为输入,同时将仿真结果实时回

weixin_34220179的博客 469

为Halide安装opencl支持

打开TargetOpenCL开关,我们可以看到使用opencl进行推理的时候,计算时调用的openclapi是如何的。展示的测速结果如下所示,这里可以看出来,虽然都是使用了cpu进行计算,但是还是intel-cpu-opencl速度更快些。compile_jit进行处理操作。查看主机平台支持的设备平台。设置kernel参数。...

Pengcode的博客 715

GJB设计开发各阶段的文件和记录要求

GJB设计开发各阶段的文件和记录要求

Abel的博客 4051

动态时间规整(Dynamic Time Warping,DTW):让时间序列分析不再枯燥和代码全分析

动态时间规整(DTW)是一种用于比较时间序列相似性的算法,特别适用于处理长度不同或时间轴不对齐的序列。本文介绍了DTW的核心概念,包括其通过非线性对齐解决时间扭曲问题的能力,以及在语音识别、金融分析等领域的应用。通过Python代码示例,演示了如何计算两个模拟时间序列的DTW距离,并可视化最优对齐路径。结果显示,DTW能够有效捕捉序列间的相似模式,即使它们在时间轴上存在偏移或伸缩。该算法通过最小化累积距离来评估相似性,得分越低表明序列间相似度越高。

此星光明博客 162

Halide示例学习四

Halide示例学习四多阶段计算图多计算图组合示例compute_at使用方法store_root配合compute_at使用方法tile配合compute_at使用方法compute_at和store_at以及之前的混合技使用方法 多阶段计算图 #include "Halide.h" #include <stdio.h> using namespace Halide; int main(int argc, char **argv) { Var x("x"), y("y");

Pengcode的博客 437

如何使用rdma-core来实现RDMA操作

rdma-core 是一个开源项目,为远程直接内存访问(RDMA)提供用户空间的支持。它包括 RDMA 设备的驱动程序、库和工具,旨在简化 RDMA 应用的开发和部署。

嵌入式技术开发 3896

Halide示例学习五

Halide示例学习四函数重定义操作RDom下标使用使用RDom计算直方图调度函数更新多阶段重定义操作使用归化函数进行模糊操作内置的归化函数sum使用归约函数的一个复杂例子 函数重定义操作 #include "Halide.h" #include <stdio.h> using namespace Halide; int main(int argc, char **argv) { Var x("x"), y("y"); Buffer<uint8_t> input

Pengcode的博客 520

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

抖音创作者必备工具!免费一键批量下载无水印视频 + 一键提取抖音视频文案

XiaoqiangClub的博客 3361

有效Dk值提取方法的仿真分析

通过本文的仿真对比分析,提取有效Dk值方面,TDR技术在一些固定的场景下,依然有其参考应用价值,而随着VNA功能的不断增强和高精度测量手段的不断更新,双端口Delta-L技术才是主流评估方法,而单端口Delta-L技术则可以作为其降本增效的方案补充。

一只豌豆象的博客 1824

如何为 Halide 后端安排网络

介绍我们使用的每台设备都是一样的卤化物代码。但是为了达到令人满意的效率,我们应该正确地安排计算。在本教程中,我们将介绍在 OpenCV 深度学习模块中使用 Halide 后端调度网络的方法。为了更好地理解 Halide 调度,您可能需要阅读教程 @。如果这是你第一次在 OpenCV 中与 Halide 会面,我们建议从开始。配置文件您可以通过编写文本配置文件来计划卤化物管道的计算。这意味着您可以轻松地矢量化、并行化和管理层计算的循环顺序。

2301_81888214的博客 927

基于YOLOv11的人脸识别系统:从构建到应用的全流程指南

深度学习是机器学习的一个分支,旨在通过多层神经网络模拟人脑的认知能力。它能够从大量数据中自动提取特征,并进行准确的预测和分类。在计算机视觉领域,深度学习技术已经取得了显著的成果,尤其是在图像识别、目标检测等方面。YOLOv11是YOLO系列模型的最新版本,结合了卷积神经网络(CNN)和其他创新技术。它在保持高精度的同时,显著提高了推理速度。YOLOv11的结构轻量且高效,非常适合实时目标检测任务。人脸检测的目标是从图像或视频中定位所有人脸的位置。

FJN110的博客 184

快速入门Halide

Halide代码流程: 声明函数,变量,表达式 用变量、表达式等实现算法 使用调度策略对算法进行调度调优 调用函数的realize成员函数,对函数进行实现 写出数据 example 1: Halide::Func gradient; // Func对象表示了一个pipeline阶段。它是一个纯函数,定义了每个像素点对应的值。 Halide::Var x, y; // Var对象是Func的定义域,或者说是Func的参数。它们本身没有任何意义。Var用来索引 Halide::Expr e = x

Time_remember的专栏 1290

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Halide源码编译

Halide源码编译Halide为何要源码编译?源码编译LLVM库源码编译Halide测试Halide是否编译成功生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 Halide   Halide 算是一种编程模式,主要用于在现代机器上来进行高性能的图像和数组处理。其寄生在C++编程语言中,作为DSL编程语言(特定域语言)来实现高

Pengcode的博客 1942

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

(深度学习优化大师)TVM的前辈,介绍下什么是HALIDE

在开始学习之前推荐大家可以多在FlyAI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。 前言 前几天又用到了TVM,想着是否能够间接替代TensorRT作为GPU服务器部署的一个后端。TensorRT在自家的GPU上确实强大,也是老黄家重点关照的”开源项目“。但TensorRT还是有一点点小缺点的: 经过infer优化后的模型与特定GPU绑定,...

iFlyAI的博客 3284

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: Halide示例学习二
下一篇: SRPC初步使用和说明
慷仔
博客等级 码龄9年 88粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值