如何在小于目标尺寸的区域进行ROI-Pooling?

时间:2018-01-09 08:20:46

标签: python image tensorflow classification detection

我目前正试图从here获得更快的R-CNN网络,以便在具有张量流的窗口中工作。为此,我想重新实现ROI-Pooling层,因为它不能在windows中工作(至少不适用于我。如果你有任何关于移植到具有张量流的窗口的提示,我将非常感谢你的评论!)。根据{{​​3}}网站,你所做的是,你从你的特征地图中获取你建议的roi,并将其内容最大化为固定的输出大小。以下完全连接的层需要此固定输出,因为它们只接受固定大小的输入。

现在的问题是:

在转换池之前的最后一个卷积层conv5_3之后,由区域提议网络产生的框大多为5x5像素。这是完全正常的,因为我想要检测的对象通常在原始图像中具有80x80像素的尺寸(由于合并的下采样因子是16)。但是,我现在必须最大化5x5像素的区域并将其扩展到7x7,这是ROI-Pooling的目标大小。我的第一次尝试只是做插值不起作用。此外,用零填充不起作用。我的课程似乎总是得到相同的分数。

我做错了什么吗?我不想改变任何图层的尺寸,我知道我训练有素的网络一般都有效,因为我在我的数据集上有Linux运行的参考实现。

非常感谢您的时间和精力:)

2 个答案:

答案 0 :(得分:0)

现在有一个正式的TF实现Faster-RCNN,以及其他对象检测算法,在Object Detection API中你应该检查一下。

如果您仍想自己编码,我想知道与您完全相同的事情,并且无法找到关于您应该如何做的答案。我的三个猜测是:

  • 插值,但它改变了特征值,因此它会破坏一些信息......

  • 仅通过复制每个单元格7次调整大小为35x35然后最大池化为7x7(您不必实际调整大小,然后进行池化,例如在1D中它基本上减少了自身到output[i]=max(input[floor(i*5/7)], input[ceil(i*5/7)]),在2D中有类似的最多超过4个元素 - 小心,我可能已经忘记了一些+ 1 / -1或其他东西 - )。我看到至少有两个问题:一些价值观过多,被复制的比其他价值高;但更糟糕的是,输出中根本不会复制某些(小)值! (你应该避免,因为你可以在输出中存储比输入中更多的信息)

  • 确保所有输入要素值至少在输出中至少复制一次,位于最佳位置(基本上将input[i]复制到output[j] j=floor((i+1)*7/5)-1))。对于剩余的点,要么留0,要么插值。我认为这个解决方案是最好的,也许是插值,但我真的不确定。

看起来smallcorgi's implementation使用我的第二个解决方案(没有实际调整大小,只使用最大池),因为它与输入大于输出的情况相同。

答案 1 :(得分:0)

我知道已经晚了,但我发布了此答案,因为它可能会帮助其他人。我编写了一个代码,解释了在池和区域中,roi池如何在不同的高度和宽度条件下工作。 您可以在github中看到代码的链接: https://github.com/Parsa33033/RoiPooling