faster-rcnn训练自己的数据集
按照下面这个博客修改faster-rcnn源码,训练自己的数据:
http://blog.csdn.net/sinat_30071459/article/details/51332084
训练自己的数据的时候如果提示assert (boxes[:, 2] >= boxes[:, 0]).all()这样的AssertionError,有下面几种解决方法:
1、为了防止和之前的模型搞混,训练前把output文件夹删除(或改个其他名),还要把py-faster-rcnn/data/cache中的文件和
py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件删除(如果有的话)。
2、因为VOC2007 的矩形标注坐标是以1为基准的(1-based),而我们在处理图像坐标都是0起始的(0-based)。在py-faster-rcnn/lib/datasets/pascal_voc.py (line 207)文件中会对Xmin,Ymin,Xmax,Ymax进行减1操作。
# Make pixel indexes 0-based
x1 = float(bbox.find('xmin').text) - 1 y1 = float(bbox.find('ymin').text) - 1 x2 = float(bbox.find('xmax').text) - 1 y2 = float(bbox.find('ymax').text) - 1 cls = self._class_to_ind[obj.find('name').text.lower().strip()] boxes[ix, :] = [x1, y1, x2, y2] gt_classes[ix] = cls overlaps[ix, cls] = 1.0 seg_areas[ix] = (x2 - x1 + 1) * (y2 - y1 + 1)
xmin,ymin,xmax,ymax的含义:
xmin,ymin为矩形的左上角坐标(x,y),xmax=x+w-1,ymax=y+h-1
错误来自于py-faster-rcnn/lib/datasets/imdb.py文件中append_flipped_images(self)函数中:
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 xrange(num_images): boxes = self.roidb[i]['boxes'].copy() oldx1 = boxes[:, 0].copy() oldx2 = boxes[:, 2].copy() boxes[:, 0] = widths[i] - oldx2 - 1 print boxes[:, 0] boxes[:, 2] = widths[i] - oldx1 - 1 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
所以在生成XML文件的时候就一定要以1为基准(1-based)来生成。
3、如果已经将你的标注xml中的坐标统一为1-based坐标了,但在执行训练的时候还是会有上面的Assert错误,那么就要好好检查你的标注数据中,是不是有超出图像范围的矩形。如果有,一定要修正。