【技术分享】昇腾CANN AIPP入门学习实战&总结

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库中方法固化模型:

image.png

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

转换成功
image.png

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推理得到性能和精度数据:

image.png

msame --model vgg19_tf_32batch.om --input orgin_bins/ --output results

image.png

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

在资料中:
image.png
所以带上使能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

image.png

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推理得到性能和精度数据

image.png

image.png

32batch,平均推理性能141.78ms,5万张完整数据集的精度top1/top5: 71.0%/89.8%

3、总结

batchsize=32 时:

AIPP时延吞吐精度
不带145.4ms220 FPS71.0%/89.8%
141.7ms228 FPS71.0%/89.8%

可以看到带上AIPP预处理之后,精度不变的情况下,模型的推理性能得到了3.7ms的提升,效果还是很明显的。
另外本次只是尝试简单的添加减均值和归一化的参数,和大家做个分享,后面准备再深入学习下其他的配置如:色域转换、crop、resize等,欢迎交流

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2022年5月27日 下午4:30
下一篇 2022年5月27日 下午4:33

相关推荐