两步走的目标检测:先进行区域推荐,而后进行目标分类
端到端的目标检测:采用一个网络一步到位
2.1.1滑动窗口
目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。如下图所示
这样就变成每张子图片输出类别以及位置,变成分类问题。但是滑动窗口需要初始设定一个固定大小的窗口,这就遇到了一个问题,有些物体适应的框不一样,所以需要提前设定K个窗口,每个窗口滑动提取M个,总共K x M 个图片,通常会直接将图像变形转换成固定大小的图像,变形图像块被输入 CNN 分类器中,提取特征后,我们使用一些分类器识别类别和该边界框的另一个线性回归器。
2.1.2 训练数据集
3.1.3 Overfeat模型总结
这种方法类似一种暴力穷举的方式,会消耗大量的计算力量,并且由于窗口大小问题可能会造成效果不准确
在CVPR 2014年中Ross Girshick提出R-CNN
2.2.1 完整R-CNN结构
不使用暴力方法,而是用候选区域方法(region proposal method),创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型 ,R-CNN在当时以优异的性能令世人瞩目,以R-CNN为基点,后续的SPPNet、Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路
2.2.2候选区域(ROI)(了解)
选择性搜索(SelectiveSearch,SS)中,首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。
Crop+Warp(了解)
传统的CNN限制了输入必须固定大小,所以在实际使用中往往需要对原图片进行crop或者warp的操作
无论是crop还是warp,都无法保证在不失真的情况下将图片传入到CNN当中。会使用一些方法尽量让图片保持最小的变形。
1.各向异性缩放:即直接缩放到指定大小,这可能会造成不必要的图像失真
2.各向同性缩放:在原图上出裁剪侯选区域, (采用侯选区域的像素颜色均值)填充到指定大小在边界用固定的背景颜色
2.2.3 CNN网络提取特征
在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据
提取的这些特征将会保存在磁盘当中(这些提取的特征才是真正的要训练的数据)
2.2.4 特征向量训练分类器SVM
假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。那么最后需要对这些特征进行分类,R-CNN选用SVM进行二分类。假设检测N个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,如下图所示
2.2.5 非最大抑制(NMS)
假设现在滑动窗口有:A、B、C、D、E5个候选框,
第一轮:对于右边车辆,假设B是得分最高的,与B的loU>0.5删除。现在与B计算loU,DE结果>0.5,剔除DE,B作为一个预测结果
第二轮:对于左边车辆,AC中,A的得分最高,与A计算loU,C的结果>0.5,剔除C,A作为一个结果
最终结果为在这个5个中检测出了两个目标为A和B
SS算法得到的物体位置已经固定了,但是我们筛选出的位置不一定真的就特别准确,需要对A和B进行最后的修正
2.2.6 修正候选区域
那么通过非最大一直筛选出来的候选框不一定就非常准确怎么办?R-CNN提供了这样的方法,建立一个bbox regressor
修正过程(线性回归)
2.3.1
任务 | description | 输入 | 输出 | 评价标准 |
---|---|---|---|---|
Detection and Localization (检测和定位) | 在输入图片中找出存在的物体类别和位置(可能存在多种物体) | 图片(image ) | 类别标签(categories)和 位置(bbox(x,y,w,h)) | IoU (Intersection over Union) mAP (Mean Average Precision) |
2.3.2 R-CNN训练过程
R-CNN的训练过程这些部分,正负样本准备+预训练+微调网络+训练SVM+训练边框回归器
训练样本的标记:候选框(如RCNN2000个)标记
1.每个ground-truth box有着最高的loU的anchor标记为正样本
2.剩下的anchor/anchors与任何ground-truth box的loU大于0.7记为正样本,loU小于0.3,记为负样本
预训练(pre-training)
CNN模型层数多,模型的容量大,通常会采用2012年的著名网络AlexNet来学习特征,包含5个卷积层和2个全连接层,利用大数据集训练一个分类器,比如著名的ImageNet比赛的数据集,来训练AlexNet,保存其中的模型参数。
微调(fine-tuning)
AlexNet是针对ImageNet训练出来的模型,卷积部分可以作为一个好的特征提取器,后面的全连接层可以理解为一个好的分类器。R-CNN需要在现有的模型上微调卷积参数。
将第一步中得到的样本进行尺寸变换,使得大小一致,然后作为预训练好的网络的输入,继续训练网络(迁移学习)
2.4 R-CNN总结
表现
在VOC2007数据集上的平均精确度达到66%
缺点
1、训练阶段多:步骤繁琐: 微调网络+训练SVM+训练边框回归器。
2、训练耗时:占用磁盘空间大:5000张图像产生几百G的特征文件。(VOC数据集的检测结果,因为SVM的存在)
3、处理速度慢: 使用GPU, VGG16模型处理一张图像需要47s。
SPPNet主要存在两点改进地方,提出了SPP层(空间金字塔变换层)
R-CNN模型 | SPPNet模型 |
---|---|
1、R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像 2、固定大小的图像塞给CNN 传给后面的层做训练回归分类操作 | 1、SPPNet把全图塞给CNN得到全图的feature map 2、让候选区域与feature map直接映射,得到候选区域的映射特征向量 3、映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层 |
3.3.1.1 映射
原始图片经过CNN变成了feature map,原始图片通过选择性搜索(SS)得到了候选区域,现在需要将基于原始图片的候选区域映射到feature map中的特征向量。映射过程图参考如下:
整个映射过程有具体的公式,如下
假设(x′,y′)(x′,y′)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关心与网络结构有关:(x,y)=(S∗x′,S∗y′),即
其中 S 就是CNN中所有的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为=16
拓展:如果关注这个公式怎么计算出来,请参考:http://kaiminghe.com/iccv15tutorial/iccv2015_tutorial_convolutional_feature_maps_kaiminghe.pdf
3.3.1.2 spatial pyramid pooling
通过spatial pyramid pooling 将任意大小的特征图转换成固定大小的特征向量
示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256的,可以理解成有256个这样的Filter,每个Filter对应一张13x13的feature map。接着在这个特征图中找到每一个候选区域映射的区域,spp layer会将每一个候选区域分成1x1,2x2,4x4三张子图,对每个子图的每个区域作max pooling,得出的特征再连接到一起,就是(16+4+1)x256的特征向量,接着给全连接层做进一步处理,如下图:
Spatial bins(空间盒个数)︰1+4+16=21
3.3.2 SPPNet总结
SPPNet的性能已经得到很大的改善,但是由于网络之间不统一训练,造成很大的麻烦,所以接下来的Fast R-CNN就是为了解决这样的问题
改进的地方:
提出一个RoI pooling,然后整合整个模型,把CNN、SPP变换层、分类器、bbox回归几个模块一起训练
3.4.1.1 RoI pooling
首先RoI pooling只是一个简单版本的SPP,目的是为了减少计算时间并且得出固定长度的向量,使用4*4空间盒数
例如:VGG16 的第一个 FC 层的输入是 7 x 7 x 512,其中 512 表示 feature map 的层数。在经过 pooling 操作后,其特征输出维度满足 H x W。假设输出的结果与FC层要求大小不一致,对原本 max pooling 的单位网格进行调整,使得 pooling 的每个网格大小动态调整为 h/H,w/W, 最终得到的特征维度都是 HxWxD。
它要求 Pooling 后的特征为 7 x 7 x512,如果碰巧 ROI 区域只有 6 x 6 大小怎么办?每个网格的大小取 6/7=0.85 , 6/7=0.85,以长宽为例,按照这样的间隔取网格:[0,0.85,1.7,2.55,3.4,4.25,5.1,5.95],取整后,每个网格对应的起始坐标为:[0,1,2,3,3,4,5]
为什么要设计单个尺度呢?这要涉及到single scale与multi scale两者的优缺点
后者比前者更加准确些,没有突更多,但是第一种时间要省很多,所以实际采用的是第一个策略,因此Fast R-CNN要比SPPNet快很多也是因为这里的原因。
3.4.1.3 End-to-End model
从输入端到输出端直接用一个神经网络相连,整体优化目标函数。
接着我们来看为什么后面的整个网络能进行统一训练?
特征提取CNN的训练和SVM分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,去掉了SVM分类这一过程,所有特征都存储在内存中,不占用硬盘空间,形成了End-to-End模型(proposal除外,end-to-end在Faster-RCNN中得以完善)
两个loss,分别是:
参数 | R-CNN | SPPNet | Fast R-CNN |
---|---|---|---|
训练时间(h) | 84 | 25 | 9.5 |
测试时间/图片 | 47.0s | 2.3s | 0.32s |
mAP | 66.0 | 63.1 | 66.9 |
其中有一项指标为mAP,这是一个对算法评估准确率的指标,mAP衡量的是学出的模型在所有类别上的好坏
在Fast R-CNN还存在着瓶颈问题:Selective Search(选择性搜索)。要找出所有的候选框,这个也非常耗时。那我们有没有一个更加高效的方法来求出这些候选框呢?
在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。
Faster R-CNN可以简单地看成是区域生成网络+Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如下:
生成anchors -> softmax分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
3.5.2 RPN原理
RPN网络的主要作用是得出比较准确的候选区域。整个过程分为两步
3.5.2.1 anchors
举个例子:
3.5.2.2 候选区域的训练
候选区域的训练是为了让得出来的 正确的候选区域, 并且候选区域经过了回归微调。
在这基础之上做Fast RCNN训练是得到特征向量做分类预测和回归预测。
3.5.3 Faster R-CNN的训练
Faster R-CNN的训练分为两部分,即两个网络的训练。
RPN训练:(候选框的调整,均方误差做修正)
目的:从众多的候选区域中提取出score较高的,并且经过regression调整的候选区域.
分类:二分类,softmax,logisticregression
Fast RCNN部分的训练︰
Fast R-CNN classification (over classes)︰所有类别分类N+1,得到候选区域的每个类别概率
Fast R-CNN regression (bbox regression):得到更好的位置
预测类别:softmax 预测位置:均方误差做修正
R-CNN | Fast R-CNN | Faster R-CNN | |
---|---|---|---|
Test time/image | 50.0s | 2.0s | 0.2s |
mAP(VOC2007) | 66.0 | 66.9 | 66.9 |
可以改进的需求:
在正式介绍YOLO之前,我们来看一张图:
可以看出YOLO的最大特点是速度快。
3.6.1.1 结构
一个网络搞定一切,GoogleNet + 4个卷积+2个全连接层
3.6.1.2 流程理解
1、原始图片resize到448x448,经过前面卷积网络之后,将图片输出成了一个7 7 30的结构
2、默认7 7个单元格,这里用3 3的单元格图演示
3、每个单元格预测两个bbox框
4、进行NMS筛选,筛选概率以及IoU. 以图示的方式演示
最后网络输出的7 7 30的特征图怎么理解?7 * 7=49个像素值,理解成49个单元格,每个单元格可以代表原图的一个方块。单元格需要做的两件事:
1.每个单元格负责预测一个物体类别,并且直接预测物体的概率值
2.每个单元格预测两个(默认)bbox位置,两个bbox置信度(confidence) 7 7 2=98个bbox
3.6.2.1 网格输出筛选
一个网格会预测两个Bbox,在训练时我们只有一个Bbox专门负责(一个Object 一个Bbox)
怎么进行筛选?
每个bounding box都对应一个confidence score
注:所以如何判断一个grid cell中是否包含object呢?如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。
这个概率可以理解为不属于任何一个bbox,而是属于这个单元格所预测的类别。
每个Bbox的Class-Specific Confidence Score以后,设置阈值,滤掉概率的低的bbox,对每个类别过滤IoU,就得到最终的检测结果
怎么理解这个过程?同样以分类那种形式来对应,假设以一个单元格的预测值为结果,如下图
3.6.5 与Faster R-CNN比较
Faster R-CNN利用RPN网络与真实值调整了候选区域,然后再进行候选区域和卷积特征结果映射的特征向量的处理来通过与真实值优化网络预测结果。而这两步在YOLO当中合并成了一个步骤,直接网络输出预测结果进行优化。
所以经常也会称之为YOLO算法为直接回归法代表。YOLO的特点就是快
3.7.1.1 简介
SSD算法源于2016年发表的算法论文,论文网址:https://arxiv.org/abs/1512.02325
SSD的特点在于:
SSD结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN一样比较精准。
SSD的核心是在不同尺度的特征特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。
3.7.1.2 结构
以VGG-16为基础,使用VGG的前五个卷积,后面增加从CONV6开始的5个卷积结构,输入图片要求300*300。
3.7.1.3 流程
SSD中引入了Defalut Box,实际上与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是在不同尺度feature map所有特征点上使用PriorBox层
3.7.1.4 Detector & classifier
Detector & classifier的三个部分:
1.PriorBox层:生成default boxes,默认候选框
2.Conv3 x 3:生成localization, 4个位置偏移
3.Conv3 x 3:confidence,21个类别置信度(要区分出背景)
3.7.1.4.1 PriorBox层-default boxes
default boxex类似于RPN当中的滑动窗口生成的候选框,SSD中也是对特征图中的每一个像素生成若干个框。
根据输入的不同aspect ratio 和 scale 以及 num_prior来返回特定的default box,default box 的数目是feature map的height x width x num_prior。
以下为了解内容,记住几个参数即可:
prior_box:打印出来的形状为:
Tensor("concat_2:0", shape=(?, 7308, 8), dtype=float32)
variance: bounding regression中的权重。网络输出[dxmin,dymin,dxmax,dymax],即对应利用如下方法进行针对prior box的位置回归:
decode_bbox->set_xmin(
prior_bbox.xmin() + prior_variance[0] * bbox.xmin() * prior_width);
decode_bbox->set_ymin(
prior_bbox.ymin() + prior_variance[1] * bbox.ymin() * prior_height);
decode_bbox->set_xmax(
prior_bbox.xmax() + prior_variance[2] * bbox.xmax() * prior_width);
decode_bbox->set_ymax(
prior_bbox.ymax() + prior_variance[3] * bbox.ymax() * prior_height);
layer {
name: "conv6_2_mbox_priorbox"
type: "PriorBox"
bottom: "conv6_2"
bottom: "data"
top: "conv6_2_mbox_priorbox"
prior_box_param {
min_size: 111.0
max_size: 162.0
aspect_ratio: 2.0
aspect_ratio: 3.0
flip: true
clip: false
variance: 0.10000000149
variance: 0.10000000149
variance: 0.20000000298
variance: 0.20000000298
step: 32.0
offset: 0.5
}
3.7.1.4.2 localization与confidence
这两者的意义如下,主要作用用来过滤,训练
模型中打印出最后的三个部分结果:
Tensor("Reshape_42:0", shape=(?, 7308, 4), dtype=float32) Tensor("truediv:0", shape=(?, 7308, 21), dtype=float32) Tensor("concat_2:0", shape=(?, 7308, 8), dtype=float32)
SSD的核心是在不同尺度的特征图上来进行Detector & classifier 容易使得SSD观察到更小的物体
3.7.2.1 train流程
1. 样本标记:
先将prior box与ground truth box做匹配进行标记正负样本,每次并不训练8732张计算好的default boxes, 先进行置信度筛选,并且训练指定的正样本和负样本, 如下规则
正样本
负样本:其它的样本标记为负样本
在训练时, default boxes按照正负样本控制positive:negative=1:3
3. 损失
网络输出预测的predict box与ground truth回归变换之间的损失计算, 置信度是采用 Softmax Loss(Faster R-CNN是log loss),位置回归则是采用 Smooth L1 loss (与Faster R-CNN一样)
3.7.2.2 test流程
从图中看出SSD算法有较高的准确率和性能,兼顾了速度和精度