天天看点

【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

环境:

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
           
【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

转换前,no_bn.prototxt的输入是data,

【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

而转换之后的MobileNetSSD_deploy_new.prototxt的输入是input,

【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

下面用ncnn/build/tools/caffe下的caffe2ncnn工具转换模型。

./caffe2ncnn MobileNetSSD_deploy_new.prototxt MobileNetSSD_deploy_new.caffemodel MobileNetSSD_deploy.param MobileNetSSD_deploy.bin
           
【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

下面是加密(可选),用的工具是ncnn/build/tools下的ncnn2mem,

./ncnn2mem MobileNetSSD.param MobileNetSSD.bin MobileNetSSD.id.h MobileNetSSD.mem.h
           
【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

四、测试

在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这个可执行文件,

【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

将MobileNetSSD_deploy.param和MobileNetSSD_deploy.bin这两个文件也拷贝到这个目录下,执行

./MobileNetSSD test.jpg
           

终端会打印出结果,

【ncnn】MobileNetSSD通过ncnn推理实现目标检测ubuntu16.04测试一、训练caffemodel二、编译ncnn三、转换模型四、测试

也会弹出窗口显示boundingbox。

效果和【Caffe】用Caffe训练MobileNetSSD测试的是一致的,效果差,但是至少证明整个流程已经走对了。

继续阅读