Faster-RCNN 如何锚定与 RPN 层中的滑块一起工作?

数据挖掘 图像分类 计算机视觉 卷积神经网络 物体检测 更快的rcnn
2021-09-23 12:47:53

我试图了解整个 Faster-RCNN,

来自 https://www.quora.com/How-does-the-region-proposal-network-RPN-in-Faster-R-CNN-work

然后在这些特征图上在空间上运行一个滑动窗口。滑动窗口的大小为 n×n(这里为 3×3)。对于每个滑动窗口,会生成一组 9 个锚点,它们都具有相同的中心 (xa,ya)(xa,ya),但具有 3 个不同的纵横比和 3 个不同的比例,如下所示。请注意,所有这些坐标都是相对于原始图像计算的。

在此处输入图像描述

我认为它比其他文章更清楚,但仍然很难理解特征图是如何生成的。

我看到了另一个流程图片: 在此处输入图像描述 在此处输入图像描述

在此处输入图像描述

问题,我写了下面的步骤,例如:

  1. 如果输入是 600x1000x3 pic
  2. 通过 VGG16 convnet,第 13 层输出特征图为 40x60x512
  3. 使用 3x3 滑动窗口,生成 1x1x512 特征图 ???

在这里,3x3 滑动窗口如何使用一组 9 个锚点???

抱歉,我对对象检测和图像处理真的很陌生。

我对这些步骤只有一点了解,我知道9 个锚点形状(不是真正的锚点)用于生成很多锚点(在这种情况下为 2400*9)。

我只能想象使用 9 个锚形状来滑动原始图像以获得所有 IoU 。我不明白如何在此处的 conv 特征图中使用 3x3 滑动窗口。

我知道如何选择锚点, 2400*9 -> ignore cross-boundary -> 6000 -> apply NMS -> 2000 ,在每个小批量中,它从 2000 中随机选择 512 个锚点。

我无法理解的是具有 9 个锚形状的 3x3 幻灯片。因为从原始论文中,锚点是 16,高度从 11 到 273 。我不认为它使用 13 层 conv 输出特征图来计算 IoU 。锚点必须应用在原始图像中,那么 3x3 滑动窗口在做什么?

4个回答

对于每个锚点,您会找到与图片中的对象的 IoU,如果 IoU 超过阈值,则设置为 1,如果低于较低的 tjreshold(例如 0.3),则设置为 0。如果是命中,则计算 bbox 偏移量,预测与真实 bbox 之间的距离。因此有两个损失函数:object/bg 和 bbox 回归

在它的核心,如果你查看源代码,RPN 只是一个卷积层,其映射数=每个位置的锚点数,在你的情况下它是 9。作为任何卷积层,它都连接到前一层(也卷积,有 256 个地图)使用内核,在你的例子中是 3x3。这正是“为 conv 上的每个滑动窗口生成 9 个锚点”。特征图)说。所有 9 个 RPN 映射的大小相同,因此每个值(i,j) 在每个特征图中是该位置对应锚点的得分 (i,j). 另一个convlayer9x4还为每个锚点创建特征图以预测边界框偏移。这两个卷积层中的值是在前馈阶段获得的。

由于所有anchor的大小和纵横比不同,AnchorGenerator需要计算它们的实际参数 (x,y,h,w). 为此,它需要图像大小、输出特征层和锚点超参数。它将特征图大小映射到图像大小以获得单元格网格,并为每个单元格(位置)导出锚参数。所以现在你已经拥有了计算损失所需的一切:ground truth(类+框坐标)、锚坐标和分数+框偏移预测。对于与object>threshold重叠的anchor(anchor coords vs gt box coords),RPN从第一个conv层的相应特征图中获取分数预测和来自第二个conv层的4个预测框偏移量。该分数用于二元交叉熵损失,即 MSE 类型损失中的框预测(例如 Smooth1Loss)。Anchor输出偏移预测(box-anchor),gt标签是gt box和anchor之间的偏移。

完毕!

现在,框预测是下一层(RoIAlign)的输入。

一个像素确实映射到 9 个锚点。但是 1 x 1 之前的 3 x 3 卷积层可能旨在实现额外的非线性(额外的 3 x 3 con 层产生same宽度和高度作为输入)。

所以,不是 9 个像素映射到 9 个锚点。

这是来自 CS231n 的视频,在 51 分钟时展示了上述想法。

3*3 滑动窗口用于计算 RPN 网络的回归和分类损失,确定边界框以及是否包含对象!