Ubuntu14.04下Fast-rcnn训练自己的数据

来源:互联网 发布:wamp修改php.ini路径 编辑:程序博客网 时间:2024/06/05 19:53

        ubuntu14.04下Fast-rcnn训练自己的数据

1.     首先还是数据格式问题

我们首先要明确自己的数据结构,我是用的是Annotations,JPEGImages,ImagesSet这种格式,Annotation里面我使用的是xml格式,用工具labelImg做出来的标签完全可以。JPEGImages里面存放的图片时以六位数命名的格式如:000001.jpg,图片最好不要太瘦也不要太长,imageset我们只要修改train.txt,trainval.txt,val.txt,test.txt这四个即可,这四个txt我是在windows10下做出来的,怎么访问某目录下的图片并输出到txt中?我是通过我的bat脚本如:Echo  Off

SetLocal EnableDelayedExpansion

For %%i In (*.JPG)Do (

   echo %%~i<nul>>trainval.txt

   )

Pause>nul

这个脚本是万能的,输出如下:


之后需要把.JPG删除掉,用txt中的替换功能就好了。

 

这个脚本是万能的,如果需要,还可以将脚本改成如下形式:

Echo Off

SetLocal EnableDelayedExpansion

For %%i In (*.jpg)Do (

   Set /A Num=1

  echo %%~i>>SVM_DATA.txt

   echo !Num!>>SVM_DATA.txt

   )

Pause>nul

这个也就可以想到在后面会有换行的标签1,如图;


 

如果不想要换行的标签,还可以再改,如:

Echo  Off

SetLocalEnableDelayedExpansion

For %%i In(*.JPG)Do (

    Set /A Num=1

    set /p=%%~i< nul>>SVM_DATA.txt

    echo !Num!>>SVM_DATA.txt

   )

Pause>nul

可以知道结果,就不截图了,

如:000001.JPG1

000002.JPG 1

以上只是数据的前期准备。

2.     接着是数据的候选区域的生成,

可以知道我们当时运行和训练fastrcnn时都会去找官方数据,那官方的数据selective_serach_data怎么做成的呢?

先给个链接去看下:https://github.com/zeyuanxy/fast-rcnn/tree/master/help/train

我们首先去下载官方的selective_serach_data,然后我们在matlab下打开,会发现其实官方数据中每一个.mat数据只有两个数据boxes和images,然后细心的同学会发现,其实我们自己去下载selective_search工具就会生成这两个数据,我们只要保存好了,但是我们做的只是一张图片,我们怎么保存所有图片,这个时候我们就应该按照上面网址说的那样,找到selective_search工具(python版本),找到selective_search.m,然后对他修改,先把% Process all images.后面的全部删除,再加上我们下面的语句,如我的:

image_db = '/home/XXX/fast-rcnn/data/VOCdevkit2007/VOC2007/';

image_filenames = textread([image_db '/data/ImageSets/Main/train.txt'],'%s', 'delimiter', '\n');

for i = 1:length(image_filenames)

   if exist([image_db '/JPEGImages/' image_filenames{i} '.jpg'], 'file') ==2

        image_filenames{i}= [image_db '/JPEGImages/' image_filenames{i} '.jpg'];

   end

   if exist([image_db '/JPEGImages/' image_filenames{i} '.png'], 'file') ==2

        image_filenames{i} = [image_db '/JPEGImages/'image_filenames{i} '.png'];

   end

end

selective_search_rcnn(image_filenames,'voc_2007_train.mat');

  因为有四个,就不展示,按照那样改就行,但是需要注意的是你会发现你生的.mat数据中只有all_boxes,没有images,其实不需要images,还有一个重要问题,你不修改会出错误:keyerror:boxes,为啥会错误?那是因为他从.mat数据中读取数据会找到关键字,boxes其实就是关键字,这时候需要我们把生成的.mat导入到matlab中,把all_boxes改成boxes,再保存,完美结合!!!!!!!!!!!!!

 

    还有一个注意点:在上面我给的连接中作者是训练自己的数据集,并改名字,我是接着用pascal_voc数据名字,因为我不太想改,就没改,需要的同学可以按照上面改。因为已改数据集名字,我觉得很多东西都要改。很麻烦!

3.  修改pascal_voc.py和自己需要用的网络模型train.prototxt

在pascal_voc.py修改如下:在第28行修改自己需要用到类别!如:self._classes=(‘_background_’,’car’)

在train.prototxt中修改如下:


我呢是把num_classes to 2

     num_output in the cls_score layer to 2

     num_output in thr bbox_pred layer to 2*4

4.  开始训练

以上是数据准备,下面开始训练,我用的是vgg_cnn_m_1024

./tools/train_net.py –gpu 0 –solver models/VGG_CNN_M_1024/solver.prototxt  --iters 40000 –weight data/imagenet_models/VGG_CNN_M_1024.v2.caffemodel

不过,我还是遇到了一个坑。是在训练时报的这样一个错

roidb[i]['image'] = imdb.image_path_at(i)
IndexError: list index out of range。

这个问题请到fast-rcnn-master/data/cache/删掉原来的东西。

5.  等训练结束后,会发现output有输出的caffemodel

怎么进行测试呢?tools下有工具demo.py,但是直接改成我们需要的图片的是不行的,首先,在第27行改成我们需要测试的类别:如:classes=(‘_background_’,’car’),接着还要修改NETS,我是把vgg16替换成我生成的caffemodel ,如:

NETS = {'vgg16': ('VGG16',

                 'vgg16_fast_rcnn_iter_40000.caffemodel'),

       'vgg_cnn_m_1024': ('VGG_CNN_M_1024',

                          'vgg_cnn_m_1024_fast_rcnn_iter_40000.caffemodel'),

       'caffenet': ('CaffeNet',

                     'caffenet_fast_rcnn_iter_40000.caffemodel')}

最后还有一件重要的事,测试图片也要生成.mat数据,跟前面一样的方法:用selective_search生成.mat数据,要把all_boxes改成boxes,如果这样你就保存了,后面会遇到一个问题:valueError:setting an array element with a sequence,这是因为你会发现测试图片的boxes矩阵和官方图片的boxes矩阵有差异,官方的数据矩阵是m*n型,而我们的数据矩阵的1*1型,其实我们只要把测试图片的boxes{1,1}内容读取出来就是符合官方数据的形式,我们只要在matlab命令行输入:boxes=boxes{1,1},他就会把细胞元组的内容读取复制给boxes,最后还要将boxes保存,并命名为:000001_boxes.mat。这里看个人图片,只是个例子!!!

 

原创粉丝点击