参考文献:
SSD是weiliu博士基于caffe,用于实时目标检测的深度学习框架。相比于Faster rcnn, 其在目标检测速度有了显著提高,精度也有一定提升;相比YOLO,速度差不多,但检测精度更高。在精度和速度的tradeoff方面,SSD可以说是YOLO和Faster rcnn两者的优势结合。
传统的目标检测(Faster rcnn 系列),需要region proposal 过程,也就是说需要预先提取候选区域,然后将此区域分类。SSD不需要region proposal, 而是采取在最后使用default mask的方法来检测目标。SSD产生几千个default box用于预测。每个feature map产生6个长宽比不同的default box,每一层输出包含k个feature map, 每个feature map 有m x n个像素,则每一层可以产生6kmn个default box;不同层的输出可以产生不同scale的feature map, 浅层的输出产生小的scale(小目标)default box,深层的输出产生大的scale(大目标)default box。VOC2007实验中,他使用了conv4_3,conv7,conv8_2, conv9_2, conv10_2, conv11_2的feature map。
将自己需要训练的数据制作成PASCAL格式,matlab代码如下:
% create skeleton detection label like PASCAL
% Huahui Chen, 2017.3.24
source_data_dir = '/home/chh/icme/data/detection/PKU_Skeleton_Renew';
source_label_dir = '/home/chh/icme/data/detection/Train_Label_PKU_final';
dest_label_dir = '/home/chh/icme/data/detection/detection_label';
source_label_total_filename = dir([source_label_dir '/*.txt']);
pic_height = 512;
pic_width = 512;
pic_channel = 3;
parfor i = 1 : length(source_label_total_filename)
i
filename = source_label_total_filename(i).name;
[a, filename_nopost, post] = fileparts(filename);
fid_dest = fopen([dest_label_dir '/' filename_nopost '.xml'], 'w');
fid_source = fopen([source_data_dir '/' filename_nopost '.txt']);
frame_num = 0;
while(fgetl(fid_source) ~= -1)
frame_num = frame_num + 1;
end
fprintf(fid_dest, '\n');
fprintf(fid_dest, '\t%s.png\n', filename_nopost);
fprintf(fid_dest, '\tskeleton\n');
objects = csvread([source_label_dir '/' filename_nopost '.txt']);
for j = 1 : length(objects)
fprintf(fid_dest, '\t\n');
fprintf(fid_dest, '\t\t%d\n', objects(j, 1));
fprintf(fid_dest, '\t\t\n');
fprintf(fid_dest, '\t\t\t%d\n', uint16(objects(j, 3) / frame_num * pic_width));
fprintf(fid_dest, '\t\t\t%d\n', uint16(objects(j, 2) / frame_num * pic_width));
fprintf(fid_dest, '\t\t\t%d\n', pic_height);
fprintf(fid_dest, '\t\t\t%d\n', 1);
fprintf(fid_dest, '\t\t\n');
fprintf(fid_dest, '\t\n');
end
fprintf(fid_dest, '\t\n');
fprintf(fid_dest, '\t\t%d\n', pic_channel);
fprintf(fid_dest, '\t\t%d\n', pic_height);
fprintf(fid_dest, '\t\t%d\n', pic_width);
fprintf(fid_dest, '\t\n');
fprintf(fid_dest, '');
fclose(fid_dest);
end
将产生的数据复制到以下目录:
*.xml —-> $(SSD)/data/VOCdevkit/VOC2007/Annotations
*.jpg —–> $(SSD)/data/VOCdevkit/VOC2007/JPEGImages
在$(SSD)/data/VOCdevkit/VOC2007/ImageSets/Main/ 放置trainval.txt 和 test.txt. 注意内容是无后缀的文件名。如0002-L
修改labelmap_**.prototxt内容
cd $(SSD)
修改create_list.sh路径等
./data/VOC0712/create_list.sh
生成trainval.txt test.txt test_name_size.txt 在 data/VOC0712
修改create_data.sh路径等
./data/VOC0712/create_data.sh
在data/VOCdevkit/VOC0712/lmdb/VOC0712_test_lmdb trainval_lmdb
python examples/ssd/ssd_pascal.py
$(SSD)/models/VGGNet/VOC0712/SSD_300x300/下产生网络和model weights
$(SSD)/jobs/VGGNet/VOC0712/SSD_300x300/下 产生job file, log file, python script
官网上给的 python examples/ssd/score_ssd_pascal.py 将产生score和bndbox,对应的label 是文件名,不是很适用
ssd_detect.bin 可以产生lable,源文件是ssd_detection.cpp
结果保存在test_detect.txt
./build/examples/ssd/ssd_detect.bin models/VGGNet/VOC0712/SSD_1000x300/deploy.prototxt models/VGGNet/VOC0712/SSD_1000x300/VGG_VOC0712_SSD_1000x300_iter_40000.caffemodel data/VOC0712/test_detect.txt --out_file jobs/VGGNet/VOC0712/SSD_1000x300/test_detect.txt
图形显示:
python examples/ssd/plot_detections.py jobs/VGGNet/VOC0712/SSD_1000x300/test_detect.txt / --labelmap-file data/VOC0712/labelmap_voc.prototxt --save-dir jobs/VGGNet/VOC0712/SSD_1000x300/ --visualize-threshold 0.1
job相当于一个工程,其中存有训练、测试的脚本和日志,其中的脚本或程序是上述步骤生成的可以独立运行的脚本或程序。