序
【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使用指数分布量化,量化速度也慢,但对分布不均匀的数据集也有很好的效果,使用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 则缓解了这一现象。