首页 > 解决方案 > 关于 RetinaNet 的困惑

问题描述

我最近一直在研究 RetinaNet。我阅读了原始论文和一些相关论文,并写了一篇分享我所学的帖子:http: //blog.zenggyu.com/en/post/2018-12-05/retinanet-explained-and-demystified/。但是,我仍然有一些困惑,我也在帖子中指出了这一点。任何人都可以请赐教吗?

混乱#1

如论文所述,如果其与任何真实情况的 IoU 低于 0.4,则将锚框分配给背景。在这种情况下,对应的分类目标标签应该是什么(假设有K个类)?

我知道 SSD 有一个背景类(总共有 K+1 个类),而 YOLO 预测除了 K 类概率之外,还有一个置信度分数,表示盒子里是否有物体(不是背景)或没有(背景) . 虽然我在论文中没有发现任何表明 RetinaNet 包含背景类的陈述,但我确实看到了这样的陈述:“......,我们只解码来自......的框预测,在阈值检测器置信度为 0.05 之后”,这似乎表示存在置信度分数的预测。但是,这个分数是从哪里来的(因为分类子网只输出了 K 个数字,表示 K 个类别的概率)?

如果 RetinaNet 对目标标签的定义与 SSD 或 YOLO 不同,我会假设目标是一个长度为 K 的向量,其中所有条目均为 0,没有 1。然而,在这种情况下,如果锚定为假阴性,焦点损失(见下面的定义)将如何惩罚锚定?

在此处输入图像描述

在哪里

在此处输入图像描述

混乱#2

与许多其他检测器不同,RetinaNet 使用与类别无关的边界框回归器,分类子网最后一层的激活是 sigmoid 激活。这是否意味着一个锚框可以同时预测多个不同类别的对象?

混乱#3

让我们将这些匹配的anchor box和ground-truth box对表示为${(A^i, G^i)}_{i=1,...N}$,其中$A$代表一个anchor,$G$表示真实情况,$N$ 是匹配数。

对于每个匹配的锚点,回归子网预测四个数字,我们将其表示为 $P^i = (P^i_x, P^i_y, P^i_w, P^i_h)$。前两个数字指定anchor $A^i$ 和ground-truth $G^i$ 的中心之间的偏移量,而后两个数字指定anchor 的宽度/高度与ground-truth 之间的偏移量。相应地,对于这些预测中的每一个,都有一个回归目标$T^i$,计算为anchor和ground-truth之间的偏移量:

在此处输入图像描述

上述等式是否正确?

非常感谢,并随时指出帖子中的任何其他误解!

更新:

为了将来参考,我在研究 RetinaNet 时遇到了另一个困惑(我发现这段对话很闲散):

在此处输入图像描述

标签: deep-learningcomputer-visionobject-detection

解决方案


我是开源视网膜项目fizyr/keras-retinanet的作者之一。我会尽量回答你的问题。

混乱#1

一般来说,在物体检测器中有两种常用的分类分数方法,要么使用 softmax,要么使用 sigmoid。

如果您使用 softmax,您的目标值应该始终是 one-hot 向量,这意味着如果没有对象,您应该将其“分类”为背景(意味着您需要一个背景类)。好处是您的班级分数总和为 1。

如果您使用 sigmoid,则限制较少。在我看来,这有两个好处,你不需要背景类(这使得实现更清晰),它允许网络进行多类分类(虽然我们的实现不支持它,但理论上是可能的)。一个小的额外好处是您的网络略小,因为与 softmax 相比,它需要少分类一个类,尽管这可能可以忽略不计。

由于py-faster-rcnn的遗留代码,在实现视网膜网络的早期,我们使用了 softmax 。我联系了 Focal Loss 论文的作者,询问了他关于 softmax/sigmoid 的情况。他的回答是,这是个人喜好问题,使用其中一个并不重要。由于提到了 sigmoid 的好处,现在它也是我个人的偏好。

但是,这个分数是从哪里来的(因为分类子网只输出了 K 个数字,表示 K 个类别的概率)?

每个类别的分数都被视为自己的对象,但对于一个锚点,它们都共享相同的回归值。如果班级分数高于该阈值(我很确定这是任意选择的),则将其视为候选对象。

如果 RetinaNet 对目标标签的定义与 SSD 或 YOLO 不同,我会假设目标是一个长度为 K 的向量,其中所有条目均为 0,没有 1。然而,在这种情况下,如果锚定为假阴性,焦点损失(见下面的定义)将如何惩罚锚定?

负数被分类为仅包含零的向量。正例由 one-hot 向量分类。假设预测是一个全为零的向量,但目标是一个单热向量(换句话说,一个假阴性),那么p_t你的公式中就是一个零列表。然后,焦点损失将评估为该锚点的较大值。

混乱#2

简短的回答:是的。

混乱#3

就原始实现而言,它几乎是正确的。所有值都除以widthor height。和的值除以A_x,是不正确的。A_yT_xT_y

也就是说,不久前我们切换到一个稍微简单的实现,其中回归计算为左上角和右下角点之间的差异(作为锚点宽度和高度的分数)。这稍微简化了实现,因为我们在整个代码中使用左上角/右下角。此外,我注意到我们在 COCO 上的结果略有增加。


推荐阅读