本文主要是介绍目标检测之RetinaNet(Focal Loss),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、目标检测之RetinaNet(Focal Loss)
Focal Loss for Dense Object Detection
- 论文链接:https://arxiv.org/abs/1708.02002
- 论文翻译:https://blog.csdn.net/PPLLO_o/article/details/88952923
- 论文详解:https://blog.csdn.net/JNingWei/article/details/80038594
- 论文代码:https://github.com/CasiaFan/tensorflow_retinanet
二、RetinaNet算法
1、 出发点
object detection的算法主要可以分为两大类:two-stage detector和one-stage detector。前者如Faster R-CNN,R-FCN这样需要region proposal的检测算法,这类算法可以达到很高的准确率,但是速度较慢。后者如YOLO,SSD这样不需要region proposal,直接回归的检测算法,这类算法速度很快,但是准确率不如前者。因此,作者提出focal loss的出发点也是希望one-stage detector可以达到two-stage detector的准确率,同时不影响原有的速度。
2、one-stage的精度低的原因: “类别不平衡”
-
什么是“类别不平衡”
详细来说,检测算法在早期会生成一大波的bbox。而一幅常规的图片中,顶多就那么几个object。这意味着,绝大多数的bbox属于background。 -
“类别不平衡”又如何会导致检测精度低呢?
因为bbox数量爆炸。 因为bbox中属于background的bbox太多了,所以如果分类器无脑地把所有bbox统一归类为background,accuracy也可以刷得很高。于是,分类器的训练就失败了。分类器训练失败,检测精度自然就低了。 -
为什么two-stage系就可以避免这个问题呢?
因为two-stage系有RPN罩着。
第一个stage的RPN会对anchor进行简单的二分类(只是简单地区分是前景还是背景,并不区别究竟属于哪个细类)。经过该轮初筛,属于background的bbox被大幅砍削。虽然其数量依然远大于前景类bbox,但是至少数量差距已经不像最初生成的anchor那样夸张了。就等于是 从 “类别 极 不平衡” 变成了 “类别 较 不平衡” 。
不过,其实two-stage系的detector也不能完全避免这个问题,只能说是在很大程度上减轻了“类别不平衡”对检测精度所造成的影响。
接着到了第二个stage时,分类器登场,在初筛过后的bbox上进行难度小得多的第二波分类(这次是细分类)。这样一来,分类器得到了较好的训练,最终的检测精度自然就高啦。但是经过这么两个stage一倒腾,操作复杂,检测速度就被严重拖慢了。 -
为什么one-stage系无法避免该问题呢?
因为one stage系的detector直接在首波生成的“类别极不平衡”的bbox中就进行难度极大的细分类,意图直接输出bbox和标签(分类结果)。而原有交叉熵损失(CE)作为分类任务的损失函数,无法抗衡“类别极不平衡”,容易导致分类器训练失败。因此,one-stage detector虽然保住了检测速度,却丧失了检测精度。
3、Focal Loss详解
首先是我们常使用的交叉熵损失函数:
要对类别不均衡问题对loss的贡献进行一个控制,即加上一个控制权重即可,最初作者的想法即如下这样,对于属于少数类别的样本,增大α即可 :
但这样有一个问题,它仅仅解决了正负样本之间的平衡问题,并没有区分易分/难分样本,因此后面有了如下的形式:
显然,样本越易分,pt越大,则贡献的loss就越小,相对来说,难分样本所占的比重就会变大;因此,通过这个公式区分了易分/难分样本,在实际中,作者采用如下公式,即综合了上述两个公式的形式:
这里的两个参数α和γ协调来控制,本文作者采用α=0.25,γ=2效果最好
4、实验框架
5、结果
这篇关于目标检测之RetinaNet(Focal Loss)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!