华为Altas 200DK A2 部署实战(六) 使用AIPP算子优化Yolov8模型的前处理过程

使用AIPP算子优化模型的前处理过程

   
AIPP(Artificial Intelligence Pre-Processing)人工智能预处理,用于在AI Core上完成数据预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据预处理之后再进行真正的模型推理。官方资料

AIPP根据配置方式不同 ,分为静态AIPP和动态AIPP;如果要将原始图片输出为满足推理要求的图片格式,则需要使用色域转换功能;如果要输出固定大小的图片,则需要使用AIPP提供的Crop(抠图)、Padding(补边)功能。

   
我们所部署的Yolov8-pose预处理实现的功能包括图片缩放、缩放后图片边缘填充、BGR转RGB、像素值归一化、图片内存排布转换HWC转CHW。

我们设定尺寸缩放和图片边缘填充保留为OpenCV实现。将色域转换和归一化处理交给aipp实现。HWC到CHW的转换在aipp下不需要关注由ATC工具自动完成。

   
本文演示通过静态AIPP算子来实现Yolov8部署模型的加速,参考官网样例,其配置文件(.cfg)大致如下所示。

aipp_op {
       aipp_mode : static
       related_input_rank : 0  # 标识对第1个输入进行AIPP处理
       src_image_size_w : 608
       src_image_size_h : 608
       crop : false
       input_format : YUV420SP_U8
       csc_switch : true
       rbuv_swap_switch : false
       matrix_r0c0 : 298
       matrix_r0c1 : 0
       matrix_r0c2 : 409
       matrix_r1c0 : 298
       matrix_r1c1 : -100
       matrix_r1c2 : -208
       matrix_r2c0 : 298
       matrix_r2c1 : 516
       matrix_r2c2 : 0
       input_bias_0 : 16
       input_bias_1 : 128
       input_bias_2 : 128
       mean_chn_0 : 104
       mean_chn_1 : 117
       mean_chn_2 : 123
}

   
因为opencv读取的图像为BGR格式,而我们的模型需要RGB格式的图像,所以首先要对图像进行色域转换。官网对BGR转RGB的色域转换功能给出了如下配置。
在这里插入图片描述

图1 BGR转RGB的AIPP算子配置

   
下面进行归一化处理,官网给出了如下计算公式。
在这里插入图片描述

图2 归一化配置说明

基于这个公式以及我们之前代码中归一化的方式

#	代码实现如下
img_pre = (img_pre / 255.0)	#0 - 255 to 0.0 - 1.0

我们给出如下配置结果

# mean_chn_i=0
# min_chn_i=0
# var_reci_chn=1/255

mean_chn_0 : 0
mean_chn_1 : 0
mean_chn_2 : 0
min_chn_0 : 0.0
min_chn_1 : 0.0
min_chn_2 : 0.0
var_reci_chn_0 : 0.003906
var_reci_chn_1 : 0.003906
var_reci_chn_2 : 0.003906

综上,我们得到我们的AIPP算子配置文件handpose_aipp.cfg如下

aipp_op { 
related_input_rank : 0
src_image_size_w : 640
src_image_size_h : 640
crop : false
padding : false
aipp_mode: static
input_format : RGB888_U8
csc_switch : false
rbuv_swap_switch : true
mean_chn_0 : 0
mean_chn_1 : 0
mean_chn_2 : 0
min_chn_0 : 0.0
min_chn_1 : 0.0
min_chn_2 : 0.0
var_reci_chn_0 : 0.003906
var_reci_chn_1 : 0.003906
var_reci_chn_2 : 0.003906
}

   
下面我们通过ATC工具重新生成新的带AIPP算子的om模型,执行如下指令

# 首先要配置ATC工具的环境,即设置CANN工具包的环境变量,{CANN_INSTALL_PATH}代表CANN工具包安装的地方
source CANN_INSTALL_PATH/ascend-toolkit/set_env.sh 
export LD_LIBRARY_PATH=CANN_INSTALL_PATH/ascend-toolkit/latest/x86_64-linux/devlib/:$LD_LIBRARY_PATH

#转换模型
atc --model=handpose.onnx --framework=5  --output=handpose_aipp --soc_version=Ascend310B4 --insert_op_conf=./handpose_aipp.cfg

   
模型转换成功后,我们将新的模型handpose_aipp.pm放到我们的开发板上,然后修改我们之前写的的样例程序。具体来说,打开det_utils2.py文件,删除前处理模块中的色域转换和归一化处理部分,只保留OpenCV中调整图像尺寸和填充的代码。改动如下所示

# 模型前处理
def preprocess_warpAffine(image, dst_width=640, dst_height=640):
    scale = min((dst_width / image.shape[1], dst_height / image.shape[0]))
    ox = (dst_width  - scale * image.shape[1]) / 2
    oy = (dst_height - scale * image.shape[0]) / 2
    M = np.array([
        [scale, 0, ox],
        [0, scale, oy]
    ], dtype=np.float32)
    
    img_pre = cv2.warpAffine(image, M, (dst_width, dst_height), flags=cv2.INTER_LINEAR,
                             borderMode=cv2.BORDER_CONSTANT, borderValue=(114, 114, 114))
    IM = cv2.invertAffineTransform(M)

    #img_pre = (img_pre[...,::-1] / 255.0).astype(np.float32)    # BGR to RGB, 0 - 255 to 0.0 - 1.0
    #img_pre = img_pre.transpose(2, 0, 1)[None]  # BHWC to BCHW (n, 3, h, w)
    #img_pre = torch.from_numpy(img_pre)	# 实测添加AIPP算子后好像不需要将图像从numpy转化成tentor了
    return img_pre, IM

   
改动完成后,在test.py中将模型替换为handpose_aipp.om就可以开始测试了。
在这里插入图片描述

图3 未加AIPP算子的模型所用时间

   
在这里插入图片描述

图3 加入AIPP算子的模型推理单张图片所用时间

   
在这里插入图片描述

图3 加入AIPP算子的模型推理单张图片的效果

   
在这里插入图片描述

图4 加入AIPP算子的模型推理摄像头视频帧的效果

   
可以看出得益于AIPP算子,我们模型的前处理和推理速度得到了极大提升,在640*640 30fps的摄像头下,达到了实时检测的效果。通过对其进一步优化,我们还可以进一步提高模型的性能,使模型支持更高的图像尺寸,将模型拓展到多路视频流同时推理的场景进行应用。

<think>好的,用户想了解如何将模型转换为昇腾AI处理器支持的OM格式。首先,我需要回顾一下昇腾处理器的模型转换流程。根据引用[4],导出模型需要先生成AIR格式,然后使用ATC工具转换为OM。用户提供的引用[1]中的目录结构显示有air2om.sh脚本,这可能是一个转换脚本的例子。同时,引用[2]提到在Ubuntu安装ATC工具的环境配置,说明转换环境需要Linux系统,特别是Ubuntu。 接下来,步骤应该包括准备AIR模型、安装ATC工具、编写AIPP配置文件、执行转换命令。用户可能遇到的问题包括环境配置错误、AIPP参数设置不正确等。需要提醒用户注意输入尺寸和格式是否匹配,以及AIPP预处理是否正确。此外,引用[4]提到导出模型时的输入尺寸参数,这可能影响转换时的配置,确保在ATC命令中指定正确的输入形状。 另外,引用[3]指出AI开发的痛点,所以转换过程可能涉及复杂的步骤,需要详细说明每个环节,避免用户因门槛高而放弃。需要强调检查ATC工具版本与硬件兼容性,以及转换后的OM模型验证方法。最后,生成相关问题时,应该覆盖环境配置、常见错误处理、优化方法等,帮助用户全面了解流程。</think>### 如何将模型转换为昇腾AI处理器支持的OM格式? #### **步骤1:准备AIR格式模型** 昇腾AI处理器要求模型首先转换为AIR(Ascend Intermediate Representation)格式,这是华为定义的中间表示格式。 - **生成AIR模型**:通过深度学习框架(如TensorFlow、PyTorch或MindSpore)导出模型时,需指定输出格式为`AIR`。例如在MindSpore中运行以下命令: ```python !python export.py --ckpt_file="best.ckpt" --file_name="model.air" --file_format="AIR" ``` 其中需指定输入尺寸(如`--width=960`和`--height=960`)以匹配模型需求[^4]。 #### **步骤2:安装ATC工具** ATC(Ascend Tensor Compiler)是华为提供的模型转换工具,需在**Ubuntu系统**(推荐22.04)上安装: 1. 下载昇腾AI处理器配套的CANN软件包(含ATC工具)[^2]。 2. 配置环境变量: ```bash source <CANN安装路径>/set_env.sh ``` 确保安装依赖项(如Python 3.7+、gcc 7.3.0等)[^2]。 #### **步骤3:编写AIPP配置文件** AIPP(AI Pre-Processing)用于在模型推理前对输入数据进行归一化或格式转换。配置文件示例(`aipp_unet.cfg`): ```text aipp_op { aipp_mode: static input_format : RGB888_U8 csc_switch : true rbuv_swap_switch : true } ``` 需根据模型输入类型(如RGB/YUV)调整参数[^1]。 #### **步骤4:执行ATC转换命令** 使用以下命令将AIR模型转换为OM格式: ```bash atc --model=model.air --framework=1 --output=model --soc_version=Ascend310B4 --insert_op_conf=aipp_unet.cfg ``` - **关键参数说明**: - `--model`: 输入AIR模型路径 - `--output`: 输出OM模型名称 - `--soc_version`: 昇腾处理器型号(如Ascend310B4) - `--insert_op_conf`: AIPP配置文件路径。 #### **步骤5:验证OM模型** 转换完成后,可使用昇腾提供的推理工具(如AscendCL)加载OM模型,测试输入输出是否符合预期。 --- ### **注意事项** 1. **输入尺寸一致性**:转换时需确保输入尺寸与训练时一致(如`--input_shape="input_1:1,960,960,3"`)[^4]。 2. **算子兼容性**:部分框架的算子可能不被昇腾支持,需通过昇腾文档检查兼容性。 3. **AIPP配置错误**:若预处理参数错误(如颜色通道顺序),会导致推理结果异常。 ---
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L.fountain

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值