MobileNetSSD模型量化及转换NCNN模型

Posted by lsq on February 20, 2019

最近在安卓移动端开发一个可以实时检测车辆行人的app,计算框架采用tencent的ncnn,深度神经网络模型采用MobileNetSSD,这也是现在网上流传比较广的一个例子。受限于移动端计算资源,几乎不可能完成网络模型的实时推断,模型量化的技术也就应运而生。本文将介绍:将一个预训练好的MobileNetSSD(caffe)模型进行量化、量化caffe模型转换成ncnn模型以及MobileNetSSD(ncnn)模型的加载推断。

1 MobileNetSSD模型量化

预训练好的caffe模型可以在这个项目下载 chuanqi305/MobileNet-SSD , 把项目clone下来后,我们需要其中的:deploy.prototxt、train.prototxt 和 MobileNetSSD_deploy.caffemodel。有的地方说deploy.prototxt这个文件在后面会出现问题,然后给出了另一个.prototxt,MobileNetSSD_deploy.prototxt

由于ncnn只能支持最新版本的caffe模型进行转换,所以在做量化之前我们需要先将caffe模型进行upgrade。升级模型的工具caffe已经帮我们做好了,就在 path_to_caffe/build/tools 中。这里有一个很关键的点需要注意,关于ssd相关模型的操作,需要使用caffe/ssd分支,weiliu89/caffe。编译好caffe后,就可以找到升级caffe模型了,具体教程参考 这里 ncnn组件使用指北alexnet

得到了新版caffe模型后,我们就可以进行量化了,量化工具也早就有人做好了,开心。在 BUG1989/caffe-int8-convert-tools 项目的 README 中已经介绍如何量化模型的方法,这里说下其中一些需要配置的参数。–mean 和 –norm 可以在 train.prototxt 中找到,分别对应 mean_value 和 scale,量化数据集 –images 我用的是PASCAL 2012数据集,这个就根据个人爱好吧。

一切就绪,只欠终端。将下面这条命令输入终端然后回车,不出意外的话,肯定不会顺利执行的,我遇到的问题是caffe路径。

python caffe-int8-convert-tool-dev.py --proto=../deploy_new.prototxt --model=../deploy_new.caffemodel --mean mean_value mean_value mean_value --norm=scale --images=images/ --output=deploy_new_int8.table --gpu=0

记得上面提到的caffe/ssd,这里python调用的一定也是这个。解决方法是在 import caffe 之前加上下面两条语句来配置caffe路径,然后在重新执行上面的命令即可。

caffe_root = "path_to_caffe(ssd)"
sys.path.insert(0, os.path.join(caffe_root, 'python'))

我使用cpu加上2000多张图片进行的量化,大约花费了不到十分钟的样子,完成后得到了 deploy_new_int8.table ,大小是2.7K,到这里MobileNetSSD模型量化就完成了,鼓掌!!!

2 caffe量化模型转换ncnn模型

得到了量化的MobileNetSSD模型后,接下来我们将其转换成NCNN模型,以便于集成到Android环境。需要的文件有:deploy_new.prototxt、deploy_new.caffemodel 和 deploy_new_int8.table,均为我们在上文得到的结果。转换工具在 path_to_ncnn/build/tools/caffe/caffe2ncnn, 使用方法如下:

.../caffe2ncnn deploy_new.prototxt deploy_new.caffemodel MobileNetSSD-int8.param MobileNetSSD-int8.bin 256 deploy_new_int8.table

其实到这一步已经可以加载ncnn模型进行推断了,但是还有一个骚操作就是将模型文件进行加密,加密工具在 path_to_ncnn/build/tools/ncnn2mem ,使用方法如下:

.../ncnn2mem MobileNetSSD-int8.param MobileNetSSD-int8.bin MobileNetSSD-int8.id.h MobileNetSSD-int8.mem.h

在caffe到ncnn模型转换的过程中,我进行的异常顺利,没有出现任何无法理解的问题。最后在一个安卓设备上进行推断,量化后的模型量化之前快约30%,模型缩小到原来的25%左右,精度肉眼几乎看不出降低,这个效果可以说狠满意了。

Reference

chuanqi305/MobileNet-SSD
weiliu89/caffe
Tencent/ncnn/wiki/quantized-int8-inference
Tencent/ncnn/wiki/ncnn组件使用指北alexnet
BUG1989/caffe-int8-convert-tools