您如何在小于目标大小的区域上进行投资回报率池化?



我目前正在尝试从这里获取更快的R-CNN网络,以便在带有tensorflow的窗口中工作。为此,我想重新实现 ROI 池化层,因为它在窗口中不起作用(至少对我来说不是。如果您有任何关于使用张量流移植到窗口的提示,我将非常感谢您的评论!根据该网站,您所做的是,从功能图中获取建议的投资回报率,并将其内容最大化为固定的输出大小。以下全连接层需要此固定输出,因为它们仅接受固定大小的输入。


现在的问题是以下问题:

在 conv5_3(ROI 池化之前的最后一个卷积层)之后,区域提案网络生成的框大小大多为 5x5 像素。这完全没问题,因为我要检测的对象在原始图像中的尺寸通常为 80x80 像素(由于池化导致的缩减采样因子为 16)。但是,我现在必须将最大池化面积为 5x5 像素,并将其放大到 7x7,这是 ROI 池化的目标大小。我第一次尝试简单地进行插值没有奏效。此外,用零填充不起作用。我的课程似乎总是得到相同的分数。

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

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

现在有一个官方的TF实现Faster-RCNN和其他对象检测算法,在他们的对象检测API中,你可能应该检查一下。

如果你仍然想自己编码,我想知道和你完全相同的事情,找不到你应该怎么做的答案。我的三个猜测是:

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

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

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

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

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

最新更新