记一次配使用maskrcnn-benchmark的惨痛经历,因为要用到分割,所以就使用自己的数据集转成coco格式后用maskrcnn-benchmark来训练得到目标的轮廓,但是在运行的过程中报了两个错误,很致命。
首先配置好环境,这里我就犯了一个错误,把pytorch版本装的太高了,我用的是pytorch==1.4.0,结果训练的时候报错selected_polygons.append(self.polygons[i])
IndexError: list index out of range
我查了之后发现pytorch在1.2版本以后对数据的返回值做了修改,所以我按照issue上的方法对代码进行了修改,如下
https://github.com/facebookresearch/maskrcnn-benchmark/issues/725
改完之后可以训练了,但是轮廓却检测不到,通过实验我发现还是torch.uint8和torch.bool的原因。最后,,,,我还是更换了pytorch的版本,,但还是不行,我开始意识到这是我的数据出现问题了,因为总是训练几千轮开始报索引越界的错误,后来我看coco的代码,发现了一个地方,就是数据中的segmentation部分有的坐标个数是小于6个的,这样就会被认作无效数据从而不参与训练,但是在代码中索引不会进行减一操作。所以,我把数据集中长度小于6的标注删除了,终于成功了。。。
class PolygonInstance(object):
"""
This class holds a set of polygons that represents a single instance
of an object mask. The object can be represented as a set of
polygons
"""
def __init__(self, polygons, size):
"""
Arguments:
a list of lists of numbers.
The first level refers to all the polygons that compose the
object, and the second level to the polygon coordinates.
"""
if isinstance(polygons, (list, tuple)):
valid_polygons = []
for p in polygons:
p = torch.as_tensor(p, dtype=torch.float32)
if len(p) >= 6: # 3 * 2 coordinates
valid_polygons.append(p)
polygons = valid_polygons