了解AscendCL数据预处理的两种方式:AIPP和DVPP
01 数据预处理的典型使用场景
受网络结构和训练方式等因素的影响,绝大多数神经网络模型对输入数据都有格式上的限制。在计算机视觉领域,这个限制大多体现在图像的尺寸、色域、归一化参数等。如果源图或视频的尺寸、格式等与网络模型的要求不一致时,我们需要对其处理,使其符合模型的要求,这个操作,一般称之为数据预处理。
![](/assets/blank.gif)
02 AIPP、DVPP,它们都能做什么
CANN提供了两套专门用于数据预处理的方式:AIPP和DVPP。
处理方式 |
描述 |
AIPP(Artificial Intelligence Pre-Processing) |
AIPP在AI Core上完成数据预处理,主要功能包括改变图像尺寸(抠图、填充等)、色域转换(转换图像格式)、减均值/乘系数(改变图像像素)等。 AIPP区分为静态AIPP和动态AIPP,您只能选择其中一种方式,不支持两种方式同时配置。
|
DVPP(Digital Vision Pre-Processing) |
DVPP是昇腾AI处理器内置的图像处理单元,通过AscendCL媒体数据处理接口提供强大的媒体处理硬加速能力,主要功能包括缩放、抠图、色域转换、图片编解码、视频编解码等。 |
总结一下,虽然都是数据预处理,但AIPP与DVPP的功能范围不同(比如DVPP可以做图像编解码、视频编解码,AIPP可以做归一化配置),处理数据的计算单元也不同,AIPP用的AI Core计算加速单元,DVPP就是用的专门的图像处理单元。
AIPP、DVPP可以分开独立使用,也可以组合使用。组合使用场景下,一般先使用DVPP对图片/视频进行解码、抠图、缩放等基本处理,但由于DVPP硬件上的约束,DVPP处理后的图片格式、分辨率有可能不满足模型的要求,因此还需要再使用AIPP进行色域转换、抠图、填充等处理。
例如,在昇腾310 AI处理器,由于DVPP仅支持输出YUV格式的图片,如果模型需要RGB格式的图片,则需要再使用AIPP进行色域转换。
03 如何使用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 : 250crop: true # 抠图开关,用于改变图片尺寸load_start_pos_h: 0# 抠图起始位置水平、垂直方向坐标load_start_pos_w: 0crop_size_w: 224# 抠图宽、高crop_size_h: 224csc_switch : true # 色域转换开关matrix_r0c0 : 256# 色域转换系数matrix_r0c1 : 0matrix_r0c2 : 359matrix_r1c0 : 256matrix_r1c1 : -88matrix_r1c2 : -183matrix_r2c0 : 256matrix_r2c1 : 454matrix_r2c2 : 0input_bias_0 : 0input_bias_1 : 128input_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);
04 如何使用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功能。这里先通过一张图总览接口调用流程,包括资源初始化&去初始化、通道创建与销毁、解码、缩放、等待任务完成、释放内存资源等。
![](/assets/blank.gif)
总览接口调用流程后,接下来我们以开发者更熟悉的方式“代码”来展示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的功能介绍及使用请参见“昇腾文档中心”。
05 更多介绍
[1]昇腾文档中心
[2]昇腾社区在线课程
[3]昇腾论坛
06 往期链接
基于昇腾计算语言AscendCL开发AI推理应用
了解AscendCL数据预处理的两种方式:AIPP和DVPP相关推荐
- 对连续值/离散值进行预处理的两种方式(标准化/one-hot化)、反标准化/逆标准化、字符串预处理
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) tensorflow 2.0 画出model网络模型的拓扑图 ...
- docker容器运行mysql持久化_docker容器实现数据持久化的两种方式及其区别
前言 这篇博文是我对docker实现数据持久化几种方式的特征进行一个总结. 在docker中,它的存储文件系统是在dockerhost上原有的xfs或ext4架设了一层文件系统:overlay2(将此 ...
- Android页面数据传递的两种方式
在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...
- 跨页数据传递的两种方式
选择具有PostBackUrl属性的三个控件Button.LinkButton.ImageButton.PostBackUrl属性的值就是投递的页面URL. 要在接收页面按对象的方式接收投递页面的表单 ...
- JPA踩坑笔记(一) - 数据查询的两种方式
本文介绍一下JPA常见的两种查询方式. 注:数据库为Oracle 1.前置准备 1.引入jar包 使用JPA,首先引入jar包,一个是JPA,另一个是数据库驱动,我使用的是Oracle数据库. < ...
- redis数据持久化的两种方式
1,AOF AOF持久化以日志的形式记录服务器所处理的每一个写.删除操作,查询操作不会记录,以文本的方式append记录,可以打开文件看到详细的操作记录.(相同数量的数据集而言,AOF文件通常要大于R ...
- SAP CRM和C4C数据同步的两种方式概述:SAP PI和HCI
SAP Cloud for Customer(C4C)和SAP其他传统产品进行数据同步的方式,如下图所示,可以使用SAP Netweaver Process Integration或者SAP HANA ...
- 【javaWeb】前后端传递数据交互的两种方式
一.使用struct2的方法set及get 1.在jsp中直接定义定义form表单 <form id="formid" name= "myform" me ...
- 使用预训练网络训练的两种方式:Keras Applications、TensorFlow Hub
日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) tensorflow 2.0 画出model网络模型的拓扑图 ...
- drf-路由组件:自动生成Routers路由、 使用方法、视图集中附加action的声明、自动生成路由router的两种方式的URL区别
目录 一. 自动生成Routers路由 二. 使用方法 1) 创建router对象,并注册视图集,例如 2)添加路由数据 三. 代码演示 四. 视图集中附加action的声明 五. 自动生成路由rou ...
最新文章
- 存储过程中SELECT与SET对变量赋值
- sharepoint 2016 开启Project 2016 pwa网站
- 2017年天津市大学生数学竞赛试题 (理工类)
- linux shell for 循环变量,shell for循环、循环变量值付给其他shell脚本的方法
- 3.1.1 Spring 简介
- matlab求数的因子,matlab中因子分析的函数factoran如何使用??
- SIP信令协议消息(四)
- 2021Eclipse最新下载与安装教程
- B站商业化驶入深水区
- cents 7.0命令
- 《毛泽东思想和中国特色社会主义理论体系概论》第二次在线作业
- 用户太多:互联网巨头之惑
- 中专初级计算机专业学什么知识,中专计算机主要学什么内容
- 10张思维导图,全面讲解 Pandas
- Win11游戏模式怎么开启?Win11开启游戏模式的方法
- 画色彩如何画出体积感
- MATLAB实现地球表面上两点之间的仰角和方位角计算
- cfadisk,让电脑把sd卡识别成硬盘
- BIND的安装与配置
- 反向交易: 减少最大回撤以及在其它市场上测试
热门文章
- 小白菜鸟必看-GNS3单臂路由实验教程
- 2021千瓜美食行业数据报告(小红书平台)
- 【工具】 可以实现各种图片的各种转换 包括webp格式等互转 google工具
- Hive 中 Order By 和 Sort By的区别
- 贵州事业单位计算机专业测试,必看!贵州省各地区事业单位考试重要信息!!!...
- 计算样本中心矩B和原点矩A的关系式
- 计算机结业教学心得,20XX年学校教师计算机教学心得体会文本.docx
- 谈谈多用户商城系统的优缺点
- 新手养猫如何选购猫罐头?5款性价比高的猫罐头推荐!
- STL源码剖析:class template explicit specialization代码测试和理解