此篇论文获得了ICCV最佳学生论文奖,指导人是FAIR的He Kaiming大神:
众所周知,detector主要分为以下两大门派:
- | one stage系 | two stage系 |
---|---|---|
代表性算法 | YOLOv1、SSD、YOLOv2、YOLOv3 | R-CNN、SPPNet、Fast R-CNN、Faster R-CNN |
检测精度 | 低 | 高 |
检测速度 | 快 | 慢 |
这种鱼(speed)与熊掌(accuracy)不可兼得的局面一直成为Detection的瓶颈。
究其原因,就是因为one-stage受制于万恶的 “类别不平衡” 。
这个时候,He Kaiming带着他的《Focal Loss》出现了。
该篇文章指出,“类别不平衡”是one-stage detector在精度上逊于two-stage detector的病结所在。
那么,只要通过将原先训练 回归任务 惯用的 交叉熵误差 (CE(pt)=−αtlog(pt)CE(pt)=−αtlog(pt)CE(p_t)=-\alpha_t \log(p_t)) 改为 FL (focal loss) 即可。
focal loss的标准公式非常简单:
FL(pt)=−(1−pt)γlog(pt)=(1−pt)γCE(ŷ )iFL(pt)=−(1−pt)γlog(pt)=(1−pt)γCE(y^)i
FL(p_t) = -(1-p_t)^\gamma \log(p_t) = (1-p_t)^\gamma CE(\hat{y})_{i}
也可以更复杂一点(论文中的实验即采用此公式):
FL(pt)=−αt(1−pt)γlog(pt)FL(pt)=−αt(1−pt)γlog(pt)
FL(p_t) = -\alpha_t (1-p_t)^\gamma \log(p_t)
本质改进点在于,在原本的 交叉熵误差 (CE(pt)=−αtlog(pt)CE(pt)=−αtlog(pt)CE(p_t)=-\alpha_t \log(p_t)) 前面乘上了 (1−pt)γ(1−pt)γ(1-p_t)^\gamma 这一权重。
我推算了一下乘上该权重所带来的影响:
loss量级 | 量大的类别 (如background) | 量少的类别 |
---|---|---|
被正确分类时的loss | 大幅↓↓\downarrow | 稍微↓↓\downarrow |
被错误分类时的loss | 适当↓↓\downarrow | 近乎保持不变 |
也就是说,一旦乘上了该权重,量大的类别所贡献的loss被大幅砍削,量少的类别所贡献的loss几乎没有多少降低。虽然整体的loss总量减少了,但是训练过程中量少的类别拥有了更大的话语权,更加被model所关心了。
为此,FAIR还专门写了一个简单的one-stage detector来验证focal loss的强大。并将该网络结构起名RetinaNet:
文章也对于 γγ\gamma 的取值做了一番实验:
在实验中,发现 γ=2,α=0.25γ=2,α=0.25\gamma = 2,\alpha = 0.25 的取值组合效果最好。
文章的两大贡献:
FL(pt)=−(1−pt)γlog(pt)FL(pt)=−(1−pt)γlog(pt)
FL(p_t) = -(1-p_t)^\gamma \log(p_t)
Note:
新的detector标杆,state-of-the-art一词的新定义: