您的位置:首页 > 运维架构

【目标检测】OpenCV中dnn模块的SSD demo运行

2017-03-19 23:13 916 查看

本文将opencv的contrib库中的dnn模块下的SSD检测方法的demo运行过程作以记录。

运行环境:win7 64位旗舰版,opencv3.1以及contrib库。

opencv dnn模块

到写本文的时间,opencv已经出到3.2版本了,由于之前装了3.1故版本没有更新,不过一般建议使用最新版本,新版本在兼容性和速度上都会有提升。
我们这里只使用contrib库的dnn模块,并且读取以及训练好的模型来进行检测。下面是opencv3.2的dnn模块简介。



上面的介绍,我们可以看出,dnn模块支持caffe、TensorFlow、torch三种深度学习框架。也可以自己写网络层,读取网络结构和已经训练好的模型。

SSD方法

方法主页:SSD: Single Shot MultiBox Detector
该方法在YOLO的基础上增加了多尺度的处理,对于不同尺寸的目标有了更好的检测效果,提高了准确率,同时还去掉了一些全连接层以提高检测速度。作者的实验中SSD300模型可以达到46FPS,同时VOC2007的mAP也达到了77.2。

demo运行

准备工作

1.使用cmake编译opencv以及contrib库(官网下载)。
2.下载SSD模型,在上述的主页中可以下载,这里我用的是VGG_VOC0712_SSD_300x300_iter_120000.caffemodel及其对应的结构deploy.prototxt。

开始运行

1.在..\opencv_contrib-master\modules\dnn\samples下面的ssd_object_detection.cpp就是官方给出的例子。
与以往不同的是,这个例程使用了opencv的CommandLineParser类,这是个命令行解析类,详情参见这篇博客OpenCV中CommandLineParser类。编译过后我们可以使用命令行来输入参数,这里我们直接在vs中调试。参数修改如下:
const char* about = "This sample uses Single-Shot Detector "
"(https://arxiv.org/abs/1512.02325)"
"to detect objects on image\n"; // TODO: link

const char* params
= "{ help           | false | print usage         }"
"{ proto          |deploy.prototxt| model configuration }"
"{ model          |VGG_VOC0712_SSD_300x300_iter_120000.caffemodel| model weights       }"
"{ image          |rgb.jpg       | image for detection }"
"{ min_confidence | 0.5   | min confidence      }";
2.修改deploy.prototxt文件
修改参数后直接运行会报错,一般都是读取网络结构时,没有xxx层或者读取出错。这里我们按照报错以及给出的VGG_VOC0712_SSD_300x300_iter_60000.prorotxt来修改deploy文件。
(1)Normalize->NormalizeBBox
(2)norm_para->normalize_bbox_para
(3)step->#step (注释掉)
(4)offset->#offset(注释掉)
以上在文件中查找并替换就可以了。
3.运行
接下来就可以直接运行demo了。结果如下:
        


        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: