【目标检测】目标检测算法-从OverFeat到YOLO

【目标检测】基础原理与项目实战

  • 目标检测算法
    • two-stage
      • 算法过程
      • 代表算法
    • one-stage
      • 算法过程
      • 代表算法
  • 目标检测任务
    • 两种 Bounding Box
    • 分类
      • 分类任务
      • 分类原理
      • 分类损失与优化
    • 位置信息
      • 如何衡量整个网络的损失?- L2损失
  • 如何获取目标位置信息?
    • 回归位置
    • 滑动窗口
      • 滑动窗口缺点
  • R-CNN(Region-CNN)
    • R-CNN的完整结构过程
    • R-CNN步骤(以AlexNet网络为例)
      • 如何获取候选区域(Region of Interest,ROI)?- 选择性搜索(SelectiveSearch, SS)
      • Crop+Warp
      • CNN 网络提取特征
      • 使用特征向量训练分类器SVM
      • 非最大抑制(NMS)
    • 修正候选区域
    • 目标检测评价指标
      • IoU交并比
      • 平均精确率(Mean Average Precision,MAP)
        • 回顾精确率与召回率
    • R-CNN总结
      • R-CNN流程总结
      • R-CNN缺点
  • SPPNet - R-CNN改进
    • R-CNN速度慢在哪里?- 卷积运算
      • SPPNet - SPP层 - 减少卷积运算
        • SPPNet 如何映射SS得到的候选区域与原图特征向量中对应位置?- (x,y)=(S*x',S*y')
          • 公式如何得出的?
      • Spatial Pyramid Pooling - 使用三个划分刻度
    • SPPNet总结
      • SPPNet 优点 - CNN层的共享计算减少计算耗时
      • SPPNet 缺点 - 训练过慢&效率低
  • Fast R-CNN
    • SPPNet 训练不统一 - Fast R-CNN RoI Pooling
      • Fast R-CNN RoI Pooling - 仅使用一个划分刻度
      • RoI Pooling 意义
    • 为什么要设计单个尺度呢?
    • End-to-End model
      • 为什么后面的整个网络能进行统一训练?
    • 多任务损失 - Multi-task loss - 平均绝对误差(MAE)+ 交叉熵损失
    • R-CNN、SPPNet、Fast R-CNN 效果对比
    • Fast R-CNN 总结
    • Fast R-CNN 优点 - RoI pooling + softmax
    • Fast R-CNN 缺点
  • Faster R-CNN - 候选区域筛选融合到网络中
    • 区域生成网络(RPN) + Fast R-CNN
    • Region Proposal Network,RPN 原理
    • Faster R-CNN 训练
      • RPN 训练 - 得到候选区域
      • Fast RCNN 训练 - 预测类别&预测位置
    • 训练样本anchor标记
    • 效果对比
    • Faster R-CNN 总结
      • 优点
      • 缺点
      • 可以改进的需求
    • Faster R-CNN 改进之处
    • 如何得到RPN的anchors?
  • 开源 Keras Faster RCNN 模型介绍
    • 环境需求
    • 源码组成结构
  • fine tuning 微调
    • fine tuning 微调过程
  • YOLO
    • YOLO结构
    • YOLO流程
    • 单元格 grid cell
    • 网格输出筛选
    • 非最大抑制NMS
    • 训练
    • 与Faster R-CNN比较
    • YOLO总结
      • 为什么YOLO准确率低?
  • SSD
    • SSD 特点
    • SSD 结构
    • SSD 流程
    • Detector & Classifier
      • Detector & Classifier 三个部分:
      • PriorBox层 default boxes
      • 特点分析
      • localization & confidence
      • 问题:SSD中的多个Detector & classifier有什么作用?
    • 训练
      • 1 样本标记
      • 2 损失
    • 测试
    • 比较
    • 总结

目标检测算法

two-stage

算法过程

第一步:区域推荐。先找出候选的一些区域。
第二步:目标分类。对区域进行调整、分类。

代表算法

R-CNN、SPP-net、Fast R-CNN、Faster R-CNN

one-stage

算法过程

端到端的目标检测,采用一个网络一步到位。

代表算法

YOLO、SSD

目标检测任务

分类 + 目标位置信息

输入:图片。
输出:物体类别标签 + 物体的位置坐标。

两种 Bounding Box

Ground-truth bounding box : 图片当中真实标记的框。
Predicted bounding box :预测的时候标记的框。
【目标检测】目标检测算法-从OverFeat到YOLO_第1张图片

分类

分类任务

输入:一张图片。
输出:类别标签。
评估指标:Accuracy。

分类原理

输入一张图片,经过卷积、激活、池化相关层,最后加入全连接层达到分类概率的效果。

【目标检测】目标检测算法-从OverFeat到YOLO_第2张图片

其中数据输入的是一张图片(输入层),CONV表示卷积层,RELU表示激活层,POOL表示池化层,Fc表示全连接层。

分类损失与优化

在训练的时候需要计算每个样本的损失。CNN做分类时使用softmax函数计算结果,损失为交叉熵损失。
【目标检测】目标检测算法-从OverFeat到YOLO_第3张图片
常见CNN模型
【目标检测】目标检测算法-从OverFeat到YOLO_第4张图片

位置信息

输入:图片。
输出:物体的位置坐标。
评估指标:IoU

【目标检测】目标检测算法-从OverFeat到YOLO_第5张图片

物体的位置信息有两种表示:
表示一:x,y,w,h:物体的中心点位置x,y,以及中心点距离物体两边的长宽w,h。
表示二:xmin,ymin,xmax,ymax:物体位置的左上角、右下角坐标。

如何衡量整个网络的损失?- L2损失

对于分类的概率,还是使用交叉熵损失。

位置信息具体的数值,可使用MSE均方误差损失(L2损失)。

【目标检测】目标检测算法-从OverFeat到YOLO_第6张图片

如何获取目标位置信息?

回归位置

网络最后的输出层加上位置信息。

【目标检测】目标检测算法-从OverFeat到YOLO_第7张图片

假设有10个类别,输出[p1,p.,…p10], 然后输出这一个对象的四个位置信息[x,y,w,h]。

这种方式只适用于位置信息个数固定的情况,例如图片中只有一个物体的情况。如果图片中有多个物体,位置信息需要输出n个,n是不确定的,所以n不能定义为超参数,就不能使用这种结构。

针对一张图片中多目标的位置信息的获取,提出了Overfeat模型。

滑动窗口

目标检测(一张图片含多个目标)的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。

为了在不同观察距离处检测不同的目标类型,需要使用不同大小和宽高比的窗口。如下图所示:

【目标检测】目标检测算法-从OverFeat到YOLO_第8张图片

注:这样就变成每张子图片输出类别以及位置,变成分类问题。

但是滑动窗口需要初始设定一个固定大小的窗口,这就遇到了一个问题,有些物体适应的框不一样。

所以需要提前设定K个窗口,每个窗口滑动提取M个,总共K x M个图片,通常会直接将图像变形转换成固定大小的图像,变形图像块被输入CNN分类器中,提取特征后,使用一些分类器识别类别和该边界框的另一个线性回归器。

【目标检测】目标检测算法-从OverFeat到YOLO_第9张图片

滑动窗口缺点

滑动窗口方式是一种Overfeat方式,Overfeat方式类似一种暴力穷举的方式,计算量很大,并且由于窗口大小问题可能会造成效果不准确,但提供了一种解决目标检测问题的思路。

R-CNN(Region-CNN)

了解Overfeat模型的移动窗口方法
了解选择性搜索
了解Crop+Warp的作用
知道NMS的过程以及作用
了解候选区域修正过程
说明R-CNN的训练过程
说明R-CNN的缺点

R-CNN的完整结构过程

不使用暴力方法,而是用候选区域方法(region proposal method),提供了物体检测的一个重要思路。创建目标检测的区域改变了图像领域实现物体检测的模型思路,R-CNN是以深度神经网络为基础的物体检测的模型,R-CNN在当时以优异的性能令世人瞩目,以R-CNN为基点,后续的SPPNet、 Fast R-CNN、Faster R-CNN模型都是照着这个物体检测思路。
【目标检测】目标检测算法-从OverFeat到YOLO_第10张图片

R-CNN步骤(以AlexNet网络为例)

1 找出图片中可能存在目标的侯选区域 region proposal。(AlexNet中默认找出2000个候选区域)。
2 因为候选区域长宽不一样,不能直接输入AlexNet,需要对候选区域 调整大小,为了适应AlexNet网络的输入图像的大小227x227,通过CNN对候选区域提取特征向量,2000个建议框的CNN特征组合成网络AlexNet最终输出为 2000x4096 维矩阵。
3 将2000x4096维特征经过SVM 分类 器(20种分类,SVM是二分类器,则有20个SVM), 获得 2000x20 种类别矩阵。(注:当时还不流行使用神经网络进行分类,所以使用的是 SVM 分类器)。
4 分别对2000x20维矩阵中进行 非极大值抑制(NMS:non-maximum suppression) 剔除重叠建议框,得到分数最高的一些建议框。
5 修正bbox, 对bbox做回归微调。

如何获取候选区域(Region of Interest,ROI)?- 选择性搜索(SelectiveSearch, SS)

**选择性搜索(SelectiveSearch, SS)**中,首先将每个像素作为一组。然后,计算每一组的纹理,并将邻近的两个最接近的组结合起来。但是,为了避免单个区域吞噬其他区域,首先对较小的组进行分组。之后继续合并邻近的相似区域,直到所有相似区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的ROI。

【目标检测】目标检测算法-从OverFeat到YOLO_第11张图片

Crop+Warp

Crop+Warp:SelectiveSearch在一张图片上提取出来约2000个侯选区域,需要注意的是这些候选区域的长宽不固定。而使用CNN提取候选区域的特征向量,需要接受固定长度的输入,所以需要对候选区域做一些尺寸上的修改。

CNN 网络提取特征

在侯选区域的基础上提取出更高级、更抽象的特征,这些高级特征是作为下一步的分类器、回归的输入数据。

【目标检测】目标检测算法-从OverFeat到YOLO_第12张图片

输入图片,获取候选区域,对候选区域调整大小,将候选区域图片输入到卷积神经网络进行候选区域的特征提取,得到候选区域的特征向量。将这些特征向量保存到磁盘当中(这些提取的特征才是SVM训练要使用的数据)。

使用特征向量训练分类器SVM

1 假设一张图片的2000个侯选区域,那么提取出来的就是2000 x 4096这样的特征向量(R-CNN当中默认CNN层输出4096特征向量)。
2 R-CNN选用SVM进行二分类。假设检测20个类别,那么会提供20个不同类别的SVM分类器,每个分类器都会对2000个候选区域的特征向量分别判断一次,这样得出[2000, 20]的得分矩阵,如下图所示

【目标检测】目标检测算法-从OverFeat到YOLO_第13张图片

非最大抑制(NMS)

目的:筛选候选区域,一个物体只保留一个最优的框,来抑制那些冗余的候选框。

迭代过程:

1 对于所有的2000个候选区域得分进行概率筛选,<0.5的候选框都忽略。一个物体保留分数较高的框。
2 剩余的候选框
假设图片真实物体个数为2 (N), 筛选之后候选框为5 § , 计算N中每个物体位置(Ground-truth)与所有P的交并比loU计算,得到P中每个候选框对应loU最高的N中一个候选框记为Y。
如下图,A、C候选框对应左边车辆,B、D、E对应右边车辆。左边A分数最高,右边B分数最高。

【目标检测】目标检测算法-从OverFeat到YOLO_第14张图片

假设现在滑动窗口有: A、B、C、D、E 5个候选框,且左边A分数最高,右边B分数最高。

第一轮:对于右边车辆,与Ground-truth计算IoU,B是得分最高的,之后,D、E与B计算loU, IoU结果若> 0.5剔除,剔除DE,B作为一个预测结果。

第二轮:对于左边车辆,与Ground-truth计算IoU,AC中,A的得分最高,与A计算loU,IoU结果若 > 0.5, 剔除C,A作为一个结果。

最终结果为在这个5个中检测出了两个目标为A和B

选择性搜索算法(SS算法)得到的物体位置已经固定了,但是筛选出的位置不一定真的就特别准确,需要对A和B进行最后的修正。

修正候选区域

通过非最大抑制筛选出来的候选框不一定就非常准确怎么办?

R-CNN提供了这样的方法,建立一个bbox regressor,回归用于修正筛选后的候选区域,使之回归于ground-truth,默认认为这两个框之间是线性关系,因为在最后筛选出来的候选区域和ground-truth很接近了修正过程(线性回归)。

候选区四个值,经过回归,得到预测值,在预测值与真实值间进行损失计算,训练后,得到回归模型参数。下次训练,当得到唯一候选区域后,使用该回归模型进行修正。
【目标检测】目标检测算法-从OverFeat到YOLO_第15张图片
A是预测框,G是真实框,A与G做回归训练,经过修正得到G’,更接近真实框G。
【目标检测】目标检测算法-从OverFeat到YOLO_第16张图片
RNN输出:一张图片预测一个X候选框,经过修正 x * w=y_locate,y_locate 才是真正的输出的位置。

目标检测评价指标

IoU交并比

**衡量位置近似程度。**两个区域的重叠程度overlap。

候选区域和标定区域的IoU值。值域为:[0,1]。

在这里插入图片描述

平均精确率(Mean Average Precision,MAP)

衡量类别预测结果与真实类别的近似程度。

训练样本的标记:候选框(如RCNN2000个) 标记

1 每个 ground-truth box 有着最高的IoU的anchor标记为正样本
2 剩下的 anchor/anchors 与任何 ground-truth box 的IoU大于0.7记为正样本loU小于0.3记为负样本

定义:多个分类任务的AP的平均值

  • mAP = 所有类别的AP之和 / 类别的总个数
  • 注: PR曲线,而AP (average precision) 就是这个曲线下的面积(ROC与AUC)

mAP计算方法步骤:

1 对于其中一个类别C,首先将算法输出的所有C类别的预测框,按预测的分数confidence排序。在RCNN中就是SVM的输出分数。
2 计算AUC。对于C类别候选框排序列表计算AUC。设定不同的k值,选择top k个预测框,计算FP和TP,计算Precision和AP。
3 计算mAP。将得到的N个类别的AP取平均,即得到mAP; AP是针对单一类别的,mAP是将所有类别的AP求和,再取平均。

回顾精确率与召回率

左边一整个矩形中的数表示ground truth之中为1的(即为正确的)数据。
右边一整个矩形中的数表示ground truth之中为0的数据。
精度precision的计算是用检测正确的数据个数/总的检测个数。
召回率recall的计算是用检测正确的数据个数/ground truth之中所有正数据个数。

【目标检测】目标检测算法-从OverFeat到YOLO_第17张图片

R-CNN总结

R-CNN流程总结

1 输入一张图片
2 得到候选区域
3 对候选区域大小调整为网络输入要求的图片标准大小
4 卷积得到特征向量
5 分类器对特征向量进行分类
【目标检测】目标检测算法-从OverFeat到YOLO_第18张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第19张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第20张图片
RCNN在VOC2007数据集上的平均精度mAP达到了66%。

R-CNN缺点

1 训练阶段多;步骤繁琐;微调网络+训练SVM+训练边框回归器。
2 训练耗时;占用磁盘空间大;5000张图像产生几百G的特征文件。 (VOC数据集的检测结果,因为
SVM的存在)
3 处理速度慢;使用GPU, VGG16模型处理一张图像需要47s。
4 图片形状变化;候选区域要经过crop/warp进行固定大小, 无法保证图片不变形

SPPNet - R-CNN改进

R-CNN速度慢在哪里?- 卷积运算

【目标检测】目标检测算法-从OverFeat到YOLO_第21张图片
每张图片有2000个候选区域,每个候选区域都需要做卷积运算。

SPPNet - SPP层 - 减少卷积运算

【目标检测】目标检测算法-从OverFeat到YOLO_第22张图片

R-CNN SPPNet
1、R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像;2、固定大小的图像塞给CNN传给后面的层做训练回归分类操作 1、SPPNet把全图塞给CNN得到全图的feature map;2、让SS得到候选区域直接映射原图特征向量中对应位置;3、映射过来的候选区域特征向量,经过SPP层(空间金字塔变换层),S输出固定大小的特征向量给FC层

SPPNet 如何映射SS得到的候选区域与原图特征向量中对应位置?- (x,y)=(Sx’,Sy’)

① 原始图片经过CNN变成feature map。
② 原始图片通过选择性搜索(SS) 得到了候选区域(Region of Interest),现在需要将基于原始图片的候选区域映射到feature map中的特征向量。

映射过程图参考如下:
在这里插入图片描述
整个映射过程有具体的公式,如下
假设(x’,y’)表示特征图上的坐标点,坐标点(x,y)表示原输入图片上的点,那么它们之间有如下转换关系,这种映射关系与网络结构有关: (x,y)=(Sx’,Sy’), 即
左上角的点:x’=[x/S]+1
右下角的点:x’=[x/S]-1
其中S就是CNN中所有卷积层的strides的乘积,包含了池化、卷积的stride。论文中使用S的计算出来为2x2x2x2=16。

xmin’, ymin’ = [xmin/16]+ 1, [ymin/16]+1
xmax’, ymax’ = [xmax/16]-1, [ymax/16]-1

公式如何得出的?

拓展:如果关注这个公式怎么计算出来,请参考:
http://kaiminghe.com/iccv15tutorial/iccv2015_tutorial_convolutional_feature_maps_kaiminghe.pdf

Spatial Pyramid Pooling - 使用三个划分刻度

通过spatial pyramid pooling将特征图转换成固定大小的特征向量。

示例:假设原图输入是224x224,对于conv出来后的输出是13x13x256,其中某个映射的候选区域假设为:12x10x256。

  • spp layer 按照1x1, 2x2, 4x4三种刻度每张特征图进行划分,利用了三种不同大小的刻度,对一张特征图进行划分,最后总共可以得到16+4+1=21个块,对每个划分刻度得到的每个区域作max pooling,从这21个块中,每个块提取出一个特征,这样刚好就是要提取的21维特征向量。得出的特征连接到一起就是 (16+4+1)x256=21x256=5376 结果,每组特征图就转换成了固定大小5376的特征向量,接着给全连接层做进一步处理,如下图所示。SPP layer还可以应用于特征图上的每个候选区域。
  • Spatial bins (空间盒个数) : 1+4+16=21

【目标检测】目标检测算法-从OverFeat到YOLO_第23张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第24张图片 【目标检测】目标检测算法-从OverFeat到YOLO_第25张图片

SPPNet总结

【目标检测】目标检测算法-从OverFeat到YOLO_第26张图片

SPPNet 优点 - CNN层的共享计算减少计算耗时

SPPNet在R-CNN的基础上提出了改进,通过候选区域和feature map的映射,配合SPP层的使用,从而达到了CNN层的共享计算,减少了运算时间,后面的Fast R-CNN等也是受SPPNet的启发。

SPPNet 缺点 - 训练过慢&效率低

训练依然过慢、效率低,特征需要写入磁盘(因为SVM的存在)分阶段训练网络:选取候选区域、训练CNN、训练SVM、 训练bbox回归器, SPPNet反向传播效率低。

Fast R-CNN

了解Fast R-CNN的结构特点
说明Rol pooling的特点
了解多任务损失

SPPNet 训练不统一 - Fast R-CNN RoI Pooling

SPPNet的性能已经得到很大的改善,但是由于网络之间不统一训练(训练CNN、训练SVM、 训练bbox回归器), 造成很大的麻烦,所以接下来的Fast R-CNN就是为了解决这样的问题。

相对于 SPPNet 多个模型分开训练,Fast R-CNN 进行了改进,提出了Rol pooling,然后整合整个模型,把CNN、Rolpooling、 分类器、bbox回归几个模块整个一起训练。
【目标检测】目标检测算法-从OverFeat到YOLO_第27张图片
步骤:

1 首先将整个图片输入到一个基础卷积网络,得到整张图的feature map。(与SPPNet相同)
2 将选择性搜索算法的结果region proposal (Rol) 映射到feature map中。(与SPPNet相同)
3 Rol pooling layer对每一个候选区域提取一个固定长度的特征向量,每个特征向量会输入到一系列全连接层,得到一个Rol特征向量(此步骤是对每一个候选区域都会进行同样的操作)(与SPPNet不同)

输出一:传统softmax层进行分类(不再使用SVM而是使用softmax),输出类别有K个类别加上”背景"类;输出二:bounding box regressor。(与SPPNet不同)

背景类:考虑一张图片中没有目标可以检测,什么都没有,将这种情况归为背景类。

Fast R-CNN RoI Pooling - 仅使用一个划分刻度

Rol pooling只是一个简单版本的SPP,目的是为了减少计算时间并且得出固定长度的向量。
【目标检测】目标检测算法-从OverFeat到YOLO_第28张图片

Rol 池层使用最大池化将任何有效的Rol区域内的特征转换成具有HxW的固定空间范围的小feature map,其中H和W是超参数,它们独立于任何特定的Rol。

RoI Pooling 意义

  • 为了减少计算时间并且得出固定长度的向量
  • 使用一种4*4= 16空间盒数
  • 因此Fast R-CNN要比SPPNet快很多也是因为这里的原因

为什么要设计单个尺度呢?

这要涉及到single scale与multi scale两者的优缺点。

  • single scale,直接将image定为某种scale,直接输入网络来训练即可。(Fast R-CNN)
  • multi scale,也就是要生成一个金字塔

后者比前者更加准确些,没有突更多,但是第一种时间要省很多,所以实际采用的是第一个策略,因此Fast R-CNN要比SPPNet快很多也是因为这里的原因。

End-to-End model

从输入端到输出端直接用一个神经网络相连,整体优化目标函数。

为什么后面的整个网络能进行统一训练?

废除了SVM和SPPNet,特征提取CNN的训练和SVM分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,去掉了SVM分类这一过程, 所有特征都存储在内存中,不占用硬盘空间,形成了End-to-End模型(proposal除外,proposal之后的网络结构组成End-to-End模型,end-to-end在Faster-RCNN中得以完善 )

  • 使用了softmax分类

多任务损失 - Multi-task loss - 平均绝对误差(MAE)+ 交叉熵损失

两个loss,分别是:

  • 对于分类loss,是一个N+1路的softmax输出, 其中的N是类别个数,1是背景,使用交叉熵损失。
  • 对于回归loss,是一个4xN路输出的regressor,也就是说对于每个类别都会训练一个 单独的regressor的
    意思,使用平均绝对误差(MAE)损失即L1损失。

fine-tuning训练

  • 在微调时,调整 CNN + Rol pooling + softmax
  • 调整 bbox regressor 回归当中的参数

R-CNN、SPPNet、Fast R-CNN 效果对比

![在这里插入图片描述](https://img-blog.csdnimg.cn/58fb987346744991b8a0dd90decdc6c9.png = 500x)

Fast R-CNN 总结

【目标检测】目标检测算法-从OverFeat到YOLO_第29张图片

Fast R-CNN 优点 - RoI pooling + softmax

RoI pooling + softmax

Fast R-CNN 缺点

使用Selective Search提取Region Proposals,没有实现真正意义.上的端对端,操作也十分耗时。

Faster R-CNN - 候选区域筛选融合到网络中

了解Faster R-CNN的特点
知道RPN的原理以及作用

在Fast R-CNN还存在着瓶颈问题:Selective Search (选择性搜索) 要找出所有的候选框,那有没有
一个更加高效的方法来求出这些候选框呢?

在Faster R-CNN中加入一个提取边缘的神经网络,也就说找候选框的工作也交给神经网络来做了。这样,目标检测的四个基本步骤(候选区域生成,特征提取,分类,位置精修)终于被统一到一个深度网络框架之内。

【目标检测】目标检测算法-从OverFeat到YOLO_第30张图片

区域生成网络(RPN) + Fast R-CNN

Faster R-CNN可以简单地看成是区域生成网络(RPN) + Fast R-CNN的模型,用区域生成网络(Region Proposal Network,简称RPN)来代替Fast R-CNN中的选择性搜索方法,结构如下:

【目标检测】目标检测算法-从OverFeat到YOLO_第31张图片

Fast R-CNN proposal 使用ss得到候选框输入到后面的 End-to-End 模型,Faster R-CNN 整个End-to-End模型中包含了获取候选框的Region Proposal Network。

1 首先向CNN网络(VGG-16)输入图片,Faster RCNN使用一组基础的 conv+relu+ pooling 层提取feature map。该 feature map 被共享用于后续RPN层和全连接层。
2 Region Proposal Networks。RPN网络用于生成region proposals,faster rcnn中称之为anchors。

  • 通过softmax判断anchors属于foreground(前景)或者background(背景)
  • 再利用bounding box regression修正anchors获得精确的proposals,输出其Top-N(默认为300)的区域给Rol pooling
    生成 anchors -> softmax 分类器提取fg anchors -> bbox reg回归fg anchors -> Proposal Layer生成proposals
    3 后续就是Fast RCNN操作

【目标检测】目标检测算法-从OverFeat到YOLO_第32张图片

Region Proposal Network,RPN 原理

RPN网络的主要作用是得出比较准确的候选区域。整个过程分为两步:

1 用 nxn(默认3x3=9)大小的窗口去扫描特征图,每个滑窗位置映射到一个低维的向量(默认256维),并为每个滑窗位置考虑k种(在论文设计中k=9)可能的参考窗口(论文中称为anchors)。

【目标检测】目标检测算法-从OverFeat到YOLO_第33张图片
2 每个特征图中像素对应的9个窗口大小,3*3卷积核的中心点对应原图上的位置,将该点作为anchor的中心点,在原图中框出多尺度、多种长宽比的anchors,三种尺度{ 128,256, 512}, 三种长宽比{1:1, 1:2, 2:1}, 每个特征图中的像素点有 3x3=9 种框。

【目标检测】目标检测算法-从OverFeat到YOLO_第34张图片

  • 窗口输出 [N, 256] --> 分类:判断是否是背景。
  • 回归位置: N个候选框与自己对应目标值GT做回归,修正位置。
  • 得到更好的候选区域提供给 ROI pooling 使用。

例子:
【目标检测】目标检测算法-从OverFeat到YOLO_第35张图片

Faster R-CNN 训练

RPN 训练 - 得到候选区域

从众多的候选区域中提取出score较高的并且经过regression调整的候选区域。
1 分类:RPN classifcation (anchor good/ bad)。二分类;,是否有物体,是、否;可以使用softmax,Logisticregression作为损失函数。
2 候选框调整:RPN regression (anchor > proposal),回归。均方误差修正。

注:这里使用的损失函数和Fast R-CNN内的损失函数原理类似,同时最小化两种代价。

Fast RCNN 训练 - 预测类别&预测位置

1 预测类别训练:Fast R-CNN classification (over classes),所有类别分类N+1(1为“背景类”),得到候选区域的每个类别概率。使用softmax损失。
2 预测位置训练:Fast R-CNN regression (bbox regression),得到更好的位置。均方误差损失。

训练样本anchor标记

1 每个 ground-truth box 有着最高的IoU的anchor标记为正样本。
2 剩下的 anchor/anchors 与任何 ground-truth box 的IoU大于0.7记为正样本。loU小于0.3, 记为负
样本。
3 剩下的样本全部忽略。

正负anchors样本比例为1: 3
【目标检测】目标检测算法-从OverFeat到YOLO_第36张图片

RPN训练的损失函数是①+②,Fast RCNN训练的损失函数是①+③。

候选区域的训练是为了让得出来的正确的候选区域,并且候选区域经过了回归微调。在这基础之上做Fast
RCNN训练是得到特征向量做分类预测和回归预测。

效果对比

在这里插入图片描述

Faster R-CNN 总结

优点

  • 提出RPN网络
  • 端到端网络模型

缺点

  • 训练参数过多

可以改进的需求

1 RPN (Region Proposal Networks) 改进:灵活定义窗口大小和个数,对于小目标选择利用多尺度特征信息进行RPN。
2 速度提升,如YOLO系列算法,删去了RPN,直接对proposal进行分类回归,极大的提升了网络的速度。

Faster R-CNN 改进之处

1 对比Fast R-CNN,将ss替换为RPN。

如何得到RPN的anchors?

开源 Keras Faster RCNN 模型介绍

地址:[https://github.com/jinfagang/keras_ frcnn](https://github.com/jinfagang/keras_ frcnn)

环境需求

1 由于该源代码由keras单独库编写所以需要下载keras,必须是2.0.3版本

pip install keras==2.0.3

2 该源码读取图片以及处理图片标记图片工具使用opecv需要安装

pip install opencv-pythong

源码组成结构

【目标检测】目标检测算法-从OverFeat到YOLO_第37张图片

基础模型:resnet 和 vgg。

fine tuning 微调

调整模型参数不需要过多调整
调整模型结构,微微调整
Pre-trained:预训练模型
fine tuning:微调之后的模型

fine tuning 微调过程

1 确定当前场景任务B,修改原始模型结构(修改后面全连接层)
2 确定B任务的数据大小
B任务数据量大,可以放开A模型的所有训练,A结构+修改的全连接层-起训练(A模型有已训练好的参数)
B任务数据量小,将A模型冻结掉不去训练,只训练全连接层

YOLO

知道YOLO的网络结构
知道单元格的意义。
知道YOLO的损失。
【目标检测】目标检测算法-从OverFeat到YOLO_第38张图片

YOLO最大特点是速度快。

YOLO结构

一个网络搞定一切,GoogleNet + 4个卷积 + 2个全连接层。

网络输出大小:7x7x30

【目标检测】目标检测算法-从OverFeat到YOLO_第39张图片

YOLO流程

1 原始图片resize到448x448, 经过前面卷积网络之后,将图片输出成了一个7x7x30的结构,以图示的方式演示。
2 默认7x7个单元格,这里用3x3的单元格图演示。
3 每个单元格预测两个bbox框。
4 进行NMS筛选,筛选概率以及IoU。
在这里插入图片描述
【目标检测】目标检测算法-从OverFeat到YOLO_第40张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第41张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第42张图片

单元格 grid cell

7x7=49个像素值,理解成49个单元格。

【目标检测】目标检测算法-从OverFeat到YOLO_第43张图片

1 每个单元格负责预测一个物体类别,并且直接预测物体的概率值。
2 每个单元格预测两个(默认)bbox位置,两个bbox置信度(confidence) 7x7x2=98个bbox。

每个单元格深度为30,30=(4+1+4+1+20), 4个坐标信息,1个置信度(confidence)代表一个bbox的结果, 20代表20类的预测概率结果。

网格输出筛选

一个网格会预测两个Bbox,在训练时只有一个Bbox专门负责一个物体的预测概率。(一个Object一个Bbox)。

20 个类别概率代表这个网格当中的一个bbox。

如何确定20个类别概率代表的是网格中的哪个bbox?

通过比较置信度大小。

每个bounding box都对应一个confidence score。这个概率可以理解为不属于任何一个bbox,而是属于这个单元格所预测的类别。

  • 如果 grid cell 里面没有 object,confidence就是0。
  • 如果 grid cell 里面有 object,则 confidence score 等于预测的 box 和 ground truth 的 IoU 乘积。两个bbox的4个值都与GT进行IoU计算。得到两个IoU值。两个bbox框记为A、B,如果IoU_A大于IoU_B,那么
    A框就代表最终的预测位置,30深度中的20类别预测概率代表的就是IoU_A。

注:所以如何判断一个grid cell中是否包含object呢?

如果一个object的ground truth的中心点坐标在一个grid cell中,那么这个grid cell就是包含这个object,也就是说这个object的预测就由该grid cell负责。

【目标检测】目标检测算法-从OverFeat到YOLO_第44张图片

不同于faster rcnn中的ancriors,yolo的框坐标是由网络得出,概率值直接由网络输出,而faster-rcnn是人为设定一个值,然后利用RPN网络对其优化到一个更准的坐标和是否背景类别。

非最大抑制NMS

每个Bbox的Class- Specific Confidence Score以后,设置阈值,滤掉概率的低的bbox,对每个类别过滤loU,就得到最终的检测结果。

【目标检测】目标检测算法-从OverFeat到YOLO_第45张图片

训练

1 预测框对应的目标值标记
confidence:格子内是否有目标
20类概率:标记每个单元格的目标类别

怎么理解这个过程?同样以分类那种形式来对应,假设以一个单元格的预测值为结果,如下图

【目标检测】目标检测算法-从OverFeat到YOLO_第46张图片

2 三部分损失:bbox损失+confidence损失+classfication损失

与Faster R-CNN比较

Faster R-CNN利用RPN网络与真实值调整了候选区域,然后再进行候选区域和卷积特征结果映射的特征向量的处理来通过与真实值优化网络预测结果。而这两步在YOLO当中合并成了-个步骤,直接网络输出预测结果进行优化。

所以经常也会称之为YOLO算法为直接回归法代表。YOLO的特点就是快,但是准确率较低。

在这里插入图片描述

YOLO总结

优点:速度快
缺点:准确率会打折扣

为什么YOLO准确率低?

YOLO对相互靠的很近的物体(挨在一起且中点都落在同一个格子上的情况)。还有很小的群体检测效果不好,这是因为一个网格中只预测了两个框。

SSD

知道SSD的结构
说明Detector & classifier的作用
说明SSD的优点

SSD算法源于2016年发表的算法论文,论文网址: https://arxiv.org/abs/1512.02325

SSD 特点

1 SSD结合了YOLO中的回归思想和Faster-RCNN中的Anchor机制,使用全图各个位置的多尺度区域进行回归,既保持了YOLO速度快的特性,也保证了窗口预测的跟Faster-RCNN- -样比较精准。
2 SSD的核心是在不同尺度的特征特征图上采用卷积核来预测一系列Default Bounding Boxes的类别、坐标偏移。

SSD 结构

以VGG-16为基础,使用VGG的前五个卷积,后面增加从CONV6开始的5个卷积结构,输入图片要求300x300。
【目标检测】目标检测算法-从OverFeat到YOLO_第47张图片

SSD 流程

【目标检测】目标检测算法-从OverFeat到YOLO_第48张图片

SSD中引入了Defalut Box,实际上与Faster R-CNN的anchor box机制类似,就是预设一些目标预选框,不同的是在不同尺度feature map所有特征点上使用PriorBox层(Detector & Classifier)。

Detector & Classifier

【目标检测】目标检测算法-从OverFeat到YOLO_第49张图片

Detector & Classifier 三个部分:

1 PriorBox层:生成default boxes,默认候选框。(采取Faster R-CNN优点)。利用4个variance回归调整候选框。
2 Conv3 x 3:生成localization,4 个位置偏移。(采取YOLO优点)
3 Conv3 X 3:confidence,21 个类别置信度(要区分出背景)。(采取YOLO优点)

【目标检测】目标检测算法-从OverFeat到YOLO_第50张图片

【目标检测】目标检测算法-从OverFeat到YOLO_第51张图片

PriorBox层 default boxes

default boxex类似于RPN当中的滑动窗口生成的候选框,SSD中也是对特征图中的每一个像素生成若干个框。

【目标检测】目标检测算法-从OverFeat到YOLO_第52张图片

特点分析

1 priorbox: 相当于faster rcnn里的anchors, 预设一些box, 网络根据box,通过分类和回归给出被检测到物体的类别和位置。每个window都会被分类,并回归到一个更准的位置和尺寸上。

2 各个feature map层经过priorBox层生成prior box。

【目标检测】目标检测算法-从OverFeat到YOLO_第53张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第54张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第55张图片

根据输入的不同aspect ratic和scale以及num_ prior来返回特定的default box,

default box的数目是feature map的height x width x num_ prior。

【目标检测】目标检测算法-从OverFeat到YOLO_第56张图片

1 SSD网络prior_box:打印出来的形状为:

Tensor("concat_ 2:0", shape=(?, 73088),dtype=float32)

2 variance: bounding regression中的权重。 网络输出[dxmin,dymin, dxmax, dymax], 即对应利用如下

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) ;

其中某一层网络结构输出

laver {
	name: "conv6_ 2. jibox_ pr1orbox"
	rupe:“PriorBox"
	bottom: "conv6_ 2"
	bottom: "data" #?
	top:"conv6_ 2_ mbox priorbak"
	prior.box _param{
		min_ size: 111.0
		max_ si2e: 162.0. 。
		aspect_ rat1o: 9.0
		aspec1_ rat1o: 3.0
		flip: true
		clip: false
		variance: 0. 1000000149
		variance: 0. 2000000149
		variance: 0. 20000000298
		variance: o. 2000000298
		step: 32.0
		offset: 0.5
	}
}

localization & confidence

两者主要作用是过滤和训练。
【目标检测】目标检测算法-从OverFeat到YOLO_第57张图片

问题:SSD中的多个Detector & classifier有什么作用?

SSD的核心是在不同尺度的特征图上来进行Detector & classifier容易使得SSD观察到更小的物体。

训练

输入->输出->结果与ground truth标记样本回归损失计算->反向传播,更新权值

1 样本标记

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

正样本

  • 1 与GT重合最高的boxes,其输出对应label设为对应物体.
  • 2 物体GT与anchor iou满足大于0.5
    负样本
  • 其它的样本标记为负样本

在训练时, default boxes按照正负样本控制positive: negative=1: 3

SSD中没有置信度。
【目标检测】目标检测算法-从OverFeat到YOLO_第58张图片

2 损失

网络输出预测的predict box与ground truth回归变换之间的损失计算,置信度 是采用Softmax Loss(Faster R-CNN是log loss),位置回归则是采用Smooth L1 loss (与Faster R-CNN-样)

【目标检测】目标检测算法-从OverFeat到YOLO_第59张图片
【目标检测】目标检测算法-从OverFeat到YOLO_第60张图片

测试

输入->输出->nms->输出

比较

【目标检测】目标检测算法-从OverFeat到YOLO_第61张图片

总结

SSD的结构
Detector & classitier的组成部分以及作用
SSD的训练样本标记
GT与default boxes的格式转换过程

你可能感兴趣的:(#,2D目标检测,目标检测,深度学习,计算机视觉)