小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN

目标检测小技术

  • Focal loss
      • 1.概念
      • 2.损失函数形式
  • Deformable Convlolutional Networks
      • 1.背景问题
      • 2.原理与结构
      • 3.Deformable RoI Pooling
      • 4.可变形卷积网络
  • ROI pooling vs ROI Align
      • 1.ROI pooling
      • 2.ROI Align
  • FPN(特征金字塔网络,Feature Pyramid Networks)
      • 1.FPN结构
      • 2.FPN with Fast R-CNN or Faster R-CNN
      • 3.上采样与下采样(补充知识)

Focal loss

转载:https://www.cnblogs.com/king-lps/p/9497836.html
焦点损失函数旨在通过降低内部加权(简单样本)来解决类别不平衡问题,这样即使简单样本的数量很大,但它们对总损失的贡献却很小。也就是说,该函数侧重于用困难样本稀疏的数据集来训练。

1.概念

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

2.损失函数形式

二分类交叉熵函数:
在这里插入图片描述
y’是经过激活函数的输出,所以在0-1之间。可见普通的交叉熵对于正样本而言, 输 出 概 率 越 大 损 失 越 小 。 对 于 负 样 本 而 言 , 输 出 概 率 越 小 则 损 失 越 小 。 \red{输出概率越大损失越小。对于负样本而言,输出概率越小则损失越小。} 此时的损失函数在大量简单样本的迭代过程中比较缓慢且可能无法优化至最优。那么Focal loss是怎么改进的呢?
在这里插入图片描述
在原有的基础上加了一个因子,其中gamma>0使得减少易分类样本的损失。使得更关注于困难的、错分的样本。小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第1张图片
例如gamma为2,对于正类样本而言,预测结果为0.95肯定是简单样本,所以(1-0.95)的gamma次方就会很小,这时损失函数值就变得更小。而预测概率为0.3的样本其损失相对很大。对于负类样本而言同样,预测0.1的结果应当远比预测0.7的样本损失值要小得多。对于预测概率为0.5时,损失只减少了0.25倍,所以更加关注于这种难以区分的样本。这样减少了简单样本的影响,大量预测概率很小的样本叠加起来后的效应才可能比较有效。
此外,加入平衡因子 α \alpha α,用来平衡正负样本本身的比例不均:文中 α \alpha α取0.25,即正样本要比负样本占比小,这是因为负例易分。
在这里插入图片描述
只添加alpha虽然可以平衡正负样本的重要性,但是无法解决简单与困难样本的问题。
gamma调节简单样本权重降低的速率,当gamma为0时即为交叉熵损失函数,当gamma增加时,调整因子的影响也在增加。实验发现gamma为2是最优。

Deformable Convlolutional Networks

1.背景问题

视觉识别中一个关键挑战是如何在目标尺度,姿态,视点和部件变形中适应几何变化或建模几何变换,即适应物体的形变。
现有解决方法:
1)建立具有足够期望变化的训练数据集。例如通过仿射变换增加现有数据样本,即学习足够多的数据使模型能够适应各种形状的物体。缺点: 几何变换被假定是固定并且已知的。这阻止了对具有未知几何变换新任务的泛化能力。
2)使用变换不变的特征和算法。如SIFT(尺度不变特征变换)和基于滑动窗口的目标检测。**缺点:**手工设计的不变特征和算法对于过于复杂的变换可能是不可行的。
解决方法:
可变形卷积:它将2D偏移添加到标准卷积中的常规网格采样位置上。它可以使采样网格自由形变。偏移量通过附加的卷积层从前面的特征图中学习。
可变形的RoI池化:它为前面的RoI池化的常规bin分区中的每个bin位置添加一个偏移量[15,7]。类似地,从前面的特征映射和RoI中学习偏移量,使得具有不同形状的目标能够自适应的进行部件定位。

2.原理与结构

在这里插入图片描述
在这里插入图片描述
可变形卷积,在每个点上再增加一个偏移量 Δ p n Δp_n Δpn.

由于在变换时,有时变化后输出的像素位置可能没有对应的输入图片中的位置,所以使用双线性插值,根据推导公式得到:
在这里插入图片描述
在这里插入图片描述网络结构

小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第2张图片
通过在相同的输入特征映射上应用卷积层来获得偏移。输出的长宽和输入特征图的长宽一致,维度则是输入的2倍,由于偏移的通道维度包括x方向的通道维度和y方向的通道维度。

3.Deformable RoI Pooling

传统ROI池化:
在这里插入图片描述
可变形ROI池化:
在这里插入图片描述
可变形RoI池化整体结构:
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第3张图片
首先,RoI池化(传统公式)生成池化后的特征映射。从特征映射中,一个fc层生成归一化偏移量Δpij,然后通过与RoI的宽和高进行逐元素的相乘转换为偏移量Δpij。在这里插入图片描述
其中,γ=0.1。

4.可变形卷积网络

在训练中,这些添加的用于偏移学习的conv和fc层的权重被初始化为零。它们通过双线性插值运算的反向传播进行训练。由此产生的CNN称为可变形ConvNets。
主要思路:用额外的偏移量在卷积和RoI池中增加空间采样位置,并从目标任务中学习偏移量。标准卷积中的感受野和采样位置在顶部特征映射上是固定的(左)。但在可变形卷积中(右)根据目标的尺寸和形状进行自适应调整。
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第4张图片

ROI pooling vs ROI Align

1.ROI pooling

感兴趣区域池化(Region of interest pooling)(也称为RoI pooling)其目的是对非均匀尺寸的输入执行最大池化以获得固定尺寸的特征图(例如7×7)
例子
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第5张图片
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第6张图片
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第7张图片
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第8张图片
ROI pooling的局限性
由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

  • 将候选框边界量化为整数点坐标值。
  • 将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)。
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第9张图片

下面我们用直观的例子具体分析一下上述区域不匹配问题。如 图1 所示,这是一个Faster-RCNN检测框架。输入一张800x800的图片,图片上有一个665x665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化7x7的大小,因此将上述包围框平均分割成7x7个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。

小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第10张图片

2.ROI Align

ROI Align的思路:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作.

  • 遍历每一个候选区域,保持浮点数边界不做量化。
  • 将候选区域分割成k x k个单元,每个单元的边界也不做量化。
  • 在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作。

双线性插值的理解:
1.数学定义:
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第11张图片
2.用双线性插值获取采样点的特征值
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第12张图片
坐标值服从(x1,y1,x2,y2)。这里有一点需要注意的是(0,0,0,0)代表图像由一个像素点组成。
整个图的bbox是(0,0,3,2),RoI的bbox是(0.5,0,2.5,2)。
这里每个bin的输出值采用4个采样点通过avg或者max得到。
如上图对于(0.75, 0.25)这个采样点的特征值由(0,0),(0,1),(1,0),(1,1)四个点做双线性插值得到:
F(0.75,0.25)=0.25x0.75xF(0,0)+0.25x0.25xF(0,1)+0.75x0.75xF(1,0)+0.75x0.25xF(1,1)
每个bin的采样点集做avg或者max得到每个bin的特征值。

这里对上述步骤的第三点作一些说明:这个固定位置是指在每一个矩形单元(bin)中按照固定规则确定的位置。比如,如果采样点数是1,那么就是这个单元的中心点。如果采样点数是4,那么就是把这个单元平均分割成四个小方块以后它们分别的中心点。显然这些采样点的坐标通常是浮点数,所以需要使用插值的方法得到它的像素值。在相关实验中,作者发现将采样点设为4会获得最佳性能,甚至直接设为1在性能上也相差无几。事实上,ROI Align 在遍历取样点的数量上没有ROIPooling那么多,但却可以获得更好的性能,这主要归功于解决了misalignment的问题。值得一提的是,我在实验时发现,ROI Align在VOC2007数据集上的提升效果并不如在COCO上明显。经过分析,造成这种区别的原因是COCO上小目标的数量更多,而小目标受misalignment问题的影响更大(比如,同样是0.5个像素点的偏差,对于较大的目标而言显得微不足道,但是对于小目标,误差的影响就要高很多)。
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第13张图片
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第14张图片

ROI Pooling的反向传播公式如下:
在这里插入图片描述
这里,xi代表池化前特征图上的像素点;yrj代表池化后的第r个候选区域的第j个点;i*(r,j)代表点yrj像素值的来源(最大池化的时候选出的最大像素值所在点的坐标)。由上式可以看出,只有当池化后某一个点的像素值在池化过程中采用了当前点Xi的像素值(即满足i=i*(r,j)),才在xi处回传梯度。
类比于ROIPooling,ROIAlign的反向传播需要作出稍许修改:首先,在ROIAlign中,xi*(r,j)是一个浮点数的坐标位置(前向传播时计算出来的采样点),在池化前的特征图中,每一个与 xi*(r,j) 横纵坐标均小于1的点都应该接受与此对应的点yrj回传的梯度,故ROI Align 的反向传播公式如下:
在这里插入图片描述

FPN(特征金字塔网络,Feature Pyramid Networks)

转载:https://www.cnblogs.com/sdu20112013/p/11050746.html
小目标检测很难,为什么难.想象一下,两幅图片,尺寸一样,都是拍的红绿灯,但是一副图是离得很近的拍的,一幅图是离得很远的拍的,红绿灯在图片里只占了很小的一个角落,即便是对人眼而言,后者图片中的红绿灯也更难识别.
说回到cnn,不断地卷积以后,feature map的尺寸变小.这时候feature map所代表的语义信息已经很丰富了,如果绘图绘制出来,可能会看见代表的是某种形状,颜色,或更高级的更抽象的概念了.但是由于feature map尺寸减小,所以检测小目标困难.
我们可以用同一图片,不同尺寸内容相同的同一幅图分别训练多个feature map,但是这么搞会极其耗时,并且需要大量内存.在实时性要求高的场景下是不能这么搞的.这就引入了FPN的概念

1.FPN结构

特征金字塔网络(FPN)是根据特征金字塔概念设计的特征提取器,目的是提高精度和速度.
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第15张图片

经过一系列的卷积以后得到了feature map,我们通过上采样,再一步步还原回去,在保证高级语义信息没丢的情况下,还把feature map的size搞大了.然后用大size的feature map去检测小目标.从而解决小目标难以检测的问题.
FPN由自下而上和自上而下两部分构成.自下而上的就是传统的卷积网络做特征提取,随着卷积的深入,空间分辨率减少,空间信息丢失.但是高级语义信息被更多地检测到.
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第16张图片
ssd从依据多个feature map来做预测,但是底层的layer并没有选中做object detetion.底层的具有high resolution,但是不具备高级语义high semantic.ssd为了提高速度,在predict的时候不用比较底层的feature map.这一点也导致了它对小目标的检测效果不好.
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第17张图片
FPN提供了一种自上而下的路径,去构建higher resolution layer from a semantic rich layer.
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第18张图片
这样构建出来的层具有high resolution的同时又有丰富的语义rich semantic.但是由于经过了不断地上采样下采样,object的位置已经不准确了.
所以我们在重新构建出来的层和相应的feature map之间构建横向连接,以使得检测器可以更好地预测location.
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第19张图片
下面是自下而上和自上而下的路径图.P2,P3,P4,P5是object detection所需的金字塔feature ma
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第20张图片

2.FPN with Fast R-CNN or Faster R-CNN

通过FPN,生成了feature map的金字塔(也就是一堆不同尺寸的特征图,都具有高级语义).然后用RPN生成ROI.然后对不同尺寸的目标,选用不同尺寸的特征图去做识别.小目标要用大尺寸的feature map. 大目标用小尺寸的feature map.很好理解,目标很小,你再用小尺寸(低分辨率)的feature map,肯定更难看清目标了.
小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN_第21张图片

3.上采样与下采样(补充知识)

定义:
放大图像(或称为上采样(upsampling)或图像插值(interpolating))的主要目的是放大原图像,从而可以显示在更高分辨率的显示设备上。对图像的缩放操作并不能带来更多关于该图像的信息, 因此图像的质量将不可避免地受到影响。然而,确实有一些缩放方法能够增加图像的信息,从而使得缩放后的图像质量超过原图质量的。
缩小图像(或称为下采样(subsampled)或降采样(downsampled))的主要目的有两个:1、使得图像符合显示区域的大小;2、生成对应图像的缩略图。
原理:
**上采样原理:**图像放大几乎都是采用内插值方法,即在原有图像像素的基础上在像素点之间采用合适的插值算法插入新的元素。
下采样原理:对于一幅图像I尺寸为MxN,对其进行s倍下采样,即得到(M/s)x(N/s)尺寸的得分辨率图像,当然s应该是M和N的公约数才行,如果考虑的是矩阵形式的图像,就是把原始图像sxs窗口内的图像变成一个像素,这个像素点的值就是窗口内所有像素的均值。
无论缩放图像(下采样)还是放大图像(上采样),采样方式有很多种。如最近邻插值,双线性插值,均值插值,中值插值等方法。在AlexNet中就使用了较合适的插值方法。各种插值方法都有各自的优缺点。

你可能感兴趣的:(小嘿嘿之目标检测关键小技术focal loss/DCN/ROI Align/FPN)