嵌入式开发板上部署目标检测模型mobilenetv2_ssdlite

项目地址

目标

    在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..net/sinat_31425585/article/details/101607785

经验分享 程序员 微信小程序 职场和发展