【问题标题】:Confusions regarding RetinaNet关于 RetinaNet 的困惑
【发布时间】:2019-05-17 12:16:22
【问题描述】:

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

困惑#1

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

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

如果 RetinaNet 定义的目标标签与 SSD 或 YOLO 不同,我会假设目标是一个长度为 K 的向量,其中所有 0 条目且没有 1。但是,在这种情况下,如果是假阴性,focal loss(见下面的定义)将如何惩罚anchor?

在哪里

困惑#2

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

困惑#3

让我们将这些匹配的anchor box和ground-truth box表示为${(A^i, G^i)}_{i=1,...N}$,其中$A$代表anchor, $G$ 代表一个ground-truth,$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-learning computer-vision object-detection


    【解决方案1】:

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

    困惑#1

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

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

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

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

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

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

    如果 RetinaNet 定义的目标标签与 SSD 或 YOLO 不同,我会假设目标是一个长度为 K 的向量,其中所有 0 条目且没有 1。但是,在这种情况下,如果是假阴性,focal loss(见下面的定义)将如何惩罚anchor?

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

    困惑#2

    简短回答:是的。

    困惑#3

    相对于最初的实现,它几乎是正确的。所有值均除以widthheightT_xT_y 的值除以A_xA_y 是不正确的。

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

    【讨论】:

    • 谢谢!你的回答很清楚!但是,我仍然想确定一件事,因为它对我来说看起来很新。您提到“每个班级分数都被视为自己的对象,但对于一个锚点,它们都共享相同的回归值”。这是否意味着对于一个anchor,将使用K个分数中的每一个来计算损失;因此,每个anchor总共会有K个损失值?
    • 知道了。谢谢!
    • 对不起汉斯,我仍然没有得到每个锚点目标计算的算法。它是从对象开始还是从锚点开始?我的意思是,它是不是类似于:“对于每个对象 O,计算每个锚点的 IoU 并将目标 O 分配给与 O 具有最大 IoU 的锚点?(每个 IoU 的值应该 > 0.5)”还是它更多类似:“对于每个锚点 A,计算每个对象的 IoU 并将目标分配给具有最大 IoU 的对象的锚点(受与上述相同的阈值约束)”。哪个方向好?
    • @NickZeng 也许你也有我的答案?
    猜你喜欢
    • 2020-03-06
    • 2016-03-16
    • 2013-07-27
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多