目标检测20问

1 anchor

这个文章讲的超级详细,直接转,反正我也没总结

总结来说就是:在一幅图像中,要检测的目标可能出现在图像的任意位置,并且目标可能是任意的大小和任意形状。

使用CNN提取的Feature Map的点,来定位目标的位置。
使用Anchor box的Scale来表示目标的大小
使用Anchor box的Aspect Ratio来表示目标的形状

常用的Anchor Box定义
Faster R-CNN 定义三组纵横比ratio = [0.5,1,2]和三种尺度scale = [8,16,32],可以组合处9种不同的形状和大小的边框。
YOLO V2 V3 则不是使用预设的纵横比和尺度的组合,而是使用k-means聚类的方法,从训练集中学习得到不同的Anchor
SSD 固定设置了5种不同的纵横比ratio=[1,2,3,1/2,1/3],由于使用了多尺度的特征,对于每种尺度只有一个固定的scale

2 one-stage and two-stage

侵删

  • one-stage(单阶段):输入图片,输出bounding box和分类标签,由一个网络完成。
  • two-stage(两阶段):输入图片,生成建议区域(Region Proposal),然后送入分类器分类。两个任务由不同的网络完成;
-one-stage系two-stage系multi-stage系
主要算法YOLOv1、SSD、YOLOv2、RetinaNet、YOLOv3Fast R-CNN、Faster R-CNNR-CNN、SPPNet
检测精度较低较高极低
检测速度较快较慢极慢
鼻祖YOLOv1Fast R-CNNR-CNN
状态已淘汰
  • multi-stage 算法
    最早期的检测算法 (主要为R-CNN、SPPNet) 都属于multi-stage系。这个时候的Selective Search、Feature extraction、location regressor、cls SVM是分成多个stage来各自单独train的。故谓之曰“multi-stage”
    在这里插入图片描述
  • two-stage 算法
    • 到了Fast R-CNN的时候,Feature extraction、location regressor、cls SVM都被整合到了一个network里面,可以实现这三个task一起train了。由于生成RP的task还需要另外train,故谓之曰“two-stage”:
    • 用相应的Region Proposal算法(可以是传统算法,也可以是神经网络)从输入图片中生成建议目标候选区域,将所有的候选区域送入分类器进行分类。
    • 到了Faster R-CNN中,虽然RPN的出现使得四个task可以一起被train,但由于要生成RP,依然被归类为“two-stage”。
    • 对于Two-stage的目标检测网络,主要通过一个卷积神经网络来完成目标检测过程,其提取的是CNN卷积特征,在训练网络时,其主要训练两个部分,第一步是训练RPN网络,第二步是训练目标区域检测的网络。网络的准确度高、速度相对One-stage慢。
    • .R-CNN(2013)->Fast R-CNN(2015)->Faster R-CNN(2015)->Mask R-CNN(2017)->DCN v1(2017)->DCN v2(2018)
    • 相对来说,在不计时间、空间代价,并且技术水平差不多的情况下,two-stage的算法准确度会更高(以MSCOCO mAP衡量),特别是定位框的精度会更高。
      在这里插入图片描述
  • one-stage 算法
    • 在YOLOv1中,“生成RP”这一任务被直接丢弃了。因此,整个算法只剩下了一个stage,故谓之曰“one-stage”:
    • 首先将输入图片分割成NxN的image patch, 然后每个image patch有M个固定尺寸的anchor box, 输出anchor box的位置和分类标签。
    • 但是如果考虑到时间代价(速度)、空间代价(内存占用),one-stage的检测器大多数时候能做到相同准确度的情况下更快。
    • 直接通过主干网络给出类别和位置信息,没有使用RPN网路。这样的算法速度更快,但是精度相对Two-stage目标检测网络了略低。
    • SSD(2015)->RetinaNet(2017)-NAS-FPN(2019.05)->EfficientDet(2019.11)
    • Yolo v1->Yolo v2->Yolo v3
      在这里插入图片描述
  • 区别
    两个主要差别是,one-stage中的region proposal由anchor box代替,比如,在yolo中,我们首先把图片分成NxN的image patch,在每个image patch中我们可以用M个长宽不同的anchor box,具体的长宽比可以由kmeans等算法获取得到。而region proposal在two stage中是由神经网络或者selective search等等方法产生的,相对于one stage固定的anchor box会比较慢。

3 RCNN

Region with CNN feature
RCNN算法流程分为四个步骤:

  1. 一张图生成1k~2K个候选区域,
    (使用selective search方法,首先是得到一些原始的区域,然后使用一些合并策略将这些区域进行合并)

  2. 对每个候选区域,使用深度网络提取特征
    把每个候选框进行resize到(227*227),然后送到网络得到特征向量(2000*4096维矩阵)

  3. 特征送入每一类的SVM分类器中,判别是否属于该类

    • 将2000*4096维特征与20个SVM组成的权重矩阵4096*20相乘,获得2000*20矩阵表示每个建议框的某个目标类别的得分。
    • 然后对每一类进行非极大值抑制提出重叠建议框,得到该类得分最高的建议框。
    • 怎么进行抑制。IOU(Intersection over Union)交并比。对每一类所有框进行抑制
      • 寻找得分最高的目标
      • 计算其他目标与该目标的IOU
      • 删除所有IOU值大于给定阈值的目标
      • 在这里插入图片描述
  4. 使用回归器精细修正候选框位置

  • 通过ss算法的候选框不是很准确,对NMS(非极大值抑制)处理后的剩余的建议框进一步筛选。
  • 去保留那些与真实标注的目标边界框(ground truth)有相交,且IOU要大于某一个阈值,不满足条件的进行删除掉。
  • 接着分别使用20个回归器对上述20个类别中剩余的建议框进行回归操作,最终得到每个类别修正后的得分最高的bounding box(依旧是对CNN输出的特征向量进行预测)
  • 通过回归分类器后会得到四个参数:目标边界框中心点的x,y偏移量以及高度和宽度的缩放因子3
    在这里插入图片描述

RCNN中存在的问题:

  1. 测试速度慢:
    SS算法提起候选框慢,一张图像候选框内存在大量重叠,提取特征操作冗余
  2. 训练速度慢:
    过程及其繁琐
  3. 训练所需空间大:
    对于SVM和Bounding Box回归训练,需要从每个图像中的每个目标候选框提取特征,并写入磁盘。

4 Fast RCNN

Fast RCNN改进:

  1. 直接将整张图像归一化之后送入cnn,在最后的卷积层输出的feature map上,加入建议框信息,在此之前CNN运算共享
  2. 训练时,一次性提取CNN特征和建议区域,这样不需重复计算,且不再需要把大量数据存入硬盘
  3. 把类别判断和位置回归统一用深度网络实现,不再需要额外的存储

Fast RCNN算法流程分为三个步骤:

  1. 一张图生成1k~2K个候选区域,(使用selective search方法)
  2. 将图像输入网络得到相应的特征图,将ss算法生成的候选框投影到特征图上获得相应的特征矩阵
  3. 将每个特征矩阵通过ROI(region of interest) pooling层缩放到7*7大小的特征图,接着将特征图通过一系列全连接层得到预测结果
  4. 利用softmax loss 和Smooth L1 Loss对分类概率和边框回归联合训练

网络结构:
在这里插入图片描述

训练数据采样(正样本、负样本):
并不是采取ss算法提供的所有区域进行训练。对于每张图片从2000个图中选取64个候选区域,然后其中一部分为正样本(候选框与真实的目标边界框IOU大于0.5),一部分为负样本(与所有真实边界框IOU都在0.1~0.5之间)

ROI pooling
对特征图分成7*7=49份,然后对每一份进行最大池化下采样,这样不限制输入图像尺寸。

目标概率预测分类器:
输出N+1个类别的概率,(N为检测目标的种类,1为背景)共N+1个节点

边界框回归器:
输出对应N+1个类别的候选边界框回归参数(dx,dy,dw,dh)共(N+1)*4个节点
在这里插入图片描述
损失是什么样的:
在这里插入图片描述
分类损失:
L= -log(pu)softmax的交叉熵损失
pu 表示当前候选区域类别为u的概率

交叉熵损失:
在这里插入图片描述
在这里插入图片描述
艾弗森括号:u大于等于1时结果为1;u小于等于1时,结果为0
v是怎么来的:
利用上边边界框回归参数进行反计算,得出最终的四个值

整个算法大概可以分成两个部分:

  1. ss算法进行候选框生成
  2. 特征提起、分类、边界框回归融合在一起,利用CNN网络

5 Faster RCNN

其相当于:RPN+FastRCNN
与FastRCNN相比不同:

  1. 使用RPN代替原来的SS方法生成建议窗口
  2. 产生建议窗口的CNN和目标检测的CNN共享

在这里插入图片描述
在这里插入图片描述
RPN网络:

  • 利用CNN网络得到的feature map,在特征图上利用滑动窗口进行滑动,
  • 每滑动到一个位置上就生成一个特征向量,图上给出的是256维(维度的大小根据CNN网络生成的特征图的深度channel,不同的backbone对应不同的深度,也就对应不同维度的向量),
  • 然后通过全连接层分别输出目标概率(物体、背景)和边界框回归参数。
  • cls layer2K个 scores是针对k个anchor box得到的,每个anchor box有两个值,对应是物体和不是物体的概率
  • reg layer 4K个得分也是针对k个anchor box得到的,是对anchor位置和尺寸的调整

anchor:
每个3*3的滑动窗口的中心点,计算其在原图上的位置,然后以这个点为中心计算anchor box(这里的anchor box都是指定的大小和长宽比例)

  • 有三种尺度(128*128,256*256,512*512)
  • 三种比例(1:1,1:2,2:1)
  • 所以每个位置在原图上都对应有9个anchor
  • 对于生成的候选框是有大量重叠,基于其cls得分,采用非极大值抑制,IOU设为0.7,这样每张图片大概剩2K个候选框。
    在这里插入图片描述
  • anchor和候选框不同:利用RPN生成的边界框回归参数把anchor调整到所需的边界框,也就是说候选框是通过生成的调节参数调节anchor之后再生成的。

RPN网络的实现:

  • backbone得到的特征图,然后在上边做padding为1,stride为1,的3*3卷积,会得到和原特征图尺寸一样的特征矩阵。
  • 在特征矩阵上并联两个1*1的卷积层,来进行类别和边界框回归参数的预测
  • 类别就是用卷积核大小为1,个数为2的卷积
  • 边界框回归就是卷积核为1,个数为4的卷积

RPN网络的训练:
对于每张图片,从上万个anchor中随机的采样256个anchor,其是有正样本和负样本组成,比例大概是1:1,如果正样本不够128,那么就用负样本填充
正样本:

  1. anchor与ground truth的IOU超过0.7,那么就可以认为是正样本
  2. anchor与某个ground truth拥有最大的IOU,那么这个anchor定义为正样本
  3. 如果1找不到足够的,那么就从2里边接着找

负样本:
anchor与所有的ground truth的IOU都小于0.3

正负样本你之外的anchor全部丢弃

为什么box回归为什么采用smooth L1 loss?
对于边框的预测是一个回归问题。通常可以选择平方损失函数(L2损失) f ( x ) = x 2 f(x)=x^2 f(x)=x2。但这个损失对于比较大的误差的惩罚很高。我们可以采用稍微缓和一点绝对损失函数(L1损失) f ( x ) = ∣ x ∣ f(x)=|x| f(x)=x,它是随着误差线性增长,而不是平方增长。
但这个函数在0点处导数不唯一,因此可能会影响收敛。一个通常的解决办法是在0点附近使用平方函数使得它更加平滑。它被称之为平滑L1损失函数。它通过一个参数 σ \sigma σ来控制平滑的区域:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6 Fastrcnn 代码

代码是这位大佬的代码分享,是哔哩哔哩的一个up主,视频超级优秀,侵删
在这里插入图片描述

  • README读
  • draw_box_utils.py
    工具函数,主要用来画框,画出检测出来的目标的位置。包括类别、得分等
  • fastrcnn.png
    一个较为清楚的fastrcnn的流程图
  • my_dataset
    创建自己的数据集,要写一个类,继承Dataset,然后重写len和getitem两个方法。
    len:返回图片的数量
    getitem:返回图片以及其对应的信息
    其返回两个内容,image和target
    image表示原图片经过transform之后的图片
    target里边有boxes(list,对应物品的bounding box)、labels(list,类别名称)、image_id(文件名)、area(float,bounding box 的面积)、iscrowd(布尔,是否难检测)
  • split data
    按比例切分图片,分成训练和验证集
  • Pascal_voc_classes.json
    字典,保存到的是类别名字和其对应的序号
  • transforms.py
    里边有两个方法,totensor、randomhorizontalflip
    随机水平翻转:正向传播的时候输入image和target,随机生成概率,来进行翻转
    翻转的时候把图片进行翻转,box也要进行水平翻转。
  • network_files:
    • fastrcnn framework
      • fastrcnnBase
        有四个参数:backbone、rpn、roiheads、transform
        前向传播:参数两个:images、target

7 SSD

这篇文章有SSD的具体讲解,和DSSD的讲解(但是这个没看)

Single Shot Multibox Detector
FastRCNN 缺点:
对小目标检测效果较差
模型大,检测速度慢

网络结构:
在这里插入图片描述
VGG16:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
置信度的误差包含两个部分:正样本的误差和负样本的误差。
在这里插入图片描述

位置误差仅针对正样本进行计算
在这里插入图片描述

  • 输入图片是300*300
  • 使用了VGG16前边的网络层
  • VGG16的maxpooling5从2*2-s2变成3*3-s1,这样特征层尺寸不变
  • 后边会加入一系列的卷积层,要注意层的步距对应的padding不同(虽然padding没写)
  • 在前边的层会检测尺寸较小的目标,到后边的层会检测尺寸较大的目标
  • default box:
    • 对于aspect ratio是1的情况,会增加一个尺寸和Sk、Sk+1相关的default box
    • 对于conv4-3、conv10-2、conv11-2每个feature map中点对应的default box 有四个,
  • 预测器(perditor)的实现
    • 对特征层m*n with channel p直接使用3*3 with channel p 进行卷积,得到预测分数和目标框的回归参数
    • 对于特征图上的每个位置有k个default box,对于每个default box分别计算c个类别(包括背景)分数和四个左边偏移量,所以总共需要(c+4)k卷积核
  • 正负样本选取:
    • 正样本1:对每个ground truth去匹配与它IOU值最大的default box
    • 正样本2:对于任意的default box 只要它与任意的ground truth 的IOU大于0.5,就认为是正样本
    • 负样本1:剩下的default box就是负样本,但并不是都用来进行训练,因为太多了
    • 负样本2:对所有负样本计算highest confidence loss(表示网络将负样本预测为目标的概率会越大),然后去挑选排在前边的负样本,选取负样本:正样本 = 3:1

补充

详细结构图:
在这里插入图片描述
基本步骤:
观察上述两幅图,我们可以初步得到SSD网络预测过程的基本步骤:

  • 输入一幅图片(300x300),将其输入到预训练好的分类网络(改进的传统的VGG16 网络)中来获得不同大小的特征映射;
  • 抽取Conv4_3、Conv7、Conv8_2、Conv9_2、Conv10_2、Conv11_2层的feature map,然后分别在这些feature map层上面的每一个点构造6个不同尺度大小的Default boxes。然后分别进行检测和分类,生成多个初步符合条件的Default boxes;
  • 将不同feature map获得的Default boxes结合起来,经过NMS(非极大值抑制)方法来抑制掉一部分重叠或者不正确的Default boxes,生成最终的Default boxes 集合(即检测结果);

SSD的三条核心设计理念:

  1. 采用多尺度特征图用于检测
    多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标
  2. 设置Default boxes
    每个单元设置尺度或者长宽比不同的Default boxes,预测的边界框(bounding boxes)是以这些Default boxes为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异。
  3. 采用卷积进行检测
    与 Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。
    对网络中 6 个特定的卷积层的输出分别用两个 3*3 的卷积核进行卷积,一个输出分类用的confidence,每个default box生成21个confidence(这是针对VOC数据集包含20 个 object 类别而言的,另外一个是背景的分类);一个输出回归用的 localization,每个 default box生成4个坐标值(x,y,w,h)。

default box 匹配:
在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在YOLO中,ground truth的中心落在哪个单元格,该单元格中与其IOU(定义见图8)最大的边界框负责预测它。但是在SSD 中却完全不一样,SSD的先验框与ground truth的匹配原则主要有两点。在训练时,ground truth与 default boxes按照如下方式进行配对:

  • 首先,寻找与每一个ground truth box有最大IoU的default box,这样就能保证每一个ground truth能与至少一个default box对应起来。
  • SSD之后又将剩余还没有配对的default box与任意一个ground truth尝试配对,只要两者之间的IoU大于阈值,就进行匹配(SSD 300 阈值为0.5)。

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

数据增广:
不同于Faster R-CNN,SSD算法使用了多种数据增强的方法,包括水平翻转、裁剪、放大和缩小等。论文明确指出,数据增强可以明显的提高算法的性能。主要的目的是为了使得该算法对输入的不同大小和不同形状的目标具有更好的鲁棒性。直观的理解是通过这个数据增强操作可以增加训练样本的个数,同时构造出更多的不同形状和大小的目标,将其输入到网络中,可以使得网络学习到更加鲁棒的特征。
在这里插入图片描述
NMS(非极大值抑制):
在 SSD 算法中,NMS 至关重要。因为多个 feature map 最后会产生大量的 bounding boxes,即最终检测结果。然而在这些bounding boxes中存在着大量的错误的、重叠的、不准确的样本,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。仅仅依赖于IOU 是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检情况;IOU值设置的太小,则会出现大量的重叠检测,会大大影响检测器的性能。

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

NMS简单原理: 对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.

  • 选择具有最大 score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.
  • 通常将B中剩余检测框中与M的IoU大于阈值的框从B中移除.
  • 重复这个过程,直到B为空。

SSD 加速的原因:

  1. 首先 SSD 是一个 one-stage 网络,只需要一个阶段就可以输出结果;而 Faster R-CNN是一个two-stage网络。尽管Faster R-CNN的bounding boxes少很多,但是其需要大量的前向和反向推理(训练阶段),而且需要交替的训练两个网络;
  2. Faster R-CNN中不仅需要训练RPN,而且需要训练Fast R-CNN,而SSD其实相当于一个优化了的RPN网络,不需要进行后面的检测,仅仅前向推理就会花费很多时间;
  3. YOLO网络虽然比SSD网络看起来简单,但是YOLO网络中含有大量的全连接层。和FC层相比,CONV层具有更少的参数;同时YOLO获得候选bounding boxes的操作比较费时;SSD算法中,调整了VGG网络的架构,将其中的 FC 层替换为 CONV 层,这一点会大大的提升速度。
  4. 使用了Atrous算法,该算法能够提速20%。
  5. SSD设置了输入图片的大小,它会将不同大小的图片裁剪为300x300,或者512x512,和Faster-rcnn相比,在输入上就会少很多的计算

优缺点
优点:

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

缺点:

  • 需要人工设置default boxes的初始尺度和长宽比的值。网络中default boxes的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层 feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验。
  • 对小尺寸的目标识别仍比较差,还达不到 Faster R-CNN 的水准。因为 SSD 使用 conv4_3 低级 feature 去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。

SSD 算法的改进:DSSD

SSD算法的局限:

  • 卷积神经网络在结构上存在固有的问题:高层网络感受野比较大,语义信息表征能力强,但是分辨率低,几何细节信息表征能力弱。低层网络感受野比较小,几何细节信息表征能力强,虽然分辨率高,但语义信息表征能力弱。
  • SSD采用多尺度的特征图来预测物体,使用具有较大感受野的高层特征信息预测大物体,具有较小感受野的低层特征信息预测小物体。
  • 这样就带来一个问题:使用的低层网络的特征信息预测小物体时,由于缺乏高层语义特征,导致SSD对于小物体的检测效果较差。而解决这个问题的思路就是对高层语意信息和低层细节信息进行融合。DSSD采用Top Down的网络结构进行高低层特征的融合并且改进了传统上采样的结构。

DSSD算法思想:

  • DSSD使用一种通用的Top Down的融合方法,使用VGG和Resnet网络,以及不同大小的训练图片尺寸来验证算法的通用性。
  • 将高层的语义信息融入到低层网络的特征信息中,丰富预测回归位置框和分类任务输入的多尺度特征图,以此来提高检测精度。
  • 在提取出多尺度特征图之后,DSSD 提出由残差单元组成的预测模块,进一步提取深度的特征最后输入给框回归任务和分类任务。

8 YOLO

YOLO-V1讲解
YOLO-V2讲解
YOLO-V3讲解

大佬讲解的YOLO上(V1),侵删
大佬讲解的YOLO中,侵删
大佬讲解的YOLO下,侵删

一个大哥V1、V2、V3系列讲解

V1

核心思想:

  • YOLO的核心思想就是利用整张图作为网络的输入,直接在输出层回归bounding box的位置和bounding box所属的类别。

  • faster RCNN中也直接用整张图作为输入,但是faster-RCNN整体还是采用了RCNN那种 proposal+classifier的思想,只不过是将提取proposal的步骤放在CNN中实现了,而YOLO则采用直接回归的思路。

网络结构图:
在这里插入图片描述
损失函数:
在这里插入图片描述
这个损失函数中:

  • 只有当某个网格中有object的时候才对classification error进行惩罚。
  • 只有当某个box predictor对某个ground truth box负责的时候,才会对box的coordinate error进行惩罚,而对哪个ground truth box负责就看其预测值和ground truth box的IoU是不是在那个cell的所有box中最大。

输出表示:
在这里插入图片描述

  1. 把一个图像分成S*S个网格(grid cell),如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
  2. 每个网格要预测B个(B一般为2)bounding box,每个bounding box除了要预测位置之外,还要附带预测一个confidence值(每个Bounding box预测5个值),这个confidence代表了所预测的box中含有object的置信度和这个box预测的有多准两重信息。每个网格还要预测C个类别的分数。所以每个向量总共有B*5+C个值
  3. class信息是针对每个网格的,confidence信息是针对每个bounding box的
  4. B个(B一般为2)bounding box,一个负责回归大目标,一个负责回归小目标
  5. 预测的位置信息包括中心店的坐标,其相对于grid cell来说的,在0~1之间
  6. 位置信息还包括高度和宽度的比值,其相对于整幅图像来说的,也在0~1之间
  7. confidence表示预测的目标和他所对应的真实的目标的IOU值,没有anchor概念
  8. 在test的时候把类别概率和边界框的confidence相乘
  9. 在YOLO中置信度confidence指的是一个边界框包含某个物体的可能性大小以及位置的准确性
  10. 在YOLO中,由于多了confidence这个东西,所以预测的类别其实只是一个条件概率值,就是在置信度下的类别概率,需要两者相乘才得到最终的scores。这点也与SSD和RCNN模型区别,因为它们没有confidence这个东东,只是把背景作为一个特殊的类别来处理

问题/缺点:

  • 对群体性的小目标检测很差。
  • 当目标出现新的尺寸和比例的时候,检测会很差
  • 主要的误差来源于定位不准确

补充:
只能在一个区域中检测出一个目标,如何改进?
使区域更密集,就可以缓解多个目标的问题,但无法从根本上去解决。

按上面的设计你检测得到了16个框,可是图片上只有7个葫芦娃的脸,怎么从16个结果中筛选出7个我们要的呢?
法1:聚类。聚成7类,在这7个类中,选择confidence最大的框。听起来挺好。
法1的bug:2个目标本身比较近聚成了1个类怎么办?如果不知道到底有几个目标呢?为何聚成7类?不是3类?
法2:NMS(非极大值抑制)。2个框重合度很高,大概率是一个目标,那就只取一个框。、
具体步骤:
首先拿置信度最高的框,因为其肯定是目标,得到第一个框,
然后拿这个框去做抑制
然后找剩下的框里边得分最高的框,再去做抑制
知道最后没有框

NMS的适用情况是什么?1图多目标检测时用NMS。
2个目标本身比较近怎么办?依然没有解决。
如果不知道到底有几个目标呢?NMS自动解决了这个问题。
多个类的问题:

V2

YOLO9000:检测的类别超过9000,发表在2017CVPR
V2在V1的基础上做的尝试:

主要内容:

  • 提出YOLOv2:代表着目前业界最先进物体检测的水平,它的速度要快过其他检测系统(FasterR-CNN,ResNet,SSD),使用者可以在它的速度与精确度之间进行权衡。
  • 提出YOLO9000:这一网络结构可以实时地检测超过9000种物体分类,这归功于它使用了WordTree,通过WordTree来混合检测数据集与识别数据集之中的数据。
  • 提出了一种新的联合训练算法( Joint Training Algorithm ),使用这种联合训练技术同时在ImageNet和COCO数据集上进行训练。YOLO9000进一步缩小了监测数据集与识别数据集之间的代沟。

BATTER:
具体改进:
在这里插入图片描述

  • BN
    yoloV2添加了BN层,其对收敛十分有帮助,同时减少了正则化处理,同时可以提高2个点的mAP

  • 更高分辨率的分类器
    输入图片从224*224到448*448,可以提高4个点的mAP

  • 预测目标边界框用anchor的手段
    作者发现通过预测偏移量而不是坐标值能够简化问题,让神经网络学习起来更容易。最终YOLO去掉了全连接层,使用Anchor Boxes来预测 Bounding Boxes。在mAP小幅度减小的情况下,大大提升了召回率

  • dimension cluster
    采用k-means算法去生成
    之前Anchor Box的尺寸是手动选择的,所以尺寸还有优化的余地。 为了优化,在训练集(training set)Bounding Boxes上跑了一下k-means聚类,来找到一个比较好的值。
    如果我们用标准的欧式距离的k-means,尺寸大的框比小框产生更多的错误。因为我们的目的是提高IOU分数,这依赖于Box的大小,所以距离度量的使用:
    在这里插入图片描述

  • direct location prediction
    每个anchor(prior)去负责预测目标中兴落在某个grid cell区域内的目标
    更加的容易学习,更加的稳定

  • fine grained features
    把高层特征图和低层特征图进行一个融合,针对不同特征层尺度不一样的问题,采用了passthrough layer
    这个Passthrough layer能够把高分辨率特征与低分辨率特征联系在一起,联系起来的方法是把相邻的特征堆积在不同的Channel之中,这一方法类似与Resnet的Identity Mapping,从而把2626512变成13132048。
    在这里插入图片描述
    在这里插入图片描述

  • Multi-Scale Training
    作者觉得如果输入图片尺寸固定的话,网络的鲁棒性是受限的。
    没迭代10个batch就把网络的输入尺寸进行一个随机的选择。因为网路的输入和最后的特征输出下采样率是32,所以采用的一系列输入网络尺寸都是32的倍数,所以最小的尺寸为320*320,最大是608*608.

FASTER:
backbone: YOLO使用的是GoogleLeNet,比VGG-16快,YOLO v2基于一个新的分类model,Darknet 19
在这里插入图片描述
模型框架:
在这里插入图片描述

  • 每一个convolutional 都包括conv+BN+leakyRelu
  • 丢弃了darknet的最后一个卷积层
  • 在后边添加了3个3X3的卷积层,每个卷积层卷积核个数为1024
  • 最后接一个1*1的卷积层,其输出的个数就是我们所需检测的参数
  • 然后有一个passthrough layer的直接连接

Stronger:
在训练的过程中,当网络遇到一个来自检测数据集的图片与标记信息,那么就把这些数据用完整的YOLO v2 loss功能反向传播这个图片。当网络遇到一个来自分类数据集的图片和分类标记信息,只用整个结构中分类部分的loss功能反向传播这个图片。
但是检测数据集只有粗粒度的标记信息,像“猫“、“ 狗”之类,而分类数据集的标签信息则更细粒度,更丰富。比如狗这一类就包括”哈士奇“”牛头梗“”金毛狗“等等。所以如果想同时在监测数据集与分类数据集上进行训练,那么就要用一种一致性的方法融合这些标签信息。
所以使用一种多标签的model来混合数据集,假设一个图片可以有多个分类信息,并假定分类信息必须是相互独立的规则可以被忽略。
WordNet的结构是一个直接图表(directed graph),而不是树型结构。

大佬第二篇文章总结

V2

我们认为,检测模型=特征提取器+检测头
在YOLO v1的模型中检测头就是最后的2个全连接层(Linear in PyTorch),它们是参数量最大的2个层,也是最值得改进的2个层。后面的YOLO模型都对这里进行改进:
YOLO v1一共预测49个目标,一共98个框。

YOLO v1虽然快,但是预测的框不准确,很多目标找不到:

  • 预测的框不准确:准确度不足。
  • 很多目标找不到:recall不足

预测的框不准确:
同时代的检测器有R-CNN,人家预测的是偏移量。

基于anchor的偏移量的意思是,anchor的位置是固定的,偏移量=目标位置-anchor的位置。
基于grid的偏移量的意思是,grid的位置是固定的,偏移量=目标位置-grid的位置。

为什么YOLO v2改预测偏移量而不是直接去预测 ?
上面我说了作者看到了同时代的R-CNN,人家预测的是偏移量。另一个重要的原因是:直接预测位置会导致神经网络在一开始训练时不稳定,使用偏移量会使得训练过程更加稳定,性能指标提升了5%左右。

很多目标找不到
YOLO v1一次能检测多少个目标吗?答案是49个目标,98个框,并且2个框对应一个类别。可以是大目标也可以是小目标。因为输出的尺寸是:[N, 7, 7, 30]。式中N为图片数量,7,7为49个区域(grid)。30=2(B)*5+20(class)

YOLO v2首先把7*7个区域改为13*13个区域,每个区域有5个anchor,且每个anchor对应着1个类别,那么,输出的尺寸就应该为:[N,13,13,125]。125=5(B)*5+5*20(class)

1.为什么要用Anchor呢?
答:一开始YOLO v1的初始训练过程很不稳定,在YOLO v2中,作者观察了很多图片的所有Ground Truth,发现:比如车,GT都是矮胖的长方形,再比如行人,GT都是瘦高的长方形,且宽高比具有相似性。那能不能根据这一点,从数据集中预先准备几个几率比较大的bounding box,再以它们为基准进行预测呢?这就是Anchor的初衷。

2.每个区域的5个anchor是如何得到的?
在这里插入图片描述
对于任意一个数据集,就比如说COCO吧(紫色的anchor),先对训练集的GT bounding box进行聚类,聚成几类呢?作者进行了实验之后发现5类的recall vs. complexity比较好,现在聚成了5类,当然9类的mAP最好,预测的最全面,但是在复杂度上升很多的同时对模型的准确度提升不大,所以采用了一个比较折中的办法选取了5个聚类簇,即使用5个先验框。

anchor是从数据集中统计得到的(Faster-RCNN中的Anchor的宽高和大小是手动挑选的)。

YOLO v2做了这么多改进,整体性能大幅度提高,但是小目标检测仍然是YOLO v2的痛。直到kaiming大神的ResNet出现,backbone可以更深了,所以darknet53诞生。

V3

YOLO v3的模型比之前的模型复杂了不少,可以通过改变模型结构的大小来权衡速度与精度。

小目标检测仍然是YOLO v2的痛,YOLO v3是如何改进的呢?
改进之处

  1. 多尺度预测 (类FPN)

    • 每种尺度预测3个box, anchor的设计方式仍然使用聚类,得到9个聚类中心,将其按照大小均分给3中尺度.
      • 尺度1: 在基础网络之后添加一些卷积层再输出box信息.
      • 尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍.
      • 尺度3: 与尺度2类似,使用了32x32大小的特征图.
  2. 更好的基础分类网络(类ResNet)和分类器 darknet-53
    darknet-53,仿ResNet, 与ResNet-101或ResNet-152准确率接近,但速度更快

优缺点:
优点

  • 快速,pipline简单.
  • 背景误检率低。
  • 通用性强。YOLO对于艺术类作品中的物体检测同样适用。它对非自然图像物体的检测率远远高于DPM和RCNN系列检测方法。

但相比RCNN系列物体检测方法,YOLO具有以下缺点:

  • 识别物体位置精准性差。
  • 召回率低。在每个网格中预测两个box这种约束方式减少了对同一目标的多次检测(R-CNN使用的region proposal方式重叠较多),相比R-CNN使用Selective Search产生2000个proposal(RCNN测试时每张超过40秒),yolo仅使用7x7x2个.

在这里插入图片描述
我们看YOLO v3检测头分叉了,分成了3部分:
13133*(4+1+80)
26263*(4+1+80)
52523*(4+1+80)
我们发现3个分支分别为32倍下采样,16倍下采样,8倍下采样,分别取预测大,中,小目标。
因为32倍下采样每个点感受野更大,所以去预测大目标,8倍下采样每个点感受野最小,所以去预测小目标。专人专事。

每个grid设置9个先验框,3个大的,3个中的,3个小的。每个分支预测3个框,每个框预测5元组+80个one-hot vector类别,所以一共size是:3*(4+1+80)

读到这里,请你数一下YOLO v3可以预测多少个bounding box?
(13*13+26*26+52*52)*3 =10467

为确定priors,YOLO v3 应用k均值聚类。然后它预先选择9个聚类簇。

对于COCO数据集,锚定框的宽度和高为(10 ×13),(16 ×30),(33 ×23),(30 ×61),(62 ×45),(59 ×119),(116 × 90),( 156 ×198),(373373×326326)。这应该是按照输入图像的尺寸416×416 计算得到的。这 9个priors根据它们的尺度分为3个不同的组。在检测目标时,给一特定的特征图分配一个组。

结构图:
在这里插入图片描述
在这里插入图片描述
损失函数:
在这里插入图片描述
第4行说明:loss分3部分组成:
第1行代表geo_loss,S代表13,26,52,就是grid是几乘几的。B=5。
第2行代表confidence_loss,和YOLO v2一模一样。
第3行代表class_loss,和YOLO v2的区别是改成了交叉熵。

正负样本的确定:
如果边界框先验(锚定框)与 GT 目标比其他目标重叠多,则相应的目标性得分应为 1。
对于重叠大于等于0.5的其他先验框(anchor),忽略,不算损失。
每个 GT 目标仅与一个先验边界框相关联。 如果没有分配先验边界框,则不会导致分类和定位损失,只会有目标性的置信度损失。
使用tx和ty(而不是 bx 和by)来计算损失。

总结起来就是下面4句话:
正样本:与GT的IOU最大的框。
负样本:与GT的IOU<0.5 的框。
忽略的样本:与GT的IOU>0.5 但不是最大的框。
使用 tx 和ty (而不是 bx 和by )来计算损失。

YOLO v4

多了一些细节的改进:
1.Using multi-anchors for single ground truth
之前的YOLO v3是1个anchor负责一个GT,YOLO v4中用多个anchor去负责一个GT。这就相当于你anchor框的数量没变,但是选择的正样本的比例增加了,就缓解了正负样本不均衡的问题。

2.Eliminate_grid sensitivity
最终的预测结果按理说应该能取到一个grid里面的任意位置。但是实际上边界的位置是取不到的,因为sigmoid函数的值域是: (0,1),它不是 [0,1]
所以在计算b的时候要乘以一个略大于1的数,如图所示:
在这里插入图片描述
3.CIoU-loss
MSE Loss–> IoU Loss–> GIoU Loss–>DIoU Loss–>CIoU Loss
在这里插入图片描述

YOLO v5

head部分没有任何改动,和yolov3和yolov4完全相同,也是三个输出头,stride分别是8,16,32,大输出特征图检测小物体,小输出特征图检测大物体。但采用了自适应anchor,而且这个功能还可以手动打开/关掉.
之前anchor是固定的,自适应anchor利用网络的学习功能,让anchor的(x,y,w,h) 也是可以学习的。我个人觉得自适应anchor策略,影响应该不是很大,除非是刚开始设置的anchor是随意设置的,一般我们都会基于实际项目数据重新运用kmean算法聚类得到anchor,这一步本身就不能少。

大佬第三篇文章总结

backbone 的改进:
为什么一代比一代检测头更加复杂呢?答案是:因为它们的提特征网络更加强大了,能够支撑起检测头做更加复杂的操作。

检测类网络的结构:
在这里插入图片描述

YOLO v1的backbone
YOLO v1没有Neck,Backbone是GoogLeNet,属于Dense Prediction。1阶段的检测器属于Dense Prediction,而2阶段的检测器既有Dense Prediction,又有Sparse Prediction。

在这里插入图片描述
YOLO v2:

  • 没有7*7的卷积核了,都是3*3和1*1。3*3 卷积负责扩大感受野,1*1 卷积负责减少参数量。
  • 网络可以做得更深,更好地提取到特征。为什么?因为每做一次卷积,后面都会接一个非线性的激活函数,更深意味着非线性的能力更强了。
  • 另外还用了bottleneck结构
  • 使用了GAP(Global Average Pooling)层,满足了输入不同尺度的image的需求。
  • YOLO2 的训练主要包括三个阶段:
    • 先在 ImageNet 分类数据集上预训练 Darknet-19,此时模型输入为 224 * 224 ,共训练 160 个 epochs。
    • 将网络的输入调整为 448\ * 448(注意在测试的时候使用 416 * 416 大小) ,继续在 ImageNet 数据集上 finetune 分类模型,训练 10 个 epochs。注意为什么测试的时候使用大小?答案是:将输入图像大小从448 ×448 更改为 416 ×416 。这将创建奇数空间维度(7×7 v.s 8 ×8 grid cell)。 图片的中心通常被大目标占据。 对于奇数网格单元,可以更容易确定目标所属的位置。对于一些大目标,它们中心点往落入图片中心位置,此时使用特征图中心的1个cell去预测这些目标的bounding box相对容易些,否则就要用中间4个Cells来进行预测
    • 修改 Darknet-19 分类模型为检测模型为图5形态,即:移除最后一个卷积层、global avgpooling 层以及 softmax 层,并且新增了3个 3\ * 3\ * 1024 卷积层,同时增加了一个 passthrough 层,最后使用 1\ * 1 卷积层输出预测结果,并在检测数据集上继续finetune 网络。
    • YOLO v1的训练:先使用224 * 224的分辨率训练分类网络,再切换到448\ * 448的分辨率训练检测网络。而YOLO v2在使用224 * 224的分辨率训练分类网络160 epochs之后,先使用448\ * 448的分辨率finetune分类网络10 epochs,再使用448 * 448的分辨率训练检测网络。可提升4%mAP。
      在这里插入图片描述
      在这里插入图片描述
      YOLO v3:
  • darknet 53指的是convolution层有52层+1个conv层把1024个channel调整为1000个
  • 依然是有bottleneck的结构和残差网络。
  • YOLO v3没有Pooling layer了,用的是conv(stride = 2)进行下采样,为什么?
    因为Pooling layer,不管是MaxPooling还是Average Pooling,本质上都是下采样减少计算量,本质上就是不更新参数的conv,但是他们会损失信息,所以用的是conv(stride = 2)进行下采样。
  • 特征融合的方式更加直接,没有YOLO v2的passthrough操作,直接上采样之后concat在一起。

在这里插入图片描述
在这里插入图片描述
YOLO v4:
结构:
在这里插入图片描述
YOLOv4使用了CSPDarknet53作为backbone,加上SPP模块,PANET作为neck,以及YOLO v3的head。

Yolov4的五个基本组件:

  1. CBM:Yolov4网络结构中的最小组件,由Conv+Bn+Mish激活函数三者组成。
  2. CBL:由Conv+Bn+Leaky_relu激活函数三者组成。
  3. Res unit:借鉴Resnet网络中的残差结构,让网络可以构建的更深。
  4. CSPX:借鉴CSPNet网络结构,由三个卷积层和X个Res unint模块Concate组成。
  5. SPP:采用1×1,5×5,9×9,13×13的最大池化的方式,进行多尺度融合。

YOLO v4对输入端进行了改进,主要包括数据增强Mosaic、cmBN、SAT自对抗训练,使得在卡不是很多时也能取得不错的结果。

9 Selective Search

侵删

目标检测比图像分类复杂的很重要的一个因素是:一张图像中可能存在多个物体需要分别定位和分类。显然,在训练分类器之前,需要使用一些方法将图像划分需要小的区域,划分方法统称为Region Proposal Algorithms。

Selective Search,这个方法主要有三个优势:

  • 捕捉不同尺度(Capture All Scales)
  • 多样化(Diversification)
  • 快速计算(Fast to Compute)

总结为:选择性搜索是用于目标检测的区域提议算法,它计算速度快,具有很高的召回率,基于颜色,纹理,大小和形状兼容计算相似区域的分层分组。

Selective Search算法主要包含两个内容:

  • Hierarchical Grouping Algorithm 分层分组算法
  • Diversification Strategies 多元化战略

1. Hierarchical Grouping Algorithm
图像中区域特征比像素更具代表性,作者使用Felzenszwalb and Huttenlocher[1]的方法产生图像初始区域,使用贪心算法对区域进行迭代分组:

  1. 计算所有邻近区域之间的相似性;
  2. 两个最相似的区域被组合在一起;
  3. 计算合并区域和相邻区域的相似度;
  4. 重复2、3过程,直到整个图像变为一个地区。

在每次迭代中,形成更大的区域并将其添加到区域提议列表中。以自下而上的方式创建从较小的细分segments到较大细分segments的区域提案

2. Diversification Strategies
如果采用一种策略很容易错误合并不相似区域。
这个部分讲述作者提到的多样性的一些策略,使得抽样多样化,主要有下面三个不同方面:

  • 利用各种不同不变性的色彩空间;
  • 采用不同的相似性度量;既考虑颜色、又考虑纹理大小等
  • 通过改变起始区域。

1> 八种色彩空间:
考虑到场景、光照条件的不同,作者提出使用八种不变性属性的各种颜色空间
主要用于图像分割算法中原始区域的生成
(1)RGB,(2)灰度I,(3)Lab,(4)rgI(归一化的rg通道加上灰度),(5)HSV,(6)rgb(归一化的RGB),(7)C,(8)H(HSV的H通道)
在这里插入图片描述
2> 区域相似度
把单一相似度归一化到[0,1]之间,1表示最相似
相似度的计算选用了颜色,纹理,大小,吻合四种计算策略,最后计算加权和得到。

  1. 颜色相似度
    使用L1-norm归一化获取图像每个颜色通道的25 bins的直方图,这样每个区域都可以得到一个75维的向量区域之间颜色相似度,计算如下:
    在这里插入图片描述
    当直方图差距越大,累加的和就会越小,即颜色相似度越小。
    在区域合并过程中需要对新的区域计算其直方图,计算方法:
    在这里插入图片描述
  2. 纹理相似度
    采用SIFT-Like特征,对每个颜色通道的8个不同方向计算方差[公式]的Gaussian微分,使用L1-norm归一化获取图像每个颜色通道的每个方向的10 bins的直方图,这样就可以获取到一个240(10x8x3)维的向量,计算如下:
    在这里插入图片描述
  3. 优先合并小区域
    • 如果仅仅是通过颜色和纹理特征合并的话,很容易使得合并后的区域不断吞并周围的区域,后果就是多尺度只应用在了那个局部,而不是全局的多尺度。
    • 因此我们给小的区域更多的权重,这样保证在图像每个位置都是多尺度的在合并。两个区域越小,其相似度越大,区域大小相似度计算公式:

在这里插入图片描述

  1. 区域的合适度距离

    • 考虑到如果区域ri包含在rj内,我们首先应该合并,另一方面,如果ri很难与rj相接,他们之间会形成断崖,不应该合并在一块。

    • 为了衡量两个区域是否更加“吻合”,可以令将合并后的区域的Bounding Box越小,其吻合度越高,这时候越接近1。设计如下:
      在这里插入图片描述

最后将上述相似度计算方式组合到一起,可以写成如下,其中ai属于(0,1)
在这里插入图片描述

3 区域打分
通过上述的步骤我们能够得到很多很多的区域,但是显然不是每个区域作为目标的可能性都是相同的,因此我们需要衡量这个可能性,这样就可以根据我们的需要筛选区域建议个数啦。

这篇文章做法是,给予最先合并的图片块较大的权重,比如最后一块完整图像权重为1,倒数第二次合并的区域权重为2以此类推。但是当我们策略很多,多样性很多的时候呢,这个权重就会有太多的重合了,排序不好搞啊。文章做法是给每个权重乘以一个【0,1】 的随机数,然后对于相同的区域多次出现的也叠加下权重,毕竟多个方法都说你是目标,也是有理由的嘛。这样我就得到了所有区域的目标分数,也就可以根据自己的需要选择需要多少个区域了。

4 性能评价
很自然地,通过算法计算得到的包含物体的Bounding Boxes与真实情况(ground truth)的窗口重叠越多,那么算法性能就越好。这是使用的指标是平均最高重叠率ABO(Average Best Overlap)。
对于每个固定的类别 c,每个真实情况(ground truth)表示为在这里插入图片描述
,令计算得到的位置假设L中的每个值l,那么 ABO的公式表达为:
在这里插入图片描述
重叠率的计算方式:
在这里插入图片描述

10 ROIPooling 和 ROIAlign

讲解,侵删

  1. ROIPooling
    在这里插入图片描述
  • RolPooling可以使生成的候选框region proposal映射产生固定大小的feature map
  • 原图中有一region proposal,映射到特征图中的大小在计算的时候会进行取整操作
  • 同时对特征图进行7*7分割的时候,如果计算出来是个非整数,也会进行取整操作。
  • 经过两次量化,即将浮点数取整,原本在特征图上映射的region proposal,再大小上会有一个偏差,这样的像素偏差势必会对后层的回归定位产生影响
  1. RoIAlign
    在这里插入图片描述
  • 假定原图中有一region proposal,映射到特征图中,此时,没有像RoiPooling那样就行取整操作,保留浮点数
  • pooling后固定成7*7大小的特征图,所以,将在 feature map上映射的的region proposal 划分成49个同等大小的小区域,每个小区域的大小还是存成浮点数
  • 假定采样点数为4,即表示,对于每个的小区域,平分四份,每一份取其中心点位置,而中心点位置的像素,采用双线性插值法进行计算,这样,就会得到四个点的像素值
  • 最后,取四个像素值中最大值作为这个小区域的像素值,如此类推,同样是49个小区域得到49个像素值,组成7*7大小的feature map。

总结:

  • ROIPooling采用最近邻插法,这种方法好理解、简单,但是不实用,会产生是真现象,产生棋盘格效应,更实用的方法就是双线性插值法,RoIAlign采用此方法。
  • 对于检测图片中大目标物体时,两种方案的差别不大,而如果是图片中有较多小目标物体需要检测,则优先选择RoiAlign,更精准些。

11 小目标检测

侵删
目标检测:
在这里插入图片描述

  • 小目标有两种定义方式,一种是相对尺寸大小,如目标尺寸的长宽是原图像尺寸的0.1,即可认为是小目标,另外一种是绝对尺寸的定义,即尺寸小于32*32像素的目标即可认为是小目标。
  • 小目标检测在深度学习卷积神经网络模型中一直是一个难题。早期的目标检测框架大多数是针对通用的目标来进行检测,如经典的单阶段方法yolo和ssd,两阶段方法faster-rcnn等,这些方法主要是针对通用目标数据集来设计的解决方案,因此对于图像中的小目标来说,检测效果不是很理想。

为了解决小目标问题提出的方法有:

  1. 图像的缩放。在检测前对图像进行缩放。
  2. 浅网络。小物体更容易被接受场较小的探测器预测。
  3. 上下文信息。利用围绕小对象实例的上下文。Chen等[2016a]则专门使用上下文来提高小对象的性能。他们使用上下文补丁对R-CNN进行了扩展,与区域建议网络生成的建议补丁并行。
  4. 超分辨率。还有针对小目标的图像增强等。最典型的是利用生成对抗性网络选择性地提高小目标的分辨率。

近两年提出了利用多层特征图的方法(特征金字塔、RNN思想、逐层预测),对小目标检测的效果产生了显著的提升。

现阶段主流算法有:

  • 图像金字塔:较早提出对训练图片上采样出多尺度的图像金字塔。通过上采样能够加强小目标的细粒度特征,在理论上能够优化小目标检测的定位和识别效果。但基于图像金字塔训练卷积神经网络模型对计算机算力和内存都有非常高的要求。计算机硬件发展至今也难有胜任。故该方法在实际应用中极少。
  • 逐层预测:该方法对于卷积神经网络的每层特征图输出进行一次预测,最后综合考量得出结果。同样,该方法也需要极高的硬件性能。
  • 特征金字塔:参考多尺度特征图的特征信息,同时兼顾了较强的语义特征和位置特征。该方法的优势在于,多尺度特征图是卷积神经网络中固有的过渡模块,堆叠多尺度特征图对于算法复杂度的增加微乎其微。
  • RNN思想:参考了RNN算法中的门限机制、长短期记忆等,同时记录多层次的特征信息(注:和特征金字塔有本质区别)。但RNN固有的缺陷是训练速度较慢(部分操作无法矩阵化)。

12 anchor-based 与 anchor-free

anchor-based:
在深度学习时代,物体检测问题通常都被建模成对一些候选区域进行分类和回归的问题。在单阶段检测器中,这些候选区域就是通过滑窗方式产生的 anchor;在两阶段检测器中,候选区域是 RPN 生成的 proposal,但是 RPN 本身仍然是对滑窗方式产生的 anchor 进行分类和回归。

anchor-free:
同样分为两个子问题,即确定物体中心和对四条边框的预测。
预测物体中心时,具体实现既可以定义一个 hard 的中心区域,将中心预测融入到类别预测的 target 里面,也可以预测一个 soft 的 centerness score。
对于四条边框的预测,则比较一致,都是预测该像素点到 ground truth 框的四条边距离,不过会使用一些 trick 来限制 regress 的范围。

为什么 anchor-free 能卷土重来:
最大的功劳我觉得应该归于 FPN,其次归于 Focal Loss。
在每个位置只预测一个框的情况下,FPN 的结构对尺度起到了很好的弥补
FocalLoss 则是对中心区域的预测有很大帮助。

anchor-free 和 single anchor:
在 anchor-based 的方法中,虽然每个位置可能只有一个 anchor,但预测的对象是基于这个 anchor 来匹配的,而在 anchor-free 的方法中,通常是基于这个点来匹配的。

anchor-free类算法归纳:
A.基于多关键点联合表达的方法

  1. CornerNet/CornerNet-lite:左上角点+右下角点
  2. ExtremeNet:上下左右4个极值点+中心点
  3. CenterNet:Keypoint Triplets for Object Detection:左上角点+右下角点+中心点
  4. RepPoints:9个学习到的自适应跳动的采样点
  5. FoveaBox:中心点+左上角点+右下角点
  6. PLN:4个角点+中心点

B.基于单中心点预测的方法

  1. CenterNet:Objects as Points:中心点+宽度+高度
  2. CSP:中心点+高度(作者预设了目标宽高比固定,根据高度计算出宽度)
  3. FCOS:中心点+到框的2个距离

CornerNet

侵删
CornerNet并非第一个提出Anchor-Free思想的模型,但却是第一个精度和性能达到与anchor base方法同等水平的Anchor-Free模型。

CornerNet认为Two-stage目标检测最明显的缺点是在Region Proposal阶段需要提取anchor boxes。这样做导致两个问题:

  • 提取的anchor boxes数量较多,比如DSSD使用40k,RetinaNet使用100k,anchor boxes众多造成正负样本不均衡。
  • Anchor boxes需要调整很多超参数,比如anchor boxes数量、尺寸、比率,影响模型的训练和推断速率。

CenterNet的主要思想是通过中心点的信息来回归出其他bbox的属性,如中心点与四条边的距离、姿势、方向等信息

首先,CenterNet会计算keypoint heatmap,然后通过网络直接回归出需要使用的信息。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值