MobileNet-SSD利用caffe-int8-convert-tools工具量化经验
下载caffe-int8-convert-tools工具:
caffe-int8-convert-tools
准备test文件夹:
test/images为验证机图片
test/models为MobileNet-SSD的caffemodel和prototxt文件
旧版caffe模型更新为新版模型:(ncnn只支持新版)
$ ~/caffe/build/tools/upgrade_net_proto_text MobileNetSSD.prototxt MobileNetSSD_new.prototxt
$ ~/caffe/build/tools/upgrade_net_proto_binary MobileNetSSD.caffemodel MobileNetSSD_new.caffemodel
得到量化参数文件
利用下载好的python文件运行:
python caffe-int8-convert-tools/caffe-int8-convert-tool-dev-weight.py \
--proto=models/MobileNetSSD_new.prototxt \
--model=models/MobileNetSSD_new.caffemodel \
--mean 127.5 127.5 127.5 \
--norm=0.00777 \
--images=caffe-int8-convert-tools/test/images/ \
--output=caffe-int8-convert-tools/test/MobileNetSSD.table \
--gpu=1
其中输出为MobileNetSSD.table,是量化的参数文件。
得到量化参数文件(方法二)
根据最新的ncnn框架的更新,不需要借助caffe-int8-convert-tools也可以完成量化。ncnn官方文档说明
下载安装ncnn:
git clone https://github.com/Tencent/ncnn
cd ncnn
mkdir build && cd build
cmake ..
make -j
make install
由caffe模型得到ncnn模型:
./ncnn-master/build/tools/caffe/caffe2ncnn \
MobileNetSSD_new.prototxt MobileNetSSD_new.caffemodel \
MobileNetSSD.param MobileNetSSD.bin
得到ncnn模型的param和bin文件。
优化ncnn模型:
./ncnn-master/build/tools/ncnnoptimize \
MobileNetSSD.param MobileNetSSD.bin \
MobileNetSSD-new.param MobileNetSSD-new.bin 0
提取验证集图片:
find images/ -type f > imagelist.txt
并得到量化参数文件:
./ncnn-master/build/tools/quantize/ncnn2table \
MobileNetSSD-new.param MobileNetSSD-new.bin \
imagelist.txt MobileNetSSD.table \
mean=[104,117,123] norm=[0.017,0.017,0.017] \
shape=[224,224,3] pixel=BGR thread=8 method=kl
shape 是模型的输入尺寸,[w,h] 或 [w,h,c]
pixel 是模型的像素格式
thread 是可用于并行推理的 CPU 线程数
method是训练后量化算法,目前支持kl和aciq
通过table文件量化模型
输入为ncnn的原始bin、param文件和table文件,输出为量化后int8的bin、param文件:
./ncnn-master/build/tools/quantize/ncnn2int8 \
MobileNetSSD-new.param MobileNetSSD-new.bin \
MobileNetSSD-int8.param MobileNetSSD-int8.bin \
MobileNetSSD.table