Faster-rcnn训练了自己的数据集,感觉效果还行,对于自己的数据集的准确率在89%左右,但是Faster-rcnn的速度就是个坑。因此,开始想着用SSD试一下。
因为已经有了Faster-rcnn数据集,所有数据集的制作步骤可以省略了。接下来就是SSD训练的修改了。
在此,设定SSD的根目录为caffe-ssd:
1、在caffe-ssd/data/VOCdevkit 中mkdir mydataset(自己的数据集名称)
2、cd到mydataset中,mkdir 3个文件夹Annotations、ImageSets、JPEGImages
3、在examples中mkdir mydataset(主要用来存放create_data.sh所生成的数据连接)
3、将.xml文件放在Annotations中,ImageSets中建立Main文件夹,把train.txt trainval.txt test.txt val.txt 放至Main文件夹中,JPEGImages放要训练的图片
4、在caffe-ssd/data中mkdir mydataset,将caffe-data/data/voc0712中的create_*.sh、labelmap_voc 拷贝至caffe-data/data/mydataset中
修改create_list.sh 第13行
for name in VOC2007 VOC2012:
修改至
for name in mydataset:
修改create_data.sh 主要是路径的问题
修改labelmap_voc:
每个item中代表你标签,background必须要有
5、
修改examples/ssd/ssd_pascal.py 中关于一些路径的问题,num_classes = 你的类别数量+1,num_test_image = 你训练时的test数量
6、运行sudo python ssd_pascal.py进行训练
注意训练时可能会出现
F0209 00:33:31.934646 21257 annotated_data_layer.cpp:205] Check failed:std::equal(top_shape.begin() + 1, top_shape.begin() + 4, shape.begin() + 1)
*** Check failure stack trace: ***
@ 0x7fc2c7d7e5cd google::LogMessage::Fail()
@ 0x7fc2c7d80433 google::LogMessage::SendToLog()
@ 0x7fc2c7d7e15b google::LogMessage::Flush()
@ 0x7fc2c7d80e1e google::LogMessageFatal::~LogMessageFatal()
@ 0x7fc2c84ff180 caffe::AnnotatedDataLayer<>::load_batch()
@ 0x7fc2c860c77f caffe::BasePrefetchingDataLayer<>::InternalThreadEntry()
@ 0x7fc2c84492b5 caffe::InternalThread::entry()
@ 0x7fc2bb6a55d5 (unknown)
@ 0x7fc2b617f6ba start_thread
@ 0x7fc2c65fb82d clone
@ (nil) (unknown)
Aborted (core dumped)
解决方法是将ssd_pascal.py 中183行:
resize_mode : P.Resize.warp 改为 P.Resize.FIT_SMALL_SIZE,
341行 batch_size = 1
364行 test_batch_size = 1
以上就可以运行ssd_pascal.py进行训练了
3、测试
使用ssd_detect 进行测试