目标检测算法之RetinaNet(引入Focal Loss)

前言

今天来介绍一下目标检测算法中RetinaNet,这篇论文是ICCV2017的作品,Kaiming He也是作者之一,同时这篇论文提出的Focal Loss也对工程上训练更好的目标检测模型做出了贡献,所以我们尝试理解一下这篇论文的思想。论文地址为:https://arxiv.org/pdf/1708.02002.pdf

研究背景

前面我们介绍了一些One-Stage目标检测算法和Two-Stage目标检测算法,这些算法在精度和速度上都各有特点,现在我们画个图总结一下之前介绍的各种算法的速度和精度:

image

可以看到One-Stage算法的精度相对于Two_Stage偏低,然后作者把这种问题的原因归结于正负类别不平衡(简单难分类别不平衡)。因此论文通过重新设计标准的交叉熵损失来解决这种难易样本不平衡的问题,即文章的核心Focal Loss。结合了Focal Loss的One-Stage的目标检测器被称为RetinaNet,该检测器在COCO数据集上MAP值可以和FPN(特征金字塔目标检测器,前面介绍过,推文地址为:https://mp.weixin.qq.com/s/4KT6huH6gFAautE3weZENA)和MaskRCNN接近。

一些问题?

什么是hard/esay postive/negtive example?

网上找到一张图解释在目标检测任务的一张图中什么是hard/easy postive/negtive example。

image

候选框可以分成postive/negtive两类。当bbox(由anchor加上偏移量得到)与ground truth间的IOU大于我们设置的阈值(一般取0.5)时,会认为该bbox属于positive example,如果IOU小于下门限就认为该bbox属于negative example。

为什么One-Stage检测算法精度偏低?

论文认为One-Stage算法准确度低是由于类别失衡引起的。因为在一张普通图片中,目标的所占的比例远远小于背景所占的比例,所以两类候选框例子中以negtive example为主。这就导致了:

  • (1)针对所有的negtive example,数量过多造成它的loss太大,以至于主导了损失函数,不利于收敛。
  • (2)针对单个negtive example来说,大多数的negative example不在前景和背景的过渡区域上,分类很明确(这种易分类的negative称为easy negative),训练时对应的背景类score会很大,换句话说就是单个example的loss很小,反向计算时梯度小。梯度小造成easy negative example对参数的收敛作用很有限,我们更需要loss大的对参数收敛影响也更大的example,即hard positive/negative example。

因此如果One-Stage算法如果无脑的将所有bbox拿去做分类损失,因为bbox中属于background的bbox太多了,所以如果分类器无脑地把所有bbox统一归类为background,accuracy也可以刷得很高。这就导致分类器训练失败了,自然检测精度就偏低了。 对于YOLO和SSD来讲,他们也确实没有无脑将所有的bbox拿去做分类损失,如在SSD中利用Hard-Negtive-Mining的方式将正负样本的比例控制在1:3,YOLO通过损失函数中权重惩罚的方式增大正样本对损失函数的影响等。但它们虽然可以处理第1个问题,但对于第2个问题就无能为了,这也是Focal Loss出现的原因。

Faster-RCNN为什么精度更高?

Faster-RCNN在FPN阶段会根据前景分数提出最可能是前景的example,这就会滤除大量背景概率高的easy negtive样本,这便解决了上面提出的第2个问题。同时,在生成样本给ROIPooling层的时候,会据IOU的大小来调整positive和negative example的比例,比如设置成1:3,这样防止了negative过多的情况(同时防止了easy negative和hard negative),就解决了前面的第1个问题。因此,相对于One-Stage检测器,Faster-RCNN的精度更高。

Focal Loss

论文引入了Focal Loss来解决难易样本数量不平衡。One-Stage的模板检测器通常会产生10k数量级的框,但只有极少数是正样本,正负样本数量非常不平衡。我们在计算分类的时候常用的损失——交叉熵的公式如下:

image

为了解决正负样本数量不平衡的问题,我们经常在交叉熵损失前面加一个参数[图片上传失败...(image-9a0dc1-1607910626257)]

,即:

image

虽然[图片上传失败...(image-f79604-1607910626257)]

平衡了正负样本的数量,但实际上,目标检测中大量的候选目标都是易分样本。这些样本的损失很低,但是由于数量极不平衡,易分样本的数量相对来讲太多,最终主导了总的损失。

因此,这篇论文认为易分样本(即,置信度高的样本)对模型的提升效果非常小,模型应该主要关注与那些难分样本 。所以Focal Loss横空出世了。一个简单的想法就是只要我们将高置信度(p)样本的损失降低一些就好了吧? 也即是下面的公式:

image

我们取[图片上传失败...(image-3d9b0-1607910626257)]

等于2来只管感受一下,如果[图片上传失败...(image-590071-1607910626257)]

,那么,[图片上传失败...(image-55b8cd-1607910626257)]

,损失降低了1000倍。最终Focal Loss还结合了公式(2),这很好理解,公式(3)解决了难易样本的不平衡,公式(2)解决了正负样本的不平衡,将公式(2)与(3)结合使用,同时解决正负难易2个问题!所以最终Focal Loss的形式如下:

image

下面这张图展示了Focal Loss取不同的[图片上传失败...(image-2ee061-1607910626257)]

时的损失函数下降。

image

实验结果展示,当[图片上传失败...(image-ecf981-1607910626257)]

,[图片上传失败...(image-5ff039-1607910626257)]

时,效果最好,这样损失函数训练的过程中关注的样本优先级就是正难>负难>正易>负易了。

RetinaNet

说完了Focal Loss就回到文章RetinaNet,Focal Loss与ResNet-101-FPN backbone结合就构成了RetinaNet(one-stage检测器),RetinaNet在COCO test-dev上达到39.1mAP,速度为5FPS。下图展示了RetinaNet的网络结构:

image

训练RetinaNet时有几个值得注意的关键点:

  • 训练时FPN每一级的所有example都被用于计算Focal Loss,loss值加到一起用来训练。
  • 测试时FPN每一级只选取score最大的1000个example来做nms。
  • 整个结构不同层的head部分(上图中的c和d部分)共享参数,但分类和回归分支间的参数不共享。
  • 分类分支的最后一级卷积的bias初始化成前面提到的-log((1-π)/π。

RetinaNet和当时流行的检测算法速度和精度对比如下,可以看到从速度和精度都完成了对其他算法的压制:

image

实验

Table1是关于RetinaNet和Focal Loss的一些实验结果。其中(a)是在交叉熵的基础上加上参数[图片上传失败...(image-6f8562-1607910626257)]

,[图片上传失败...(image-3ce2c5-1607910626257)]

就表示传统的交叉熵,可以看出当a=0.75的时候效果最好,AP值提升了0.9。 (b)是对比不同的参数[图片上传失败...(image-3971e2-1607910626257)]

和[图片上传失败...(image-c0ab2a-1607910626257)]

的实验结果,可以看出随着[图片上传失败...(image-f3a2a9-1607910626257)]

的增加,AP提升比较明显。(c)是anchor对AP值的影响。(d)是通过和OHEM的对比可以看出最好的Focal Loss比最好的OHEM提高了3.2AP。这里OHEM1:3表示在通过OHEM得到的minibatch上强制positive和negative样本的比例为1:3,通过对比可以看出这种强制的操作并没有提升AP。(e)加入了运算时间的对比,可以和前面的Figure2结合起来看,速度方面也有优势。Table2表示RetinaNet和One-Stage检测器的比较,可以看到RetinaNet也是毫不顺色的。

image
image

代码实现

keras版本:https://github.com/fizyr/keras-retinanet pytorch版本: https://github.com/yhenon/pytorch-retinanet caffe-focal loss: https://github.com/chuanqi305/FocalLoss

后记

今天讲了目标检测算法中的RetinaNet,希望可以对Focal Loss有清晰的了解,在工程上使用Focal Loss也是一种训练其他One-Stage检测器的有效方法。今天就讲到这里啦。

相关学习

1.Focal Loss理解
https://www.cnblogs.com/king-lps/p/9497836.html

Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。该损失函数降低了大量简单负样本在训练中所占的权重,也可理解为一种困难样本挖掘。

  1. [AI开发]目标跟踪之计数
    https://www.cnblogs.com/xiaozhi_5638/p/11010749.html

基于视频结构化的应用中,目标在经过跟踪算法后,会得到一个唯一标识和它对应的运动轨迹,利用这两个数据我们可以做一些后续工作:测速(交通类应用场景)、计数(交通类应用场景、安防类应用场景)以及行为检测(交通类应用场景、安防类应用场景)。
3.基于PyTorch实现昆虫分类任务
https://lab.datafountain.cn/forum?id=86
4.智能盘点-钢筋数量AI识别-目标检测实践
https://zhuanlan.zhihu.com/p/54951933
5.目标检测(YOLO,FPN,RetinaNet,SSD)
https://blog.csdn.net/qq_39388410/article/details/88081631
6.目标检测(Object Detection)—— RetinaNet介绍 https://blog.csdn.net/qq_39388410/article/details/88081631

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容