date: 2020/03/30

爱得太迟 - 古巨基:爱一个字 也需要及时


参考:


Faster RCNN

论文:《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks (NIPS2015)

参考:


image.png

(整体结构)


image.png

(详细结构)


可以把模型分为三部分,红框部分进行前端的特征提取,红框与绿框部分组成RPN网络用于产生候选区域,红框与紫框部分组成识别网络用于候选区域的分类识别与预测框的二次修正。


区域候选网络RPN

image.png


区域候选网络(Region Proposal Network, RPN)在特征图上预设了一系列锚框,通过输入图片预测出锚框的修正值(尺度修正和位置修正),并判断是否为正样本(包含目标),从而得出一系列候选区域。

image.png


锚框anchor

首先思考一下特征图与原始图像在位置上的对应关系。

假设原图输入分辨率为4x4,下采样两倍后特征图尺寸为2x2,

image.png     image.png

左:原图;   右:下采样2倍


由于两张图都分别代表了原图整张图片上的信息,只不过分辨率不同,那么可以认为特征图上的像素点在空间上对应原图2x2像素块的信息的一个聚合(换算成坐标的话,通常是代表2x2像素块的一个中心位置)。原文backbone部分采用的是VGG16,从下采样16倍的conv5取出特征图,此时特征图上每个像素点在空间上对应原图每个16x16像素块的中心位置。


为特征图的每个像素点上设置若干不同尺寸、不同长宽比的锚框——映射到原图上相当于以每个16x16像素块的中心点为中心设置一系列锚框。

原文将输入图片短边缩放为600(长边等比例缩放)作为原图输入,假设缩放后图像尺寸为800x600,下采样16倍后特征图尺寸为50x38,每个锚点设置三种尺寸(128x128, 256x256, 512x512)、三种长宽比(1:2, 1:1, 2:1)共9个锚框——对整张特征图而言,那么共计个锚框。

image.png


正负样本判别

image.png

模型结构上非常简单,直接用1x1卷积为每个像素点回归出个数值(即输出个通道),然后经过softmax得到个锚框的正/负样本分类概率(原文)。Reshape是为了分成组,分别做Softmax并且Reshape复原。


预测框修正

由于锚框尺寸和位置是固定的,我们需要根据输入来给锚框预测一个修正值从而得到真正的预测框。

image.png


如何将一个矩形框变换成另一个矩形框?

考虑到我们通常用左上角坐标和右下角坐标来标定一个矩形框的大小和位置,所以最直接的想法就是生成坐标的偏移量。但这样似乎抛弃掉宽高信息,同一个,对一个非常小的矩形框来说可能是一次巨变,对一个非常大的矩形框来说却又不痛不痒,显然是不大合理的。

那我们用另外一种方式来确定一个矩形框,记录其中心坐标和宽,RPN生成中心坐标和宽高的偏移量,最好再规范化一下:

这里涉及4个参数,原文用了9个锚框,也就是一共个参数(即36个通道)

注意:与YOLO不同,在Faster RCNNSSD中,中心坐标的偏移量都是相对栅格中心的一个偏移!


交并比IoU

参考:《NMS算法详解 | 知乎, TeddyZhang

交并比(Intersection over Union, IoU),也称为jaccard重叠率,通过计算两个集合的交集与并集的比值,用来指示两个集合的重合程度。

image.png


对于矩形框目标检测任务,计算IoU时有些小技巧:

假设有两个矩形框,他们的左上角坐标分别为,右下角坐标分别为,那么


IoU计算_水印.jpg


非极大值抑制NMS

参考:《目标定位和检测系列(3):交并比(IOU)和非极大值抑制(NMS)的python实现 | CSDN, Meringue_zz

网络出来的原始预测框会出现大量重叠框,非极大值抑制(Non-Maximum Suppression, NMS)的目的在于筛选去除重叠率比较高的预测框,具体过程如下:

  1. 选取score最高的框,计算它跟其他框的IoU,去掉IoU超过阈值(如0.5)的所有框
  2. 从剩下的框中继续选score最高的,去除IoU较高的框
  3. 重复步骤直到没有比当前框更低的score


注意:原始的NMS是用IoU作为筛选指标,后来的论文提出了一些更有效的指标如GIoU、DIoU等,都能在一定程度上提高NMS的效果。


RoI Pooling

Region of Interest Pooling(RoI Pooling)启发自空间金字塔池化SPP,可以根据实际的输入图像自适应划分池化区域,使得池化后的输出特征图尺寸统一,是目标检测任务中适应动态尺寸输入的常见手段之一。

image.png

左上:原图;    右上:池化区域;    左下:实际池化区域的划分;    右下:对应的池化结果


Fast RCNN网络

image.png

这一部分就比较简单,也与更早的版本Fast RCNN网络的设计相同,只是简单的全连接跟非线性激活的堆叠,最后产生预测框的二次修正,以及最终的分类结果以及分类概率——具体细节参见RPN中的论述。


训练细节

image.png

四步训练方案

FRCNN四步训练_水印.jpg

(四步训练方案示意图)


  1. 用预训练分类网络初始化红框部分,随机初始化绿框部分,训练RPN(红框和绿框)
  2. 用训练好的RPN生成候选框,用预训练分类网络重新初始化红框部分,随机初始化紫框部分,训练Fast RCNN(红框跟紫框)
  3. 用训练好的Faster RCNN的权重初始化红框部分并冻结,随机初始化绿框部分,重新训练RPN(绿框)
  4. 用新的RPN生成候选框,微调Fast RCNN(紫框)


损失函数

无论是训练RPN还是训练Fast RCNN,都使用以下损失函数:

损失包含分类损失和回归损失两部分。

其中分别是预测分类、预测修正值、实际分类、实际修正值;

使用softmax交叉熵,而使用SmoothL1损失


负样本采样


R-FCN

论文:《R-FCN: Object Detection via Region-based Fully Convolutional Networks (NIPS2016)

参考:《R-FCN 与 Position Sensitive ROI Pooling | CSDN, 图波列夫


SSD

论文:《SSD: Single Shot MultiBox Detector(2016)

早前的博文:《SSD框架解析 | Hey~YaHei!


SSD_architecture.png



FPN

论文:《Feature Pyramid Networks for Object Detection (CVPR2017)

受语义分割任务的 UNet 启发,增加上采样路径并与浅层特征融合,通常将包含FPN的backbone称为“xxx-FPN”,比如“ResNet50-FPN”。

image.png


RetinaNet

论文:《Focal Loss for Dense Object Detection (ICCV2017)》主要是提出了Focal Loss

整体结构与SSD差别不大,改使用FPN作为backbone,预测分支(subnet)则复杂得多(4个同通道的3x3卷积+1个映射通道的3x3卷积)

image.png


Mask RCNN

论文:《Mask R-CNN (ICCV2017)

参考:《令人拍案称奇的Mask RCNN | 知乎, stone

在Faster RCNN的基础上引入多任务学习,同时做检测和分割,由于有信息更丰富的分割任务的参与,使得检测网络的训练过程更快、更稳定,效果更好。

image.png


多任务学习

image.png

如图,阴影部分是原始Faster RCNN的输出部分,经过ROI Pooling之后进行简单的特征提取,然后分别预测出分类和回归出预测框的偏移量。


Mask RCNN在这基础上扩展出新的分支,经过一定的特征提取和上采样之后输出一个粗粒度的分割结果(注意,是粗粒度的像素块分割结果,而不是真正分割任务那种像素级别的细粒度分割)。分类时对每个类别分别用sigmoid激活而非整体上使用softmax,计算交叉熵损失并计入总损失进行训练,训练时只计算真实类别对应的sigmoid交叉熵损失,推断时根据分类分支的分类结果只产生单个分类的粗粒度分割结果。


ROI Align

ROI Pooling在实际操作时会出现两次取整操作,

  1. RPN输出的候选框中心点坐标、宽高其实都是小数,为了能正确从原始图片上裁剪下来,需要对这些数值进行取整;
  2. ROI Pooling在执行过程中,由于像素点不可细分,所以也需要在划分区域时进行取整操作

image.png

(ROI Pooling的两次取整,图源自stone


取整过程不可避免地引入误差,因此Mask RCNN提出不需要取整的ROI Align。其思路也非常简单,既然采样坐标是是小数,那就像Resize图像一样使用双线性插值来充分利用原始图像信息好了。

image.png


评估指标


损失函数

目标检测中最经典的损失函数就是Faster RCNN所用的“softmax交叉熵分类损失 + SmoothL1回归损失”的形式,后来有很多改进的目标检测网络、方案也陆续提出了一些损失函数上的改进。


除了这里列举的一些损失外,还可以参考一下YOLO的损失函数


分类损失

参考:

分类损失的改进主要是解决目标检测中样本不均衡的问题,通常是给难易样本设置一个自适应的权重损失。


Focal Loss

论文:《Focal Loss for Dense Object Detection (ICCV2017)》RetinaNet

作者设计了一个自适应加权的loss,为难样例设置更大的权重,从而提升训练效果。


首先考虑一个二分类的交叉熵(为方便起见,用二分类进行讨论,同理可推广至多分类情况),

其中,,而是预测为的概率


加入一个人工设置的权重,缓解样本不均衡的问题,


引入一个自适应的权重,为难样例设置更大的权重,

image.png


实际操作中,Focal Loss可以结合人工设置的一起使用,即


image.png


Focal Loss有两个超参需要设置,之后一些新的分类损失则进一步简化了形式,提出一些不需要设置额外超参的loss。


Class-Balanced Loss

论文:《Class-Balanced Loss Based on Effective Number of Samples (CVPR2019)  参考译文  

论文提出用样本数量来调节为已有的损失函数加权,以此来缓解样本不均衡问题,应用在Focal Loss上则为

image.png

其中,

是一个超参;

是训练集上类别的样本数;

越大,越小,权重越小,也即样本数量越多,那么他对损失的贡献就越小


AP Loss

论文:《Towards Accurate One-Stage Object Detection With AP-Loss (CVPR2019)

参考:《感知算法论文(九):Towards Accurate One-Stage Object Detection with AP-Loss | CSDN, 呆呆的猫

Average Precision Loss(AP Loss)对每个预测框进行排序,用排序后的序号来设计loss,核心思想在于鼓励正样本预测框的得分在负样本得分序列中尽可能靠前。启发自AUC Loss,后者用AUC的排序序号来设计loss,直接对AUC进行优化,而目标检测通常以mAP为指标,因此作者指出直接对AP进行优化能有更好的效果。


Bounding Box的设置方式跟传统的设置方式有些不同。比如有分类,

image.png

左:一个label,属于分类k;    右:K个label,第k个为1


AP Loss的具体设计(与GTBox的IoU超过阈值为正样本,否则为负样本):

  1. 所有预测框两两之间的得分差值
  2. 计算每个预测框的归一化排序(在所有预测框中的排序)

    其中,是得分大于等于的所有预测框数量(包括正负样本);
    显然,就是第个预测框在所有预测框中的排序序号,而就是第个预测框的得分在所有负样本框中的一个排位(归一化的序号,序号越小则得分越高);
    也可以展开成关于的数学描述,

    其中,为阶跃函数,
  3. 计算AP Loss

    其中,是正样本预测框的数量;也可以写成,

  4. 显然是不可导,所以需要定义近似的更新规则
    是真实值。
    时,,因为我们目标是让正样本预测框的得分比所有负样本预测框都高;
    时,,因为它不对AP Loss产生贡献;
    因此,可以简化成


相比于Focal Loss有比较明显的提升,而且不需要调整任何超参:

image.png

(在RetinaNet上使用不同分类损失的实验结果)


GHM-C Loss

论文:《Gradient Harmonized Single-stage Detector (AAAI2019)GHM-C和GHM-R

Gradient Harmonized Mechanism(GHM)通过利用计算损失前的特征的梯度信息,对原损失进行规范化操作。包括针对分类损失改进的GHM-C和针对回归损失改进的GHM-R。该损失只有一个超参。


考虑某一分类的交叉熵

其中,那么(注意这里的对数是自然对数),

记梯度的绝对值为

显然,越大,那么这个样例就越hard

image.png

如上图所示,对于一个收敛的检测网络,


接下来定义第个样例上的梯度密度,

其中,为一个batch的样例数,是一个宽度,而

直观点理解,

表示在所有样例中,梯度绝对值在附近范围内的样例数量;

按照区间宽度对数量进行规范化处理,将具体展开来为

image.png

显然,对小梯度和大梯度对应的梯度密度都做了一些抑制。


进一步用归一化梯度密度来定义一个梯度密度协变量(gradient density harmonizing parameter),


最后用为不同样例的损失进行加权以平衡难易样例的权重,


image.png

如上图所示,CE、FL、GHM-C都可以看作是对梯度分布正则化的过程,将梯度范数调整到一个相对平缓的范围内。FL仅仅抑制了小梯度的样例数量(主要是easy负样例),而GHM-C同时抑制了大梯度的样例数量(very hard样例)。

GHM-C依赖于mini-batch的统计结果,跟BN一样,要求batch-size不能太小,否则统计量不准确将导致训练过程不稳定。


实验结果:似乎比Focal Loss稍微好一点点,但不明显

image.png


为了降低梯度密度的计算复杂度,提出了一种近似算法:

  1. 找到梯度的最大值最小值
  2. 将区间等分为个子区间(Unit Region),那么有
  3. 为第个区间中包含的样例数量,那么可以近似求得
  4. 只要足够大,就能比较好近似原始设计(如论文实验取能得到最佳效果)
  5. 考虑到算法涉及mini-batch内的统计量,有可能出现某个mini-batch里出现一些极端值导致训练不稳定。为了稳定数值,可以采用指数平滑平均EMA进行处理
  6. 实验比较(原始设计的训练速度非常慢)

image.png

(GHM-C Standard和GHM-C RU分别表示原始设计和近似设计)


回归损失

参考:

原始的回归损失是直接利用L1、L2或SmoothL1对坐标值/尺度进行数值回归,GHM-R是GHM在提出GHM-C分类损失的同时,采取类似的处理的一种改进思路;后来出现了直接用IoU来设计回归损失,再后来回归损失的改进都是对框回归好坏的指标改进,先后出现了GIoU、DIoU等对IoU的改进方案,从而衍生出对应的回归损失。


GHM-R Loss

论文:《Gradient Harmonized Single-stage Detector (AAAI2019)》GHM-C和GHM-R


沿用GHM-C Loss的思路设计新的回归损失函数,直觉告诉我们可以这样做:

其中,

为SmoothL1损失函数

关于的含义可以参见Faster RCNN的预测框修正一节,为方便进一步解释,记


接下来考虑的合理性,

其中,是认为设置的超参。

那么


由于GHM-R依赖梯度信息来计算Loss,所以要求不同样例的梯度能有一定的区分度。

但这里的,于是作者设计了另一种与SmoothL1有类似效果的损失:

那么,记,则


实验结果:SL和ASL效果相近,GHM-R则有少量提升

image.png


IoU Loss

论文:《UnitBox: An Advanced Object Detection Network (ACM-MM2016)

早前的L1、L2、SmoothL1损失都只把每个(规范化的)坐标值/尺度当作独立的变量训练,没有考虑它们内在的联系,因此提出用IoU的交叉熵来设计损失。

IoU Loss在设计损失时为(规范化的)坐标值/尺度建立了联系,可以直接反映预测框的检测效果,同时IoU对尺度也不敏感。

但是,GIoU的论文也指出了IoU的一些缺点,

  1. 对于不与真实框重叠的预测框,,此时损失为零,对网络的学习过程没有贡献
  2. 在某些情况下(尤其是允许预测框旋转的情况下),IoU指标似乎不够合理。如下图所示,三组的IoU是相等的,但直观上判断回归的效果是:左 > 中 > 右

image.png


GIoU Loss

论文:《Generalized Intersection over Union: A Metric and A Loss for Bounding Box Regression (CVPR2019)

image.png

(它们的GIoU Loss相同,但显然第三种情况回归地更好)


DIoU Loss & CIoU Loss

论文:《Distance-IoU Loss: Faster and Better Learning for Bounding Box Regression (AAAI2020)

image.png

image.png


在DIoU Loss的基础上,论文继续引入长宽比的惩罚得到CIoU Loss:

其中,

度量了两框的长宽比差异,完全相等时

是一个自适应的调节权重,目的是为了突出的回归,当比较小甚至时,应当优先学习如何回归出能够重叠、重叠的比较好的预测框,而不是学习如何调整长宽比。


Yolo-v3在VOC2007上的实验结果:

image.png

表示用DIoU来做NMS


图像增广


其他