【ML Notes】 2019-11-28 目标检测算法梳理

信息量爆炸,看了各种博客后摘抄总结一下,免得明天又忘了。。

【ML Notes】 2019-11-28 目标检测算法梳理_第1张图片

目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型:(1)two-stage方法,如R-CNN系算法,其主要思路是先通过启发式方法(selective search)或者CNN网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高;(2)one-stage方法,如Yolo和SSD,其主要思路是均匀地在图片的不同位置进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快,但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡(参见Focal Loss),导致模型准确度稍低。不同算法的性能如图1所示,可以看到两类方法在准确度和速度上的差异。(3)Anchor free方法。如:centernet



一、Two-stage类别的目标检测算法

如R-CNN系列算法,其主要思路是先通过启发式方法(selective search)或者 CNN 网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类(classification)与回归(bounding box regression),two-stage方法的优势是准确度高;

图源链接:https://blog.csdn.net/gaoyu1253401563/article/details/86485851

【ML Notes】 2019-11-28 目标检测算法梳理_第2张图片
基本流程


【ML Notes】 2019-11-28 目标检测算法梳理_第3张图片
发展


1.R-CNN

论文地址

代码地址


【ML Notes】 2019-11-28 目标检测算法梳理_第4张图片


【ML Notes】 2019-11-28 目标检测算法梳理_第5张图片

主要思想:

1.输入一张图像

2.(Selective Search)选择性搜索从图像中生成2000个左右的区域建议框。

不使用暴力方法,而是用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。在选择性搜索(selective search,SS)中,我们首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。

【ML Notes】 2019-11-28 目标检测算法梳理_第6张图片

3.将每一个区域建议框转换为固定大小的图像,并分别馈送到卷积神经网络中。该网络架构后面会跟几个全连接层,提取特征,并组合特征。

4.使用线性SVM分类器对每个区域建议框分类

5.通过边界框回归算法重新定义目标边界框

局限性:

1.目标候选区域的重叠使CNN特征提取存在很大冗余,如果我们有 2000 个候选区域,且每一个都需要独立地馈送到 CNN 中,那么对于不同的 ROI,我们需要重复提取 2000 次特征。

2.crop/warp导致图片的信息缺失或变形,影响识别精度。


2.Fast R-CNN

论文地址

代码地址

【ML Notes】 2019-11-28 目标检测算法梳理_第7张图片


【ML Notes】 2019-11-28 目标检测算法梳理_第8张图片

主要思想:

1.生成建议窗口,Fast R-CNN用(Selective Search)方法生成建议窗口,每张图片大约2000张。

2.Fast R-CNN 使用特征提取器(CNN)先提取整个图像的特征,而不是从头开始对每个图像块提取多次。Fast R-CNN将建议窗口映射到CNN的最后一层卷积feature map上。

3.ROI Pooling 将不同尺寸的特征图块转换为固定的大小,并馈送到全连接层进行分类和定位

    因为 Fast R-CNN 使用全连接层,所以我们应用 ROI Pooling 将不同大小的 ROI 转换为固定大小。

    ROI Pooling 借鉴了spp的思想,可理解为单尺度的SPP层。

    为简洁起见,我们先将 8×8 特征图转换为预定义的 2×2 大小。

【ML Notes】 2019-11-28 目标检测算法梳理_第9张图片
左上角:特征图。右上角:将 ROI(蓝色区域)与特征图重叠。左下角:将 ROI 拆分为目标维度。例如,对于 2×2 目标,我们将 ROI     分割为 4 个大小相似或相等的部分。右下角:找到每个部分的最大值,得到变换后的特征图。

    输入特征图(左上),输出特征图(右下),ROI (右上,蓝色框)。

    按上述步骤得到一个 2×2 的特征图块,可以馈送至分类器和边界框回归器中

4.送入全连接层和softmax计算每个候选框具体属于哪个类别,输出类别的得分

5. Smooth L1 Loss 生成边框回归


【ML Notes】 2019-11-28 目标检测算法梳理_第10张图片
将候选区域直接应用于特征图,并使用 ROI 池化将其转化为固定大小的特征图块。

解决R-CNN问题:

1.Fast R-CNN直接将图像归一化后接CNN,然后在最后一层特征图上增加区域建议框,相比R-CNN要将每个区域建议框使用CNN提取特征要节省很多计算量,因此速度得到显著提升。

2.对特征图块进行ROI Pooling取代 R-CNN中crop/warp图像的操作

3.Fast R-CNN还引入了一个重要的策略,在对窗口进行分类的同时,还会对物体的边框进行回归,使得检测框更加准确。前面我们说候选窗口会有非常高的召回率,但是可能框的位置不是很准,例如一个人体框可能是缺胳膊缺腿,那么通过回归就能够对检测框进行校准,在初始的位置上求精。Fast R-CNN把分类和回归放在一起来做,把R-CNN的SVM和边框回归去掉,采用了多任务协同学习的方式由CNN直接得到类别和边框。 


3.Faster R-CNN

论文地址

代码

算法详解(anchor机制)

【ML Notes】 2019-11-28 目标检测算法梳理_第11张图片


【ML Notes】 2019-11-28 目标检测算法梳理_第12张图片


之前的Fast R-CNN已经基本实现端到端的检测,而主要的速度瓶颈是在Selective Search算法实现的Region Proposal,故到了Faster R-CNN,主要是解决Region Proposal问题,以实现Real-Time检测。Faster R-CNN的主要思路是,既然检测工作是在卷积的结果Feature Map上做的,那么候选区域的选取是否也能在Feature Map上做?于是RPN网络(Region Proposal Network)应运而生。

候选框提取不一定要在原图上做,特征图上同样可以,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network),整体架构如下图所示


【ML Notes】 2019-11-28 目标检测算法梳理_第13张图片
Faster R-CNN 采用Region proposal Network,直接生成建议框,只有300个。RPN分支网络共享特征图,大幅提升目标检测速度。


主要思想:

1.Faster R-CNN 目标检测分为4个部分(候选区域生成,特征提取,分类,和Bounding box回归)

2.候选区域由RPN完成,其它三个部分沿用Fast R-CNN


【ML Notes】 2019-11-28 目标检测算法梳理_第14张图片
Faster R-CNN 的流程图与 Fast R-CNN 相同

RPN

RPN引入了所谓anchor box的设计,具体来说,RPN在最后一个卷积层输出的特征图上,先用3x3的卷积得到每个位置的特征向量,然后基于这个特征向量去回归k个不同大小和长宽比的窗口,把这些窗口按照分数进行排序,然后取前300个作为候选窗口,送去做最终的分类 。


【ML Notes】 2019-11-28 目标检测算法梳理_第15张图片
ZF模型


对于特征图中的每一个位置,RPN 会做 k 次预测。因此,RPN 将输出 4×k 个坐标和每个位置上 2×k 个得分。下图展示了 8×8 的特征图,且有一个 3×3 的卷积核执行运算,它最后输出 8×8×3 个 ROI(其中 k=3)。下图(右)展示了单个位置的 3 个候选区域。

【ML Notes】 2019-11-28 目标检测算法梳理_第16张图片

此处有 3 种猜想,稍后我们将予以完善。由于只需要一个正确猜想,因此我们最初的猜想最好涵盖不同的形状和大小。因此,Faster R-CNN 不会创建随机边界框。相反,它会预测一些与左上角名为「锚点」的参考框相关的偏移量(如x、y)。我们限制这些偏移量的值,因此我们的猜想仍然类似于锚点。

【ML Notes】 2019-11-28 目标检测算法梳理_第17张图片
锚点偏移量

要对每个位置进行 k 个预测,我们需要以每个位置为中心的 k 个锚点。每个预测与特定锚点相关联,但不同位置共享相同形状的锚点。这些锚点是精心挑选的,因此它们是多样的,且覆盖具有不同比例和宽高比的现实目标。这使得我们可以以更好的猜想来指导初始训练,并允许每个预测专门用于特定的形状。该策略使早期训练更加稳定和简便。

Faster R-CNN 部署 9 个锚点框:3 个不同宽高比、不同大小的锚点框。每一个位置使用 9 个锚点,每个位置会生成 2×9 个 objectness 分数和 4×9 个坐标。


【ML Notes】 2019-11-28 目标检测算法梳理_第18张图片



二、Anchor based One-stage类别的目标检测算法


直接通过主干网络给出类别和位置信息,没有使用RPN网路。这样的算法速度更快,但是精度相对Two-stage目标检测网络了略低。

目前常用的典型的One-stage目标检测网络

        YOLOv1、YOLOv2、YOLOv3

        SSD、DSSD等


【ML Notes】 2019-11-28 目标检测算法梳理_第19张图片

思路

基于区域的检测器是很准确的,但需要付出代价。Faster R-CNN 在 PASCAL VOC 2007 测试集上每秒处理 7 帧的图像(7 FPS)。

作为替代,我们是否需要一个分离的候选区域步骤?我们可以直接在一个步骤内得到边界框和类别吗?

feature_maps = process(image)

results = detector3(feature_maps) # No more separate step for ROIs

让我们再看一下滑动窗口检测器。我们可以通过在特征图上滑动窗口来检测目标。对于不同的目标类型,我们使用不同的窗口类型。以前的滑动窗口方法的致命错误在于使用窗口作为最终的边界框,这就需要非常多的形状来覆盖大部分目标。更有效的方法是将窗口当做初始猜想,这样我们就得到了从当前滑动窗口同时预测类别的检测器。


【ML Notes】 2019-11-28 目标检测算法梳理_第20张图片
基于滑动窗口进行预测

这个概念和 Faster R-CNN 中的锚点很相似。只不过,单次检测器会同时预测边界框和类别。例如,我们有一个 8 × 8 特征图,并在每个位置做出 k 个预测,即总共有 8 × 8 × k 个预测结果。在每个位置,我们有 k 个锚点(锚点是固定的初始边界框猜想),一个锚点对应一个特定位置。我们使用相同的 锚点形状仔细地选择锚点和每个位置。使用 4 个锚点在每个位置做出 4 个预测。


【ML Notes】 2019-11-28 目标检测算法梳理_第21张图片
4 个锚点(绿色)和 4 个对应预测(蓝色),每个预测对应一个特定锚点

在 Faster R-CNN 中,我们使用卷积核来做 5 个参数的预测:4 个参数对应某个锚点的预测边框,1 个参数对应 objectness 置信度得分。因此 3× 3× D × 5 卷积核将特征图从 8 × 8 × D 转换为 8 × 8 × 5(有点迷,前文说的是输出 4个坐标和2个得分,这里两个得分统一成一个了吧)。

【ML Notes】 2019-11-28 目标检测算法梳理_第22张图片
使用 3x3 卷积核计算预测。

在单次检测器中,卷积核还预测 C 个类别概率以执行分类(每个概率对应一个类别)。因此我们应用一个 3× 3× D × 25 卷积核将特征图从 8 × 8 × D 转换为 8 × 8 × 25(C=20),这就很接近YOLO V1的思路了。


【ML Notes】 2019-11-28 目标检测算法梳理_第23张图片
YOLO会预测每个矩形框的4个参数和其包含物体的信度,以及其属于每个物体类别的概率



【ML Notes】 2019-11-28 目标检测算法梳理_第24张图片
共SxS个位置,每个位置做出 B 个预测



4.YOLO v1

v1论文地址

代码


【ML Notes】 2019-11-28 目标检测算法梳理_第25张图片

主要思想:

1.将整个图像分成S*S个格子

2.将整张图像送入CNN,预测每一个格子是否存在目标、(预测目标边界框和目标的类别)

3.将预测的边界框做非最大值抑制(NMS),得到最终结果。

【ML Notes】 2019-11-28 目标检测算法梳理_第26张图片

可以看出,这个网络中主要采用了1x1卷积后跟着3x3卷积的方式。

特征提取网络采用了前20个卷积层,加一个avg-pooling层和一个全连接层,对ImageNet2012进行分类,top-5正确率为88%,输入分辨率为224x224。

检测时,将输入分辨率改为448x448,因为网络结构是全卷积的,所以输入分辨率可以改变,整个网络输出为7x7x30维的tensor。

YOLO算法主要有以下优点:

1.检测速度达到实时帧检测,在Titan X GPU上每秒可检测45帧,快速版每秒能做到150帧

2.YOLO 是对整张图进行检测,采取回归的方式检测目标的位置和类别,是一种全新的检测方式

缺点:

1.定位精度差,没有区域建议算法高,主要由于该算法对图像做回归而不是滑动窗口检测

2.对小目标,或目标之间位置接近的情况下检测效果不好

Trick:

模型首先会将ImageNet作为训练集预训练模型,最终达到88%精度,然后使用迁移学习将预训练的模型应用到当前标注的训练集进行训练。ImageNet分辨率为224x224。检测时,将输入分辨率改为448x448,因为网络结构是全卷积的,所以输入分辨率可以改变,整个网络输出为7x7x30维的tensor。

模型输出5维信息(x,y,w,h,score),使用Leaky Relu作为激活函数,全连接层后添加Dropout层防止过拟合。在得到输出值之后,我们需要计算每个box与ground true的Iou值,然后通过非极大值抑制筛选box。



5.SSD

论文地址

代码

【ML Notes】 2019-11-28 目标检测算法梳理_第27张图片


SSD在YOLO的基础上改进了三点:多尺度特征图,利用卷积进行检测,设置先验框。

SSD 使用 VGG19 网络作为特征提取器(和 Faster R-CNN 中使用的 CNN 一样),在该网络之后添加自定义卷积层(蓝色),并使用卷积核(绿色)执行预测。


同时对类别和位置执行单次预测

然而,卷积层降低了空间维度和分辨率。因此上述模型仅可以检测较大的目标。为了解决该问题,SSD从多个特征图上执行独立的目标检测。


【ML Notes】 2019-11-28 目标检测算法梳理_第28张图片
使用多尺度特征图用于检测

(1)采用多尺度特征图用于检测

所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,这正如图3所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标,如图4所示,8x8的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。


【ML Notes】 2019-11-28 目标检测算法梳理_第29张图片

(2)采用卷积进行检测

与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对于形状为m×n×p的特征图,只需要采用3×3×p这样比较小的卷积核得到检测值。 对于一个大小m×n的特征图,共有mn个单元,每个单元设置的先验框数目记为k,每个现验框有(c+4)个检测值,那么每个单元共需要(c+4)k个预测值,所有的单元共需要(c+4)kmn个预测值,由于SSD采用卷积做检测,所以就需要(c+4)k个卷积核完成这个特征图的检测过程。

(3)设置先验框 

SSD采用了不同尺度和长宽比的先验框(Prior boxes, Default boxes,在Faster R-CNN中叫做锚,Anchors)

在Yolo中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,Yolo需要在训练过程中自适应目标的形状。而SSD借鉴了Faster R-CNN中anchor的理念,每个单元设置尺度或者长宽比不同的先验框,预测的边界框(bounding boxes)是以这些先验框为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图5所示,可以看到每个单元使用了4个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练,后面会详细讲解训练过程中的先验框匹配原则。


【ML Notes】 2019-11-28 目标检测算法梳理_第30张图片
SSD的先验框

SSD的检测值也与Yolo不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。第一部分是各个类别的置信度或者评分,值得注意的是SSD将背景也当做了一个特殊的类别,如果检测目标共有c个类别,SSD其实需要预测c+1个置信度值,其中第一个置信度指的是不含目标或者属于背景的评分。后面当我们说c个类别置信度时,请记住里面包含背景那个特殊的类别,即真实的检测类别只有c−1个。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框只包含背景。第二部分就是边界框的location,包含4个值(cx,cy,w,h),分别表示边界框的中心坐标以及宽高(通过预测偏移量而不是坐标值能够简化问题,所以是边界框相对于先验框的转换值offset)。

在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在Yolo中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。首先,对于图片中每个ground truth,找到与其IOU最大的先验框,该先验框与其匹配,这样,可以保证每个ground truth一定与某个先验框匹配。通常称与ground truth匹配的先验框为正样本,反之,若一个先验框没有与任何ground truth进行匹配,那么该先验框只能与背景匹配,就是负样本。一个图片中ground truth是非常少的, 而先验框却很多,如果仅按第一个原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以需要第二个原则。第二个原则是:对于剩余的未匹配先验框,若某个ground truth的IOU大于某个阈值(一般是0.5),那么该先验框也与这个ground truth进行匹配。这意味着某个ground truth可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个ground truth,如果多个ground truth与某个先验框IOU大于阈值,那么先验框只与IOU最大的那个先验框进行匹配。第二个原则一定在第一个原则之后进行,仔细考虑一下这种情况,如果某个ground truth所对应最大IOU小于阈值,并且所匹配的先验框却与另外一个ground truth的IOU大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保某个ground truth一定有一个先验框与之匹配。但是,这种情况我觉得基本上是不存在的。由于先验框很多,某个ground truth的最大IOU肯定大于阈值,所以可能只实施第二个原则既可以了。


【ML Notes】 2019-11-28 目标检测算法梳理_第31张图片
绿色的GT是ground truth,红色为先验框,FP表示负样本,TP表示正样本

尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3

(4)NMS

在 SSD 算法中,NMS 至关重要。因为多个 feature map 最后会产生大量的 bounding boxes,即最终检测结果。然而在这些bounding boxes中存在着大量的错误的、重叠的、不准确的样本,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。仅仅依赖于IOU 是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检情况;IOU值设置的太小,则会出现大量的重叠检测,会大大影响检测器的性能。

      即使在IOU处理掉大部分的bounding boxes之后,仍然会存在大量的错误的、重叠的、不准确的bounding boxes(如图14),这就需要NMS进行迭代优化。

【ML Notes】 2019-11-28 目标检测算法梳理_第32张图片
上图中展示了重叠的、IoU无法剔除的bounding boxes


NMS简单原理: 对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大 score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值的框从B中移除.重复这个过程,直到B为空。


【ML Notes】 2019-11-28 目标检测算法梳理_第33张图片

trick:

数据扩增技术很重要,对于mAP的提升很大;

使用不同长宽比的先验框可以得到更好的结果;

【ML Notes】 2019-11-28 目标检测算法梳理_第34张图片

优点:

 运行速度超过YOLO,精度超过Faster R-CNN(一定条件下,对于稀疏场景的大目标而言)。

缺点:

(1)需要人工设置default boxes的初始尺度和长宽比的值。网络中default boxes的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层 feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验。

(2)对小尺寸的目标识别仍比较差,还达不到 Faster R-CNN 的水准。因为 SSD 使用 conv4_3 低级 feature 去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。




6.YOLO V2

YOLO-v2在YOLO-v1的版本上做了一些改进。

(1)添加了BN层,map提高了2%。

随着神经网络的训练,网络层的输入分布会发生变动,逐渐向激活函数取值两端靠拢,如:sigmoid激活函数,此时会进入饱和状态,梯度更新缓慢,对输入变动不敏感,甚至梯度消失导致模型难以训练。BN,在网络层输入激活函数输入值之前加入,可以将分布拉到均值为0,标准差为1的正态分布,从而使激活函数处于对输入值敏感的区域,从而加快模型训练。

BN的地位:与激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。

BN的本质原理:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0、方差为1),然后再进入网络的下一层。但是不像我们想象的那么简单,它是一个可学习、有参数(γ、β)的网络层。

BN的作用:

       1)改善流经网络的梯度

       2)允许更大的学习率,大幅提高训练速度:

            你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;

       3)减少对初始化的强烈依赖

       4)改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求

你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

       5)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;

       6)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)。

(2)用448x448的输入分辨率在ImageNet上进行参数微调,map提高了4%。

(3)把全连接层取消,使用anchor boxes来预测目标方框;使用anchor boxes的话就把分类置信度和空间位置分离了,所以对每个预测方框都可以回归一个方框置信度和分类置信度。不用anchor box时map是69.5%,召回率是81%,使用了之后map是69.2%召回率是88%。

(4)用k-means来选择好的方框先验。

(5)对于每个方格,预测5个方框。

(6)把26x26x512的feature-map,相邻特征分到不同的channel中,因此得到13x13x2048的feature-map,与后面层进行concat,使得map提高了1%。这里主要是添加了一个层:passthrough layer。这个层的作用就是将前面一层的26*26的feature map和本层的13*13的feature map进行连接,有点像ResNet。这样做的原因在于虽然13*13的feature map对于预测大的object以及足够了,但是对于预测小的object就不一定有效。通过这个passthrough layer把高分辨率特征与低分辨率特征联系在了一起,联系起来的方法是把相邻的特征堆积在不同的 Channel(通道) 中,这一方法类似与 Resnet(残缺网络) 的 Identity Mapping(恒等映射),从而把 26*26*512 变成 13*13*2048。YOLO 中的检测器位于扩展后(expanded )的特征图的上方,所以他能取得细粒度的特征信息,这提升了 YOLO 1% 的性能。

(7)多scale的训练,因为网络为全卷积层,所以同样的网络可以预测不同分辨率的输入,每10个batch随机选择一个新的image size。

迁移学习之前,在介绍YOLO-v1的时候我们说到,模型需要先在ImageNet上预训练模型,因此,此时图像输入为224x224,使用迁移学习训练后我们的图像输入是448x448,因此模型需要适应图像分辨率的改变。在YOLO-v2中,我们在预训练模型中先224x224训练160个epoch,然后将输入调整到448x448,再跑10个epoch,也就是在ImageNet数据集中两种分辨率跑两次。YOLO大神作者实现表明,这样操作可以提高4%的map

训练阶段,采用32的倍数作为图像尺寸动态输入,如【320,352。。。608】。这种网络训练方式使得相同网络可以对不同分辨率的图像做detection。

(8)新的分类网络Darknet-19


【ML Notes】 2019-11-28 目标检测算法梳理_第35张图片

(9)分类和检测联合训练Joint classification and detection

使用1000类的ImageNet进行训练,为了建立WordtTree 1K,把所有中间词汇加入到WordTree上,把标签空间从1000扩大到了1369。在训练过程中,如果有一个图片的标签是”Norfolk terrier“,那么这个图片还会获得”狗“(dog)以及“哺乳动物”(mammal)等标签。总之现在一张图片是多标记的,标记之间不需要相互独立。 


【ML Notes】 2019-11-28 目标检测算法梳理_第36张图片

如图所示,之前的ImageNet分类是使用一个大softmax进行分类。而现在,WordTree只需要对同一概念下的同义词进行softmax分类。


【ML Notes】 2019-11-28 目标检测算法梳理_第37张图片
用WordTree 把数据集合中的类别映射到分层树中的同义词上,例如上右图,WordTree混合ImageNet与COCO。


YOLO-v2利用WordTree,将分类和检测任务进行联合训练,对于没有方框标注的物体也能预测出其方框,能够对词典中9000个概念进行预测。YOLO-v2也叫做YOLO9000。

训练一个Extremely Large Scale检测器。所以训练的时候使用WordTree混合了COCO检测数据集与ImageNet中的Top9000类,混合后的数据集对应的WordTree有9418个类。另一方面,由于ImageNet数据集太大了,作者为了平衡一下两个数据集之间的数据量,通过过采样(oversampling)COCO数据集中的数据,对COCO过采样的方式进行数据集扩增,使COCO数据集与ImageNet数据集之间的数据量比例达到1:4。

YOLO9000的训练基于YOLO v2的构架,但是使用3priors而不是5来限制输出的大小。当网络遇到检测数据集中的图片时则正常地反方向传播,当遇到分类数据集图片的时候,只使用分类的loss功能进行反向传播。同时作者假设IOU最少为 .3。最后根据这些假设进行反向传播(有点迷)。

使用联合训练法,YOLO9000使用COCO检测数据集学习检测图片中的物体的位置,使用ImageNet分类数据集学习如何从大量的类别中进行分类。

为了评估这一方法,使用ImageNet Detection Task对训练结果进行评估。

评估结果:

YOLO9000取得19.7mAP。

在未学习过的156个分类数据上进行测试,mAP达到16.0。

YOLO9000的mAP比DPM高,而且YOLO有更多先进的特征,YOLO9000是用部分监督的方式在不同训练集上进行训练,同时还能检测9000个物体类别,并保证实时运行。



7.YOLO V3

YOLO-v3在YOLO-v2的基础上进行了一些改进。

(1)用logistic regression对方框置信度进行回归,对先验与实际方框IOU大于0.5的作为正例,与SSD不同的是,若有多个先验满足目标,只取一个IOU最大的先验。

(2)类别预测由softmax改为logistic(使用sigmoid):用于处理预测物体之间存在包含关系问题,解决多标签对象支持。比如woman和person,softmax输出:person,logistic输出两者。

(3)利用多个scale进行预测,实际使用3个不同的scale。将前两层的feature-map进行上采样,与开始的feature-map进行concat起来,加一些卷积层,然后进行预测。


【ML Notes】 2019-11-28 目标检测算法梳理_第38张图片
使用多尺度特征预测物体

(4)新的特征提取网络Darkent-53


【ML Notes】 2019-11-28 目标检测算法梳理_第39张图片
Darknet-53和Resnet-152正确率相同,但速度是2倍

(5)网络细节


【ML Notes】 2019-11-28 目标检测算法梳理_第40张图片

DBL:指Darknetconv2d_BN_Leaky。

resn:指:n代表数字,有res1,res2, … ,res8等等,表示这个res_block里含有多少个res_unit,使用残差结构可以让网络更深。

concat:张量拼接。将darknet中间层和后面的某一层的上采样进行拼接。拼接的操作和残差层add的操作是不一样的,拼接会扩充张量的维度,而add只是直接相加不会导致张量维度的改变。(解决SSD 使用 conv4_3 低级 feature 去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题?)

在YOLO-v3网络中没有池化层和全连接层,那么张量尺寸的变化是通过改变卷积核步长来实现。同YOLO-v2一样,输出尺寸为输入尺寸的1/32,即:一般要求输入图像尺寸是32的倍数。



三、Anchor Free 类别的目标检测算法


8.centernet: object as point

原理简单优雅,不明觉厉。backbone还有一些实现细节还要从源码阅读

1.整体架构

【ML Notes】 2019-11-28 目标检测算法梳理_第41张图片
512*512 input resolution

2.Backbone

【ML Notes】 2019-11-28 目标检测算法梳理_第42张图片

a:Hourglass 沙漏网络,文中未对其修改

b:带转置卷积的resnet, 同时增加了deformable conv

c:原始的DLA-34语义分割网络

d:文中用到的修改过的DLA-34,增加了FPN结构

由于采用全卷积网络直接得到4倍下采样的热力图,所以不需要提前设定anchors, 所以大大减少了网络参数量和计算量。热力图的通道数等于要检测的目标类别数,热力图的前100个峰值作为网络提取的目标中心点,然后设定一个阈值进行筛选得到最终的目标中心点。

Centernet 中所有的上采样前都有deformable卷积,这种卷积的作用就是使得网络的感受野变得更加精确,而不是限定为3*3的矩形卷积框内。同时4倍的下采样feature map 比一般网络的分辨率高很多,所有不需要进行多尺度预测和特征金字塔也可以同时较好的检测大小目标。

Centernet 不需要NMS,因为所有检测的中心点是由热力图的峰值得到的,这样就已经有一个非极大值抑制的过程,而且NMS是十分耗时的,所以Centernet才能又好又快。

Centernet 采用编码解码的全卷积骨干网络,上采样用到的是转置卷积,与一般上采样中的双线性差值有很大区别,转置卷积可以更好的还原图像的语义信息和位置信息。

3.思路

与基于锚点的one-stage方法相近。中心点可看成形状未知的锚点(见图3)。但存在几个重要差别(本文创新点):

第一,我们分配的锚点仅仅是放在位置上,没有尺寸框。没有手动设置的阈值做前后景分类。(像Faster RCNN会将与GT IOU >0.7的作为前景,<0.3的作为背景,其他不管);

第二,每个目标仅仅有一个正的锚点,因此不会用到NMS,我们提取关键点特征图上局部峰值点(local peaks);

第三,CenterNet 相比较传统目标检测而言(缩放16倍尺度),使用更大分辨率的输出特征图(缩放了4倍),因此无需用到多重特征图锚点;

在推理的时候,我们分别提取热力图上每个类别的峰值点。如何得到这些峰值点呢?做法是将热力图上的所有响应点与其连接的8个临近点进行比较,如果该点响应值大于或等于其八个临近点值则保留,最后我们保留所有满足之前要求的前100个峰值点。目标的宽高信息由热力图分布回归得到。

参考文章链接:

https://blog.csdn.net/weixin_38632246/article/details/90450264

https://blog.csdn.net/f290131665/article/details/81012556

https://blog.csdn.net/qq_27825451/article/details/89137697

https://www.jianshu.com/p/f87be68977cb

https://www.jianshu.com/p/d5d7cd7ad200

https://segmentfault.com/a/1190000017509636?utm_source=tag-newest

http://baijiahao.baidu.com/s?id=1598999301741831102&wfr=spider&for=pc

https://blog.csdn.net/qq_41007606/article/details/89572824

等,感谢以上博文的资料整理,对我的学习带来了极大的帮助

你可能感兴趣的:(【ML Notes】 2019-11-28 目标检测算法梳理)