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

2024-04-27 23:25:36 发布

您现在位置:Python中文网/ 问答频道 /正文


我目前正在尝试让更快的R-CNN网络从here使用tensorflow在windows中工作。为此,我想重新实现ROI池层,因为它在windows中不起作用(至少对我来说不行)。如果您有任何关于使用tensorflow移植到windows的提示,我将非常感谢您的评论。根据this网站的说法,你要做的是,从你的特征图中提取你建议的投资回报率,然后把它的内容最大限度地集中到一个固定的输出大小。以下完全连接的层需要此固定输出,因为它们只接受固定大小的输入。在


现在的问题是:

在roi池之前的最后一个卷积层conv5_3之后,区域建议网络产生的方框大小大多为5x5像素。这是非常好的,因为我要检测的对象在原始图像中的尺寸通常为80x80像素(由于合并而导致的下采样因子是16)。但是,我现在必须将池的面积最大化为5x5像素,并将其放大到7x7,这是ROI池的目标大小。我第一次尝试简单地做插值并没有成功。另外,用0填充也不起作用。我的课似乎总是一样的。在

我做错什么了吗?我不想改变任何层的维度,我知道我训练过的网络一般都能工作,因为我的数据集上运行着Linux中的参考实现。在

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


Tags: 网络内容here网站windowstensorflow评论像素
2条回答

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

现在有了一个官方的TF实现更快的RCNN和其他对象检测算法,在它们的Object Detection API中,您可能应该检查一下。在

如果你还想自己编写代码,我想知道和你完全一样的事情,却找不到你该怎么做的答案。我的三个猜测是:

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

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

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

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

相关问题 更多 >