训练自己的数据遇到的问题

 先按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

posted on 2017-07-03 15:29  塔上的樹  阅读(662)  评论(0编辑  收藏  举报