1

我刚刚在 Pytorch 中从头开始实现了一个 Mask RCNN,代码如下:https ://github.com/arthurhero/Mask_R-CNN_Pytorch/blob/master/masker_ops.py

我在两台不同的机器上只有一个 GTX1080 和一个 Quadro6000,所以每次迭代只能训练 2 个 imgs。我的问题是,Mask RCNN 通常需要多长时间才能收敛?我怎么知道它是否在正确的轨道上?

现在我只训练 RPN 头(所以这是四个“实用步骤”中的第一个)。经过一晚的训练,这个模型仍然给我很多“0 positive bboxes”的通知,即当它为一个img的每个bbox分配标签时,它们都是负数(没有足够大的iou和ground-truth框)。并且似乎“0 正 bboxes”通知的数量并没有随着训练的进行而减少。

我想了几个原因。

  1. 现在,如果其中一个 img 具有“0 个正 bbox”,我将跳过整个批次,只是因为它会使张量形状对于以后的计算变得奇怪。人们通常是这样处理这种情况的吗?是否给培训带来了太多的低效?

  2. 学习率可能太大了?我目前正在使用论文中的 0.02。但是由于我的batch size只有2,这个学习率是不是太大了?

  3. 我对将偏移量应用于锚点的方式有点怀疑……目前,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被赋值为“负”时,如果标签为正,则位于原始anchor中心的类标签将受到惩罚。这对我来说看起来不公平......我在这里有误会吗?或者它只是无关紧要?我们是否应该对这些偏移量施加一些严格的限制,以使生成的 bbox 不会离锚点太远?

  4. for 循环太多。这是 ROIAlign 层和 Proposal 过滤器层的问题。由于每个 img 可能有不同数量的过滤提案,也只是因为很难操纵 5D 张量......我通常只是沿批处理轴拆分 bbox 或提案批次,并使用 for 循环来处理集合一次只有一个 img 的提案。但是从我对操作系统的有限了解来看,GPU 似乎不擅长做串行工作。那些 for 循环会拖累训练速度吗?有没有更好的方法在没有 for 循环的情况下在 5d 张量上实现这些计算?

  5. GPU太少了。基本问题:是否甚至可以仅在一个 GPU 上训练 Mask RCNN?如果不是...对于成本更低的对象掩蔽器有什么建议?我听说 YOLO 的计算成本也很高...

非常感谢!!

-Z

4

0 回答 0