国庆假期闲来无事~又正好打算入门基于深度学习的视觉检测领域,就利用这个时间来写一份学习的博文~本博文主要是本人的学习笔记与调研报告(不涉及商业用途),博文的部分来自我团队的几位成员的调研报告(由于隐私关系,不公告他们的名字了哈~),同时结合本人的一些思考与理解。本博文仅从理论、介绍入手。暂时不涉及代码,后续会有博文补充各个算法的代码~好下面进入正题
目录
R-CNN(Regions with CNN features)
小结(R-CNN, Fast R-CNN, Faster R-CNN三种算法)
引言
计算机视觉是利用计算机及相关设备对生物视觉的一种模拟。它的主要任务就是通过对采集的图片或视频进行处理以获得相应场景的三维信息,就像人类和许多其他类生物那样。主要有以下几个方向:
- 语义分割(Semantic segmentation)
- 分类与定位(Classification and localization)
- 目标检测(Object detection)
- 实例分割(Instance segmentation)
本博文关注目标检测(object detection)这一方向。目标检测是指在一个静态图像(或动态视频)中检测出人们感兴趣的目标对象。物体检测的任务是找出图像或视频中的感兴趣物体,同时检测出它们的位置和大小。也即在给定的图片中精确找到物体所在位置,并标注出物体的类别。是计算机视觉领域的核心问题之一。目标检测过程中有很多不确定因素,如图像中目标数量不确定,目标有不同的外观、形状、姿态,加之物体成像时会有光照、遮挡等因素的干扰,导致检测算法有一定的难度。
传统的目标检测算法主要是分为三步:1、先利用不同尺寸的滑动窗口框住图中的某一部分作为候选区域;2、提取候选区域的特征(如通过SIFT、HOG、SURF等检测特征点);3、分类决策(传统的机器学习分类器,如SVM等)
在传统的目标检测方法中,性能最佳的当属可变形部件模型(Deformable Part based Model,DPM)。DPM是基于经典手工特征的检测算法发展的顶峰,连续获得VOC07、08、09三年的检测冠军。DPM的主要思想可简单理解为将传统目标检测算法中对目标整体的检测问题拆分并转化为对模型各个部件的检测问题(如对于人脸而言,将人脸分为鼻子、嘴巴等等),然后将各个部件的检测结果进行聚合得到最终的检测结果,即“从整体到部分,再从部分到整体”的一个过程。DPM可以看作是HOG+SVM的扩展(关于HOG的介绍可见之前博文《学习笔记之——HOG、LBP与Haar特征(未完待续)》)下图为DPM的检测流程
在当时,DPM的检测效果虽然较好,但是由于相对比较复杂,运算较慢。为此引起了一股研究的热潮去改进DPM。然而,卷积神经网络(CNN)在2012年ImageNet分类任务中取得了巨大成功(将检测的准确率提升了一倍),在2013年R-CNN又在VOC 2007测试集检测的mAP大幅提升至48%。
下面介绍常见的深度目标检测算法
深度目标检测算法
传统的目标检测算法需要人工提取特征,而深度学习就是又深度网络代替人工提取特征。好,先给出一系列目标检测的关键名词
bounding box——也就是所框出来的,检测的边框
Precision 与 Recall(查准率(precision)和查全率(recall))
对于二分类而言,有如下表格
Precision其实就是在识别出来的图片中,True positives所占的比率。就是对于识别出来的是正例而言,真正是正例的准确率。
recall就是对于实际是正例而言,有多少被检测出来了。
MAP(mean average precision)
每一个类别都可以根据recall和precision绘制一条曲线,那么AP就是该曲线下的面积,而mAP是多个类别AP的平均值,这个值介于0到1之间,且越大越好。这个指标是目标检测算法最为重要的一个指标参数。
IOU(交比并)
如下图所示。绿色框是人工标注的groundtruth,红色框是目标检测算法最终给出的结果(红色的框为Selective Search提取的Region Proposal),显然绿色框对于飞机这个物体检测的更加准确(机翼机尾都全部包含在绿色框中),IOU正是表达这种bounding box和groundtruth的差异的指标。算法产生的bbox VS 人工标注的数据
IOU定义了两个bounding box的重叠度,可以说,当算法给出的框和人工标注的框差异很小时,或者说重叠度很大时,可以说算法产生的boundingbox就很准确。 矩形框A、B的一个重合度IOU计算公式为: IOU=(A∩B)/(A∪B)
Bounding-box regression(边界框回归)
由前面介绍的IOU指标可知,这里所获得的红色框可以认为是检测失败的,因为它和绿色的groundtruth的 IOU值小于了0.5,也就是说重叠度不够。那么我们就需要对这个红色框进行微调。使得经过微调后的窗口跟Ground Truth 更接近 。
如下图所示。红色的框 P 代表原始的Proposal **绿色的框 G **代表目标的 Ground Truth 目标是:寻找一种关系使得输入原始的窗口 P 经过映射得到一个跟真实窗口 G 更接近的回归窗口 G~ G~≈G。(本博文没有给出其数学过程,仅给出较为直观的描述)
NMS(非极大值抑制)
在检测网络中,NMS至关重要。因为多个feature map 最后会产生大量的bounding boxes,即最终检测结果。然而在这些bounding boxes中存在着大量的错误的、重叠的、不准确的样本,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。对于目标检测算法产生的大量的bounding box都进行调整肯定是不可行的。那么我们就需要对这些粗略结果先进行一个大体的挑选。挑选出其中最具代表性的结果。再对这些挑选后的结果进行调整,这样可以加快算法效率。 消除多余的框,找到最佳的bounding box。仅仅依赖于IOU是不现实的,IOU值设置的太大,可能就会丢失一部分检测的目标,即会出现大量的漏检情况;IOU值设置的太小,则会出现大量的重叠检测,会大大影响检测器的性能。即使在IOU处理掉大部分的bounding boxes之后,仍然会存在大量的错误的、重叠的、不准确的bounding boxes如下图所示。
这就需要NMS进行迭代优化——对于Bounding Box的列表B及其对应的置信度S,采用下面的计算方式.选择具有最大score的检测框M,将其从B集合中移除并加入到最终的检测结果D中.通常将B中剩余检测框中与M的IoU大于阈值的框从B中移除.重复这个过程,直到B为空。对于每个预测框(default boxes),首先根据类别置信度确定其类别(置信度最大者)与置信度值,并过滤掉属于背景的预测框。然后根据置信度阈值(如0.5)过滤掉阈值较低的预测框。对于留下的预测框进行解码,根据先验框得到其真实的位置参数,一般需要根据置信度进行降序排列,然后仅保留top-k(如400)个预测框。最后就是进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。如下图所示,右上图黄色bounding boxes可以代表为正样本。正样本通过分类与回归得到右下图中的各色bounding boxes,到这一步时使用了top-k让选框数量减少。最后再使用NMS得到左下图。(使用分类网络给出每个框的每类置信度,使用回归网络修正位置,最终应用NMS)。
NMS算法流程:
根据这些框的分类器类别分类概率做排序: A<B<C<D<E<F
(1)从最大概率矩形框F开始,分别判断A~E与F的重叠度IOU是否大于某个设定的阈值;
(2)假设B、D与F的重叠度超过阈值,那么就扔掉B、D;并标记第一个矩形框F,是我们保留下来的。
(3)从剩下的矩形框A、C、E中,选择概率最大的E,然后判断E与A、C的重叠度,重叠度大于一定的阈值,那么就扔掉;并标记E是我们保留下来的第二个矩形框。
从传统目标检测的角度来解释:大部分人脸检测的核心是分类器,即给定一个尺寸固定的图片,分类器判断是或者不是人脸。而将分类器进化为检测器的关键是:在原始图像上从多个尺度产生窗口,并resize到固定尺寸,然后送给分类器做判断。最常用的方法是滑动窗口。即同一个人脸,有好几个框(每一个框都带有一个分类器的得分)。而目标是对于一个人脸,只保密一个最优的框。于是我们就要用到非极大值抑制,来抑制那些冗余的框: 抑制的过程是一个迭代-遍历-消除的过程。
(1)将所有框的得分排序,选中最高分及其对应的框:
(2)遍历其余的框,如果和当前最高分框的重叠面积(IOU)大于一定阈值,我们就将框删除;
(3)从未处理的框中继续选一个得分最高的,重复上述过程;
CNN(卷积神经网络)
在计算机视觉领域,深度网络采用卷积神经网络(CNN)。而再自然语言处理(NLP)领域采用RNN(涉及到时间序列的)。卷积就是两个函数之间的相互关系,然后就得出一个新的值。他是在连续空间做积分运算,然后将在离散空间内求和的过程。在计算机视觉里面,可以把卷积当做是一个抽象的过程,把图像上小区域的信息统计抽象出来。
卷积层——卷积层是CNN的核心,层的参数由一组可学习的滤波器(filter)或内核(kernels)组成,它们具有小的感受野,延伸到输入容积的整个深度。 在前馈期间,每个滤波器对输入进行卷积,计算滤波器和输入之间的点积,并产生该滤波器的二维激活图(输入一般二维向量,但可能有高度(即RGB))。 简单来说,卷积层是用来对输入层进行卷积,提取更高层次的特征。
池化层——池化层又称下采样,它的作用是减小数据处理量同时保留有用信息。具有如下特性:1. 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。2. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。3. 在一定程度上防止过拟合,更方便优化。
池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。示例:如下图所示,对于每个2*2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。
全连接层——两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的。
如上图所示,对于一张图片中的每个区域,通过CNN可以学习到n个不同的卷积和函数,然后对这个区域进行统计。可以用不同的方法统计,比如着重统计中央,也可以着重统计周围,从而使得统计的和函数的种类多种多样,同时也可以同时学习多个统计的累积和。
首先用学习好的卷积和对输入图像进行扫描,然后每一个卷积和会生成一个扫描的响应图,称为response map,或feature map。如果有多个卷积和,就有多个feature map。也就说从一个最开始的输入图像(RGB三个通道)可以得到256个通道的feature map,因为有256个卷积和,每个卷积和代表一种统计抽象的方式。
在卷积神经网络中,除了卷积层,还有一层池化层。池化操作就是对一个小区域内求平均值或者求最大值的统计操作。若输入256通道的卷积的响应feature map,每一个feature map都经过一个求最大的池化层,就会得到一个比原来的feature map更小的256通道的feature map。如下图所示,池化层对每一个2*2的区域求最大值,然后把最大值赋给生成的feature map对应的位置。如果输入图像是100×100的话,那输出图像就会变成50×50,feature map变成了一半。同时保留的信息是原来2X2区域里面最大的信息。
VOC物体检测任务
这个就相当于一个竞赛,里面包含了20个物体类别:http://host.robots.ox.ac.uk/pascal/VOC/voc2012/examples/index.html 还有一个背景,总共就相当于21个类别。
深度目标检测算法的分类
基于深度学习的目标检测算法——深度目标检测(不知这样命名是否恰当,本文先以这样命名)。目前深度目标检测算法主要分为两类:
1、two stage的目标检测算法(如R-CNN系列)——先通过启发式方法(selective search)或者CNN网络(RPN)产生一系列稀疏的候选框(proposal),再通过卷积神经网络对这些proposal进行样本分类与回归。(检测的准确率高和定位精度较好)
2、one stage的目标检测算法(如YOLO、SSD等)——不用产生proposal候选框,直接将目标边框定位的问题转化为回归问题处理。直接在网络中提取特征来预测物体分类和位置。均匀地在图片多个层数的特征图上进行密集抽样,抽样时可以采用不同尺度和长宽比,然后利用CNN提取特征后直接进行分类与回归,整个过程只需要一步,所以其优势是速度快。但是均匀的密集采样的一个重要缺点是训练比较困难,这主要是因为正样本与负样本(背景)极其不均衡,导致模型准确度稍低。 (速度较快)
两类算法的对比如下,可以清楚看出两类方法在准确度和速度上的差异
R-CNN(Regions with CNN features)
2014 年加州大学伯克利分校的 Ross B. Girshick 提出 R-CNN (Region CNN)算法(《Rich feature hierarchies for accurate object detection and semantic segmentation》)。其基本思想是首先用一个非深度的方法,在图像中提取可能是物体的图形块,然后深度学习算法根据这些图像块,判断属性和一个具体物体的位置。通过利用选择性搜索(Selective Search)算法评测相邻图像子块的特征相似度,通过对合并后的相似图像区域打分,选择出感兴趣区域的候选框作为样本输入到卷积神经网络结构内部,由网络学习候选框和标定框组成的正负样本特征,形成对应的特征向量,再由支持向量机设计分类器对特征向量分类,最后对候选框以及标定框完成边框回归操作达到目标检测的定位目的(可以算是一个传统机器学习算法与深度学习算法融合的例子)。
R-CNN 利用候选区域方法创建了约 2000 个 ROI。这些区域被转换为固定大小的图像,并分别馈送到卷积神经网络中。该网络架构后面会跟几个全连接层,以实现目标分类并提炼边界框bounding box。
算法的步骤
(1)输入图片 ;
(2)提取大约2000个自下而上的region proposals ;Region Proposal是一类传统的区域提取方法,可以看作不同宽高的滑动窗口,通过窗口滑动获得潜在的目标图像,根据Proposal提取的目标图像进行归一化,作为CNN的标准输入。
在做目标检测时,如采用扫描窗的方法进行物体检测,要考虑到扫描窗的长宽比和位置不一样,若每一个图像块都要过一遍深度网络的话,计算时间非常大。为此采用了折中的办法——Selective Search。先把完全不可能是物体的图像块去掉。采用seletive search 对读入的图片生成候选区域,再计算每个候选区域和ground truth的交并比(IOU).当IOU大于阈值时,则认为是当前的候选区域属于正确类。并且将其标定为相应的类别(label)。这样每一个候选区域就会产生相应的label即(image, label). (image, label)就是要训练的训练集。然后利用这些数据训练CNN网络,
(3)利用CNN计算每个proposal的特征 ;这属于标准CNN过程,根据输入进行卷积/池化等操作,得到固定维度的输出;但对于每一个区域,需要修正区域大小,进行crop/warp(归一化)操作,以适合CNN的输入,做一次前向运算。
一般CNN后接full-connect layer或者classifiler,它们都需要固定的输入尺寸。因此需要对输入数据进行crop/warp操作,这些处理会造成数据的丢失或几何学上的失真。
(4)对每个proposal使用线性svm进行分类;实际包含两个子步骤:(i)对上一步的输出向量进行分类(需要根据特征训练分类器);(ii)通过边界回归(bounding-box regression) 得到精确的目标区域,由于实际目标会产生多个子区域,旨在对完成分类的前景目标进行精确的定位与合并,避免多个检出。
基于候选区域的目标检测器
1.滑动窗口检测器
自从 AlexNet 获得 ILSVRC 2012 挑战赛冠军后,用 CNN 进行分类成为主流。一种用于目标检测的暴力方法是从左到右、从上到下滑动窗口,利用分类识别目标。为了在不同观察距离处检测不同的目标类型,我们使用不同大小和宽高比的窗口。
滑动窗口(从右到左,从上到下)。根据滑动窗口从图像中剪切图像块。由于很多分类器只取固定大小的图像,因此这些图像块是经过变形转换的。但是,这不影响分类准确率,因为分类器可以处理变形后的图像。
将图像变形转换成固定大小的图像。然后再输入 到CNN 分类器中,提取出 4096 个特征。之后,再使用 SVM 分类器识别类别和该边界框的另一个线性回归器。下图为滑动窗口检测器的系统工作流程图。
2.选择性搜索(Selective Search)算法
不使用暴力的滑动窗口法,而是用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。Region Proposal是一类传统的区域提取方法,可以看作不同宽高的滑动窗口,通过窗口滑动获得潜在的目标图像,根据Proposal提取的目标图像进行归一化,作为CNN的标准输入。而Region Proposal方法中常用的一种就是选择性搜索(Selective Search)方法。选择性搜索是用于对象检测的区域提议算法。 它被设计成具有非常高的召回速度。 它计算基于颜色,纹理,尺寸和形状兼容性的相似区域的分层分组。
首先将每个像素作为一组。然后,计算每一组的纹理,并将两个最接近的组结合起来。但是为了避免单个区域吞噬其他区域,我们首先对较小的组进行分组。我们继续合并区域,直到所有区域都结合在一起。下图第一行展示了如何使区域增长,第二行中的蓝色矩形代表合并过程中所有可能的 ROI。
selective search算法流程:
step0:生成区域集R
step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
step2:找出相似度最高的两个区域,将其合并为新集,添加进R
step3:从S中移除所有与step2中有关的子集
step4:计算新集与所有子集的相似度
step5:跳至step2,直至S为空
虽然 R-CNN 算法相较于传统目标检测算法取得了 50%的性能提升,使用了selective search等预处理步骤来提取潜在的bounding box作为输入,但存在以下缺陷:
(1)训练网络的正负样本候选区域由传统算法生成,使得算法速度受到限制,且多个候选区域对应的图像需要预先提取,占用较大的磁盘空间。
(2)卷积神经网络需要分别对每一个生成的候选区域进行一次特征提取,实际存在大量的重复运算,制约了算法性能。(特征提取时会有重复计算)
(3)针对传统CNN需要固定尺寸的输入图像,crop/warp(归一化)产生物体截断或拉伸,会导致输入CNN的信息丢失
SPP-Net
针对卷积神经网络重复运算问题,2015 年微软研究院的何恺明等提出一种 SPP-Net 算法,通过在卷积层和全连接层之间加入空间金字塔池化结构(Spatial Pyramid Pooling)代替 R-CNN 算法在输入卷积神经网络前对各个候选区域进行剪裁、缩放操作使其图像子块尺寸一致的做法。SPP-Net 算法有两个特点:
1、结合空间金字塔方法实现CNN的对尺度输入。(将空间金字塔的思想加入到CNN中,实现了数据的多尺度输入)
一般CNN后接全连接层或者分类器,他们都需要固定的输入尺寸,因此不得不对输入数据进行crop或者warp,这些预处理会造成数据的丢失或几何的失真。SPP Net的第一个贡献就是将金字塔思想加入到CNN,实现了数据的多尺度输入。如下图所示。在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。从而取消了crop/warp图像归一化过程,解决图像变形导致的信息丢失以及存储问题;
2、只对原图提取一次卷积特征
在R-CNN中,每个候选框(proposal region)先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间,比R-CNN有一百倍左右的提速。
利用空间金字塔池化结构有效避免了 R-CNN 算法对图像区域剪裁、缩放操作导致的图像物体剪裁不全以及形状扭曲等问题,更重要的是解决了卷积神经网络对图像重复特征提取的问题,大大提高了产生候选框的速度,且节省了计算成本。但是SPP-Net 也有明显的缺点:
1、像R-CNN一样,训练分为多个阶段: 提取候选框+计算CNN特征+SVM分类+Bounding Box回归。大量的结果需要转存,无法整体训练参数;
2、SPP-NET在微调网络的时候固定了卷积层,只对全连接层进行微调,而对于一个新的任务,有必要对卷积层也进行微调。无法同时Tuning在SPP-Layer两边的卷积层和全连接层,很大程度上限制深度CNN的效果。(分类的模型提取的特征更注重高层语义,而目标检测任务除了语义信息还需要目标的位置信息)。
R-CNN 需要非常多的候选区域以提升准确度,但其实有很多区域是彼此重叠的,因此 R-CNN 的训练和推断速度非常慢。如果有 2000 个候选区域,且每一个都需要独立地馈送到 CNN 中,那么对于不同的 ROI,我们需要重复提取 2000 次特征。针对以上问题,Ross B. Girshick提出了该Fast R-CNN,一个精简快速的检测框架。直接利用特征图来计算ROI
Fast R-CNN
如上图所示,Fast R-CNN网络有两个输出层。一个softmax,一个bbox regressor(相对于R-CNN、SPP Net中分类和回归是两个部分,这里集成在同一个网络中)。而且加入了一个ROL pooling layer(没有用金字塔、一个尺度的SPP layer)。在Fast R-CNN中,提取proposal的方法依然是Selective Search。
R-CNN的进阶版Fast R-CNN就是在RCNN的基础上采纳了SPP Net方法,对RCNN作了改进,使得性能进一步提高。2015 年微软研究院的 Ross B. Girshick提出可以一个可以看作单层SPP Net的网络层,称为ROI pooling(虽然借鉴了SPP Net的思路,但是没有用金字塔)。这个网络层可以把不同大小的输入映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。ROI pooling 池化层结构,可以有效解决 R-CNN 算法必须将图像区域剪裁、缩放到相同尺寸大小的操作。提出多任务损失函数思想,将分类损失和边框回归损失结合统一训练学习,并输出对应分类和边框坐标,不再需要额外的硬盘空间来存储中间层的特征,梯度能够通过 RoI Pooling 层直接传播。
ROI pooling layer——是SPP Net中pooling的一个简化版本,可以看作是只有一个尺度filter的“金字塔”。输入是N个整幅图像的feature map和一组R个候选区域。每个特征映射都是H*W*C,每个候选区域都是一个元祖(n,r,c,h,w),n是特征映射的索引,r,c,h,w分别是候选区域的左上角坐标和高与宽。输出是max-pooling过得到的特征映射
除此之外,R-CNN的处理流程是先提取proposal,然后CNN提取特征,之后用SVM分类器,最后再做bounding-box regression。而在Fast-RCNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型
在R-CNN中,最大的缺点就是每个proposal都要独自经过CNN,这使得花费的时间非常多,且有很多重复的计算。而在Fast R-CNN中,共享卷积层,不再是是每一个候选框都当做输入进入CNN了,而是输入一张完整的图片,在第五个卷积层再得到每个候选框的特征。R-CNN的方法:许多候选框(比如两千个)-->CNN-->得到每个候选框的特征-->分类+回归。Fast R-CNN的方法:一张完整图片-->CNN-->得到每张候选框的特征-->分类+回归。故此很明显可以看出。Fast R-CNN的提速的原因在于:不像R-CNN把每个候选区域给深度网络提特征,而是整张图提一次特征,再把候选框映射到conv5上,而SPP只需要计算一次特征,剩下的只需要在conv5层上操作就可以了。加速是Fast R-CNN的最主要贡献
Faster R-CNN
2015年S Ren等人对R-CNN系列又提出了改进型Faster R-CNN。运用一种区域建议网络RPN(Region Proposal Network),它和检测网络共享全图的卷积特征,使得区域建议几乎不花时间。对于Fast R-CNN存在——选择性搜索,找出所有的候选框,这个过程非常耗时。为此,加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。做这样的任务的神经网络叫做Region Proposal Network(RPN)。Faster R-CNN的主要贡献就是设计了提取候选区域的网络,使得检测速度大为提高,上图中黄色部分为RPN,除了RPN外,其他部分继承了Fast R-CNN的结构。候选框的选取不一定要在原图上做,在特征图上也可以,而低分辨率的特征图意味着更少的计算量。Faster R-CNN是首个利用CNN来完成proposals的预测的
将RPN放在最后一个卷积层的后面,RPN直接训练得到候选区域。
RPN候选区域网络的简介
RPN是一个全卷积网络, 在每个位置同时预测目标边界和客体性得分。将RPN 生成的高质量区域建议框,用于Fast R-CNN来检测,通过一种简单的交替运行优化方法,RPN和Fast R-CNN 可以在训练时共享卷积特征,应用共享卷积,计算建议框的边际成本是很小的(例如每个图像10ms)。这种将一直以来分离的候选区域提取阶段和卷积神经网络分类过程融合到了一起,使用端到端的网络进行目标检测,在速度以及精度上都得到了显著的提高。
RPN通过一个滑动窗口(下图中红色框)连接在最后一个卷积层输出的feature map上,然后通过全连接层调整到256维的向量,作为输出层的输入,同时每个滑动窗口对应k个anchor boxes。在作者的原文中使用了3个尺寸和3个比例的anchor。每个anchor对应原图上的一个感受区域,通过这种方法来提高scale-invariant。RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归。
• 在feature map上滑动窗口
• 建一个神经网络用于物体分类+框位置的回归
• 滑动窗口的位置提供了物体的大体位置信息
• 框的回归提供了框更精确的位置
一种网络,四个损失函数;
• RPN calssification(anchor good.bad)
• RPN regression(anchor->propoasal)
• Fast R-CNN classification(over classes)
• Fast R-CNN regression(proposal ->box)
小结(R-CNN, Fast R-CNN, Faster R-CNN三种算法)
R-CNN, Fast R-CNN, Faster R-CNN三种算法的关系
R-CNN, Fast R-CNN, Faster R-CNN三种算法的性能对比:
R-CNN, Fast R-CNN, Faster R-CNN三种算法的步骤
RCNN
1. 在图像中确定约1000-2000个候选框 (使用选择性搜索)
2. 每个候选框内图像块缩放至相同大小,并输入到CNN内进行特征提取
3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4. 对于属于某一特征的候选框,用回归器进一步调整其位置
Fast RCNN
1. 在图像中确定约1000-2000个候选框 (使用选择性搜索)
2. 对整张图片输进CNN,得到feature map
3. 找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层
4. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
5. 对于属于某一特征的候选框,用回归器进一步调整其位置
Faster RCNN
1. 对整张图片输进CNN,得到feature map
2. 卷积特征输入到RPN,得到候选框的特征信息
3. 对候选框中提取出的特征,使用分类器判别是否属于一个特定类
4. 对于属于某一特征的候选框,用回归器进一步调整其位置
YOLO(或称为YOLOV1)
Faster实现了端到端的检测,并且几乎达到了效果上的最优,速度方向的改进仍有余地,于是YOLO(You Only Look Once)诞生了(2015 年华盛顿大学的 Joseph Redmon 等提出)。YOLO采用了一种非常激进的检测方法,前面提到的目标检测算法都是基于proposal区域的检测方法,而YOLO利用一个单一的CNN,完成了在整幅图像上bounding box和类别概率的预测。实现了end-to-end的优化,同时极大提高了算法的速度。其增强版本在GPU上能实现45fps,简化版本能达到155fps(Fast YOLO使用9个卷积层代替YOLO的24个,网络更轻快,但同时损失了检测准确率。)。基本的原理如下图所示,将原图划分为7*7的网格,如果某个object的中心落再一个网格中,这个网格就负责预测这个object,利用单一的CNN,每个grid cell同时完成多个bounding box的位置及其类别概率的预测。(YOLO的中文译名:你只需要看一次,不需要类似RPN的候选框提取,直接进行整图回归就可以了)
论文:You Only Look Once: Unified, Real-Time Object Detection(这篇 Paper 的主页在这里:http://pjreddie.com/darknet/yolo/)
YOLO文章的翻译https://www.cnblogs.com/zyly/p/9274472.html
YOLO相比于传统物体检测分类模型的最大优点:使用端到端(所谓的端到端就是不需要使图片通过传统的流水线进行预处理,输入图像到YOLO即可得到物体的位置信息和类别,如下图所示)的深度学习方式,不需要使图片通过传统的流水线进行预处理,输入图像到YOLO即可得到物体的位置信息和类别。YOLO算法将检测问题看做是回归问题( regression problem,回归的是bounding box),采用单个神经网络,利用整个图像的信息来预测目标的边框、识别目标的类别,实现端到端的目标检测,YOLO 从输入的图像,仅仅经过一个 neural network,直接得到 bounding boxes 以及每个 bounding box 所属类别的概率。正因为整个的检测过程仅仅有一个网络,所以它可以直接 end-to-end 的优化。
YOLO模型输入:448x448的RGB图片
YOLO模型输出:S × S × (B ∗ 5 + C) 维度的张量
符号说明:用S x S的格点分割原始图片(如7*7), 有B个框选物体的Bounding boxes,每个框都会输出5个信息(p, x, y, w, h)
其中。p——该网格是否有物体, 即P(Object)。
只有目标中心在的格点中,才有以下值,对于有目标的格点,选择最适合其轮廓的一个Bounding Box包含以下值,其他的Bounding Box内的值均为don’t cares
x:——网格内目标的中心x坐标(目标中心x坐标与网格宽度的比值)
y——网格内目标的中心y坐标(目标中心y坐标与网格高度的比值)
w——正确预测框的宽度 (目标宽度相对于网格宽度的比值)
h—— 正确预测框的高度(目标高度相对于网格高度的比值)
C——每个格点都会有C个需要判断的类别,即P(Class i)
YOLO模型结构:
Use a linear activation function for the final layer and all other layers use the following leaky rectified linear activation (Leaky RELU):
YOLO算法采用的网络结构,与GoogLeNet有点类似,有24个卷积层,2个全连接层,如下图所示。
YOLO模型流程:
step1:输入一张448x448的图片,并用7*7的网格进行划分,划分为49个网格(cell)。若一个目标的中心落入某个格子中,那么该格子将负责检测该目标。对于每个网格,都预测2个边框,包括B个bounding boxes,以及这些bounding boxes 的置信值(confidence scores)。预测出7*7*2个目标窗口,然后根据阈值去除可能性比较低的目标窗口,最后NMS去除冗余窗口即可(如上图所示);
step2:模型会为每一个网格都输出一个(B ∗ 5 + C)长度的tensor。每个Bounding boxe有5个预测参数:是否有物体、x坐标、y坐标、宽、高。C为类别。而bounding box中的参数“是否有物体”用置信值confidence来衡量,confidence表示bounding box与ground truth的IOU。。而每个网格为第C类别的概率为
tensor结构——每个cell有两个窗口,存储结构为一个30维的向量,如下图所示。可以看到每个cell向量的前5维分别代表了一个检测框的x坐标,y坐标,宽度和高度,检测框中有目标物体的置信度(P(Object) ∗ IOU)。6~10维表示第二个检测框
step3:对于所有网格计算出置信度。将bounding box的置信度与类别概率相乘,得到特定类的置信分数,这个分数代表了该类别出现在bounding box的概率,也代表了bounding box吻合目标的程度。
YOLO模型预测出每个bounding box时,也预测出了该bounding box的置信值。置信值表明了该bounding box包含目标的可信度,也即该bounding box的可信度。在训练模型时,如果对应的格子中不包含目标时,我们希望该置信值等于0,否则,我们希望该置信值等于predicted box与ground truth的IOU。置信度大于某阈值的网格,则认为选出的网格是包含目标的,令这些候选出来的格点集合为S;
step4:对于上述集合S中的每一元素s,利用公式
选出最大的可能预测类(经过此步骤,则选出了所有存在检测的目标的网格,而且这些存在目标的网格只预测了一类物体)。令这些后选出的集合为
对于上面提到的cell为30维向量,还剩下20维向量,代表这个cell中的物体属于20个类别的概率值。将cell两个检测框的置信度分别乘以20类别的概率值。
step5:对于K集合中相同的每一类,要从候选的检测框中找出最后的目标框。对每个类别,进行阈值比较、降序排列、对有重叠的候选框使用非极大值抑制(NMS)操作。
While there are any remaining boxes:
Pick the box with largest C
Discard any remaining box with IoU >= some threshold with the box output in the previous step
最后候选框的最终分数得到最终的类别和分数:
获得最终结果:
关于NMS
用bbox_max代表分数最大的候选框,将其与其他候选框bbox_cur进行比较,如果IoU(bbox_max,bbox_cur)>0.5,将候选框bbox_cur的分数置为0。第一轮循环后,由于橙色框(bbox_max)和绿色框的重叠度大于0.5,所以将绿色候选框的分数置0。
第二轮循环,将剩下的第二大分数的候选框设为bbox_max(图中的蓝色框)
同样的道理,由于蓝色框(bbox_max)和粉色框的重叠度大于0.5,所以将粉色候选框的分数置0。
使用非极大值抑制循环结束后,很多情况下,都只有少数的几个候选框大于0。
YOLO模型训练
1、训练流程(YOLO网络骨架为24个卷积层+2个全连接层)
YOLO模型前面20层使用了改进的GoogleNet,得到14×14×1024的tensor,接下来经过4个卷积层分别进行3×3的卷积操作和1×1的降维操作,最后经过两个全连接层后输出为7×7×30的tensor。检测目标就能从7×7×30的tensor中得到。这里的7×7并不是将输入图像划分为7×7的网格,实际上指经过多个卷积层处理过后的特征map是7×7大小的,而且其中的每个cell是互相有重叠的,但是为了便于直观理解,直接将原始图像用7×7的网格进行划分。
i)先在以下模型上训练分类任务。在预训练阶段,采用图中的前20卷积层,外加a average-pooling layer and a fully connected layer
ii)再增加四个卷积层和两个全连接层训练物体检测任务(冻住i中模型所的参数,对新增加的层随机初始化参数再进行训练),为了避免过拟合,两个全连接层均使用了dropout正则化,kee_pro = 0.5。最后一层输出类别概率、bounding box(最后一层输出物体的类别概率和物体框的中心坐标,高宽度和类别概率。物体的中心坐标是相对于每一个包含该物体中心格点的偏移量,物体框的高宽度通过图片的高宽度标准化为0,1之间。所以所有输出值都在0,1之间)。
2、损失函数
每个格子预测出多个bounding box。但是,在训练时,只希望一个bounding box predictor 来负责一个目标,所以,根据bounding box与ground truth的IOU来选取合适的bounding box predictor 。在训练过程中,采用的损失函数如下:
损失函数是Yolo算法的精华所在。
1.只对真实值中的确有物体的格点进行x, y, w, h的反向传播训练
2.虽然损失函数的各个部分均为均方误差(包含w, h的部分除外),但坐标损失部分的权重和无物体格点的有无物体预测权重设的不同,分别为
坐标损失权重之所以设的很大,是因为坐标值一般较小,不设置大的权重很难学习,而模型中大部分的格点都是没有物体的,所以如果无物体的损失权重和有物体的损失权重一样,为了最小化这样的损失,神经网络对于有物体和无物体的预测概率会大致相同,但事实上大部分格点真实值为0,为了避免这种问题,就把无物体的格点有无物体预测给予更小的权重,使得模型更倾向与预测无物体格点(符合真实的数据分布)
3.为了避免对大网格和对小网格的偏差基于相同的惩罚(对于相同的偏差,对小网格的惩罚应该更大)
例如网格宽度真实值分别为200和20的网格宽度预测值为190和10,那么后一个预测显然是差的多的。如果单纯的使用差值的平方作为损失,那么两者的平方损失均为10² = 100, 这是不正确的,因为前者的预测显然好很多过后者,为了解决这一问题, 对网格预测的高宽度和网格真实的高宽度均开根号再相减,使得损失函数对小值偏差更为敏感。例如
YOLO优点:
a、简单,采取端到端的深度学习方式,不需要对图片进行传统的流水线进行预处理;
b、快速,YOLO算法流程简单,速度很快,可以实现实时监测。由于不需要对图片进行预处理,而且采取卷积的物体定位的实现方式,借鉴Google-net,构造了更加小的模型,使得YOLO可以用于实时物体检测任务。而Faster YOLO更加快;
c、相比Fast R-CNN,YOLO不易于错误预测背景。YOLO采用全图信息进行预测。与滑动窗口、region proposals不同,YOLO在训练、预测过程中利用全图信息。Fast R-CNN方法错误地将背景块检测为目标,原因在于Fast R-CNN方法在检测时无法看到全局图像。相比于Fast R-CNN,YOLO可以将背景预测错误率降低一半 ;
YOLO的泛化能力强,还可以检测油画中的object
YOLO 和其他网络的对比如下图
YOLO 各种数据集上表现和其他物体检测神经网络的对比如下图
YOLO缺点:
a、每个格子只能预测出两个bounding box、一种类别,这导致模型对相邻目标的检测准确率下降。因此,YOLO对成堆目标的检测准确率较低。
其实YOLO从某种程度上而言,就是用了proposal,只是R-CNN系列的proposal是通过算法得出,而YOLO则是对整张图划分为7*7=49的网格,就是49个proposal,那么自然它的速率就会提升,但是这也是已牺牲准确度为代价的~
YOLOV2
YOLO与Fast R-CNN相比有较大的定位误差,与基于region proposal的方法相比具有较低的召回率。因此,为了目标的提高召回率和定位能力,YOLO作者提出了《YOLO9000: Better, Faster, Stronger》YOLOV2是在YOLO的基础上改进的(better、faster、stronger),下面先看看新增的改进,以及这些改进的作用
YOLOV2的检测速度和检测质量相对于前一代都有进一步的提高,在67帧,YoloV2可以达到76.8的mAP,在40帧,可以达到78.6的mAP。而YOLO9000建立在YOLOV2之上,可以检测超过9000类的物体(虽然准确率不怎么样,但是训练这个模型的思路还是很好的),在Image Net的交叉验证集的44个类别里,达到19.7的mAP,在COCO的156类物体里达到16.0的mAP。尽管可以预测很多类别,YOLO9000还是很有实时性的。
Better
1、使用Batch Normalization(可以提升模型的收敛速度,且可以起到一定正则化的效果,降低过拟合)。CNN在训练过程中网络每层输入的分布一直在改变, 会使训练过程难度加大,但可以通过normalize每层的输入解决这个问题。YOLO中也大量用了Batch Normalization,同时在定位层后边用了dropout,YOLOV2中取消了dropout,在每一个卷积层后全部添加Batch Normalization。 加快收敛,提高了2%的mAP。由于Batch Normalization有轻微正则化的作用,故此不再使用dropout正则化。
2、High Resolution Classifier——使用更高的分辨率图片作为分类模型训练,YOLO先在ImageNet(224*224)分类数据集上预训练模型的主体部分(大部分目标检测算法),获得较好的分类效果,然后再训练网络的时候将网络的输入从224*224增加为448*448。但是直接切换分辨率,检测模型可能难以快速适应高分辨率。所以YOLOV2增加了在ImageNet数据集上使用448*448的输入来finetune分类网络这一中间过程(10 epochs),这可以使得模型在检测数据集上finetune之前已经适用高分辨率输入。使得模型对图片输入有更大的像素适应范围。使用高分辨率分类器后,YOLOV2的mAP提升了约4%。
3、Anchor Box & Dimension Clusters——YOLO中直接在卷积层之后使用全连接层预测bounding box的坐标,导致丢失较多的空间信息,定位不准。YOLOV2借鉴Faster R-CNN中的anchor思想,使用anchor boxes预测bounding box的偏移。移除了全连接层(网络仅采用卷积层和池化层),保留了一定空间结构信息。并且删掉了一个pooling层使特征的分辨率更大一些。Anchor box如下图所示
在YOLO中,输入图片最终被划分为7*7的网格单元(cell),每个cell预测2个边框。YOLO中最后采用的是全连接层直接对边框进行预测,其中边框的宽与高是相对整张图片的大小的,而由于数据集中各图片中存在不同尺度和高宽比的物体,YOLO在训练过程中难以适应不同的物体的形状。从而导致YOLO在定位精准度上较差。而YOLOV2中通过引入anchor box,可以获得更高的recall(YOLO中只有98个边框,而YOLO2中有1000多个)
然后,通过缩减网络(下采样32倍),让图片输入分辨率为由448*448变为416 * 416,这一步的目的是为了让后面产生的卷积特征图宽高都为奇数(输出为13*13*5*25),产生奇数的目的是产生一个center cell。因为作者观察到,大物体通常占据了图像的中间位置, 就可以只用中心的一个cell来预测这些物体的位置,否则就要用中间的4个cell来进行预测,这个技巧可稍稍提升效率。最后,YOLOv2使用了卷积层降采样(factor为32),使得输入卷积网络的416 * 416图片最终得到13 * 13的卷积特征图(416/32=13)。加入了anchor boxes后,可以预料到的结果是召回率上升,准确率下降。我们来计算一下,假设每个cell预测9个建议框,那么总共会预测13 * 13 * 9 = 1521个boxes,而之前的网络仅仅预测7 * 7 * 2 = 98个boxes。
anchor box的具体效果为:没有anchor boxes,模型recall为81%,mAP为69.5%;加入anchor boxes,模型recall为88%,mAP为69.2%。准确率只有小幅度的下降,而召回率则提升了7%。
Dimension Clusters则是用于决定anchor box的尺寸选择问题。在Faster R-CNN中,是采用手动设定的。YOLOV2使用k-means clustering 算法来训练,为图片自适应的选择3个anchor box。为聚类算法定义的距离函数如下
在COCO 和VOC 2017训练集上训练得到的Anchor Boxes示意图如下图所示。
4、改进每一个box的预测值定义来改进模型(作者发现Yolov1模型训练早期的不稳定性来自坐标和高宽度的预测),作者先是吐槽了一下RPN(region proposal network)坐标预测的缺点,t_x, t_y为预测值。最终坐标计算如下。x, y为最终预测点的坐标。如果t_x,t_y预测的很大或者很小,那么中心点坐标会超出图片的范围。
其实作者就是想说前面的缩放比例应该先定在0,1之间,所以作者使用了sigmoid函数作为激活函数。除此之外,作者将预测到的高宽度用了指数激活方式,认为增加非线性函数,给神经网络一个误差容限,而不是单纯的数值误差,新的五个预测值的表示如下:
最终通过使用自动选择的Anchor boxes和新定义的预测值,Yolov2的性能提升了5%,而且模型更加的稳定。
5、细粒度特征(fine grain features)——在Faster R-CNN 和 SSD 均使用了不同的feature map以适应不同尺度大小的目标。YOLOv2使用了一种不同的方法,简单添加一个 pass through layer(转移层)捕捉更细粒度的特征,这个转移层也就是把高低两种分辨率的特征图做了一次连结,把浅层特征图连接到深层特征图。 通过叠加浅层特征图相邻特征到不同通道(而非空间位置),类似于Resnet中的identity mapping。将浅层特征图与原生的深层特征图相连接,使模型有了细粒度特征。使得浅层模型特征对最终预测结果有更大的影响。
6、Multi-Scale Training(采用不同尺寸的图片训练)——YOLO训练时,输入网络的图像的尺寸固定不变。而YOLOV2中,由于没有了全连接层,所以其输入不限于416*416大小的图片。YOLOV2每隔几次迭代后就会微调网络的输入尺寸。训练时每迭代10次,就会随机选择新的输入图像尺寸。因为YOLOv2的网络使用的downsamples倍率为32,所以使用32的倍数调整输入图像尺寸{320,352,…,608}。训练使用的最小的图像尺寸为320 x 320,最大的图像尺寸为608 x 608,对应特征图的大小为19*19。 这使得网络可以适应多种不同尺度的输入,提高鲁棒性.
Faster
1、大多数检测框架依赖于VGG-16作为的基本特征提取器。VGG-16是一个强大的,准确的分类网络,但它比较复杂。YOLO借鉴Google-net 的模型架构,自定义了一种网络,这个网络比VGG-16快,然而准确性比VGG-16差。YOLOV2提出了一种新的分类模型Darknet-19,更简便的模型,更少的运算,但也有很不错的准确率和mAP。Darknet网络结构如下图。包含了19个conv和5maxpooling,相比YOLOv1的24个卷积层和2个全连接层精简了网络。
先对模型训练1000类的分类任务: 先在standard ImageNet 1000 class classification dataset训练160epochs。
再对模型进行检测训练:在分类网络Darknet-19的基础上去掉最后一个1*1的卷积层,加上一个3*3*1024的卷积层,然后再加上一个1x1卷积层输出类别,
除此之外,添加跨层跳跃连接,融合粗细粒度的特征。将前面最后一个3*3*512卷积的特征图跨层连接到最后一个卷积层。
Stronger
1、由于现实生活中的物体分类数据集远大于物体检测数据集,因此单纯的使用一小部分的物体检测数据集进行YOLOV2的训练会使得该模型无法检测更多类别的物体。为了解决这一问题, 并且尽可能地利用分类数据集来提升Yolo能够检测的物体的类别数量,作者提出了联合训练算法,并使模型可以进行尽可能多的分类数据进行训练,采用树状图构建现实世界的物体分类数据集来融合多个平台的图片数据集来训练物体分类模型,再使用一小部分物体检测的数据进行训练定位模型,使得YOLOV2可以对9000种物体进行检测。
在训练的时候,物体检测数据集和物体分类数据集是混合在一起的。如果某个数据来自分类数据集,则不对定位量b_x, b_y, b_w, b_h进行反向传播训练,只降低分类损失,如果是物体检测数据集,则降低全部损失。
但是这种融合数据集的方法会有几个问题:
- 分类数据集的物体类别多,分类更加详细。
- 检测数据集的物体类别少,分类粗糙。
因此需要采取结构化的方式,结构化融合的数据集。
2、采用树状图构建现实世界的物体分类数据,若一个物体有多条路径到达根节点(Physical Object),则选取最短路路径进行模型标记。先将Image Net中只有一条路径通往根结点的物体路径添加到树有向图中,再将剩余的有多条路径通往有向图根结点的物体以添加最少分支的原则添加到有向图中。构造了WordTree树状图如下,解决了不同数据集互相排斥的问题(具体没理解)。
assume:
if we wan to compute absolute probability of Norfolk terrier
在训练的时候,举一个例子,如果某一个样本他的真是标签是Norfolk terrier(一种狗名),那么输出中,对狗和哺乳动物的分类也是1。
2、采用多sotfmax来预测类别,而不是使用单softmax
Yolov2优点:
检测类别更多,应该是最多类别的物体检测模型,准确率更高, mAP更高,准确率提升的同时,速度依然很快。
Yolov2缺点:
对于分类数据集中出现的,但定位模型中没有出现的小物体定位精度很低
YOLO的升级版本有两种:YOLOV2和YOLO9000。作者采用一系列的方法优化了YOLO的模型结构,产生了YOLOV2,在快速的同时准确率也达到很高。然后作者再采用wordtree的方法,总会ImageNet的数据集和COCO数据集训练YOLO9000,使其识别率可以达9000种。
YOLOV3
YOLOV3与之前模型的对比
模型的改进:
1、采用更深的模型Darknet-53。使用残差模型和采用FPN架构。YOLOV3的特征提取器是一个残差模型,因为包含53个卷积层,所以称为Darknet-53,从网络结构上看,相比Darknet-19网络使用了残差单元,所以可以构建得更深。
2、采用FPN架构(Feature Pyramid Networks for Object Detection)来实现多尺度检测。每种尺度预测3个bounding box。anchor的设计方式仍然采用Dimension Clusters,得到9个聚类中心,将其按照大小均匀分给3个尺度。
-
尺度1: 在基础网络之后添加一些卷积层再输出box信息.
-
尺度2: 从尺度1中的倒数第二层的卷积层上采样(x2)再与最后一个16x16大小的特征图相加,再次通过多个卷积后输出box信息.相比尺度1变大两倍.
-
尺度3: 与尺度2类似,使用了32x32大小的特征图.
3、采用logistic(逻辑回归)替换原来模型的单个节点softmax。这样更易于预测。softmax使每个框分配一个类别(选择score最大的一个,但实际上可能存在重叠的类别标签),因此不适用于多标签分类。
(本人对YOLOV2的理解不是特别的深入,为此YOLOV3也没有多大的体会,后续会对本部分进行修补)
SSD
基于“Proposal + Classification”的目标检测方法中,R-CNN 系列(R-CNN、 SPPnet、Fast R-CNN以及 Faster R-CNN等)取得了非常好的结果,但是在速度方面离实时效果还比较远。在提高 mAP (Mean Average Precision) 的同时兼顾速度,逐渐成为神经网络目标检测领域未来的趋势。YOLO检测算法不仅能够达到实时的效果,而且mAP与前面面提到的 R-CNN系列相比有很大的提升。 但是YOLO 有一些缺陷:每个网格只能预测一个物体,容易造成漏检;且对于物体的尺度相对比较敏感,面对尺度变化较大的物体时泛化能力较差。针对 YOLO 中的这些不足,SSD(Single Shot MultiBox Detector)网络在这两方面都有所改进,同时兼顾了 mAP 和实时性的要求。
(论文地址:https://arxiv.org/abs/1512.02325)
SSD相比Faster R-CNN有明显的速度优势,相比YOLO又有明显的mAP优势。从上图对比可以看出YOLO在卷积层后接全连接层,即坚持时只利用了最高层的feature map(Faster R-CNN也是如此)。而SSD则将好几层的,所获得的大小不同的feature map用于检测。在多个feature map上同时进行softmax分类和位置回归。如下图所示。
网络结构
SSD网络分为两种结构:SSD 300和SSD 512,用于不同输入尺寸的图像识别。本博文主要以SSD 300为例进行分析。
SSD 300中输入图像的大小是300x300,特征提取部分使用了VGG16的卷积层,并将VGG16的两个全连接层转换成了普通的卷积层(图中conv6和conv7),之后又接了多个卷积(conv8_1,conv8_2,conv9_1,conv9_2,conv10_1,conv10_2),最后用一个Global Average Pool来变成1x1的输出(conv11_2)。从图中我们可以看出,SSD将conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2都连接到了最后的检测分类层做回归。具体细节如下图
观察上述两幅图,我们可以初步得到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、采用多尺度特征图用于检测(Mult-scale feature map for detection)
刚开始的层使用分类模型中的层,成为base network。在base network后添加一些卷积层,这些卷积层的大小逐渐减少,进而可以获得多尺度的特征图。
所谓多尺度采用大小不同的特征图,CNN网络一般前面的特征图比较大,后面会逐渐采用stride=2的卷积或者pool来降低特征图大小,这正上如图所示,比较大的特征图和比较小的特征图,它们都用来做检测。这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标,如下图所示,8x8的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。
多尺度特征图检测的作用可以从下图的例子中得到很好的体现。图中,浅层网络特征图很适合用来识别猫这一目标(蓝色方框,浅层的时候,感受野小),但面对狗这一目标,选框尺寸显得太小无法很好地将目标检测到。而到了深层网络,由于特征图经过池化层后尺寸减小,感受野变大。因此,红色选框可以较准确地识别到狗。究其原因,正是因为每一个特征图中都只能用尺度相同的选框(应称为Default boxes,后文会介绍),导致目标尺寸与选框尺寸差距过大时,无法完成理想检测。
从下图中更是可以直接感受到,采用多尺度特征用于检测可以提高识别的准确度。
2、设置Default boxes
SSD借鉴了Faster R-CNN中anchor(如上图)的理念,每个单元设置尺度或者长宽比不同的Default boxes(就是一些目标的预选框,后续通过softmax分类+bounding box regression获得真实目标的位置),预测的边界框(bounding boxes)是以这些Default boxes为基准的,在一定程度上减少训练难度。一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异。对应上一条核心思想我们知道,Default boxes其实就是在某一feature map上每一点处选取的不同长宽比的选框。以feature map上每个点的中心点为中心,生成一系列通同心的Default boxes。与YOLO不同的是,YOLO在每个位置只选取正方形选框,但是真实目标的形状是多变的,YOLO需要在训练过程中自适应目标的形状。
Default boxes尺寸的确定(Choosing scales and aspect ratios for default boxes )
Conv7,Conv8_2,Conv9_2,Conv10_2,Conv11_2作为检测所用的特征图,加上Conv4_3层,共提取了6个特征图,其大小分别是(38,38)(19,19)(10,10)(5,5)(3,3)(1,1)。但是不同特征图设置的先验框数目不同。先验框的设置,包括尺度(scale)和长宽比(aspect ratio)两个方面。对于对于每个feature map对应的先验框的尺度,其遵守一个线性递增规则:随着特征图大小降低,先验框尺度线性增加:
这里smin是0.2,表示最底层的尺度是0.2,;smax是0.9,表示最高层的尺度是0.9。通过这种计算方法,可以得出6个特征图的default box尺度分别为:[30,60,111,162,213,264]。长宽比用ar表示为下式(注意这里一共有5种长宽比):
通过下面的公式计算 default box 的宽度w和高度h:
默认情况下,每个特征图会有一个且尺度为的先验框,除此之外,还会设置一个尺度为且的先验框,这样每个特征图都设置了两个长宽比为1但大小不同的正方形先验框。因此,每个特征图一共有6个先验框,但是在实现时,Conv4_3,Conv10_2和Conv11_2层仅使用4个先验框,它们不使用长宽比为3,1/3的先验框。SSD 300一共可以预测的default box个数为:
所以说SSD本质上是密集采样。
3、采用卷积进行检测(Convolutional predictors for detection)
与Yolo最后采用全连接层不同,SSD直接采用卷积对不同的特征图来进行提取检测结果。对网络中6个特定的卷积层的输出分别用两个3*3的卷积核进行卷积,一个输出分类用的confidence,每个default box生成21个confidence(这是针对VOC数据集包含20个object类别而言的,另外一个是背景的分类);一个输出回归用的localization,每个default box生成4个坐标值(x,y,w,h)。下图给出了一个5*5大小的卷积核对feature map检测的过程。其中Priorbox是代表default box(只是不同叫法,实际上是一样的),前面已经介绍了生成规则。检测值包含两个部分:类别置信度和边界框位置,各采用一次3*3卷积来进行完成。令为该特征图所采用的先验框数目,那么类别置信度需要的卷积核数量为,而边界框位置需要的卷积核数量为。
训练与预试
1、default box匹配
在训练过程中,首先要确定训练图片中的ground truth(真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。在YOLO中,ground truth的中心落在哪个单元格,该单元格中与其IOU最大的边界框负责预测它。但是在SSD中却完全不一样,在训练时,ground truth与 default boxes按照如下方式进行配对:
i)、首先,寻找与每一个ground truth box有最大IOU的default box,这样就能保证每一个ground truth能与至少一个default box对应起来。
ii)、SSD之后又将剩余还没有配对的default box与任意一个ground truth尝试配对,只要两者之间的IoU大于阈值,就进行匹配(SSD 300 阈值为0.5)。
通常称与ground truth匹配的default box为正样本,反之,若一个default box没有与任何ground truth进行匹配,那么该default box只能与背景匹配,就是负样本。下图为一个匹配示意图,其中绿色的GT是ground truth,红色为先验框,FP表示负样本,TP表示正样本。
尽管一个ground truth可以与多个先验框匹配,但是ground truth相对先验框还是太少了,所以负样本相对正样本会很多。为了保证正负样本尽量平衡,SSD采用了hard negative mining,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大的top-k作为训练的负样本,以保证正负样本比例接近1:3。
2、损失函数
在训练样本确定了之后,就是选择损失函数了。损失函数定义为位置误差(locatization loss,loc)与置信度误差(confidence loss, conf)的加权和:
其中N是先验框的正样本数量。c为类别置信度预测值。l为先验框的所对应边界框的位置预测值,而g是ground truth的位置参数。权重系数通过交叉验证设置为1。
对于位置误差,其采用Smooth L1 loss,定义如下:
这里为一个指示参数,当时表示第i个default boxes与第j个ground truth匹配,并且ground truth的类别为g。由于的存在,所以位置误差仅针对正样本进行计算。
对于置信度误差,其采用softmax loss,定义如下:
从公式中可以看出,置信度的误差包含两个部分:正样本的误差和负样本的误差。通过下图我们可以更好地观察到具体过程。
3、数据增广
不同于Faster R-CNN,SSD算法使用了多种数据增强的方法,包括水平翻转、裁剪、放大和缩小等。论文明确指出,数据增强可以明显的提高算法的性能。主要的目的是为了使得该算法对输入的不同大小和不同形状的目标具有更好的鲁棒性。直观的理解是通过这个数据增强操作可以增加训练样本的个数,同时构造出更多的不同形状和大小的目标,将其输入到网络中,可以使得网络学习到更加鲁棒的特征。
4、Atrous Algothrim
采用Hole算法可以利用已经训练好的模型进行微调,又可以改变网络结构得到更加稠密的得分图。其原理如下图。
5、NMS(非极大值抑制)
在SSD算法中,NMS至关重要。因为多个feature map 最后会产生大量的bounding boxes,即最终检测结果。然而在这些bounding boxes中存在着大量的错误的、重叠的、不准确的样本,这不仅造成了巨大的计算量,如果处理不好会影响算法的性能。(在上文已经对NMS作了较为详细的介绍)
性能评估
1、模块性能
观察上图可以得到如下的结论:
1)数据增强方法在SSD算法中起到了关键性的作用,使得mAP从65.5变化到71.6,主要的原因可能是数据增强增加了样本的个数,使得模型可以获得更重更样的样本,即提高了样本的多样性,使得其具有更好的鲁棒性,从而找到更接近GT的bounding boxes。
2)[1/2,2]和[1/3, 3]box可以在一定程度上提升算法的性能,主要的原因可能是这两种box可以在一定程度上增加较大和较小的bounding boxes,可以更更加准确的检测到较大和较小的目标,而且VOC数据集上面的目标一般都比较大。当然,更多的比例可以进一步提升算法的性能。
3)Atrous算法可以轻微提升算法性能,但是其主要的作用是用来提速,论文中表明它可以提速20%。主要的原因可能是虽然该算法可以获得更大的feature map和感受野,但是由于SSD本身利用了多个feature map来获取bounding boxes,bounding boxes的多样性已经足够,由于feature map扩大而多得到的bounding boxes可能是一些重复的,并没有起到提升检测性能的作用。
2、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相比,在输入上就会少很多的计算。
SSD优点:
运行速度超过YOLO,精度超过Faster R-CNN(一定条件下,对于稀疏场景的大目标而言)。
SSD缺点:
需要人工设置default boxes的初始尺度和长宽比的值。网络中default boxes的基础大小和形状不能直接通过学习获得,而是需要手工设置。而网络中每一层feature使用的default box大小和形状恰好都不一样,导致调试过程非常依赖经验。
对小尺寸的目标识别仍比较差,还达不到Faster R-CNN的水准。因为SSD使用conv4_3低级feature去检测小目标,而低级特征卷积层数少,存在特征提取不充分的问题。
DSSD
SSD算法的局限:
- 卷积神经网络在结构上存在固有的问题:高层网络感受野比较大,语义信息表征能力强,但是分辨率低,几何细节信息表征能力弱。低层网络感受野比较小,几何细节信息表征能力强,虽然分辨率高,但语义信息表征能力弱。
- SSD采用多尺度的特征图来预测物体,使用具有较大感受野的高层特征信息预测大物体,具有较小感受野的低层特征信息预测小物体。
- 这样就带来一个问题:使用的低层网络的特征信息预测小物体时,由于缺乏高层语义特征,导致SSD对于小物体的检测效果较差。而解决这个问题的思路就是对高层语意信息和低层细节信息进行融合。DSSD采用Top Down的网络结构进行高低层特征的融合并且改进了传统上采样的结构。
DSSD(Deconvolutional Single Shot Detector)算法思想:
- DSSD使用一种通用的Top Down的融合方法,使用VGG和Resnet网络,以及不同大小的训练图片尺寸来验证算法的通用性。
- 将高层的语义信息融入到低层网络的特征信息中,丰富预测回归位置框和分类任务输入的多尺度特征图,以此来提高检测精度。
- 在提取出多尺度特征图之后,DSSD提出由残差单元组成的预测模块,进一步提取深度的特征最后输入给框回归任务和分类任务。
(论文地址:https://arxiv.org/abs/1701.06659)
1、DSSD网络
DSSD的基础是SSD检测网络。经过以上的分析我们知道,SSD算法对小目标不够鲁棒的最主要的原因是浅层feature map的表征能力不够强。DSSD就使用了更好的基础网络(ResNet)和Deconvolution层,skip连接来给浅层feature map更好的表征能力。(上图的上半部分)。DSSD算法将上图中的特定的七层特征图拿出六层(去掉尺寸最小的一层的特征图)输入到反卷积模型里,输出修正的特征图金字塔,形成一个由特征图组成的沙漏结构。最后经预测模块输入给框回归任务和分类任务做预测。
DSSD的核心思想,也就是如何利用中间层的上下文信息。方法就是把红色层做反卷积操作,使其和上一级蓝色层尺度相同,再把二者融合在一起,得到的新的红色层用来做预测。如此反复,仍然形成多尺度检测框架。在图中越往后的红色层分辨率越高,而且包含的上下文信息越丰富,综合在一起,使得检测精度得以提升。
2、实现细节
2.1、预测模块
SSD的直接从数个卷积层中分别引出预测函数,预测量多达7000多,梯度计算量也很大。MS-CNN方法指出,改进每个任务的子网可以提高准确性。根据这一思想,作者在每一个预测层后增加残差模块,并且对于多种方案进行了对比,如下图所示。
图中:
(a)为SSD使用的方法,直接提取出网络中的多尺度特征图做分类和回归的预测;
(b)为Resnet残差单元的网络结构;
(c)为改进的只含一个残差单元的预测模型,在残差旁路将原来的特征图用的卷积核做处理后与网络主干道的特征图做通道间加法;
(d)为只含两个残差单元的预测模型。
图中四种预测方式的实验结果如下图:
结果表明,增加残差预测模块后,高分辨率图片的检测精度比原始SSD提升明显。
2.2、反卷积模块
为了引入更多的高级上下文信息,DSSD在SSD+Resnet-101之上,采用反卷积层来进行预测(Deconvolution Module)。和原始SSD是不同的,最终形成沙漏形的网络。添加额外的反卷积层以连续增加后面特征图的分辨率,为了加强特征,作者在沙漏形网络中采用了跳步连接(skip connection)方法。反卷积模型指的是DSSD中高层特征和低层特征的融合模块,其基本结构如下图 所示。该模块可以适合整个DSSD架构。
DSSD的提出者认为用于精细网络的反卷积模块的分解结构达到的精度可以和复杂网络一样,并且更有效率。因此进行了一定的改进:
- 在每个卷积层后添加批归一化层;
- 使用基于学习的反卷积层而不是简单地双线性上采样;
- 测试了不同的结合方式,元素求和(element-wise sum)与元素点积(element-wise product)方式,实验证明点积计算能得到更好的精度(见下图)。
2.3、训练与预测
2.3.1、训练过程
训练的大部分过程和原始SSD类似。
- 首先,依然采用了SSD的default boxes,把重叠率高于0.5的视为正样本。
- 设置一些负样本,使得正负样本的比例为3:1。
- 训练中使Smooth L1+Softmax联合损失函数最小。训练前依然需要数据扩充(包含了hard example mining技巧)。
另外原始SSD的default boxes维度是人工指定的,可能不够高效,为此,DSSD算法在这里采用K-means聚类方法重新得到了7种default boxes维度,得到的这些boxes维度更具代表性。这一点是对上文提到的SSD算法需要人工确定default boxes,很依赖经验这一局限的改进。而训练阶段DSSD算法独有的过程分为两个阶段:
- 第一个阶段,加载SSD模型初始化DSSD网络,并冻结SSD网络的参数,然后只增加反卷积模型(不添加预测模型),在这样的条件下只训练反卷积模型;
- 第二个阶段,微调第一阶段的模型,解冻第一阶段训练时候冻结的所有参数,并添加预测模型。
2.3.2、预测过程
预测过程较SSD算法并无太大差别。同样是选取特定层的feature map选取default boxes。但需要注意的是,由于经过了反卷积层的作用,这些feature map包涵更多的特征信息和更精细的感受野。
对选定的feature map使用新增加的残差模块进行运算后,再做分类与回归(SSD中没有残差模块)。接着就是SSD算法的流程了,根据置信度进行降序排列保留top-k个预测框。然后进行NMS算法,过滤掉那些重叠度较大的预测框。最后剩余的预测框就是检测结果了。
DSSD针对小目标鲁棒性太差,提出了以下两个贡献:
- 把SSD的基准网络从VGG换成了Resnet-101,并添加了残差模块,增强了特征提取能力;
- 使用反卷积层(deconvolution layer)增加了大量上下文信息。
因此, DSSD算法达到了更好的检测准确率,特别是对小目标也有较好的检测效果。
不足之处是时效性不高,原因:
- Resnet-101相比VGG有更多的卷积层;
- 增加的反卷积层带来的额外的运算;
- DSSD中增加了比例为1.6的default boxes,这也增加了预测时间。
小结(R-CNN系列、YOLO系列、SSD系列)
好~终于把几种常见的检测网络写完了~~~不过可能由于用的时间较短,对于部分细节理解不够透彻(比如YOLOV2采用了很多改进的算法,但是细节部分,本人感觉还没理解透彻,接下来会对YOLOV2进行实现,做深入的剖析),接下来有新的体会会及时更新本博文,也欢迎大家赐教~
本博文主要是对常用的深度学习的检测网络进行了介绍,后面还会有博文介绍分类网络。这里补充说明一下检测网络和分类网络的区别。检测网络就是用于目标检测的(object detection)。包含两个问题:一是判断属于某个特定类的物体是否出现在图中;二是对该目标定位,定位常用表征表征就是物体的边界框(bounding box)。可以实现——输入测试图片,输出检测到的目标类别和位置。
而分类网络则是实现物体的分类任务。该任务需要我们对出现在某幅图像中的物体做标注,比如一共有1000个物体类,对一幅图片中所有物体来说,某个物体要么有,要么没有。可实现:输入一幅测试图片,输出该图片中物体类别的候选集。
主要参考博文:
https://blog.csdn.net/Julialove102123/article/details/79520473
https://blog.csdn.net/qq_38906523/article/details/79971817(目标检测的发展史,推荐看看)
https://www.cnblogs.com/Libo-Master/p/9717626.html
https://www.jianshu.com/p/e6496a764b51
https://blog.csdn.net/liangjiubujiu/article/details/80879771(R-CNN)
https://www.cnblogs.com/skyfsm/p/6806246.html(R-CNN)
https://blog.csdn.net/u013989576/article/details/72781018(YOLO)
http://www.cnblogs.com/sandy-t/p/7397713.html(YOLO,写得非常好)
https://www.cnblogs.com/makefile/p/YOLOv3.html(YOLOV2)
https://blog.csdn.net/wfei101/article/details/79398563(YOLOV2)
https://www.jianshu.com/p/032b1eecb335(YOLOV2)
https://blog.csdn.net/qq1483661204/article/details/79776065(SSD代码分析)
https://baijiahao.baidu.com/s?id=1598999301741831102&wfr=spider&for=pc(基于候选区域的目标检测器)