先按VOC数据集做好了自己的数据集。
1. 训练faster rcnn时出现如下报错:
File "/py-faster-rcnn/tools/../lib/datasets/imdb.py", line 108, in append_flipped_images assert (boxes[:, 2] >= boxes[:, 0]).all() AssertionError
编了代码查找标签坐标,发现确实存在坐标为0的情况,说明标签生成是0-base(以0为基准)。
标准的VOC2007 的矩形标注坐标是以1为基准的(1-based),而在处理图像坐标都是0起始的(0-based)。
所以在faster rcnn源码中才要对从xml文件中读取的xmin,ymin,xmax,ymax 统统减1将坐标变为我们做数据处理时所需要的0-based坐标。
如果Xmin为0,减一后变为65535。
(不推荐修改源码)我把xml文件中的xmin,ymin,xmax,ymax全部+1处理。
# py-faster-rcnn/lib/datasets/pascal_voc.py (line 207)
# 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的含义
对于一个矩形(x,y,w,h)定义,xmin,ymin,xmax,ymax的准确含义是什么呢?,
xmin,ymin一看就明白,我们理解它为矩形的左上角坐标(x,y),那么xmax,ymax是什么呢?
根据上面的Python代码最后一行,就可以推断应该是:
xmax=x+w-1,ymax=y+h-1
所以应当如下生成:
createNode("xmin", rect.x + 1),
createNode("ymin", rect.y + 1),
createNode("xmax", rect.x + rect.width),
createNode("ymax", rect.y + rect.height)
这里width,height恰恰不能加+1,因为xmax,ymax是指矩形右下角1-base坐标(不是在矩形外)
如果加了1,就是矩形外了。
矩形越界
如果你已经注意到了上面的这个问题,已经将你的标注xml中的坐标统一为1-based坐标了,但在执行训练的时候还是会有上面的Assert错误,那么就要好好检查你的标注数据中,是不是有超出图像范围的矩形。如果有,一定要修正。
是的,我修改样本是1-base之后还是不行,依然报如上错误。
我对xml文件中xmin,ymin,xmax,ymax的理解有问题,我以为它是左下角和右上角的坐标,但是我错了,它应该是左上角和右下角的坐标,其图片坐标系原点在左上角,x轴向右延伸,y轴向下延伸。当标注矩形的边与图像的边缘重合的时候,也会产生标题中的Assert断言错误。因此, 很有可能是坐标错误导致矩形越界的错误。
训练缓存清空
如果你确定没有越界的矩形却还是会报这个Assert错误,那么有可能是缓冲区中的数据乱了。
把py-faster-rcnn/data/cache中的文件和
py-faster-rcnn/data/VOCdevkit2007/annotations_cache中的文件统统删除(如果有的话),再来试试吧。我就因为这个问题被折腾了一天。
参考:http://blog.csdn.net/10km/article/details/64641322