我的最终目标是将MobileNetSSD部署到Anroid设备端,考虑到运行效率,采用了NCNN前向推理来实现,下面将在PC端的实现过程和大家分享下,欢迎讨论。
一、前提
1、在ubuntu系统下安装caffe-ssd,这一过程不清楚的地方可以参考我之前的一篇文章,也可以参考下面链接的文章:
https://blog.csdn.net/qq_33431368/article/details/84866166
2、用自己的数据集制作图像VOC数据集,用下面链接的工具:
https://github.com/imistyrain/MRLabeler.git
下载好后,里面有详细的操作说明。
3、Caffe实现MobileNetSSD,可以参考我之前的文章
二、下载编译ncnn
用下面的命令操作
git clone https://github.com/Tencent/ncnn.git
cd ncnn
mkdir -p build
cd build
cmake ..
make -j4
完成之后,查看/home/XXX/ncnn/build/tools和/home/XXX/ncnn/build/tools/caffe分别有ncnn2mem和caffe2ncnn两个可执行文件,如下图所示。
其中
caffe2ncnn 将caffemodel转换为ncnnmodel
ncnn2mem 对模型进行加密操作
三、转换模型并加密
用自己数据集训练的直接用自己数据集的即可,没有的话可以联系我。这里画重点:
旧版caffe模型和网络文件转换成新版caffe模型和网络文件(ncnn只支持新版)
在/home/XXX/ncnn/build/tools/下新建一个ncnnmodel的文件夹便于管理,在自己的caffe文件下build/tools中有相应的转换文件,没有的话,在caffe路径下,用下面的命令生成。
mkdir -p build
cd build
cmake ..
之后的操作如下:
$~/caffe/build/tools/upgrade_net_proto_text MobileNetSSD_deploy.prototxt MobileNetSSD_deploy_new.prototxt
$~/caffe/build/tools/upgrade_net_proto_binary MobileNetSSD_deploy.caffemodel MobileNetSSD_deploy_new.caffemodel
在ncnnmodel文件夹下得到两个新的文件:
四、利用ncnn的两个可执行文件进行转换model
在home/XXX/ncnn/build/tools和/home/XXX/ncnn/build/tools/caffe有ncnn2mem可执行文件,用它转换model,如下所示:
最后得到的结果如下:
五、在PC上run
在ncnn/examples中有 mobilenetssd.cpp 我们利用这个文件进行操作
为了不丢失这个demo,我们另外复制一个文件依然在这个文件夹中重命名为mobilenetssd_my.cpp,改文件修改并做出说明。
将这两个文件MobileNetSSD_deploy_my.param、MobileNetSSD_deploy_my.bin也复制到这个文件夹中,然后打开ncnn/examples目录下的CMakeLists.txt文件,增加这两行:
add_executable(mobilenetssd_my mobilenetssd_my.cpp)
target_link_libraries(mobilenetssd_my ncnn ${OpenCV_LIBS})
打开ncnn根目录下的CMakeLists.txt文件,将编译examples语句的注释打开(默认是被注释掉的)
在ncnn/build路径下,终端运行make:
在 ncnn/build/examples文件中有:
运行./mobilenetssd_my1.jpg
欢迎大家加我微信或者加入交流群: