你如何在小于目标大小的区域上进行 ROI-Pooling?

How do you do ROI-Pooling on Areas smaller than the target size?


我目前正在尝试从 here to work in windows with tensorflow. For that, I wanted to re-implement the ROI-Pooling layer, since it is not working in windows (at least not for me. If you got any tips on porting to windows with tensorflow, I would highly appreciate your comments!). According to this 网站获取 Faster R-CNN 网络,您所做的是,从特征图中获取建议的 roi,并将其内容最大池化为固定的输出大小。以下全连接层需要此固定输出,因为它们只接受固定大小的输入。


现在的问题是:

在conv5_3之后,roi pooling之前的最后一个卷积层,region proposal network产生的框大小大多是5x5像素。这完全没问题,因为我想要检测的对象在原始图像中通常具有 80x80 像素的尺寸(由于池化而导致的下采样因子为 16)。但是,我现在必须最大池化 5x5 像素的区域并将其放大到 7x7,即 ROI 池化的目标大小。我通过简单地进行插值的第一次尝试没有奏效。此外,用零填充也不起作用。我的 类.

似乎总是得到相同的分数

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

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

现在有 Faster-RCNN 和其他目标检测算法的官方 TF 实现,在他们的 Object Detection API 中,您应该检查一下。

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

  • 插值,但是改变了特征值,所以破坏了一些信息...

  • 只需将每个单元格复制 7 次然后最大池化为 7x7 即可将大小调整为 35x35(您不必实际进行调整大小然后进行池化,例如在 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 使用了我的第二个解决方案(没有实际调整大小,只是使用最大池化),因为它与输入大于输出的情况的实现相同。

我知道已经晚了,但我 post 这个答案可能对其他人有帮助。我写了一段代码来解释 roi pooling 如何在 pool 和 region 的不同高度和宽度条件下工作。 你可以在github中看到代码的link: https://github.com/Parsa33033/RoiPooling