华为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的摄像头下,达到了实时检测的效果。通过对其进一步优化,我们还可以进一步提高模型的性能,使模型支持更高的图像尺寸,将模型拓展到多路视频流同时推理的场景进行应用。

猜你喜欢

转载自blog.csdn.net/lzq6261/article/details/134979104