Windows下使用SSD检测

来源:互联网 发布:ros系统 与 linux 编辑:程序博客网 时间:2024/06/06 00:07

先来一波文章
SSD是一个单一的网络对象检测的统一框架。你可以使用代码来训练/评估一个用于目标检测任务的网络。http://arxiv.org/abs/1512.02325
再来一波代码https://github.com/conner99/caffe

环境
windows7 + vs2013 + Cuda7.5
caffe: caffe-ssd-microsoft
python: 2.7

1、编译caffe-SSD

参考http://blog.csdn.net/Chen_yingpeng/article/details/59056245
接下来就是训练和测试了

2、训练
训练之前需要准备数据
2.1准备数据
SSD训练使用的是LMDB格式的数据,而平时我们熟知的检测使用的基本为VOC格式的数据集,那么怎么办呢?

先制作个VOC数据集吧http://blog.csdn.net/gaohuazhao/article/details/60871886

将VOC转化为LMDB

官方使用caffe-ssd-microsoft\data\VOC0712文件夹下的create_list.sh 去生成转化LMDB格式所需的trainval.txt和test.txt
文件夹下大概有这么些东西
这里写图片描述
这两个文件的内容大致为
这里写图片描述
这里写图片描述

而我不造为什么执行了create_list.sh出来的trainval.txt和test.txt都是空的,自然就无法生成LMDB了,于是自己写了个Python小程序

create_train_test_file.py

#! /usr/bin/pythonimport os, sysimport globtrainval_filename = "F:/SSD/caffe-ssd-microsoft/data/VOC0712/cut_wheel/ImageSets/Main/trainval.txt"test_filename = "F:/SSD/caffe-ssd-microsoft/data/VOC0712/cut_wheel/ImageSets/Main/test.txt"dist_img_dir = "cut_wheel/JPEGImages"dist_anno_dir = "cut_wheel/Annotations"trainval_fd = open("F:/SSD/caffe-ssd-microsoft/data/VOC0712/trainval.txt", 'w')test_fd = open("F:/SSD/caffe-ssd-microsoft/data/VOC0712/test.txt", 'w')f1=open(trainval_filename,'r')lines1=f1.readlines()f1.close()f2=open(test_filename,'r')lines2=f2.readlines()f2.close()for line in lines1:    content = line.strip('\n')    trainval_fd.write(dist_img_dir + '/' + str(content) + '.jpg' + ' ' + dist_anno_dir + '/' + str(content) + '.xml\n')for line in lines2:    content = line.strip('\n')    test_fd.write(dist_img_dir + '/' + str(content) + '.jpg' + ' ' + dist_anno_dir + '/' + str(content) + '.xml\n')

终于终于生成了可以用的trainval.txt和test.txt

接下来的文件只需要稍微修改下路径,运行get_image_size.bat可以生成test_name_size.txt,

有几类就分几类,再加个背景
labelmap_voc.prototxt

item {  name: "none_of_the_above"  label: 0  display_name: "background"}item {  name: "wheel"  label: 1  display_name: "wheel"}

有了这些文件,就运行create_data.bat吧
于是你得到了想要的trainval_lmdb,和test_lmdb
那么VOC转化LMDB就已经结束了。

2.2 开始训练
官方提供了训练的Python文件

caffe-ssd-microsoft\examples\ssd\ssd_pascal.py
这个程序会自动生成训练所需的train.prototxt、test.prototxt、solver.prototxt
还有训练用的命令VGG_VOC0712_SSD_300x300_train.bat

只要路径都没问题,需要修改的也不多
num_classes = 2(类别数+1,我的只有背景+wheel)
使用自己的数据训练的话可以把base_lr设置第一点,大的话容易发散。
num_test_image = 119(我有119张测试图片)
其他的参数都可以酌情调整。

在SSD根目录下执行

python examples/ssd/ssd_pascal.py

运行结果
这里写图片描述

3、测试
使用Python工具jupyter notebook打开caffe-ssd-microsoft\examples\ssd_detect.ipynb
稍微修改就可以对单张图片进行测试

不过将ssd_detect.ipynb的代码拷贝成ssd_image.py也挺方便的
不过需要在程序的结束为止加一行代码

pylab.show()

运行ssd_image.py的结果
这里写图片描述

这里写图片描述
上述结果为单独检测轮子
使用的数据集是进行滑动窗口截取的特殊数据http://blog.csdn.net/run_it_faraway/article/details/76862506
在视频检测中检测不出像轮子这么细节的东西的

还有之前做了另一个实验(只检测飞机)
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

这两个实验单独做,在各自的数据集上效果还是很好的
相信把这两个网络接起来应该能达到检测飞机轮子的目的了
写得乱七八糟,做出来以后会写比较详细的过程

原创粉丝点击