项目地址
目标
- 在RK3308嵌入式开发板(Arm Linux)上使用ncnn部署mobilenetv2_ssdlite模型
- 模型量化
细节
模型量化
https://github.com/Tencent/ncnn/tree/master/tools/quantize
优化图
https://github.com/Tencent/ncnn/wiki/use-ncnnoptimize-to-optimize-model
./ncnnoptimize mbv2_ssdlite/mobilenetv2_ssdlite_voc.param mbv2_ssdlite/mobilenetv2_ssdlite_voc.bin mbv2_ssdlite_nobn/mobilenetv2_ssdlite_voc.param mbv2_ssdlite_nobn/mobilenetv2_ssdlite_voc.bin 0
算子合并
- batchnorm - scale
- convolution - batchnorm
- convolutiondepthwise - batchnorm
- deconvolution - batchnorm
- deconvolutiondepthwise - batchnorm
- innerproduct - batchnorm
- convolution - relu
- convolutiondepthwise - relu
- deconvolution - relu
- deconvolutiondepthwise - relu
- innerproduct - relu
消除空算子
- innerproduct - dropout
- flatten after global pooling
偏好更好的算子
- replace convolution with innerproduct after global pooling
创建校准表文件
我们建议使用验证数据集进行校准,该数据集应超过5000张图像。
ncnn2table --param=mbv2_ssdlite_nobn/mobilenetv2_ssdlite_voc.param --bin=mbv2_ssdlite_nobn/mobilenetv2_ssdlite_voc.bin --images=../images/ --output=mbv2_ssdlite_nobn.table --mean=127.5,127.5,127.5 --norm=0.007843,0.007843,0.007843 --size=300,300 --thread=10
量化
ncnn2int8 mbv2_ssdlite_nobn/mobilenetv2_ssdlite_voc.param mbv2_ssdlite_nobn/mobilenetv2_ssdlite_voc.bin mbv2_ssdlite_int8/mobilenetv2_ssdlite_voc.param mbv2_ssdlite_int8/mobilenetv2_ssdlite_voc.bin mbv2_ssdlite_nobn.table
修改输入分辨率
-
修改模型文件mobilenetv2_ssdlite_voc.param的分辨率为192x192,原分辨率为300x300
Input data 0 1 data 0=192 1=192 2=3
-
修改mobilenetv2ssdlite.cpp中的输入图像的分辨率为192x192,原分辨率为300x300
const int target_size = 192; int img_w = bgr.cols; int img_h = bgr.rows; ncnn::Mat in = ncnn::Mat::from_pixels_resize(bgr.data, ncnn::Mat::PIXEL_BGR, bgr.cols, bgr.rows, target_size, target_size);
加速效果
分辨率300 x 300
模型量化后,运行时间减少25%,加速效果明显,目标检测结果保持不变。
若要进一步提升速度,可考虑调整mobilenetv2的通道数,减小模型。
分辨率192 x 192
模型量化后,运行时间减少28%,加速效果明显,目标检测结果保持不变。
由于是直接修改分辨率,没有使用相应分辨率微调模型,导致检测的边界框不是很准确。
相关文章
https://blog.csdn.net/sinat_31425585/article/details/101607785