赞
踩
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的色域转换功能给出了如下配置。
下面进行归一化处理,官网给出了如下计算公式。
基于这个公式以及我们之前代码中归一化的方式
# 代码实现如下
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就可以开始测试了。
可以看出得益于AIPP算子,我们模型的前处理和推理速度得到了极大提升,在640*640 30fps的摄像头下,达到了实时检测的效果。通过对其进一步优化,我们还可以进一步提高模型的性能,使模型支持更高的图像尺寸,将模型拓展到多路视频流同时推理的场景进行应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。