环境:
Ubuntu16.04
具体方法请参考链接:【Caffe】用Caffe训练MobileNetSSD。
具体方法请参考链接:【ncnn】Ubuntu16.04+OpenCV3.4.0 ncnn环境搭建。
完成之后确认build/tools下有ncnn2mem可执行文件,build/tools/caffe下有caffe2ncnn可执行文件。
这里要用到caffe/build/tools下面的两个工具,这里转换的是合并bn层的model
cd caffe/build/tools
./upgrade_net_proto_text no_bn.prototxt MobileNetSSD_deploy_new.prototxt
./upgrade_net_proto_binary no_bn.caffemodel MobileNetSSD_deploy_new.caffemodel
转换前,no_bn.prototxt的输入是data,
而转换之后的MobileNetSSD_deploy_new.prototxt的输入是input,
下面用ncnn/build/tools/caffe下的caffe2ncnn工具转换模型。
./caffe2ncnn MobileNetSSD_deploy_new.prototxt MobileNetSSD_deploy_new.caffemodel MobileNetSSD_deploy.param MobileNetSSD_deploy.bin
下面是加密(可选),用的工具是ncnn/build/tools下的ncnn2mem,
./ncnn2mem MobileNetSSD.param MobileNetSSD.bin MobileNetSSD.id.h MobileNetSSD.mem.h
在ncnn/examples目录下有一个mobilenetssd.cpp,把这个文件稍微修改一下作为我的测试代码。
将
mobilenet.load_param("mobilenet_ssd_voc_ncnn.param");
mobilenet.load_model("mobilenet_ssd_voc_ncnn.bin");
修改为我自己的model文件。
mobilenet.load_param("MobileNetSSD_deploy.param");
mobilenet.load_model("MobileNetSSD_deploy.bin");
如果使用加密的模型,
mobilenet.load_param("MobileNetSSD_deploy.param.bin");
mobilenet.load_model("MobileNetSSD_deploy.bin");
将
static const char* class_names[] = {"background",
"aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair",
"cow", "diningtable", "dog", "horse",
"motorbike", "person", "pottedplant",
"sheep", "sofa", "train", "tvmonitor"};
修改为自己的类别名字。
把修改后的cpp文件重命名为MobileNetSSD.cpp。
打开ncnn/examples/CMakeLists.txt,在末尾添加
add_executable(MobileNetSSD MobileNetSSD.cpp)
target_link_libraries(MobileNetSSD ${NCNN_EXAMPLE_LINK_LIBRARIES})
进入ncnn/build,执行
make
下面已经多了MobileNetSSD这个可执行文件,
将MobileNetSSD_deploy.param和MobileNetSSD_deploy.bin这两个文件也拷贝到这个目录下,执行
./MobileNetSSD test.jpg
终端会打印出结果,
也会弹出窗口显示boundingbox。
效果和【Caffe】用Caffe训练MobileNetSSD测试的是一致的,效果差,但是至少证明整个流程已经走对了。