大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

时间:2024-03-26 08:09:29

大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

邵盛松 笔记

介绍

王枫老师,旷视研究院检测组算法研究员,曾在文字检测著名赛事ICDAR中ArT检测任务中担任主力带队获得冠军。
天元官网
MegEngine GitHub
作业地址
RetinaNet对应的论文Focal Loss for Dense Object Detection
作者:Tsung-Yi LinPriya GoyalRoss GirshickKaiming HePiotr Doll ́ar

课程大纲

RetinaNet前置概念介绍
RetinaNet的模型结构和实现方式
RetinaNet后处理
课程作业

RetinaNet前置概念介绍

backbone - ResNet50

Kaiming He等人关于ResNet的两篇论文
Deep Residual Learning for Image Recognition
作者:Kaiming He,Xiangyu Zhang,Shaoqing Ren,Jian Sun

Identity Mappings in Deep Residual Networks
作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun

ResNet(Residual Network,残差网络)较好地解决的问题:
随着网络的加深,网络却越发难以训练,一方面会产生梯度消失现象;另一方面越深的网络返回的梯度相关性会越来越差,接近于白噪声,导致梯度更新也接近于随机扰动。

ResNet获得了2015年ImageNet分类任务的第一名。此后的分类、检测、分割等任务也大规模使用ResNet作为网络骨架。
ResNet的思想在于引入了一个深度残差框架来解决梯度消失问题,即让卷积网络去学习残差映射,而不是期望每一个堆叠层的网络都完整地拟合潜在的映射(拟合函数)。如下图显示普通网络与ResNet的残差映射的区别。

大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》
对于神经网络,如果我们期望的网络最终映射为H(x),左侧的网络需要直接拟合输出H(x),而右侧由ResNet提出的子模块,通过引入一个shortcut(捷径)分支,将需要拟合的映射变为残差F(x):H(x)-x。ResNet给出的假设是:相较于直接优化潜在映射H(x),优化残差映射F(x)是更为容易的。

上述的一个残差模块称为Bottleneck。ResNet有不同网络层数的版本,如18层、34层、50层、101层和152层,所以网络名字又叫ResNet-18、ResNet-34、ResNet-50、ResNet-101和ResNet-152这5种,分别代表不同卷积层数目的神经网络。这里王枫老师以常用的50层来讲解。ResNet-50的网络架构看下图的50-layer,最主要的部分在于中间经历了4个大的卷积组,而这4个卷积组分别包含了3、4、6、3这4个Bottleneck模块。最后经过一个全局平均池化使得特征图大小变为1×1,然后进行1000维的全连接,最后经过Softmax输出分类得分。

大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

FPN结构

FPN是把resnet输出的特征进行融合的一种网络结构。因为很好的融合了不同层的特征,通常能够起到不错的效果。
FPN全程Feature Pyramid Networks,对应论文Feature Pyramid Networks for Object Detection
FPN将高层的特征与低层的特征进行融合,分别对每一层进行预测,其中高层特征通过最近邻插值的方式增大两倍的尺寸,而底层的特征经过一个1×1的卷积进行降维,两层特征分别进行像素级的相加完成融合。融合之后的特征可以经过一个3×3的卷积层之后用来预测,也可以再重复上面的操作,和更低层的特征进行融合。
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》
FPN简单有效的多尺度策略,使其成为目标检测领域中主流的多尺度框架。对FPN方法的后续改进可以从以下两个思路出发。
(1)利用学习的方法,把高层和底层的信息通过卷积进行融合,而不是进行简单的像素级叠加,由神经网络自主选择哪些特征进行融合。
(2)增加降采样的跳层连接,进一步增加特征信息流动。
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

Anchor

PFN产生了P2-P6的特征,我们的任务就是需要针对FPN输出的特征图产生对应的先验框,这些先验框我们称为anchor。
Anchor的本质:
网络对于输入的先验Proposals = Anchor + Offset

Anchor是目标检测算法中非常重要的内容,最早是出现在Faster RCNN系列论文中,Anchor这个单词翻译成中文是锚,锚是船只在航行过程中需要停下时使用的东西,在一定程度上能够起到固定船只的目的,而在目标检测算法中,Anchor正是一系列固定大小、宽高比的框,这些框均匀地分布在输入图像上,而检测模型的目的就是基于这些anchor得到预测框的偏置信息(offset),使得Anchor加上偏置信息后得到的预测框能够尽可能地接近真实目标框。在SSD论文中提到过一个名词default box,翻译过来就是默认框,其实默认框与anchor的含义是类似的,基础知识可以参考这里
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

对应论文 Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
作者:Shaoqing Ren, Kaiming He, Ross Girshick, and Jian Sun

RetinaNet的模型结构和实现方式

RetinaNet在物体检测上实现的Pipeline

1 根据输入图像进行特征提取,并将产生的特征输出
2 根据上一步输出的特征产生Anchor
3 对Anchor进行分类和回归,并输出实际的预测框。
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》
上图还有另一种叫法
ReNet称为body
FPN称为neck
class和box部分称为head
RetinaNet对应的论文Focal Loss for Dense Object Detection

输入图像处理流程

对于COCO数据集,一种有两部
1 将输出图像resize成短边不超过800,长边不超过1333的图像
2 对于输入图像进行随机水平翻转,翻转概率为0.5
3 转成(CHW)形状的输入图像

在实际进入检测网络之前还需要进行进一步预处理:
1 将数据图像的宽度和高度pad成32的倍数
2 normalization(减去mean后除以std)

基础网络backbone(ResNet50)

1 要实现一个Resnet-50的backbone,需要实现3个卷积组成的bottleneck这一基本组件
2 实现了bottleneck之后,接下来就是根据ResNet-50结构搭积木

FPN结构

对于ResNet输出的一个特征图来收,FPN结构上需要一个水平方向的1*1卷积和一个进行上采样的方法(未必是卷积)。

Anchor生成器

Anchor是根据特征图的尺寸产生的候选框,在实际生成Anchor过程中,我们先生成一个pixel的anchor,称为cell anchor.
全部的anchor就是cell anchor进行水平和垂直两个方向的偏移得到的结果。

RetinaNet Head

RetinaNet中head有两个分支,这些分支针对FPN的输出进行对应特征的回归和分类。
另外需要注意的点是head是一个共享的,针对FPN的多个输出,产生输出。
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

Loss部分

1 Focal loss是RtinaNet论文提出的一个loss,用于解决检测中样本不均衡问题,在RetinaNet中用于anchor的分类
2 Smooth L1 Loss是常用于监督box的回归的一个loss,RetinaNet中的回归分支就是使用的这一个loss。
大佬带队!旷视研究院 CV Master训练营-《 一阶段检测器RetinaNet 详解与实践》

了解决一阶网络中样本的不均衡问题,何凯明等人首先改善了分类过程中的交叉熵损失函数,提出了可以动态调整权重的Focal Loss。

从标准交叉熵损失开始
关于交叉熵的基础知识
PyTorch版本的实践

标准的交叉熵(Cross Entropy, CE)

C E ( p , y ) = { − log ⁡ ( p )  if  ( y = 1 ) − log ⁡ ( 1 − p )  otherwise  C E(p, y)=\left\{\begin{array}{cc} -\log (p) & \text { if }(y=1) \\ -\log (1-p) & \text { otherwise } \end{array}\right. CE(p,y)={log(p)log(1p) if (y=1) otherwise 

公式中,p代表样本在该类别的预测概率,y代表样本标签。可以看出,当标签为1时,p越接近1,则损失越小;标签为0时p越接近0,则损失越小,符合优化的方向。

为了方便表示,按照上式将p标记为pt:

p t = { p  if  ( y = 1 ) 1 − p  otherwise  p_{t}=\left\{\begin{array}{cc} p & \text { if }(y=1) \\ 1-p & \text { otherwise } \end{array}\right. pt={p1p if (y=1) otherwise 

则交叉熵可以表示为下式的形式:

C E ( p , y ) = C E ( p t ) = − log ⁡ ( p t ) C E(p, y)=C E\left(p_{t}\right)=-\log \left(p_{t}\right) CE(p,y)=CE(pt)=log(pt)

可以看出,标准的交叉熵中所有样本的权重都是相同的,因此如果正、负样本不均衡,大量简单的负样本会占据主导地位,少量的难样本与正样本会起不到作用,导致精度变差。

平衡交叉熵损失

为了改善样本的不平衡问题,平衡交叉熵在标准的基础上增加了一个系数αt来平衡正、负样本的权重,αt由超参α按照下式计算得来,α取值在[0,1]区间内。

α i = { α  if  ( y = 1 ) 1 − α  otherwise  \alpha_{i}=\left\{\begin{array}{cc} \alpha & \text { if }(y=1) \\ 1-\alpha & \text { otherwise } \end{array}\right. αi={α1α if (y=1) otherwise 

有了αt,平衡交叉熵损失公式如下式所示。

C E ( p t ) = − α t log ⁡ ( p t ) C E\left(p_{t}\right)=-\alpha_{t} \log \left(p_{t}\right) CE(pt)=αtlog(pt)

Focal loss出现了

尽管平衡交叉熵损失改善了正、负样本间的不平衡,但由于其缺乏对难易样本的区分,因此没有办法控制难易样本之间的不均衡。
F L ( p t ) = − a t ( 1 − p t ) γ log ⁡ ( p t ) \mathrm{FL}\left(p_{\mathrm{t}}\right)=-a_t \left(1-p_{\mathrm{t}}\right)^{\gamma} \log \left(p_{\mathrm{t}}\right) FL(pt)=at(1pt)γlog(pt)
对于该损失函数,有如下3个属性:
·与平衡交叉熵类似,引入了 α t α_t αt权重,为了改善正负样本的不均衡,可以提升一些精度。
·(1-pt)γ是为了调节难易样本的权重。当一个边框被误分类时,pt较小,则(1-pt)γ接近于1,其损失几乎不受影响;当pt接近于1时,表明其分类预测较好,是简单样本,(1-pt)γ接近于0,因此其损失被调低了。
·γ是一个调制因子,γ越大,简单样本损失的贡献会越低。

RetinaNet的后处理

对预测图像的缩放

图像输入网络需要resize到800/1333的操作,但是每个图像都是自己的原始大小,网络预测的框的大小是基于resize之后的图像,为了保持一致性,需要根据原始图像的大小对预测框进行处理。

处理冗余框

NMS算法 这里

课程作业

1 熟悉MegEngine
2 使用MegEngine中的RetinaNet并熟悉代码
3 尝试在COCO mini上复现Anchor Free
实现Anchor Free可参考 CornerNet-Squeeze、FCOS、TTFNet等