摘要:本文介绍了昇腾CANN提供的两种数据预处理的方式:DVPP和AIPP,介绍了两者的功能、差别及联系,并以具体代码示例介绍了如何使用DVPP和AIPP的功能。

本文分享自华为云社区《了解AscendCL数据预处理的两种方式:AIPP和DVPP》,作者:昇腾CANN。

数据预处理的典型使用场景

受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不一致时,我们需要对其处理,使其符合模型的要求,这个操作,一般称之为数据预处理。

AIPP、DVPP,它们都能做什么

CANN提供了两套专门用于数据预处理的方式:AIPP和DVPP。

总结一下,虽然都是数据预处理,但AIPP与DVPP的功能范围不同(比如DVPP可以做图像编解码、视频编解码,AIPP可以做归一化配置),处理数据的计算单元也不同,AIPP用的AI Core计算加速单元,DVPP就是用的专门的图像处理单元。

AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVPP对图片/视频进行解码、抠图、缩放等基本处理,但由于DVPP硬件上的约束,DVPP处理后的图片格式、分辨率有可能不满足模型的要求,因此还需要再使用AIPP进行色域转换、抠图、填充等处理。

例如,在昇腾310 AI处理器,由于DVPP仅支持输出YUV格式的图片,如果模型需要RGB格式的图片,则需要再使用AIPP进行色域转换。

如何使用AIPP功能

下文以此为例:测试图片分辨率为250*250、图片格式为YUV420SP,模型对图片的要求为分辨率224*224、图片格式为RGB,因此需要通过AIPP实现抠图、图片格式转换2个功能。关于各种格式转换,其色域转换系数都有模板,可从《ATC工具使用指南》获取,参见“昇腾文档中心”。

静态AIPP

1.构造AIPP配置文件*.cfg。

抠图:有效数据区域从左上角(0, 0)像素开始,抠图宽*高为224*224。

图片格式转换:输入图片格式为YUV420SP_U8,输出图片格式通过色域转换系数控制。

aipp_op {
aipp_mode : static # AIPP配置模式
input_format : YUV420SP_U8 # 输入给AIPP的原始图片格式
src_image_size_w : 250 # 输入给AIPP的原始图片宽高
src_image_size_h : 250
crop: true # 抠图开关,用于改变图片尺寸
load_start_pos_h: 0 # 抠图起始位置水平、垂直方向坐标
load_start_pos_w: 0
crop_size_w: 224 # 抠图宽、高
crop_size_h: 224
csc_switch : true # 色域转换开关
matrix_r0c0 : 256 # 色域转换系数
matrix_r0c1 : 0
matrix_r0c2 : 359
matrix_r1c0 : 256
matrix_r1c1 : -88
matrix_r1c2 : -183
matrix_r2c0 : 256
matrix_r2c1 : 454
matrix_r2c2 : 0
input_bias_0 : 0
input_bias_1 : 128
input_bias_2 : 128
}

2.使能静态AIPP。

使用ATC工具转换模型时,可将AIPP配置文件通过insert_op_conf参数传入,将其配置参数保存在模型文件中。

atc --framework=3 --soc_version=${soc_version}
--model= $HOME/module/resnet50_tensorflow.pb
--insert_op_conf=$HOME/module/insert_op.cfg
--output=$HOME/module/out/tf_resnet50

参数解释如下:

- framework:原始网络模型框架类型,3表示TensorFlow框架。
- soc_version:指定模型转换时昇腾AI处理器的版本,例如Ascend310。
- model:原始网络模型文件路径,含文件名。
- insert_op_conf:AIPP预处理配置文件路径,含文件名。
- output:转换后的*.om模型文件路径,含文件名,转换成功后,文件名自动以.om后缀结尾。

3.调用AscendCL接口加载模型,执行推理。

可参考往期的技术文章,请参见“基于昇腾计算语言AscendCL开发AI推理应用”。

动态AIPP

1.构造AIPP配置文件*.cfg。

aipp_op
{
aipp_mode: dynamic
max_src_image_size: 752640 # 输入图像最大内存大小,需根据实际情况调整
}

2.使能动态AIPP。

使用ATC工具转换模型时,可将AIPP配置文件通过insert_op_conf参数传入,将其配置参数保存在模型文件中。

atc --framework=3 --soc_version=${soc_version}
--model= $HOME/module/resnet50_tensorflow.pb
--insert_op_conf=$HOME/module/insert_op.cfg
--output=$HOME/module/out/tf_resnet50

参数解释如下:

- framework:原始网络模型框架类型,3表示TensorFlow框架。
- soc_version:指定模型转换时昇腾AI处理器的版本,例如Ascend310。
- model:原始网络模型文件路径,含文件名。
- insert_op_conf:AIPP预处理配置文件路径,含文件名。
- output:转换后的*.om模型文件路径,含文件名,转换成功后,文件名自动以.om后缀结尾。

3.调用AscendCL接口加载模型,设置AIPP参数后,再执行推理。

模型加载、执行可从参考往期的技术文章,请参见“基于昇腾计算语言AscendCL开发AI推理应用”。

调用AscendCL接口设置AIPP参数的代码示例如下:

aclmdlAIPP *aippDynamicSet = aclmdlCreateAIPP(batchNumber);
aclmdlSetAIPPSrcImageSize(aippDynamicSet, 250, 250);
aclmdlSetAIPPInputFormat(aippDynamicSet, ACL_YUV420SP_U8);
aclmdlSetAIPPCscParams(aippDynamicSet, 1, 256, 0, 359, 256, -88, -183, 256, 454, 0, 0, 0, 0, 0, 128, 128);
aclmdlSetAIPPCropParams(aippDynamicSet, 1, 2, 2, 224, 224, 0);
aclmdlSetInputAIPP(modelId, input, index, aippDynamicSet);
aclmdlDestroyAIPP(aippDynamicSet);复制

如何使用DVPP功能

昇腾AI处理器内置图像处理单元DVPP,提供了强大的媒体处理硬加速能力。同时,异构计算架构CANN提供了使用图像处理硬件算力的入口:AscendCL接口,开发者可通过接口来进行图像处理,以便利用昇腾AI处理器的算力。

DVPP内的功能模块如下所示。

此处就以JPEGD图片解码+VPC图片缩放为例来说明如何使用DVPP功能。这里先通过一张图总览接口调用流程,包括资源初始化&去初始化、通道创建与销毁、解码、缩放、等待任务完成、释放内存资源等。

总览接口调用流程后,接下来我们以开发者更熟悉的方式“代码”来展示JPEGD图片解码+VPC图片缩放功能的关键代码逻辑。

// 创建通道
acldvppChannelDesc dvppChannelDesc = acldvppCreateChannelDesc();
acldvppCreateChannel(dvppChannelDesc);
// 在JPEGD图片解码前,准备其输入、输出
// ……
// 创建解码输出图片描述信息,设置输出图片的宽、高、图片格式、内存地址等
acldvppPicDesc decodeOutputDesc = acldvppCreatePicDesc();
acldvppSetPicDescData(decodeOutputDesc, decodeOutputBuffer));
acldvppSetPicDescWidth(decodeOutputDesc, decodeOutputWidth);
acldvppSetPicDescHeight(decodeOutputDesc, decodeOutputHeight);
// 此处省略其它set接口……
// 执行JPEGD图片解码
acldvppJpegDecodeAsync(dvppChannelDesc, decodeInputBuffer, decodeInputBufferSize, decodeOutputDesc, stream);
// 5. 在VPC图片缩放前,准备其输入、输出
// 创建缩放输入图片的描述信息,并设置各属性值,解码的输出作为缩放的输入
acldvppPicDesc resizeInputDesc = acldvppCreatePicDesc();
acldvppSetPicDescData(resizeInputDesc, decodeOutputBuffer);
acldvppSetPicDescWidth(resizeInputDesc, resizeInputWidth);
acldvppSetPicDescHeight(resizeInputDesc, resizeInputHeight);
// 此处省略其它set接口……
// 创建缩放输出图片的描述信息,并设置各属性值
acldvppPicDesc resizeOutputDesc = acldvppCreatePicDesc();
acldvppSetPicDescData(resizeOutputDesc, resizeOutputBuffer);
acldvppSetPicDescWidth(resizeOutputDesc, resizeOutputWidth);
acldvppSetPicDescHeight(resizeOutputDesc, resizeOutputHeight);
// 此处省略其它set接口……
// 6. 执行VPC图片缩放
acldvppVpcResizeAsync(dvppChannelDesc, resizeInputDesc,
resizeOutputDesc, resizeConfig, stream);
// 7. JPEGD图片解码、VPC图片缩放都是异步任务,需调用以下接口阻塞程序运行,直到指定Stream中的所有任务都完成
aclrtSynchronizeStream(stream);

本节通过接口调用流程、示例代码带大家了解了DVPP的功能开发,更多DVPP的功能介绍及使用请参见“昇腾文档中心”。

点击关注,第一时间了解华为云新鲜技术~

Ascend CL两种数据预处理的方式:AIPP和DVPP的更多相关文章

  1. 两种获取connectionString的方式

    两种获取connectionString的方式 1. public static string connectionString = ConfigurationManager.ConnectionSt ...

  2. Spring两种实现AOP的方式

    有两种实现AOP的方式:xml配置文件的方式和注解的形式 我们知道通知Advice是指对拦截到的方法做什么事,可以细分为 前置通知:方法执行之前执行的行为. 后置通知:方法执行之后执行的行为. 异常通 ...

  3. javascript两种声明函数的方式的一次深入解析

    声明函数的方式 javascript有两种声明函数的方式,一个是函数表达式定义函数,也就是我们说的匿名函数方式,一个是函数语句定义函数,下面看代码: /*方式一*/ var FUNCTION_NAME ...

  4. Java中有两种实现多线程的方式以及两种方式之间的区别

    看到一个面试题.问两种实现多线程的方法.没事去网上找了找答案. 网上流传很广的是一个网上售票系统讲解.转发过来.已经不知道原文到底是出自哪里了. Java中有两种实现多线程的方式.一是直接继承Thre ...

  5. Hibernate中两种获取Session的方式

    转自:https://www.jb51.net/article/130309.htm Session:是应用程序与数据库之间的一个会话,是hibernate运作的中心,持久层操作的基础.对象的生命周期 ...

  6. 如何理解redis两种不同的持久化方式

    其实redis就是一种高级的以键值对形式存储数据的数据库,而它的好处就是他可以支持数据的持久化,其实redis之所以会有这样的优点,主要是因为,redis的数据都是存放在内存中的,如果不配置持久化,那 ...

  7. Java学习-013-文本文件读取实例源代码(两种数据返回格式)

    此文源码主要为应用 Java 读取文本文件内容实例的源代码.若有不足之处,敬请大神指正,不胜感激! 1.读取的文本文件内容以一维数组[LinkedList<String>]的形式返回,源代 ...

  8. OC中两种单例实现方式

    OC中两种单例实现方式 写在前面 前两天探索了一下C++ 的单例,领悟深刻了许多.今天来看看OC中的单例又是怎么回事.查看相关资料,发现在OC中一般有两种实现单例的方式,一种方式是跟C++ 中类似的常 ...

  9. JIT(Just in time,即时编译,边运行边编译)、AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

    JIT(Just in time,即时编译,边运行边编译).AOT(Ahead Of Time,运行前编译),是两种程序的编译方式

  10. FMX有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法(firemonkey messaging)

    看FMX代码,发现有两种消息处理的实现方式,一种是用TMessageManager来实现自定义的消息,另外一种象TEdit中的实现,直接声明消息方法.   早前,看过文章说TMessageManage ...

随机推荐

  1. 算法修养--广度优先搜索BFS

    广度优先算法(BFS) 广度优先算法(Breadth-First Search)是在图和树领域的搜索方法,其核心思想是从一个起始点开始,访问其所有的临近节点,然后再按照相同的方式访问这些临近节点的节点 ...

  2. Java编程之道:巧妙解决Excel公式迭代计算难题

    本文由葡萄城技术团队原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 什么是迭代计算 迭代计算其实是在 Excel 中,一种公式的循环引用,对于了 ...

  3. 🎁平平无奇的 Docker 命令(日常流)

    Docker search docker search 命令用于在 Docker Hub 上搜索镜像,语法如下: docker search [OPTIONS] TERM 常用的选项包括: --fil ...

  4. JAVA架构师

    https://github.com/zq99299/note-architect https://zq99299.github.io/note-architect/hc/ https://zq992 ...

  5. 持续进化,快速转录,Faster-Whisper对视频进行双语字幕转录实践(Python3.10)

    Faster-Whisper是Whisper开源后的第三方进化版本,它对原始的 Whisper 模型结构进行了改进和优化.这包括减少模型的层数.减少参数量.简化模型结构等,从而减少了计算量和内存消耗, ...

  6. AB32VG1系列之手把手入门与RTC简单评测

    说是评测, 时间仓库仅仅是玩了一下例程而已. 后面有时间打算移植 CoreMark 看看与Cortex-M3的对比. AB32VG1系列之手把手入门与RTC简单评测

  7. 放弃"Jenkins"的种种理由,期待更好赋能研发的持续交付平台

    Jenkins 很酷,但是不完美,有历史局限性造成的问题.本文仅从"如何更好给研发团队赋能的角度",剖析Jenkins, 探讨理想的持续交付平台, 不带货无广告- 不完美的Jenk ...

  8. 初窥门径,从大模型到内容生成看AI新次元

    视频云AI进化新纪元. 最近Gartner发布2024年十大战略技术趋势,AI显然成为其背后共同的主题.全民化的生成式人工智能.AI增强开发.智能应用......我们正在进入一个AI新纪元. 从Cha ...

  9. 飞码LowCode前端技术之画布的设计

    简介 本章节从精准定位.分层设计.异步组件.拖拽四个方面分析飞码画布设计. 一.精准定位设计 飞码画布是一个套件,可对外提供画布能力.精准定位有两种情况,一是目标组件无子组件,而是目标组件有子组件. ...

  10. c#|创建一个简单的窗体项目