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層也是一樣重新命名就好
六、結果
正在跑,跑完貼結果...
參考文獻: