深度学习之RetinaNet

总述

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

目标识别有两大经典结构:

  1. 第一类是以Faster RCNN为代表的两级识别方法,这种结构的第一级专注于proposal的提取,第二级则对提取出的proposal进行分类和精确坐标回归。两级结构准确度较高,但因为第二级需要单独对每个proposal进行分类/回归,速度就打了折扣;
  2. 第二类结构是以YOLO和SSD为代表的单级结构,它们摒弃了提取proposal的过程,只用一级就完成了识别/回归,虽然速度较快但准确率远远比不上两级结构。

那有没有办法在单级结构中也能实现较高的准确度呢?Focal Loss就是要解决这个问题。

为什么单级结构的识别准确度低

作者认为单级结构准确度低是由类别失衡(class imbalance)引起的。计算Loss的bbox可以分为 positive 和 negative 两类。当bbox(由anchor加上偏移量得到)与ground truth间的IOU大于上门限时(一般是0.5),会认为该bbox属于positive example,如果IOU小于下门限就认为该bbox属于negative example。在一张输入image中,目标占的比例一般都远小于背景占的比例,所以两类example中以negative为主,这引发了两个问题:

  1. negative example过多造成它的loss太大,以至于把positive的loss都淹没掉了,不利于目标的收敛;
  2. 大多negative example不在前景和背景的过渡区域上,分类很明确(这种易分类的negative称为easy negative),训练时对应的背景类score会很大,换个角度看就是单个example的loss很小,反向计算时梯度小。梯度小造成easy negative example对参数的收敛作用很有限,我们更需要loss大的对参数收敛影响也更大的example,即hard positive/negative example。
  3. 这里要注意的是前一点我们说了negative的loss很大,是因为negative的绝对数量多,所以总loss大;后一点说easy negative的loss小,是针对单个example而言。

Faster RCNN的两级结构可以很好的规避上述两个问题:

  1. 会根据前景score的高低过滤出最有可能是前景的example (1K~2K个),因为依据的是前景概率的高低,就能把大量背景概率高的easy negative给过滤掉,这就解决了前面的第2个问题;
  2. 会根据IOU的大小来调整positive和negative example的比例,比如设置成1:3,这样防止了negative过多的情况(同时防止了easy negative和hard negative),就解决了前面的第1个问题。

所以Faster RCNN的准确率高。

OHEM是近年兴起的另一种筛选example的方法,它通过对loss排序,选出loss最大的example来进行训练,这样就能保证训练的区域都是hard example。这个方法有个缺陷,它把所有的easy example都去除掉了,造成easy positive example无法进一步提升训练的精度。

Focal Loss

Focal Loss的目的:消除类别不平衡 + 挖掘难分样本

Focal loss是在交叉熵损失函数基础上进行的修改,首先回顾二分类交叉上损失:

CE(p,y)={−log(p),y=1−log(1−p),y=otherwise.CE(p,y)=\left\{\begin{matrix} -log(p),&y=1 & & \\ -log(1-p),&y=otherwise \end{matrix}\right..CE(p,y)={log(p),log(1p),y=1y=otherwise.

可以进行如下定义:

pt={p,y=11−p,y=otherwise.p_t=\left\{\begin{matrix} p,&y=1 & & \\ 1-p,&y=otherwise \end{matrix}\right..pt={p,1p,y=1y=otherwise.

就可以得到:

CE(pt)​=−log(pt)CE(p_t)​=-log(p_t)CE(pt)=log(pt)

对于这个公式,Pt越大,代表越容易分类,也就是越接近target。

CE曲线是下图中的蓝色曲线,可以看到,相比较其他曲线,蓝色线条是变化最平缓的,即使在p>0.5(已经属于很好区分的样本)的情况下,它的损失相对于其他曲线仍然是高的,也许你会说,它相对于自己前面的已经下降很多了,对,是下降很多了,然后呢?看似每一个是微不足道,但是当数量巨大的易区分样本损失相加,就会主导你的训练过程而忽略hard examples
在这里插入图片描述

Balanced Cross Entropy

那怎么解决类不平衡呢?常见的思想是引入一个权重因子 α ,α ∈[0,1],当类标签是1是,权重因子是α ,当类标签是-1时,权重因子是1-α 。同样为了表示方便,用 ata_tat 表示权重因子,那么此时的损失函数被改写为:

CE(pt)​=−αtlog(pt)CE(p_t)​=-α_t log(p_t)CE(pt)=αtlog(pt)

Focal Loss Definition

解决了正负样本的比例失衡问题(positive/negative examples),但是这种方法仅仅解决了正负样本之间的平衡问题,并没有区分简单还是难分样本(easy/hard examples),那么怎么去抑制容易区分的负样本的泛滥呢?不然整个训练过程都是围绕容易区分的样本进行,而被忽略的难区分的样本才是训练的重点。这时需要再引入一个调制因子,公式如下:

CE(pt)​=−(1−pt)γlog(pt)CE(p_t)​=-(1-p_t)^{γ} log(p_t)CE(pt)=(1pt)γlog(pt)

γγγ 也是一个参数,范围在[0,5],观察上式可以发现,当 ptp_tpt 趋向于1时,说明该样本比较容易区分,整个调制因子是趋向于0的,也就是loss的贡献值会很小;如果某样本被错分,但是ptp_tpt 很小,那么此时调制因子是趋向1的,对loss没有大的影响(相对于基础的交叉熵),参数 γγγ 能够调整权重衰减的速率。还是上面这张图,当 γ=0γ=0γ=0 的时候,FL就是原来的交叉熵CE,随着 γγγ 的增大,调整速率也在变化,实验表明,在 γ=2γ =2γ=2 时,效果最佳。

上述两小节分别解决了正负样本不平衡问题和易分,难分样本不平衡问题,那么将这两个损失函数组合起来,就是最终的Focal loss:

CE(pt)​=−αt(1−pt)γlog(pt)CE(p_t)​=-α_t(1-p_t)^{γ} log(p_t)CE(pt)=αt(1pt)γlog(pt)

它的功能可以解释为:通过 αtα_tαt 可以抑制正负样本的数量失衡,通过 γγγ 可以控制简单/难区分样本数量失衡。关于focal loss,有以下结论:

1、无论是前景类还是背景类,ptp_tpt越大,权重 (1−pt)r(1-p_t)^r(1pt)r 就越小。也就是说easy example可以通过权重进行抑制。换言之,当某样本类别比较明确些,它对整体loss的贡献就比较少;而若某样本类别不易区分,则对整体loss的贡献就相对偏大。这样得到的loss最终将集中精力去诱导模型去努力分辨那些难分的目标类别,于是就有效提升了整体的目标检测准度

2、αtα_tαt 用于调节positive和negative的比例,前景类别使用 ata_tat 时,对应的背景类别使用 KaTeX parse error: Expected group after '_' at position 5: 1-at_̲

3、rrrαtα_tαt的最优值是相互影响的,所以在评估准确度时需要把两者组合起来调节。作者在论文中给出 r=2、αt=0.25r=2、α_t=0.25r=2αt=0.25 时,ResNet-101+FPN作为backbone的结构有最优的性能。

此外作者还给了几个实验结果:

  1. 在计算 ptp_tpt 时用sigmoid方法比softmax准确度更高;
  2. Focal Loss的公式并不是固定的,也可以有其它形式,性能差异不大,所以说Focal Loss的表达式并不crucial。

RetinaNet

为了验证focal loss的有效性设计了一种one-stage的目标检测器RetinaNet,它的设计利用了高效的网络特征金字塔以及采用了anchor boxes,表现最好的RetinaNet结构是以ResNet-101-FPN为bakcbone,在COCO测试集能达到39.1的AP,速度为5fps;

在这里插入图片描述
RetinaNet本质上是由 resnet+FPN+两个FCN子网络组成,设计思路是 backbone 选择vgg、resnet等有效的特征提取网络,主要尝试了resnet50、resnet101,FPN是针对resnet 里面形成的多尺度特征进行强化利用获得表达力更强包含多尺度目标区域信息的feature map,最后在 FPN 的feature map集合上分别使用两个结构相同但是不share参数的 FCN子 网络,从而完成目标框类别分类和bbox位置回归任务;

Anchor信息:与RPN网络类似,也使用anchors来产生proposals。特征金字塔的每层对应一个anchor面积。anchor的面积从 32232^23225122512^25122 在特征金字塔p3到p7等级上,在每一个level上都有三种不同的长宽比例{1:2,1:1,2:1},针对denser scale coverage,在每一个level的anchor集合上加入 20,21/3,22/3{2^0, 2^{1/3}, 2^{2/3}}20,21/3,22/3 三种不同的size;每一个anchor分配一个长度为K的vector作为分类信息,以及一个长度为4的bbox回归信息;

inference:前向推理阶段,即测试阶段,作者对金字塔每层特征图都使用0.05的置信度阈值进行筛选,然后取置信度前1000的候选框(不足1000更好) ,接下来收集所有层的候选框,进行NMS,阈值0.5

train:训练时,与GT的IOU大于0.5为正样本,小于0.4为负样本,否则忽略

Classification Subnet:分类子网对A个anchor,每个anchor中的K个类别,都预测一个存在概率。如下图所示,对于FPN的每一层输出,对分类子网来说,加上四层3x3x256卷积的FCN网络,最后一层的卷积稍有不同,用3x3xKA,最后一层维度变为KA表示,对于每个anchor,都是一个K维向量,表示每一类的概率,然后因为one-hot属性,选取概率得分最高的设为1,其余k-1为归0。传统的RPN在分类子网用的是1x1x18,只有一层,而在RetinaNet中,用的是更深的卷积,总共有5层,实验证明,这种卷积层的加深,对结果有帮助。

Box Regression Subnet:与分类子网并行,对每一层FPN输出接上一个位置回归子网,该子网本质也是FCN网络,预测的是anchor和它对应的一个GT位置的偏移量。首先也是4层256维卷积,最后一层是4A维度,即对每一个anchor,回归一个(x,y,w,h)四维向量。注意,此时的位置回归是类别无关的。分类和回归子网虽然是相似的结构,但是参数是不共享的。

模型的训练和部署:使用训练好的模型针对每个FPN level上目标存在概率最高的前1000bbox进行下一步的decoding处理,然后将所有level的bbox汇总,使用0.5threshold的nms过滤bbox最后得到目标最终的bbox位置;训练的loss由bbox位置信息L1 loss和类别信息的focal loss组成,在模型初始化的时候考虑到正负样本极度不平衡的情况对最后一个conv的bias参数做了有偏初始化;

注意几点:

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

实验部分

在这里插入图片描述

参考

  • Focal Loss for Dense Object Detection解读

  • RetinaNet: Focal loss在目标检测网络中的应用

  • https://www.cnblogs.com/ziwh666/p/12494348.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453727.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python的datetime函数_Python连载8-datetime包函数介绍

一、datetime包(上接连载7内容)1.函数:datetime(1)用法:输入一个日期,来返回一个datetime类?(2)格式:datetime.datetime(年,月,日,hour,minute,second)其中hour,minute,…

深度学习之 soft-NMS

论文:《Improving Object DetectionWith One Line of Code》soft-NMS 英文论文链接:https://arxiv.org/pdf/1704.04503.pdfsoft-NMS github 链接:https://github.com/bharatsingh430/soft-nms 绝大部分目标检测方法,最后都要用到…

一维二维_Excel二维数据转一维,2种方法轻松搞定

今天是2020年1月1日,祝各位小伙伴们新年快乐,开心每一天~如下所示,左边是二维交叉数据表,我们希望快速转换成右边的一维数据表如果复制粘贴,效率太低了,今天分享两种方法,实现快速转换1、powerq…

深度学习之 Cascade R-CNN

Zhaowei Cai, Nuno Vasconcelos. 《Cascade R-CNN: Delving into High Quality Object Detection》. CVPR 2018.论文链接:https://arxiv.org/abs/1712.00726代码链接:https://github.com/zhaoweicai/cascade-rcnn 前言 IOU阈值被用来定义正负例&#x…

转换文档参数_明明2秒可以搞定Word、Excel相互转换,你却用了半小时!真亏了...

我们在用office三件套工作的时候,经常都需要对文件的格式进行转换,像是Word文档和Excel表格的转换,很多小伙伴都要花上半个小时甚至以上的时间才能搞定,效率实在不行。别担心,今天小编将分享能快速完成Word、Excel转换…

深度学习之 DCN(Deformable Convolution)-可变形卷积

Paper link: http://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdfhttps://arxiv.org/pdf/1703.06211 Code link: https://github.com/msracver/Deformable-ConvNets Abstract 如何有效地对几何图形的变化进行…

软件开发 项目进展 软件架构 指南

软件开发,标准化流水线式开发的实施构想 软件开发,标准化流水线式开发的实施构想 近日看到一篇博文,讨论标准化流水线开发模式的话题,但是这篇博文仅仅提出这个问题,未见回应。 这其实是一个很大的问题,我…

c++ 舞伴配对问题_挑战新物体描述问题,视觉词表解决方案超越人类表现

编者按:最近,研究者们发布了 nocaps 挑战,用以测量在没有对应的训练数据的情况下,模型能否准确描述测试图像中新出现的各种类别的物体。针对挑战中的问题,微软 Azure 认知服务团队和微软研究院的研究员提出了全新解决方…

深度学习之双线性插值(Bilinear interpolation)

1. 什么是插值 Interpolation is a method of constructing new data points within the range of a discrete set of known data points. Image interpolation refers to the“guess”of intensity values at missing locations. 图片放大是图像处理中的一个特别基础的操作。…

深度学习之 OHEM (Online Hard Example Mining)

论文 《Training Region-based Object Detectors with Online Hard Example Mining》链接 https://arxiv.org/pdf/1604.03540.pdf Astract 摘要主要讲了四点: (1) 训练过程需要进行参数的空间搜索(2) 简单样本与难分辨样本之间的类别不平衡是亟需解决的问题(3) 自…

音视频 详解

avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操…

c6011取消对null指针的引用_C++| 函数的指针参数如何传递内存?

函数的参数是一个一级指针,可以传递内存吗?如果函数的参数是一个一级指针,不要指望用该指针去申请动态内存。看下面的实例:#include using namespace std;void GetMemory(char *p, int num){p (char *)malloc(sizeof(char) * num…

深度学习目标检测之 YOLO v2

论文名:《YOLO9000: Better, Faster, Stronger》原文:https://arxiv.org/pdf/1612.08242v1.pdf代码:http://pjreddie.com/darknet/yolo/ YOLO v2 斩获了CVPR 2017 Best Paper Honorable Mention。在这篇文章中,作者首先在YOLOv1的…

深度学习目标检测之 YOLO v3

论文名:《YOLOv3: An Incremental Improvement》论文地址 https://pjreddie.com/media/files/papers/YOLOv3.pdfhttps://arxiv.org/abs/1804.02767v1 论文代码 https://github.com/yjh0410/yolov2-yolov3_PyTorchkeras:https://github.com/qqwweee/keras…

30本pdf完整版的经典Linux学习和开发教程和资料下载 android arm java 资料大全

史上最牛的Linux内核学习方法论 点击下载我的arm_linux移植笔记 点击下载S3C2440完全开发流程 点击下载Linux系统命令及其使用详解完整版 点击下载Linux主要shell命令详解 点击下载深入理解Linux内核(第三版 pdf英文版) 点击下载深入分析Linux内核源代码教程pdf完整版 点击下…

Fedex Ship Manager Software安装

本文出自Simmy的个人blog:西米在线 http://simmyonline.com/archives/552.html 这个软件的安装颇费了我一番周章,特地Log之。下载:http://www.fedex.com/apac_english/fsmsoftware/ 安装完后,接着输入用户信息,然后连…

【转】博客美化(3)为博客添加一个漂亮的分享按钮

阅读目录 1.社会化分享2.选择一个分享按钮3.添加到博客园博客博客园美化相关文章目录:博客园博客美化相关文章目录 在前2篇博客“博客美化(1)基本后台设置与样式设置”与"博客美化(2)自定义博客样式细节"中详细介绍了博客样式设置的相关问题,当…

深度学习目标检测之 YOLO v4

论文原文:https://arxiv.org/abs/2004.10934代码 原版c: https://github.com/AlexeyAB/darknetkeras:https://github.com/Ma-Dan/keras-yolo4pytorch:https://github.com/Tianxiaomo/pytorch-YOLOv4 前言 2020年YOLO系列的作者…

[Android] 年年有鱼手机主题

自制的年年有鱼手机主题,希望大家喜欢!~ 下载地址:https://yunpan.cn/cqauQbiM97idd (提取码:d272) 本文转自haiyang45751CTO博客,原文链接: http://blog.51cto.com/haiyang457/1…

mysql 小数做索引_10 分钟掌握 MySQL 的索引查询优化技巧

本文的内容是总结一些MySQL的常见使用技巧,以供没有DBA的团队参考。如无特殊说明,存储引擎以InnoDB为准。MySQL的特点了解MySQL的特点有助于更好的使用MySQL,MySQL和其它常见数据库最大的不同在于存在存储引擎这个概念,存储引擎负…