Focal Loss阅读笔记
论文链接: https://arxiv.org/abs/1708.02002
非官方pytorch实现:https://github.com/kuangliu/pytorch-retinanet
文章中个人观点由下划线标记
一句话总结
降低简单样本的损失改善单端检测中的正负样本极度不均使得简单背景样本dominant loss的问题,同时验证了该问题的存在.实现了coco上39.1 AP,5FPS的结果.
概述
提出focal loss损失函数,其中为置信度准确度.(即预测置信度p.对正样本准确率就是p,否则是1-p).该函数性质在于对准确度高的样本的损失相对原CE损失会有很大的减少,从而克服单端dense detection中简单的背景样本dominant loss的问题.
同时关于是否存在该问题在实验结果中也有分析与验证.见后文结果分析
另外加上FPN,多阶段检测,在feature map上使用FCN后再进行预测并将box回归与class预测分离,更多anchor.同时获得最优结果时还使用了scale jitter. 以上5种加FL一同作用实现了最终的结果.
结果
| Method | backbone | AP AP50 AP75 | Speed | |
|---|---|---|---|---|
| Retina Net | ResNeXt-101-FPN | 39.1 59.1 42.3 | 21.8 42.7 50.2 | 198ms(5FPS) |
39.1的结果只在最后对比时出现了一次,之前的分析800x800都是37.8. 这里最好的结果多用了scale jitter 并且训练了1.5x更长的时间.提升了1.3AP.
论文细节
网络结构与anchor设定
对于backbone与anchor设定,在哪些层做了检测,目前读了没有搞清楚…由于不是论文核心,暂时放一放.前者等FPN和ResNet看完,后者得去看看代码与搜一搜.
对于后者的anchor. 在https://github.com/kuangliu/pytorch-retinanet 的pytorch的Resnet50实现中,从p3->p7中anchor的基础面积分别为,aspect与faster r-cnn一致{1:2,1:1,2:1},而scale_ratios为即anchor的实际尺寸为基础尺寸*scale_ratios.基本符合论文中的说法.
正负样本分类
IOU>=0.5为正样本, [0,0.4)为负样本, [0.4,0.5)忽略
分类分支网络结构与损失函数
在获得feature map后,增加4层3x3的卷积层,feature map的channel为256, 这四层卷积层channel与其一致,均为256. 之后再用3x3卷积层预测每个位置上K类A个bbox的类别分数.
Focal Loss在这里起作用,用于计算分类损失.同时在FL基础上加上了一个权重 表示正样本所占权重为[0,1],则为负样本权重.因此最终损失函数为 即在多分类时每一类当做正负二分类用以上公式计算损失. 该加权同样可用于CE损失.
坐标预测分支网络结构与损失函数
个人理解bbox那里不使用focal loss而仍正常使用faster r-cnn的L1 loss回归,看的GitHub上实现是这样的
这与后面的分析一致,即由于只有证样本需回归坐标,而focal loss对正样本loss分布影响不大. 同时这意味着所谓的简单背景样本dominant loss是分类误差的影响.
实验细节与结果分析
data augmentation
在中间尝试时没有具体提到. 最终的结果相对之前的多加了scale jitter并且训练更长时间以获得1.3AP. 最终结果为输入800x800,而中间尝试基本为600x600
权重初始化
采用Res-net的backbone权重.在所有新层,除了最后的预测层采用一般初始化b=0,.
而同focal loss所说,正样本远远少于负样本,一般初始化导致分布为0.5/0.5,不合理,因此使用了 方差不变.这使得被标记成前景概率大致为为0.01.
训练策略
同步SGD在8个GPU上,每个GPU2张图,因此batch=16. 所有模型训练90k. 前60k的lr=0.01,60k-80k为0.001,80k之后为0.0001. weight decay=0.0001,momentum=0.9
超参选取
设置效果最好.
anchor取scales=3, aspect=3. 与faster r-cnn一致.只是面积参数具体得根据feature map大小调节. 虽然sc=2时多0.2AP.
其它设置
某张图片的FL计算所有anchor的FL后除以正样本数量来归一化.不用总anchor数是由于绝大部分都是简单样本
在检测时,为了加速,只计算前1k置信度的anchor对应的box,然后取置信度>=0.05的,然后采用nms,thresh=0.5.
论文的结果,尝试与自己的分析思考
- 对于分类时使用加权CE时提升正样本权重有一定提高.0.5时30.2而0.75时最高,为31.1.说明单纯的负样本远超正样本数量而简单提升正样本权重会有一定作用,但影响有限.不为主要问题
- 设置效果最好,同时在提升时需要降低.这是由于会大幅降低负样本的总损失,也说明了负样本损失中大部分为简单样本 –> 需验证
- 对于focal loss分布的分析
- 论文中验证focal loss的有效性与动机的合理性的方法为:用训练好的模型对大量图片取预测结果.负样本约正样本约,同时使用不同的FL计算loss(虽然有的值与训练时不一致).然后分正负两类分开分析.从小到大排序每个预测的loss大小,归一化到1后画出两类的CDF图.
- 分析:对于正样本,loss分布与原EL基本一致而对于负样本,
FL使得loss分布中困难(loss分数高的)样本贡献了绝大部分loss.而简单样本对总loss贡献很少.说明了FL在保持正样本分布大致不变情况下更加考虑负样本中困难样本,同时克服了simple samples dominant loss的问题.同时也表明了该问题确实存在. - 同时采用了一些别的FL近似函数,能压缩简单样本损失的都有一定效果.
- OHEM类方法尝试了两种,一个是只保留loss最高的那些样本,完全忽略掉简单样本. 另一个是按class比例sample:在前者基础上,再保证正负样本的比例(1:3). 效果均不好. 那么不应该完全舍弃简单样本,可能是由于舍弃会导致图像太多区域没有覆盖到而丢失了全局的信息?还是其他原因?. 同时,在RPN中使用focal loss以获得更好的RPN网络效果如何?
- 文章分离了分类与位置误差. 自己一直觉得在一个feature map上同时检测与分类,二者会有干扰.启发于R-FCN. 这个的影响有多大? 或者二者的权重之间应该有一些的影响来让分类指导检测但又不影响其位置敏感性?
- 关于双端中ROI Pooling在分类与检测方面作用的思考. 同YOLOv3中思考一样,单端与双端的区别这里同样提到了ROI pooling. 其可提取任意位置的feature,而one-stage 得用FPN来尽可能提取gt的相邻位置使得feature看到了整个物体.另外,ROI另一个作用还在于不同proposal之间,反向传播更新feature map时会只更新相应区域,尽可能少的干扰了其它特征,这其对使得feature map影响更精细.从而获得的feature map更加精细. 而这些思考很大程度上基于感受野的概念.使用resnet来打破感受野的问题呢? 或者说这其实是一个trade off,那么用类似方法来获得adaptive的trade off呢?