1、什么是AIPP
资料中,对于AIPP的描述:
AIPP(Artificial Intelligence Pre-Processing)AI预处理,用于在AI Core上完成图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素),数据处理之后再进行真正的模型推理。
由于使用DVPP进行数据预处理后,DVPP各组件基于处理速度和内存占用量的考虑,对输出图片有诸多限制,如输出图片需要长宽对齐,输出格式必须为YUV420SP等,但模型输入通常为RGB或BGR,且输入图片尺寸各异。由此引入AIPP功能,可以通过AIPP提供的色域转换功能,输出满足要求的图片格式;通过补边(Padding)功能,输出满足长宽对齐的图片等。
AIPP根据配置方式不同 ,分为静态AIPP/动态AIPP;如果要将原始图片输出为满足推理要求的图片格式,则需要使用色域转换功能;如果要输出固定大小的图片,则需要使用AIPP提供的Crop(抠图)、Padding(补边)功能。
我理解这个预处理就是对标原始模型中常见预处理方式,比如减均值、归一化等操作,在AI Core上可以起到加速处理的作用。
2、静态AIPP配置实战
2.1 以TensorFlow官方github中Vgg19预训练模型为例
step 1、 下载预训练ckpt,固化成pb,参考tf-slim库中方法固化模型:
step 2、 pb转om,先不带AIPP,batchsize=32
atc --model=frozen_vgg19.pb --framework=3 --output=vgg19_tf_32batch --output_type=FP32 --soc_version=Ascend310 --input_shape="input:32,224,224,3" --log=info
转换成功
step 3、 对照tf-slim库中预处理方法,编写预处理脚本
因为使用msame工具,在NPU上推理,输入是bin文件,所以参考tf-slim库中的方法,编写python脚本,对输入图片进行预处理,数据集使用ImageNet2012 Validation数据集。
关键代码:
_R_MEAN = 123.68
_G_MEAN = 116.78
_B_MEAN = 103.94
.....
image = _aspect_preserving_resize(image, resize_side)
image = _central_crop([image], output_height, output_width)[0]
image.set_shape([output_height, output_width, 3])
image = tf.to_float(image)
if use_grayscale:
image = tf.image.rgb_to_grayscale(image)
return _mean_image_subtraction(image, [_R_MEAN, _G_MEAN, _B_MEAN])
完整的预处理代码
可以看到原来模型针对推理所做的预处理逻辑:
1、读取图片为RGB格式
2、resize
3、Central crop
4、减均值
step 4、 预处理转为bin文件之后,使用msame推理得到性能和精度数据:
msame --model vgg19_tf_32batch.om --input orgin_bins/ --output results
32batch,平均推理性能145.42ms,5万张完整数据集的精度top1/top5: 71.0%/89.8%,和TensorFlow Modelzoo的数据一致。
2.2 添加AIPP配置文件
本次尝试简单的把减均值添加到AIPP配置中去。
step1、根据原来网络的预处理逻辑,编写AIPP配置文件
根据前面原来网络的预处理,减均值[_R_MEAN = 123.68,G_MEAN = 116.78,B_MEAN = 103.94],没有归一化,所以根据模板:
vim aipp.cfg
#增加如下内容
aipp_op {
aipp_mode: static
input_format : RGB888_U8
src_image_size_w : 224
src_image_size_h : 224
mean_chn_0 : 124
mean_chn_1 : 116
mean_chn_2 : 104
var_reci_chn_0 : 1
var_reci_chn_1 : 1
var_reci_chn_2 : 1
}
这个预处理相当于送进模型推理之前,将原来正确的处理的逻辑要包含在AIPP配置中。
三个通道的减均值,和原先的对应,因为资料里面写了不支持小数,所以取整。原来没有归一化,所以var_reci_chn取1。
step2、pb转om,带AIPP,batchsize=32
在资料中:
所以带上使能small channel的优化,看一下性能提升的效果:
atc --model=frozen_vgg19.pb --framework=3 --output=vgg19_tf_32batch_aipp --output_type=FP32 --soc_version=Ascend310 --input_shape="input:32,224,224,3" --insert_op_conf=aipp.cfg --enable_small_channel=1 --log=info
step3、预处理代码中,去掉减均值,并且保存的时候转为uint8类型
关键代码:
if use_grayscale:
image = tf.image.rgb_to_grayscale(image)
#return _mean_image_subtraction(image, [_R_MEAN, _G_MEAN, _B_MEAN])
return image
.....
img = img.eval()
img = img.astype(np.uint8, copy=False)
step 4、 预处理转为bin文件之后,使用msame推理得到性能和精度数据
32batch,平均推理性能141.78ms,5万张完整数据集的精度top1/top5: 71.0%/89.8%
3、总结
batchsize=32 时:
AIPP | 时延 | 吞吐 | 精度 |
---|---|---|---|
不带 | 145.4ms | 220 FPS | 71.0%/89.8% |
带 | 141.7ms | 228 FPS | 71.0%/89.8% |
可以看到带上AIPP预处理之后,精度不变的情况下,模型的推理性能得到了3.7ms的提升,效果还是很明显的。
另外本次只是尝试简单的添加减均值和归一化的参数,和大家做个分享,后面准备再深入学习下其他的配置如:色域转换、crop、resize等,欢迎交流
文章出处登录后可见!