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

本文将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方法

该方法在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中调试。参数修改如下:
  1. const char* about = "This sample uses Single-Shot Detector "
  2. "(https://arxiv.org/abs/1512.02325)"
  3. "to detect objects on image\n"; // TODO: link
  4. const char* params
  5. = "{ help | false | print usage }"
  6. "{ proto |deploy.prototxt| model configuration }"
  7. "{ model |VGG_VOC0712_SSD_300x300_iter_120000.caffemodel| model weights }"
  8. "{ image |rgb.jpg | image for detection }"
  9. "{ 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了。结果如下:
        

        


猜你喜欢

转载自blog.csdn.net/maweifei/article/details/81045281