Ascend CL两种数据预处理的方式:AIPP和DVPP
摘要:本文介绍了昇腾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的功能介绍及使用请参见“昇腾文档中心”。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
浅谈DWS函数出参方式
摘要:DWS的PL/pgSQL函数/存储过程中有一个特殊的语法PERFORM语法,用于执行语句但是丢弃执行结果的场景,常用于一些状态判断的场景。 本文分享自华为云社区《GassDB(DWS)功能 -- 函数出参 #【玩转PB级数仓GaussDB(DWS)】》,作者:譡里个檔。 DWS的PL/pgSQL函数/存储过程中有一个特殊的语法PERFORM语法,用于执行语句但是丢弃执行结果的场景,常用于一些状态判断的场景。但是客户往往会不当使用PERFORM语法,导致业务逻辑出错,最常见的就是使用PERFORM执行带有出参的函数。 已知函数inner定义如下 CREATE OR REPLACE FUNCTION public.inner( IN a1 integer, IN b1 integer, OUT a integer, OUT b integer ) RETURNS record LANGUAGE plpgsql NOT FENCED NOT SHIPPABLE AS $function$ DECLARE BEGIN a := a1; b := b1; ...
- 下一篇
代码实战带你了解深度学习中的混合精度训练
摘要:本文为大家介绍一下深度学习中的混合精度训练,并通过代码实战的方式为大家讲解实际应用的理论,并对模型进行测试。 本文分享自华为云社区《浅谈深度学习中的混合精度训练》,作者:李长安。 1 混合精度训练 混合精度训练最初是在论文Mixed Precision Training中被踢出,该论文对混合精度训练进行了详细的阐述,并对其实现进行了讲解,有兴趣的同学可以看看这篇论文。 1.1半精度与单精度 半精度(也被称为FP16)对比高精度的FP32与FP64降低了神经网络的显存占用,使得我们可以训练部署更大的网络,并且FP16在数据转换时比FP32或者FP64更节省时间。 单精度(也被称为32-bit)是通用的浮点数格式(在C扩展语言中表示为float),64-bit被称为双精度(double)。 如图所示,我们能够很直观的看到半精度的存储空间是单精度存储空间的一半。 1.2为什么使用混合精度训练 混合精度训练,指代的是单精度 float和半精度 float16 混合训练。 float16和float相比恰里,总结下来就是两个原因:内存占用更少,计算更快。 内存占用更少:这个是显然可见的,通...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19