環境:
Ubuntu16.04
一、訓練caffemodel
具體方法請參考連結:【Caffe】用Caffe訓練MobileNetSSD。
二、編譯ncnn
具體方法請參考連結:【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測試的是一緻的,效果差,但是至少證明整個流程已經走對了。