我刚刚从头开始在Pytorch中实现了Mask RCNN,下面是代码:https://github.com/arthurhero/Mask_R-CNN_Pytorch/blob/master/masker_ops.py
我在两台单独的机器上只有一台GTX1080和一台Quadro6000,因此每次迭代只能训练2张img。我的问题是,掩码RCNN通常需要花费多长时间?我怎么知道它是否在正确的轨道上?
现在,我只训练RPN头(所以这是四个“实用步骤”中的第一个)。经过一夜的训练,该模型仍然给我很多“ 0个正bboxes”的通知,即,当它为img的每个bbox分配标签时,它们全都是负的(没有足够大的真实值) bbox)。而且,随着培训的进行,似乎“ 0阳性bbox”通知的数量并没有减少。
我想到了几个原因。
现在,如果其中一个img具有“ 0个正bboxes”,我将跳过整个批处理,只是因为它将使张量形状对于以后的计算很奇怪。人们通常如何处理这种情况?会给培训带来太多的效率低下吗?
学习率可能太大?我目前使用的是0.02。但是由于我的批处理量只有2个,这个学习率是否过高?
我对将偏移量应用于锚点的方式有些疑问...当前,RPN头返回相对于锚点框的dy,dx,logh,logw。将这些偏移量应用于锚框的代码如下:
center_y = center_y + (dy*height)
center_x = center_x + (dx*width)
height = height * torch.exp(dh)
width = width * torch.exp(dw)
生成的bbox可能超出了原始锚点的边界(如果dy和dx大)。但是,当将此bbox分配为“负”时,如果原始锚点中心的类标签为正,则将受到惩罚。这对我来说似乎不公平……我在这里误会了吗?还是没关系?我们是否应该对这些偏移量施加一些严格的约束,以使生成的bbox距离锚点不会太远?
for循环太多。这是ROIAlign层和“建议”过滤器层的问题。由于每个img可能具有不同数量的已过滤提议,并且仅仅是因为很难操纵5D张量...我通常只是沿批处理轴拆分批处理bbox或提议,并使用for循环处理集合一次提交一张img的提案。但是从我对OS的有限了解来看,GPU在执行串行工作方面似乎很糟糕。这些循环是否拖累了训练的速度?还有没有更好的方法可以在没有for循环的情况下在5d张量上实现这些计算?
GPU太少。基本问题:是否有可能仅在一个GPU上训练Mask RCNN?如果不是,对于价格便宜的对象遮罩有何建议?我听说YOLO在计算上也非常昂贵...
非常感谢!
-Z