写点什么

Ascend CL 两种数据预处理的方式:AIPP 和 DVPP

  • 2023-03-20
    广东
  • 本文字数:3357 字

    阅读完需:约 11 分钟

Ascend CL两种数据预处理的方式:AIPP和DVPP

本文分享自华为云社区《了解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: dynamicmax_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 的功能介绍及使用请参见“昇腾文档中心”。


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

发布于: 刚刚阅读数: 3
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
Ascend CL两种数据预处理的方式:AIPP和DVPP_人工智能_华为云开发者联盟_InfoQ写作社区