我最近一直在学习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使用与类无关的包围盒回归器,而分类子网的最后一层的激活是S形激活。这是否意味着一个锚框可以同时预测不同类别的多个对象?
困惑#3
让我们用$ {(A ^ i,G ^ i)} _ {i = 1,... N} $来表示这些匹配的锚点框和地面真相框对,其中$ A $代表锚点, $ G $表示真相,$ N $是匹配数。
对于每个匹配的锚点,回归子网预测四个数字,我们将它们表示为$ P ^ i =(P ^ i_x,P ^ i_y,P ^ i_w,P ^ i_h)$。前两个数字指定锚点$ A ^ i $和地面真值$ G ^ i $的中心之间的偏移,而后两个数字指定锚点的宽度/高度与地面真点之间的偏移。相应地,对于这些预测中的每一个,都有一个回归目标$ T ^ i $计算为锚点与地面真相之间的偏移量:
以上方程式正确吗?
在此先感谢您,并随时在帖子中指出其他误解!
更新:
为了便于将来参考,我在学习RetinaNet时遇到了另一个困惑(我发现这个对话很轻松):
答案 0 :(得分:4)
我是开源视网膜网项目fizyr/keras-retinanet的作者之一。我会尽力回答您的问题。
困惑#1
通常,在对象检测器中有两种常用的分类评分方法,可以使用softmax或使用S型。
如果使用softmax,则目标值应始终为一热向量,这意味着如果没有对象,则应将其“分类”为背景(这意味着需要背景类)。好处是您的班级分数总和为1。
如果使用S形,则约束会更少。在我看来,这样做有两个好处,您不需要后台类(这样可以使实现更整洁),并且它允许网络进行多类分类(尽管我们的实现不支持这种分类,但从理论上讲是可行的)。另一个小的好处是您的网络要稍微小一些,因为与softmax相比,它需要分类的类少了,尽管这可能会忽略不计。
在实施Retinanet的早期,由于py-faster-rcnn的遗留代码,我们使用softmax。我联系了Focal Loss论文的作者,并询问了有关softmax / Sigmoid情况。他的回答是,这是个人喜好问题,无论您使用哪一个都不重要。由于提到了乙状结肠的好处,现在这也是我个人的喜好。
但是,该分数从何而来(由于分类子网仅输出表示K个类别的概率的K个数字)?
每个班级分数都被视为自己的对象,但对于一个锚,它们都共享相同的回归值。如果班级分数高于该阈值(我敢肯定是任意选择的),则将其视为候选对象。
如果RetinaNet与SSD或YOLO定义的目标标签不同,我将假定目标是长度为K的矢量,所有条目均为0,没有1。但是,在这种情况下,如果它是假阴性,那么焦点损失(请参阅下面的定义)将如何惩罚锚点?
负数被分类为仅包含零的向量。阳性通过一热向量分类。假设预测是一个全零的向量,而目标是一个热向量(换句话说,一个假负数),那么p_t
是公式中零的列表。然后,焦点损失将对该锚定一个较大的值。
混乱#2
简短的回答:是的。
困惑#3
关于原始实现,这几乎是正确的。所有值都除以width
或height
。用A_x
,A_y
除以T_x
和T_y
的值是不正确的。
也就是说,前一段时间,我们切换到了一个稍微简单的实现方式,在该实现方式中,将回归计算为左上点和右下点之间的差(以锚点的宽度和高度为单位)。因为我们在整个代码中使用了左上/右下,所以这简化了实现。此外,我注意到我们的结果在COCO方面略有提高。