目标检测算法的分类
- 两步走
- 先找出候选区域
- 再对候选区域进行调整、分类
- 代表:R-CNN
- 一步走(端对端
- 采用一个网络一步到位
- 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为例
- 对于给定一张图片,找出可能存在目标的默认的2000个候选区域
- 2000个候选区域大小变换,输入到Alex net中(相当于输入2000张图片)得到2000个特征向量(Alex net输出4096维)
- 经过20个类别的分类器。对于2000个候选区域做判断,得到2000 * 20个概率值(类别矩阵)
- 对[2000, 20]维矩阵进行非极大抑制(NMS),去除不好的、重叠度高的候选区域。剩下的是分数最高的建议框(proposal bounding box)
- 修bounding box
1.2.1 RoI候选区域
通过选择性搜索算法,将每个像素作为一组,然后计算每一组的纹理,并将两个最接近的组结合,直到所有区域都结合起来。第一行展示如何使区域增长,第二行中蓝色矩形框代表合并过程中所有可能的RoI。
![在这里插入图片描述](https://img-blog.csdnimg.cn/e42adaae64a044ad82823
这样筛选出来的候选框长款不固定,而作为backbone的骨干网络要求固定的输入,所以需要对候选框进行调整。
1.2.2 CNN网络提取特征
在候选区域的基础上提取出更抽象的特征,这些特征作为下一步分类器的输入数据。(训练时可以保存到本地)
1.2.3 特征向量训练分类器SVM
- 假设一张图片会生成2000个候选区域,那么输入到CNN后提取出来就是2000 * 4096维的特征向量(Alex net输出)
- R-CNN选用SVM作为分类器。假设有20个类别,则设置20个SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样会得出[2000, 20]形状的得分矩阵(每行是一个候选框,列为该样本属于某类的概率)
每个SVM做的事情:判断2000个候选区域是属于前景的某类别,还是属于背景
1.2.4 非极大抑制 NMS
- 目的:筛选候选区域,目标是一个物体(被标记的物体)只保留一个最优的框,来抑制那些冗余的候选框。图片中有三个人工标记的ground truth,那么只保留三个比较准确的候选框。
- 迭代过程:
- 对于所有的2000个候选框,如果概率小于0.5(SVM分类结果)则舍弃
- 剩余候选框(可信度较大的冗余候选框)
- 假设图片真实物体个数(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的缺点
- 训练阶段多:步骤繁琐(微调网络 + SVM + 边框回归)三者都要训练且保存参数。
- 空间占用:磁盘空间占用率大。使用SVM分类5000张图象会产生几百G的特征文件
- 处理速度慢:使用GPU,VGG16处理一张图像需要47s
- 图片形状:候选区域需要经过crop/warp进行固定大小,无法保证图片不变形
1.3 检测的评价指标
对于目标检测来讲,不能再用简单的准确率来衡量
1.3.1 IoU交并比
Intersection over Union,交并比。反应候选区域和标定区域的重叠程度
1.3.2 平均精确率 mAP
IoU本身无法反应分类是否正确。引入更加复杂的mean average precision,平均精确率。平均精确率定义为多分类任务的AP的平均值,即mAP = 所有类别AP和 / 类别总个数。AP是PR曲线下的面积(横坐标为召回率,纵坐标为精确率)
- 训练样本的标记:候选框标记(如RCNN有2000个)
- 每个ground-truth box有着最高的IoU的anchor标记为正样本。(保证至少存在候选框)
- 剩余的anchor与任何ground-truth box的IoU大于0.7的标记为正样本,小于0.3标记为负样本。
- 对于其中一个类别C,首先将算法输出的所有C类别的预测框按预测分数进行排序
- 设定不同k值,选择top k个预测框,计算precision和AP(k组FPR,TPR点对)
- 将得到的所有的C类别的AP取平均,得到C类别的AP
- AP是针对一个类别的,再将所有类别的AP求平均得到mAP
2. SPPNet
是R-CNN的一种改进。导致R-CNN速度慢的主要原因是卷积运算(2000个候选区域进行卷积)
可以看到,SPP是用先进行一次卷积得到一个feature map,然后添加一个spatial pyramid pooling(空间金字塔变换层)代替R-CNN中将候选框全部输入到卷积层的操作。
SPPNet步骤
- 图片输入到网络得到一个features map
- 原图中通过选择性搜索算法得到的候选区域直接映射feature map对应位置
- 映射得到的特征,经过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]+1右下角的点:x′′=[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 训练步骤
- 将原始图片输入到一个基础卷积网络中,得到整张图的feature map
- 将选择性搜索算法的结果RoI映射到feature map中(至此,和SPPNet都相同)
- RoI pooling层提取一个固定长度的特征向量,每个特征会输入到一系列的全连接层,得到一个RoI特征向量(对每一个候选区域做相同操作)
- 分类器用softmax代替SVM
- 也有一个bbox回归器
3.1.2 RoI Pooling层
RoI Pooling层是一个简化版本的SPP,目的是为了减少计算量并得出固定长度的向量。下图中只是用44的空间盒。
SPP中使用了44, 22, 11(全局池化)三个尺度的池化,ROI只采用一个尺度的池化。采用几个尺度的问题涉及到single scale与multi 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。
- 通过softmax判断anchor属于前景还是背景
- 再利用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标记:
- 每个和ground truth由最高IoU的anchor标记为该类别
- 剩下的anchor与任何ground truth的IoU>0.7标记为True,IoU<0.3标记为False
- 其余anchors丢弃
- 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__(单元格 * 单元格)的结构。
- 将图片分割成77个单元格。(以下用33做演示)
- 每个单元格中给出两个bounding box
- 进行NMS筛选
- 得到最后的输出结果,注意:不做微调
5.2.1 单元格 grid cell
理解网络输出的7730的特征图。
7*7 = 49是49个单元格,每个单元格对应一根30维的向量。单元格需要做的两件事
- 每个单元格预测一个物体类别,并直接预测概率值
- 每个单元格预测两个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详细流程如下
- 每个阶段的feature map不仅输入到下一层卷积网络中,同时横向输入到一个Detector & classifier层(又称作Prior Box层)
- 第一份feature maps要经过归一化
- 不同阶段的feature map对应的默认box个数不同(类似anchor)
- 原论文共有(38384 + 19196 + 10106 + 556 + 334 + 114 = )8732个候选框
- 这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的三个部分
- PriorBox层:生成default boxes,即生成默认4或6个候选框。生成候选框之后还会进行微调
- Conv 3*3:生成localization,4个位置偏移
- Conv 3*3:生成置信度,21个类别置信度(20个类别加背景)
第四阶段feature map
Dafault box generator
每个点生成三个候选框(不同于论文,代码采用 default boxes = 3)
Localization
对 5 ∗ 5 ∗ 256 5*5*256 5∗5∗256的feature map采用12个 3 ∗ 3 ∗ 256 3 * 3 * 256 3∗3∗256的卷积核得到一个 5 ∗ 5 ∗ 12 5*5*12 5∗5∗12个feature map。 5 ∗ 5 ∗ 12 5*5*12 5∗5∗12的feature map可以想象成25根含12个值的向量(棍)。每个点产生三个候选框,对应的一个点的位置偏移参数需要12个( 3 ∗ 4 3*4 3∗4)值,将每根棍平均劈成3份分给各个候选框。( 5 ∗ 5 ∗ 3 ∗ 4 = 5 ∗ 5 ∗ 12 5*5*3*4 = 5*5*12 5∗5∗3∗4=5∗5∗12)
confidence
类似于localization。每个候选框需要21个类别概率,所以向量棍含有的参数量为 21 ∗ 3 21*3 21∗3
- 某一层的结构输出格式
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,先进行置信度筛选,并训练指定的正样本和负样本。
- 正样本:
- 与GT重合最高的box,对应label设置为对应物体
- 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过滤得到最终结果。