目标检测笔记

目标检测算法的分类

  1. 两步走
    • 先找出候选区域
    • 再对候选区域进行调整、分类
    • 代表:R-CNN
  2. 一步走(端对端
    • 采用一个网络一步到位
    • yolo, SSD

在这里插入图片描述

目标检测不仅需要输出分类结果还要输出物体的位置信息。主要评估指标——IOU

  • 目标定位的简单实现思路
    增加一个全连接层,即FC1和FC2。FC1用于类别的输出,FC2用于位置信息(x, y, w, h)的输出。
    在这里插入图片描述
  • 对于分类的概率 可以使用交叉熵损失
  • 对于位置的信息 可以使用均方差损失
两种bounding box
  • ground-truth bounding box: 人工标记的框
  • predicted bounding box: 预测的框

分类与定位问题:图片中只有一个物体需要检测
目标检测: 有多个物体

1. R-CNN

前面提到的思路中存在的问题:目标检测个数未知时,不能以固定个数输出物体的位置值。
在这里插入图片描述

1.1 Overfeat模型

1.1.1 滑动窗口

目标检测暴力的从左到右、从上到下滑动窗口,利用分类识别目标。这样就从一个检测问题变换成了一个分类问题。

存在的问题是,滑动窗口需要初始设定一个固定大小的窗口,但是不同的物体适应的框不一样。

所以需要定义K个大小的窗口,每个窗口滑动提取M个,总共K * M个图片,将这些图像块输入到网络中进行图像分类问题。

1.2 R-CNN模型

Overfeat模型开销太大,实现不现实。

R-CNN采用候选区域方法(region proposal method)
在这里插入图片描述

步骤——以Alex net为例
  1. 对于给定一张图片,找出可能存在目标的默认的2000个候选区域
  2. 2000个候选区域大小变换,输入到Alex net中(相当于输入2000张图片)得到2000个特征向量(Alex net输出4096维)
  3. 经过20个类别的分类器。对于2000个候选区域做判断,得到2000 * 20个概率值(类别矩阵)
  4. 对[2000, 20]维矩阵进行非极大抑制(NMS),去除不好的、重叠度高的候选区域。剩下的是分数最高的建议框(proposal bounding box)
  5. 修bounding box

1.2.1 RoI候选区域

通过选择性搜索算法,将每个像素作为一组,然后计算每一组的纹理,并将两个最接近的组结合,直到所有区域都结合起来。第一行展示如何使区域增长,第二行中蓝色矩形框代表合并过程中所有可能的RoI。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e42adaae64a044ad82823在这里插入图片描述
这样筛选出来的候选框长款不固定,而作为backbone的骨干网络要求固定的输入,所以需要对候选框进行调整。

1.2.2 CNN网络提取特征

在候选区域的基础上提取出更抽象的特征,这些特征作为下一步分类器的输入数据。(训练时可以保存到本地)

1.2.3 特征向量训练分类器SVM

  1. 假设一张图片会生成2000个候选区域,那么输入到CNN后提取出来就是2000 * 4096维的特征向量(Alex net输出)
  2. R-CNN选用SVM作为分类器。假设有20个类别,则设置20个SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样会得出[2000, 20]形状的得分矩阵(每行是一个候选框,列为该样本属于某类的概率)

每个SVM做的事情:判断2000个候选区域是属于前景的某类别,还是属于背景

1.2.4 非极大抑制 NMS

  • 目的:筛选候选区域,目标是一个物体(被标记的物体)只保留一个最优的框,来抑制那些冗余的候选框。图片中有三个人工标记的ground truth,那么只保留三个比较准确的候选框。
  • 迭代过程:
    1. 对于所有的2000个候选框,如果概率小于0.5(SVM分类结果)则舍弃
    2. 剩余候选框(可信度较大的冗余候选框)
      • 假设图片真实物体个数(ground truth)为N,剩余候选框为P,计算N中每个物体位置和所有P的交并比IoU(重合程度),得到P中每个候选框对应IoU最高的N中的一个(找到每个候选框的类别归宿
      • 如下图。粉色为ground truth,蓝色为候选框。经过上述IoU计算得出,左面两个框对应左边车辆,右边三个框对应右边车辆。
        在这里插入图片描述
      • 假设现在有A, B, C, D, E五个候选框。
        • 第一轮:对于右边车辆(一个类别),假设B的得分最高,则将和B计算IoU,结果大于0.5的删除。(即D,E与B重叠度高,认为是荣誉候选框)
        • 第二轮:对于左边车辆(其他类别),重复上述操作。

在选择性搜索过程中候选框的形状和位置就已经确定了,但并不一定是最好的。所以要对候选框进一步微调

1.2.5 修正候选区域

  • 目的:使最终结果更加逼近ground truth

R-CNN采用的方法是建立了一个bounding box regressor。回归用于修正筛选后的候选区域,使之回归于ground-truth。因为最后筛选出来的候选区域和ground-truth已经十分接近了,所以认为候选框和ground-truth是线性关系。

假设A是候选框,G是目标GT框。让A向G做回归,得到四个参数。则RCNN的输出就是线性计算后的结果。
在这里插入图片描述

1.2.6 R-CNN的缺点

  1. 训练阶段多:步骤繁琐(微调网络 + SVM + 边框回归)三者都要训练且保存参数。
  2. 空间占用:磁盘空间占用率大。使用SVM分类5000张图象会产生几百G的特征文件
  3. 处理速度慢:使用GPU,VGG16处理一张图像需要47s
  4. 图片形状:候选区域需要经过crop/warp进行固定大小,无法保证图片不变形

1.3 检测的评价指标

对于目标检测来讲,不能再用简单的准确率来衡量

1.3.1 IoU交并比

Intersection over Union,交并比。反应候选区域和标定区域的重叠程度
在这里插入图片描述

1.3.2 平均精确率 mAP

IoU本身无法反应分类是否正确。引入更加复杂的mean average precision,平均精确率。平均精确率定义为多分类任务的AP的平均值,即mAP = 所有类别AP和 / 类别总个数。AP是PR曲线下的面积(横坐标为召回率,纵坐标为精确率)

  1. 训练样本的标记:候选框标记(如RCNN有2000个)
    • 每个ground-truth box有着最高的IoU的anchor标记为正样本。(保证至少存在候选框)
    • 剩余的anchor与任何ground-truth box的IoU大于0.7的标记为正样本,小于0.3标记为负样本。
  2. 对于其中一个类别C,首先将算法输出的所有C类别的预测框按预测分数进行排序
  3. 设定不同k值,选择top k个预测框,计算precision和AP(k组FPR,TPR点对)
  4. 将得到的所有的C类别的AP取平均,得到C类别的AP
  5. AP是针对一个类别的,再将所有类别的AP求平均得到mAP

2. SPPNet

是R-CNN的一种改进。导致R-CNN速度慢的主要原因是卷积运算(2000个候选区域进行卷积)

在这里插入图片描述
可以看到,SPP是用先进行一次卷积得到一个feature map,然后添加一个spatial pyramid pooling(空间金字塔变换层)代替R-CNN中将候选框全部输入到卷积层的操作。

SPPNet步骤
  1. 图片输入到网络得到一个features map
  2. 原图中通过选择性搜索算法得到的候选区域直接映射feature map对应位置
  3. 映射得到的特征,经过SSP层输出固定大小的特征向量

2.1 映射

在这里插入图片描述
原始图像经过CNN变成了feature map,原始图片经过选择性搜索(SS)得到候选区域,现在需要将基于原始图像的候选区域映射到feature map中。

  • 映射公式如下

假设(x’, y’), (x’‘, y’')表示特征图上的坐标点,(x, y)表示原输入图片上的点,那么有如下关系式。
左 上 角 的 点 : x ′ = [ x / S ] + 1 右 下 角 的 点 : x ′ ′ = [ x / S ] − 1 左上角的点:x' = [x/S] + 1 \\ 右下角的点:x'' = [x/S] - 1 x=[x/S]+1x=[x/S]1
其中S表示所有strides的乘积。

2.2 空间金字塔层

通过SPP层将候选区域的特征图转换成固定大小的特征向量。

假设原图输入是224224,对于卷积出来的输出是1313256,假设某个映射的候选区域为1210*256,那么:

  • SPP层会将每一个候选区域分为11, 22, 4*4 的三张子图,对每个子图的每个区域做max pooling,得出的特征再连接到一起就是(16 + 4+1) 256 = 21256=5376个结果

在这里插入图片描述
空间盒数定义为16+4+1 = 21个。多尺度的池化,就是空间金字塔名字的含义。

2.3 SPP优缺点

  • 优点: 在R-CNN基础上做了改进,通过候选框和feature map的映射配合SPP层使用,从而达到了CNN共享计算,减少了运算时间。Fast R-CNN也是受SPPNet的启发
  • 缺点:训练效率依然过慢,特征仍因为SVM需要写入磁盘;需要分阶段训练网络(选择候选区域,训练CNN,训练SVM,训练bbox回归器)导致SPPNet反向传播效率低

3. Fast R-CNN

SPPNet性能相对于R-CNN已经得到了改善,但是因为网络之间的训练不统一会造成很大麻烦。因此引入Fast R-CNN。Fast R-CNN使用softmax代替了SVM。

3.1 RoI Pooling

Fast R-CNN的改进之处就在于提出了RoI Pooling,然后整合整个模型,把CNN、RoIpooling、分类器、bbox回归器几个模块一起训练。

3.1.1 训练步骤

在这里插入图片描述

  1. 将原始图片输入到一个基础卷积网络中,得到整张图的feature map
  2. 将选择性搜索算法的结果RoI映射到feature map中(至此,和SPPNet都相同)
  3. RoI pooling层提取一个固定长度的特征向量,每个特征会输入到一系列的全连接层,得到一个RoI特征向量(对每一个候选区域做相同操作)
  4. 分类器用softmax代替SVM
  5. 也有一个bbox回归器

3.1.2 RoI Pooling层

RoI Pooling层是一个简化版本的SPP,目的是为了减少计算量并得出固定长度的向量。下图中只是用44的空间盒。
在这里插入图片描述
SPP中使用了4
4, 22, 11(全局池化)三个尺度的池化,ROI只采用一个尺度的池化。采用几个尺度的问题涉及到single scalemulti scale的优缺点。

  • single scale:直接将image定为某种scale,直接输入网络训练即可。如Fast R-CNN
  • multi scale:需要生成一个金字塔,即SPPNet

虽然多尺度要比单尺度更加准确一些,但并没有高出很多。而单尺度的训练速度要远远快于多尺度。所以实际采用的都是单尺度策略。

3.2 端到端模型

输入端到输出端直接使用一个神经网络相连,整体优化目标函数。采用卷积神经网络 + roi pooling + softmax架构。

为什么能统一训练:特征提取CNN网络和训练分类器在时间上是先后顺序且二者的训练方式独立。因此如果使用SVM,SVM的Loss不能更新之前的卷积层的参数,而去掉SVM用softmax代替,使得所有特征都存储在内存中就形成了End-to-End模型。(这里所说的端到端模型不包括proposal,即候选框选择算法部分)

3.2.1 多任务损失 Multi task loss

由于算法最终的输出结果包含softmax分类器和bbox regressor回归两个任务,所以需要引入多任务损失来统一损失,以便于统一指导网络的参数更新。

两个loss分别是

  • 分类loss:N+1的softmax输出,N代表N个类别,是背景。使用交叉熵损失
  • 回归loss:4*N的regressor,4代表位置的4个参数。即对于每个类别都会训练出一个单独的regressor,使用平均绝对误差即L1损失

取最终损失为 交叉熵损失 + L1损失

在微调时,调整CNN + RoI Pooling + fc + softmax的参数和bbox regressor中的参数

  • 效果对比

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

3.3 Fast R-CNN缺点

选择性搜索算法并没有融合到网络当中

4. Faster R-CNN

舍弃选择性搜索算法,即把寻找候选框的任务也给神经网络来做。这样目标检测所有基本步骤(候选区域生成,特征提取,分类,位置微调)真正意义上统一到了一个深度网络框架当中。

Faster R-CNN可以看作区域生成网络(RPN, Region Proposal Network)+Fast R-CNN的模型。
在这里插入图片描述
feature map输入到RPN中。

4.1 RPN网络

Region Proposal Network,区域生成网络。用于生成region proposal,亦被称为anchor

  1. 通过softmax判断anchor属于前景还是背景
  2. 再利用bbox regressor修正 anchor得到更精确的proposal,将Top n(默认为300个)的区域送给RoI Pooling

在这里插入图片描述

Faster RCNN:输入PQ的图像,调整尺寸MN输入到一个神经网络中(图示为VGG)得到一个feature map。feature map共享,一边直接输入到ROI Pooling,一边输入到RPN网络中。RPN最后得出top n个proposal区域也输入到ROI Pooling中。从ROI Pooling开始的操作和Fast R-CNN相同。

4.2 RPN网络原理

RPN流程:RPN卷积特征图,得到anchors

RPN用nn(默认33)大小的窗口扫描特征图,(对feature map进行一次33的卷积操作,不改变feature map的尺寸)每个滑窗位置映射到一个1维的向量(默认256维),并为**每个滑窗以33的中心为原图上的位置考虑k种(默认k=9)种可能的参考窗口(称为anchor)**。因此,whc维的feature map会__产生wh9个anchors,且每个anchors是c维__,对应channel数。

在这里插入图片描述
这每个点对应的原图上的k种anchor,是不同尺度不同宽度比的anchors。尺度一般定义为{128, 256, 512},长宽比为{1:1, 2:1, 1:2},尺度即是面积
在这里插入图片描述

把卷积后的HW256的特征图看作含HW个向量,每个向量(对应原图9个anchor)是256维。那么再把这256维的向量输入到两个全连接网络中。一个经过softmax得到两个分数,分别是前景的分数和背景的分数;一个经过bbox regressor得到四个坐标,四个坐标指对原图坐标的偏移*。

上图中cls layer和reg layer中 k=H*W。

4.3 Faster R-CNN训练

RPN训练

  • cls:二分类从众多anchor中提取出分数较高的,并且经过bbox regression调整的候选区域
  • reg: 调整位置

Fast R-CNN训练

  • Fast R-CNN Cls(注意与RPN中cls区分):所有类别分类N+1,得到候选区域每个类别的概率
  • Fast R-CNN Reg: 调整位置

4.4 候选区域的训练

训练样本anchor标记:

  1. 每个和ground truth由最高IoU的anchor标记为该类别
  2. 剩下的anchor与任何ground truth的IoU>0.7标记为True,IoU<0.3标记为False
  3. 其余anchors丢弃
  4. anchors保证正负样本比例1:3

4.5 Faster RCNN缺点

训练参数过大

RPN对于小目标(待检测目标较小)可以选择多尺度信息(从9中anchors到18中anchors;或者在{128, 256, 512}尺度集合中增加更小的尺度)

4.6 Faster RCNN实现

B站——pytorch版本Faster R-CNN源码分析和复现

5. YOLO——You Only Look Once(简述)

关键词:YOLO网格结构,单元格

5.1 YOLO结构

  • 一个网络:GoogleNet + 4个卷积 + 2个全连接层
  • 输出:7730矩阵
    在这里插入图片描述

5.2 流程

输入图片resize到448448,经过一系列的卷积,将图片输出成一个__77*30__(单元格 * 单元格)的结构。

  1. 将图片分割成77个单元格。(以下用33做演示)
    在这里插入图片描述
  2. 每个单元格中给出两个bounding box
    在这里插入图片描述
  3. 进行NMS筛选
  4. 得到最后的输出结果,注意:不做微调

5.2.1 单元格 grid cell

理解网络输出的7730的特征图。
在这里插入图片描述

7*7 = 49是49个单元格,每个单元格对应一根30维的向量。单元格需要做的两件事

  1. 每个单元格预测一个物体类别,并直接预测概率值
  2. 每个单元格预测两个bbox的位置和两个bbox的置信度。一个bbox需要:xmin, ymin, xmax, ymax和confidence。所以两个bbox共需要10个值。另外20个值代表20个分类的分类概率。

在这里插入图片描述
综上,输出为7730的向量。

网络输出筛选

一个单元格会预测两个bbox,在训练时只用一个bbox。一个网格中的两个bbox中只有一个会用于预测概率。因此,通过比较置信度大小(实际是比较bbox和ground truth的IoU大小)决定20个对象的概率代表哪个bbox的预测类别。

  • 如果 grid cell里没有object,则两个confidence都等于0
  • 如果有 则confidence等于预测的box和ground truth的IOU乘积

置 信 度 = P ( 类 别 ) × I o U 置信度 = P(类别) \times IoU =P()×IoU

如何判断grid cell中是否包含某个object:如果一个物体的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就包含该物体,即该物体的预测由该gri cell负责
在这里插入图片描述

不同于anchors,yolo的候选框是由网络得出的,而Fast R-CNN是预设的一个值(9中anchor)

5.2.2 训练过程

首先进行预测框对应的目标值标记。

  • confidence:格子内是否有目标
  • 20类概率:标记每个单元格的目标类别

在这里插入图片描述
因为有三个预测,所以损失部分有三个部分的损失。

5.3 与Faster R-CNN比较

在这里插入图片描述
YOLO将Faster R-CNN的PRN网络和预测网络两步合并为一步,直接用一个网络输出预测结果进行优化。所以称YOLO算法维直接回归法代表。YOLO的特点就是快。

5.4 YOLO准确率低

准确率低意味着框太少。YOLO对于相互靠的很近的物体,如中心点都落在一个格子上的情况,还有物体比较小的物体(小物体重叠在大物体上)效果不好。

6. SSD算法(单发多框检测)

Faster R-CNN准确率高是因为有很多框;YOLO速度快是因为只有一个网络,SSD算法结合了二者的优点。

SSD——Single Shot Multi Detector。SSD的特点在于:

  • 结合了YOLO回归的思想和Faster R-CNN中anchor的机制。
  • 核心是在不同尺度的feature map上采用卷积核来预测一系列Default Bounding Box类别,坐标偏移

6.1 SSD的结构

在这里插入图片描述

SSD以VGG-16为基础,使用VGG的前五个卷积,后面增加conv6开始的五个卷积结构。注意:SSD卷积过程中的中间层feature map被保留。

6.1.1 SSD流程

SSD详细流程如下

在这里插入图片描述

  1. 每个阶段的feature map不仅输入到下一层卷积网络中,同时横向输入到一个Detector & classifier层(又称作Prior Box层
  2. 第一份feature maps要经过归一化
  3. 不同阶段的feature map对应的默认box个数不同(类似anchor
  4. 原论文共有(38384 + 19196 + 10106 + 556 + 334 + 114 = )8732个候选框
  5. 这8732个候选框进行NMS,输出最终结果

SSD中的多尺度指的就是不同阶段的feature map,每个阶段重点关注大小不同的物体。不同尺度feature map所有特征点上使用prior box层

6.1.2 Detector & Classifier

拿第一阶段feature map举例
在这里插入图片描述
在38*38个位置上,每个位置选出4个bounding box,共选出5776个bbox。Detecor & classifier的三个部分

  1. PriorBox层:生成default boxes,即生成默认4或6个候选框。生成候选框之后还会进行微调
  2. Conv 3*3:生成localization,4个位置偏移
  3. Conv 3*3:生成置信度,21个类别置信度(20个类别加背景)

第四阶段feature map
在这里插入图片描述

Dafault box generator

每个点生成三个候选框(不同于论文,代码采用 default boxes = 3)

Localization

5 ∗ 5 ∗ 256 5*5*256 55256的feature map采用12个 3 ∗ 3 ∗ 256 3 * 3 * 256 33256的卷积核得到一个 5 ∗ 5 ∗ 12 5*5*12 5512个feature map。 5 ∗ 5 ∗ 12 5*5*12 5512的feature map可以想象成25根含12个值的向量(棍)。每个点产生三个候选框,对应的一个点的位置偏移参数需要12个( 3 ∗ 4 3*4 34)值,将每根棍平均劈成3份分给各个候选框。( 5 ∗ 5 ∗ 3 ∗ 4 = 5 ∗ 5 ∗ 12 5*5*3*4 = 5*5*12 5534=5512

confidence

类似于localization。每个候选框需要21个类别概率,所以向量棍含有的参数量为 21 ∗ 3 21*3 213

  • 某一层的结构输出格式
layer{
	name: "conv6_2_mbox_priqrbox"
	type: "PriorBox"
	bottom: "conv6_2"
	top: "conv6_2_mbox_priorbox"
	prior_box_param 
	{
		min_size: 111.0
		max_size: 162.0
		aspect_ratio: 2.0
		aspect_ratio: 3.0
		variance: 0. 10000000149
		variance: 0.10000000149
		variance: 0.20000000298
		variance: 0.20000000298
		step: 32.0
		offset:0.5
	}
}

6.2 SSD训练过程

  • 输入->输出(8732个框)->结果与ground truth回归损失计算->反向传播,更新权值

6.2.1 样本标记

先将prior box 与ground truth box做匹配进行样本正负标记。每次并不训练8732张计算好的default box,先进行置信度筛选,并训练指定的正样本和负样本。

  • 正样本:
    1. 与GT重合最高的box,对应label设置为对应物体
    2. GT与bbox的IoU大于0.5
  • 负样本:其他的样本标记为负样本

仍控制正例:负例 = 1:3

6.2.2 损失

网络的损失也是两部分:置信度Softmax Loss,位置回归Smooth L1 Loss

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c a ( x , l , g ) ) , x i , j p = { 0 , 1 } L(x, c, l, g) = \frac{1}{N}(L_{conf}(x, c) + \alpha L_{loca}(x, l, g)) , x_{i, j}^{p} = \{0, 1\} L(x,c,l,g)=N1(Lconf(x,c)+αLloca(x,l,g)),xi,jp={0,1}假设与GT的IoU大于0.5的筛选出来有N个。

i:第i个default框
j:第j个GT框
p:第p个类
c:置信度
l:预测框
g:GT框
L:损失

6.2.3 测试流程

一个输入得到8732个候选框,经过NMS过滤得到最终结果。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值