【yolov4-tiny】三、NNIE小结

【yolov4-tiny】一、darknet->caffe
【yolov4-tiny】二、pytorch->onnx->caffe

前文使用两种途径将yolov4-tiny转为caffe,此后只需根据海思的HiSVP开发指南.pdf操作将caffe转为nnie,本文记录几点注意事项:

1、输入预处理

nnie_mapper 配置选项中配置了输入图片归一化的话,不需要在模型代码中自己再写一遍归一化。

nnie模型的默认输入为BGR格式,nnie_mapper 配置选项中配置了 RGB 的话模型会自己进行一次通道变换,nnie_mapper 配置选项中配置了 BGR 的话模型对输入不会做额外处理,所以使用模型时我们送给模型的输入一般用 BGR就好。

使用模型时,nnie输入图片为chw格式,opencv读取图片为hwc格式,需要自己做个维度变换再输入。

量化时,nnie_mapper不会对输入图片做resize,需要提前把图片resize好再输入。

2、量化

非饱和均匀量化在模型数据分布不均匀的时候(例如coco数据集),会导致量化后的模型精度与量化前的模型精度相差甚远。

拿Tengine框架做 yolov4-tiny 在 cocoval2017 数据集下的量化测试,在不同量化图片数量下测得 mAP50 如下,其中500张和1000张图片为cocoval2017里随意选择的。

量化方式 MIN_MAX ACIQ KL
500张图片 15.7% 24.6% 34.9%
1000张图片 22.5% 28.4% 36.4%
5000张图片 0.5% 0.78% 36.9%

时间上当然是MIN_MAX最快,ACIQ其次,KL最慢。

参考文章:NNIE量化算法及实现,NNIE使用量化公式如下:
nnie量化公式
NNIE使用指数分布量化,量化速度也慢,但对分布不均匀的数据集也有很好的效果,使用5000张图片量化和使用精选400张图片量化效果基本一致。

3、ReLU和leaky ReLU的影响

偶然间发现不同激活函数在NNIE上量化后的精度损失不同,实验结果如下,使用yolov4-tiny训练coco person单类别的AP50。

激活函数 ReLU leaky ReLU
Pytorch 72.0% 72.1%
NNIE 69.0% 57.8%

原本以为是leaky ReLU层有问题,单独使用一个leaky ReLU做测试发现量化前后数据差别并不大,cos sim能达到0.9999,百思不得解,最后在大佬的博客里发现了原因:海思开发:relu、relu6 在量化前后的精度变化及原因思考

文中说到 ReLU 导致权值范围相差过大,而使用 ReLU6 则缓解了这一现象,那么用在这里也有可能是 leaky ReLU 导致权值范围相差过大,而使用 ReLU 则缓解了这一现象。

你可能感兴趣的:(模型转换,神经网络,边缘计算)