---
title: 如何基于香橙派AIpro对视频/图像数据进行预处理-官方技术文章-昇腾社区
description: 本文章介绍如何基于香橙派AIpro对视频/图像数据进行预处理。
keywords: AIpro,如何基于香橙,对视频,图像数据进行,预处理,官方技术文章,昇腾社区,前言
url: https://www.hiascend.com/developer/techArticles/20240416-1
section: (其他)
---

# 如何基于香橙派AIpro对视频/图像数据进行预处理-官方技术文章-昇腾社区

URL: https://www.hiascend.com/developer/techArticles/20240416-1
描述: 本文章介绍如何基于香橙派AIpro对视频/图像数据进行预处理。
关键词: AIpro,如何基于香橙,对视频,图像数据进行,预处理,官方技术文章,昇腾社区,前言

官方技术文章 [了解详情](https://www.hiascend.com/zh/developer/techArticles)

如何基于香橙派AIpro对视频/图像数据进行预处理

如何基于香橙派AIpro对视频/图像数据进行预处理

昇腾CANNAscend C香橙派

发表于: 2024/04/16

3.1k

20

## 01 前言

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

昇腾AI硬件内置专门用于图像预处理的硬件单元，开发者通过其上层软件栈CANN能够更加便捷地发挥出硬件强大的媒体处理硬加速能力。香橙派AIpro开发板是香橙派联合昇腾打造的高性能AI开发板，开发者可以基于此，对不满足神经网络模型输入要求的数据进行预处理，从而更好地完成AI推理计算。

## 02 昇腾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进行色域转换、归一化等处理。

## 03 如何使用AIPP功能

下文以此为例：测试图片分辨率为250*250、图片格式为YUV420SP，模型对图片的要求为分辨率224*224、图片格式为RGB，因此需要通过AIPP实现抠图、图片格式转换2个功能。关于各种格式转换，其色域转换系数都有模板，可从ATC工具使用指南中获取，请参见“昇腾文档中心[1] [了解详情](https://www.hiascend.com/zh/document)”。

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推理应用 [了解详情](https://www.hiascend.com/zh/developer/techArticles/20240326-1?envFlag=1)。

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推理应用 [了解详情](https://www.hiascend.com/zh/developer/techArticles/20240326-1?envFlag=1)。调用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功能。这里先通过一张图总览接口调用流程，包括资源初始化&去初始化、通道创建与销毁、解码、缩放、等待任务完成、释放内存资源等。

总览接口调用流程后，接下来我们以开发者更熟悉的方式“代码”来展示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);
```

## 05 更多学习资源

更多学习资源，欢迎登录昇腾社区查阅：

[1]昇腾文档中心：https://www.hiascend.com/zh/document [了解详情](https://www.hiascend.com/zh/document)

[2]香橙派AIpro开源样例代码：https://gitee.com/ascend/EdgeAndRobotics [了解详情](https://gitee.com/ascend/EdgeAndRobotics)

[3]香橙派AIpro学习资源一站式导航：https://www.hiascend.com/forum/thread-0285140173361311056-1-1.html [了解详情](https://www.hiascend.com/forum/thread-0285140173361311056-1-1.html)

点赞 20

本页内容

01 前言 [了解详情](https://www.hiascend.com/#id-1)

02 昇腾CANN数据预处理方式简介 [了解详情](https://www.hiascend.com/#id-2)

03 如何使用AIPP功能 [了解详情](https://www.hiascend.com/#id-3)

04 如何使用DVPP功能 [了解详情](https://www.hiascend.com/#id-4)

05 更多学习资源 [了解详情](https://www.hiascend.com/#id-5)
