1. 程式人生 > >Faster R-cnn :訓練自己的資料集 caffe/python/windows 過程記錄

Faster R-cnn :訓練自己的資料集 caffe/python/windows 過程記錄

一、製作自己的資料集:為了方便直接新建與VOC2007一樣名稱的資料夾

VOC2007資料夾中包含:

1.Annotations中包含:

.xml檔案是由labellmg.exe標定ground truth後生成的檔案:

2.ImageSets中包含:--ImageSets--Main--test、train、val、trainval.txt

 

有一個簡單的生成TXT的程式碼:

import os  
import random  
  
trainval_percent = 0.66  
train_percent = 0.5  
xmlfilepath = 'C:\\Users\\Admin\\Desktop\\VOC2007\\Annotations'  
txtsavepath = 'C:\\Users\\Admin\\Desktop\\VOC2007\\ImageSets\\Main'  
total_xml = os.listdir(xmlfilepath)  
  
num=len(total_xml)  
list=range(num)  
tv=int(num*trainval_percent)  
tr=int(tv*train_percent)  
trainval= random.sample(list,tv)  
train=random.sample(trainval,tr)  
  
ftrainval = open('C:\\Users\\Admin\\Desktop\\VOC2007\\ImageSets\\Main\\trainval.txt', 'w')
ftest=open('C:\\Users\\Admin\\Desktop\\VOC2007\\ImageSets\\Main\\test.txt', 'w')
ftrain = open('C:\\Users\\Admin\\Desktop\\VOC2007\\ImageSets\\Main\\train.txt', 'w')  
fval = open('C:\\Users\\Admin\\Desktop\\VOC2007\\ImageSets\\Main\\val.txt', 'w')  
  
for i  in list:  
    name=total_xml[i][:-4]+'\n'  
    if i in trainval:  
        ftrainval.write(name)  
        if i in train:  
            ftrain.write(name)  
        else:  
            fval.write(name)  
    else:  
        ftest.write(name)  
  
ftrainval.close()  
ftrain.close()  
fval.close()  
ftest .close() 

3.JPEGImages中的內容:圖片名稱應該與VOC2007相同,是6位順序數

至此資料集建立完成,將VOC2007資料夾放到..\py-faster-rcnn-master\data\VOCdevkit2007檔案中,VOCdevkit2007沒有的話自己新建一個就好。

二、修改prototxt檔案

prototxt檔案在models資料夾下:..\py-faster-rcnn-master\models\pascal_voc\VGG16,我選擇的是faster_rcnn_end2end,為了不影響原有的檔案,我新建了一個資料夾faster_rcnn_end2end_boat,然後將faster_rcnn_end2end中的3個prototxt檔案複製到新建的資料夾中去,並按如下方式更改。

1.train.prototxt:

input-data:n

roi-data:n

cls_score:n(我這裡是因為出現了問題3,所以將層重新命名了)

bbox_pred:n*4(我這裡是因為出現了問題3,所以將層重新命名了)

2.test.propotxt:

cls_score:n

bbox_pred:n*4

3.solve.propotxt

至此,所有prototxt檔案更改完畢。

三、更改程式碼:..\py-faster-rcnn-master\lib\datasets資料夾下的程式碼

1.pascal_voc.py:

class pascal_voc(imdb):  
    def __init__(self, image_set, year, devkit_path=None):  
        imdb.__init__(self, 'voc_' + year + '_' + image_set)  
        self._year = year  
        self._image_set = image_set  
        self._devkit_path = self._get_default_path() if devkit_path is None \  
                            else devkit_path  
        self._data_path = os.path.join(self._devkit_path, 'VOC' + self._year)  
        self._classes = ('__background__', # always index 0  
                         '你的標籤1','你的標籤2',你的標籤3','你的標籤4'  
                      ) #需要更改的地方改成自己要的類別,小寫字母

2.imdb.py:

def append_flipped_images(self):  
        num_images = self.num_images  
        widths = [PIL.Image.open(self.image_path_at(i)).size[0]  
                  for i in xrange(num_images)]  #更改的部分
        for i in range(num_images):  
            boxes = self.roidb[i]['boxes'].copy()  
            oldx1 = boxes[:, 0].copy()  
            oldx2 = boxes[:, 2].copy()  
            print boxes[:, 0]  
            print boxes[:, 0]  
            assert (boxes[:, 2] >= boxes[:, 0]).all()  
            entry = {'boxes' : boxes,  
                     'gt_overlaps' : self.roidb[i]['gt_overlaps'],  
                     'gt_classes' : self.roidb[i]['gt_classes'],  
                     'flipped' : True}  
            self.roidb.append(entry)  
        self._image_index = self._image_index * 2  

還要把py-faster-rcnn/data/cache中的檔案和py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的檔案刪除(如果有的話)。

四、開始訓練

1.訓練格式:

./tools/train_net.py --gpu 0 --solver path/to/solver.prototxt --weights path/to/pretrain_model --imdb voc_2007_trainval --iters 100000 --cfgs experiments/cfgs/faster_rcnn_end2end.yml

我自己:train.bat

.\tools\train_net.py --gpu 0 --solver .\models\pascal_voc\VGG16\faster_rcnn_end2end_boat\solver.prototxt --weights .\data\faster_rcnn_models\VGG16_faster_rcnn_final.caffemodel --imdb voc_2007_trainval --iters 100000 --cfg .\experiments\cfgs\faster_rcnn_end2end.yml

2.測試格式:

./tools/test_net.py --gpu 0 --def path/to/test.prototxt --net path/to/your/final.model --imdb voc_2007_test --cfgs experiments/cfgs/faster_rcnn_end2end.yml

五、遇到的問題:

1、AttributeError: 'module' object has no attribute 'text_format'

解決方案:在 ../lib/fast_rcnn/train.py增加一行import google.protobuf.text_format

2.F0615 14:53:28.416858  4384 smooth_L1_loss_layer.cpp:24] Check failed: bottom[0] ->channels() == bottom[1]->channels() (12 vs. 84)

解決方案:一般都是end2end中的train.prototxt的類別沒有改好導致的。

檢查train.prototx中的input-data層的num_classes:n (自己要訓練的類別+1,1代表背景)

                                   roi-data層的num_classes:n

                                   cls_score層的num_output:n

                                   bbox_preda層的num_output:4*n。

3.F0615 14:58:38.421589  7596 net.cpp:757] Cannot copy param 0 weights from layer ‘cls_score’; shape mismatch.Source param shape is 21 4096 (86016); target param shape is 3 4096(12288). To learn this layer’s parameters from scratch rather thancopying from a saved net, rename the layer.

解決方法:我是在訓練過程中遇到的問題,所以將train.ptototxt相應的cls_score重新命名了:cls_score1

                 bbox_pred層也是一樣重新命名就好

六、結果

正在跑,跑完貼結果...

參考文獻: