关于 RetinaNet 的困惑
Confusions regarding RetinaNet
最近在研究RetinaNet。我阅读了原论文和一些相关的论文并写了一个post分享我所学到的东西:http://blog.zenggyu.com/en/post/2018-12-05/retinanet-explained-and-demystified/。不过,我还是有一些困惑,我也在post中指出了。谁能赐教一下?
困惑 #1
如论文所示,如果锚框与任何地面实况的 IoU 低于 0.4,则将锚框分配给背景。在这种情况下,对应的 classification 目标标签应该是什么(假设有 K classes)?
我知道SSD有一个背景class(这使得一共K+1classes),而YOLO预测一个置信度分数表明盒子里是否有物体(不是background) 或 not (background) 除了 K class 概率。虽然我没有在论文中找到任何表明 RetinaNet 包含背景 class 的陈述,但我确实看到了这样的陈述:“......,我们只解码来自......的框预测,在阈值检测器置信度为 0.05 之后” ,这似乎表明存在对置信度得分的预测。然而,这个分数从何而来(因为classification子网只输出K个数字表示K个classes的概率)?
如果 RetinaNet 定义的目标标签与 SSD 或 YOLO 不同,我会假设目标是一个长度为 K 的向量,所有条目均为 0,没有 1。然而,在这种情况下,如果 anchor 是 false negative,focal loss(见下面的定义)将如何惩罚它?
哪里
困惑 #2
与许多其他检测器不同,RetinaNet 使用 class-agnostic bounding box regressor,classification subnet 最后一层的激活是 sigmoid 激活。这是否意味着一个anchor box可以同时预测多个不同classes的对象?
困惑 #3
让我们将这些匹配的锚框和真实框表示为${(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 width/height 和 ground-truth 之间的偏移量.相应地,对于这些预测中的每一个,都有一个回归目标 $T^i$ 计算为 anchor 和 ground-truth 之间的偏移量:
以上方程是否正确?
非常感谢,如有任何其他误解,请随时指出 post!
更新:
供以后参考,我在研究RetinaNet时的另一个困惑(我在slack中发现了这个对话):
我是开源 retinanet 项目的作者之一,fizyr/keras-retinanet。我会尽量回答你的问题。
困惑#1
一般来说,在对象检测器中有两种常用的class化分数方法,要么使用 softmax,要么使用 sigmoid。
如果你使用 softmax,你的目标值应该始终是单热向量,这意味着如果没有对象你应该 "classify" 它作为背景(意味着你需要一个背景 class)。好处是您的 class 总分总和为一。
如果您使用 sigmoid,则限制较少。在我看来这有两个好处,你不需要背景class(这使得实现更清晰)并且它允许网络进行多class class化(尽管它在我们的实现中不支持,理论上是可能的)。一个额外的小好处是您的网络稍微小一些,因为与 softmax 相比,它需要 classify 少一个 class,尽管这可能可以忽略不计。
在实现 retinanet 的早期,我们使用 softmax,因为来自 py-faster-rcnn 的遗留代码。我联系了Focal Loss论文的作者,向他询问了softmax/sigmoid的情况。他的回答是,这是个人喜好的问题,使用其中一种并不重要。由于上面提到的对 sigmoid 的好处,它现在也是我个人的偏好。
However, where does this score come from (since the classification subnet only outputs K numbers indicating the probability of K classes)?
每个 class 分数都被视为自己的对象,但对于一个锚点,它们都共享相同的回归值。如果 class 分数高于该阈值(我很确定这是任意选择的),则它被视为候选对象。
If RetinaNet defines target labels differently from SSD or YOLO, I would assume that the target is a length-K vector with all 0s entries and no 1s. However, in this case how does the focal loss (see definition below) will punish an anchor if it is a false negative?
负数被class化为只包含零的向量。正例 class 被一个单热向量化。假设预测是全零向量,但目标是单热向量(换句话说,假阴性),那么 p_t
是公式中的零列表。然后 focal loss 将评估为该锚点的较大值。
困惑 #2
简答:是。
困惑#3
关于原始实现,它几乎是正确的。所有值都除以 width
或 height
。 T_x
和 T_y
的值除以 A_x
、A_y
是不正确的。
就是说,不久前我们切换到一个稍微简单的实现,其中回归计算为左上角和右下角点之间的差异(作为分数 w.r.t。锚点'宽度和高度)。这稍微简化了实现,因为我们在整个代码中使用了左上角/右下角。此外,我注意到我们在 COCO 上的结果略有增加。
最近在研究RetinaNet。我阅读了原论文和一些相关的论文并写了一个post分享我所学到的东西:http://blog.zenggyu.com/en/post/2018-12-05/retinanet-explained-and-demystified/。不过,我还是有一些困惑,我也在post中指出了。谁能赐教一下?
困惑 #1
如论文所示,如果锚框与任何地面实况的 IoU 低于 0.4,则将锚框分配给背景。在这种情况下,对应的 classification 目标标签应该是什么(假设有 K classes)?
我知道SSD有一个背景class(这使得一共K+1classes),而YOLO预测一个置信度分数表明盒子里是否有物体(不是background) 或 not (background) 除了 K class 概率。虽然我没有在论文中找到任何表明 RetinaNet 包含背景 class 的陈述,但我确实看到了这样的陈述:“......,我们只解码来自......的框预测,在阈值检测器置信度为 0.05 之后” ,这似乎表明存在对置信度得分的预测。然而,这个分数从何而来(因为classification子网只输出K个数字表示K个classes的概率)?
如果 RetinaNet 定义的目标标签与 SSD 或 YOLO 不同,我会假设目标是一个长度为 K 的向量,所有条目均为 0,没有 1。然而,在这种情况下,如果 anchor 是 false negative,focal loss(见下面的定义)将如何惩罚它?
哪里
困惑 #2
与许多其他检测器不同,RetinaNet 使用 class-agnostic bounding box regressor,classification subnet 最后一层的激活是 sigmoid 激活。这是否意味着一个anchor box可以同时预测多个不同classes的对象?
困惑 #3
让我们将这些匹配的锚框和真实框表示为${(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 width/height 和 ground-truth 之间的偏移量.相应地,对于这些预测中的每一个,都有一个回归目标 $T^i$ 计算为 anchor 和 ground-truth 之间的偏移量:
以上方程是否正确?
非常感谢,如有任何其他误解,请随时指出 post!
更新:
供以后参考,我在研究RetinaNet时的另一个困惑(我在slack中发现了这个对话):
我是开源 retinanet 项目的作者之一,fizyr/keras-retinanet。我会尽量回答你的问题。
困惑#1
一般来说,在对象检测器中有两种常用的class化分数方法,要么使用 softmax,要么使用 sigmoid。
如果你使用 softmax,你的目标值应该始终是单热向量,这意味着如果没有对象你应该 "classify" 它作为背景(意味着你需要一个背景 class)。好处是您的 class 总分总和为一。
如果您使用 sigmoid,则限制较少。在我看来这有两个好处,你不需要背景class(这使得实现更清晰)并且它允许网络进行多class class化(尽管它在我们的实现中不支持,理论上是可能的)。一个额外的小好处是您的网络稍微小一些,因为与 softmax 相比,它需要 classify 少一个 class,尽管这可能可以忽略不计。
在实现 retinanet 的早期,我们使用 softmax,因为来自 py-faster-rcnn 的遗留代码。我联系了Focal Loss论文的作者,向他询问了softmax/sigmoid的情况。他的回答是,这是个人喜好的问题,使用其中一种并不重要。由于上面提到的对 sigmoid 的好处,它现在也是我个人的偏好。
However, where does this score come from (since the classification subnet only outputs K numbers indicating the probability of K classes)?
每个 class 分数都被视为自己的对象,但对于一个锚点,它们都共享相同的回归值。如果 class 分数高于该阈值(我很确定这是任意选择的),则它被视为候选对象。
If RetinaNet defines target labels differently from SSD or YOLO, I would assume that the target is a length-K vector with all 0s entries and no 1s. However, in this case how does the focal loss (see definition below) will punish an anchor if it is a false negative?
负数被class化为只包含零的向量。正例 class 被一个单热向量化。假设预测是全零向量,但目标是单热向量(换句话说,假阴性),那么 p_t
是公式中的零列表。然后 focal loss 将评估为该锚点的较大值。
困惑 #2
简答:是。
困惑#3
关于原始实现,它几乎是正确的。所有值都除以 width
或 height
。 T_x
和 T_y
的值除以 A_x
、A_y
是不正确的。
就是说,不久前我们切换到一个稍微简单的实现,其中回归计算为左上角和右下角点之间的差异(作为分数 w.r.t。锚点'宽度和高度)。这稍微简化了实现,因为我们在整个代码中使用了左上角/右下角。此外,我注意到我们在 COCO 上的结果略有增加。