如何基于香橙派AIpro对视频/图像数据进行预处理
本文分享自华为云社区《如何基于香橙派AIpro对视频/图像数据进行预处理》,作者: 昇腾CANN。
受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不一致时,我们需要对其进行数据预处理。
昇腾AI硬件内置专门用于图像预处理的硬件单元,开发者通过其上层软件栈CANN能够更加便捷地发挥出硬件强大的媒体处理硬加速能力。香橙派AIpro开发板是香橙派联合昇腾打造的高性能AI开发板,开发者可以基于此,对不满足神经网络模型输入要求的数据进行预处理,从而更好地完成AI推理计算。
01 昇腾CANN数据预处理方式简介
昇腾CANN提供了两种专门用于数据预处理的方式:AIPP和DVPP。
AIPP(Artificial Intelligence Pre-Processing)在AI Core上完成数据预处理,主要功能包括改变图像尺寸(抠图、填充等)、色域转换(转换图像格式)、减均值/乘系数(改变图像像素)等。AIPP区分为静态AIPP和动态AIPP,您只能选择其中一种方式,不支持两种方式同时配置。
- 静态AIPP:模型转换时设置AIPP模式为静态,同时设置AIPP参数,模型生成后,AIPP参数值被保存在离线模型(*.om)中,每次模型推理过程采用固定的AIPP预处理参数,无法修改。
- 动态AIPP:模型转换时仅设置AIPP模式为动态,每次模型推理前,根据需求,在执行模型前设置动态AIPP参数值,然后在模型执行时可使用不同的AIPP参数。
DVPP(Digital Vision Pre-Processing)是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括缩放、抠图、色域转换、图片编解码、视频编解码等。
总结一下,虽然都是数据预处理,但AIPP与DVPP的功能范围不同(比如DVPP可以做图像编解码、视频编解码,AIPP可以做归一化配置),处理数据的计算单元也不同,AIPP用的AI Core计算加速单元,DVPP就是用的专门的图像处理单元。
AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVPP对图片/视频进行解码、抠图、缩放等基本处理,再使用AIPP进行色域转换、归一化等处理。
02 如何使用AIPP功能
下文以此为例:测试图片分辨率为250*250、图片格式为YUV420SP,模型对图片的要求为分辨率224*224、图片格式为RGB,因此需要通过AIPP实现抠图、图片格式转换2个功能。关于各种格式转换,其色域转换系数都有模板,可从ATC工具使用指南中获取,请参见“昇腾文档中心”。
1、静态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处理器的版本,可执行npu-smi info命令进行查询,在查询到的“Name”前增加Ascend信息,例如“Name”对应取值为xxxyy。
- --model:原始网络模型文件路径,含文件名。
- --insert_op_conf:AIPP预处理配置文件路径,含文件名。
- --output:转换后的*.om模型文件路径,含文件名,转换成功后,模型文件名自动以.om后缀结尾。
(3)调用AscendCL接口加载模型,执行推理,具体可参见如何基于香橙派AIpro开发AI推理应用。
2、动态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处理器的版本。
- --model:原始网络模型文件路径,含文件名。
- --insert_op_conf:AIPP预处理配置文件路径,含文件名。
- --output:转换后的*.om模型文件路径,含文件名,转换成功后,模型文件名自动以.om后缀结尾。
(3)调用AscendCL接口加载模型,设置AIPP参数后,再执行推理,具体可参见如何基于香橙派AIpro开发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);
03 如何使用DVPP功能
昇腾AI处理器内置图像处理单元DVPP,提供了强大的媒体处理硬加速能力。同时,异构计算架构CANN提供了使用图像处理硬件算力的入口:AscendCL接口,开发者可通过接口来进行图像处理,以便利用昇腾AI处理器的算力。
DVPP内的功能模块如下表所示。
功能模块 | 描述 |
VPC(Vision Preprocessing Core) | 处理YUV、RGB等格式的图片,包括缩放、抠图、色域转换、直方图统计等。 |
JPEGD(JPEG Decoder) | JPEG压缩格式-->YUV格式的图片解码。 |
JPEGE(JPEG Encoder) | YUV格式-->JPEG压缩格式的图片编码。 |
VDEC(Video Decoder) | H264/H265格式-->YUV/RGB格式的视频码流解码。 |
VENC(Video Encoder) | YUV420SP格式-->H264/H265格式的视频码流编码。 |
PNGD(PNG decoder) | PNG格式-->RGB格式的图片解码。 |
此处就以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);
04 更多学习资源
更多学习资源,欢迎登录昇腾社区查阅:
[1]昇腾文档中心:https://www.hiascend.com/zh/document
[2]香橙派AIpro开源样例代码:https://gitee.com/ascend/EdgeAndRobotics
[3]香橙派AIpro学习资源一站式导航:https://www.hiascend.com/forum/thread-0285140173361311056-1-1.html

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
小小开发板承载万千创新可能,小熊派的云上奇遇记
本文分享自华为云社区《小小开发板承载万千创新可能,小熊派的云上奇遇记》,作者:华为云社区精选。 一块掌心大小的开发板可以做什么? 给物联网开发爱好者,他们能将普通门锁改造成为智能指纹门锁,让家里的花花草草自动浇水;给专业工程师,他们能开发出脑卒中患者步态评估等辅助医疗诊断设备,让问诊更加严谨高效;若是给资深极客发明家,他们能爆改出威力无穷的机械臂,变身为野生钢铁侠…… 一块开发板,万千创新可能。本期《先锋开发者云上说》跟随小熊派联合创始人裴嘉,体验云和物联网交融的奇妙开发之旅,见证小熊派与开发者在云上的双向奔赴。 【戳我观看完整版视频】 三个物联网老兵的灵感乍现,做个“小熊派” 2018年一个风和日丽的下午,熊保松、王城,裴嘉,三个在物联网行业深耕多年的开发者凑一起聊天,无意中提到一个话题:“国内怎么就没有一个像树莓派那样的‘派’呢?”。仨人互相打趣,“要不我们做一个吧。”小熊派的种子就此埋下。 也正是这一年,低功耗、广覆盖、低成本、大容量的NB-IoT通信技术迎来商用,物联网行业正朝着真正意义上的互联互通大步迈进。 在这样的技术趋势下,物联网设备上云成为常态,开发者需要将硬件采集的数...
- 下一篇
数仓的两种轻量级数据交换格式:json与jsonb
本文分享自华为云社区《GaussDB(DWS)——探究JSON,JSONB》,作者:yd_283975606。 1. 前言 适用版本:【8.1.1(及以上)】 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,常用于将数据从服务器发送到Web应用程序。它采用人类易读和机器易解析的文本格式,基于键值对的集合,用于表示结构。 2. json/jsonb简介 json演进历程 版本 8.1.1 支持JSON数据类型 8.1.2 支持JSONB高级特性、索引 9.1.0 支持JSON列存、向量化,JSONB支持索引 2.1 json/jsonb简介 参考DWS产品文档,JSON数据类型可以用来存储JSON(JavaScript Object Notation)数据。 可以是单独的一个标量,也可以是一个数组,也可以是一个键值对象,其中数组和对象可以统称容器(container): 标量(scalar):单一的数字、bool、string、null都可以叫做标量。 数组(array):[]结构,里面存放的元素可以是任意类型的JSON,并且不要求数组内所...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 2048小游戏-低调大师作品
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS6,CentOS7官方镜像安装Oracle11G