RetinaNet
动机
one stage的方法思路都得密集采样,然后基于base进行回归,那这个过程中采样出的fake anchor的数量中,正负样本是极端不平衡的,除了像SSD中那样在计算loss时通过score筛选下参与学习的bbox以保持正负样本比的方案,使用有权重的损失函数也会比较好的解决这个问题,这就是retina net中提出的Focal Loss.
方法概要
-
目的很简单,就是想让数量少的正样本anchor分量重一点,让数量极多的负样本分量轻一点。
- 先是分类时用到的交叉熵【这里p为预测为正样本的概率】
- 然后我们统一写做:
- 进一步我们有BCEloss,就是balanced 交叉熵,给交叉熵带了个权:【这里的\alpha_t的话,当y=1时为\alpha, 其他情况是1-\alpha】
- 然后focalloss来了【不管你本来是正样本在预测时置信度偏小,还是你本来是负样本在预测时置信度偏小,这两种情况都可以叫做hard,这种情况下都会让p_t偏小,然后在Focalloss中会有一个较大的loss累计,当你本来就是负样本,然后很轻松的得到较高的置信度被预测正确时,或者说你本来是正样本被预测正确了,这两种情况下都叫做easy sample,这时对于loss的累计贡献就比较低。因此Focal loss变相压制了easy sample的loss贡献,而其中受到迫害最严重的莫过于非常easy的大量负样本。这样被压制之后,正负样本不就平衡了吗】
- 先是分类时用到的交叉熵【这里p为预测为正样本的概率】
-
那再把普通的balance参数\alpha加进去就是终极奥义了。
细节及注意事项
- 实现上用了FPN+解耦双头
评价
- 其实整个压制负样本的过程有点亡羊补牢的意味了,虽然不晚,但是进行了比较多的无意义的loss的计算和累计,其实最好的办法还是在分配anchor时就提前做好正负样本均衡。