关闭

读DL论文心得之SPP代码运行实验

标签: 深度学习SPP目标检测matlab
3328人阅读 评论(29) 收藏 举报
分类:

本代码来自于上一篇博客中读过的论文Spatial pyramid pooling in deep convolutional networks for visual recognition

1. 安装SPP_net

(1)环境配置

Windows7,MATLAB(R2014b,64-bit),MEX 配置为使用 Microsoft Visual C++ 2010 (C)以进行 C 语言编译。配置方法:

mex -setup

(2)下载SPP_net的源码

直接从github下载,或者使用命令行:

git clone https://github.com/ShaoqingRen/SPP_net.git

(3)下载Caffe的依赖项

Caffe的依赖项,即修改过的caffe的编译好的mexcpp文件,可以在matlab下直接运行SPP_net-master\external\fetch_caffe_mex_5_5.m下载:

cd external
fetch_caffe_mex_5_5
cd ..

也可以自己去下载,反正都需要翻墙。解压后放在external文件夹下,即external\caffe\...形式。

(4)运行startup

在MATLAB中进入SPP_net-master目录,运行startup.m,会提示下载Selective Search代码,按照提示操作,看到SPP_net startup done就好了。startup.m主要导入要用的一些目录,还有对其他需要用到的目录的检查,如果出错了,就把这个文件打开对照提示信息检查。

startup

(5)运行spp_build()

生成liblinearselective searchspp_pool以及nms。生成liblinear的时候编译器可能会有warning,不用管它。

spp_build()

(6)运行data\fetch_model_data

这个脚本的作用是下载模型包:

cd data
fetch_model_data

也可以自己去网站上下载
又是墙外资源,解压后,把cnn_modelspp_model放在SPP_net-master中的data文件夹下,把Zeiler_conv5_ft(5s_flip)放在SPP_net-master中的finetuning文件夹下。

(7)运行data\fetch_ss_data_voc2007

下载VOC2007的selective search数据包:

fetch_ss_data_voc2007.m
cd ..

同样可以自己去网站下载。解压后合并放在相同名字的文件夹下。

2. 训练SPP_net检测器(以VOC2007为例)

正常流程是:提取特征->微调->训练SVM->检测。
缓存特征大概需要20GB的磁盘容量,这些数据会默认放在feat_cache文件夹下,有SSD可以考虑放SSD里面。

(1)下载VOCdevkit包

把其中的VOCcode文件夹放在datasets\VOCdevkit2007文件夹下。

(2)修改VOCinit.m

VOC2007=false改为VOC2007=true

(3)下载VOC2007数据

datasets\VOCdevkit2007文件夹下新建一个文件夹,命名为VOC2007,把traintestJPEGImagesAnnotationsImageSets都合并放在下面(血泪经验,多次出bug并调试)注意:不要把VOCevaldet.m覆盖了,否则后面会报错。

(4)训练前的数据准备

在我的实验中,为了节约时间和存储空间,训练样本和测试样本一共只用了1500个,也就是说把ImageSets\Main中trainval/train/val/test从1500以后的都删除,AnnotationsJPEGImages中的注解和图片1500以后的也删除。本次只是调试,以后用自己的数据可以随便决定。

(5)开始训练

直接运行函数来训练:

Script_spp_voc()

记录遇到的问题:

  • GPU显存不足而崩溃

在生成缓存文件的时候,总会在第27个就停止运行,崩溃,这个问题困扰了很久。因为每次崩溃都要重启,还得在资源管理器把MATLAB的进程关掉,调试过程非常麻烦。
单步调试了很久,终于找到了原因,这个图片的宽高比太大,SPP会按短边将图像缩放到[480,576,688,864,1200]这几个尺度,以后来会遇到的000109.jpg为例,当短边缩放到1200,长边会缩放到大约2400,这超过了GPU的计算范围,因此会崩溃,把选择模型的条件改成if ~use_gpu || (numel(resized_im(:,:,1)) > 1200*2400*2/3)
处理到000262.jpg的时候,居然还是崩溃了,它的尺寸是500*196,缩放后变成3062*1200,看来也超过了CPU的处理范围,因此在上面语句之前加上一个while循环,限制图片的最大尺寸。即对spp_features_convX.m做如下修改:
这里写图片描述

即添加:

while (numel(resized_im(:,:,1)) > 1200*2400)
        im_resized_width = im_resized_width/1.1;
        im_resized_height = im_resized_height/1.1;
        resized_im = imresize(im, [im_resized_height, im_resized_width], 'bilinear', 'antialiasing', false);
end

两个判断条件那里具体修改为多少要根据自己的CPU和GPU的显存大小来决定,自己试几次就知道了。
同理,没有GPU的要把GPU参数设为0,否则后果应该很严重。但这样会导致速度很慢,GPU和CPU计算速度差距较大。
这里写图片描述

一个一劳永逸的方法是把缩放到1200的这个给删了。

  • 内存不足而崩溃

又遇到新的bug,是微调这一步出现的,提示内存不足,因为图片太大,所以要处理的数据量也实在太大了,于是手动把虚拟内存给调大吧,解决了。
后来遇到的问题都是文件名没设置对导致的,单步调试找到出错位置就能解决。

  • VOCevaldet.m参数出错

微调完以后又遇到参数个数过多的问题,单步调试发现问题出在VOCevaldet.m上,调用时的参数多了一个,原因见2.(3),感谢师弟指出原因。


3. 使用自己训练的模型

训练出来的模型会被放在cachedir\Zeiler_conv5_ft(5s_flip)_fc7\voc_2007_trainval中,名字叫spp_model
用于检测单张图像的spp_demo(),默认用的是作者提供的spp_model,现在要用自己的模型检测图像,就改一下spp_demo.m中的spp_model_file,用我们自己的spp_model

spp_model_file = '.\cachedir\Zeiler_conv5_ft(5s_flip)_fc7\voc_2007_trainval\spp_model.mat';

想用GPU的话就把use_gpu设为true,这时候就要相应地把spm_im_size = [480 576 688 874 1200];中的1200删掉,以免超过了GPU计算范围,导致速度太慢。

spp_demo()

仅用1500个样本,20个类,只迭代20000次,这个效果不错了,大约用了5.5s。
这里写图片描述

注意:

  1. 整个过程中有几处MATLAB可能会崩溃,这时候要把MATLAB关掉,还要把任务管理器中的MATLAB进程kill掉,再重新打开MATLAB试试。如果重新打开MATLAB还遇到相同的问题,那就应该是超出计算范围了,具体位置单步调试自己找。
  2. 遇到问题需要重新训练,有时候需要把之前的缓存文件删掉,imdb\cache中是imdbroidb的缓存,feat_cache\Zeiler_conv5中是feature的缓存,其他地方不清理也没太大问题。
  3. finetune的速度非常慢,按照原代码中设定的需要迭代200000次,在我的电脑上需要运行将近20个小时,而且很有可能中途崩溃,因此我在调试的时候把它改成迭代20000次,在第16000次迭代时达到了最佳,并保存为文件FT_iter_16000,下一次可以把spp_finetune_voc这一行注释掉,直接从finetune文件载入。
  4. 上面的资源很有可能下载不到,我把我用到的资源打包上传到百度云盘了。
    http://pan.baidu.com/s/1caNPCy
3
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:210510次
    • 积分:2488
    • 等级:
    • 排名:第15422名
    • 原创:36篇
    • 转载:4篇
    • 译文:2篇
    • 评论:198条
    最新评论