SSD目标检测框架教程--2017.3

6 篇文章 0 订阅
1 篇文章 0 订阅

SSD目标检测框架教程–2017.3

参考文献:

SSD简介

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

创建LMDB数据

将产生的数据复制到以下目录:
*.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

训练

修改ssd_pascal.py路径等
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相当于一个工程,其中存有训练、测试的脚本和日志,其中的脚本或程序是上述步骤生成的可以独立运行的脚本或程序。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值