基于深度学习的目标检测技术

        **object detection 就是在图像中精确找到物体的位置以及分辨物体的类别,这并不是一个容易的任务,一张图片上可能有多个目标物,并且这些目标物有可能互相覆盖遮挡,而且这些物体的大小方向在图像上也是随机的。**

分类网络:
AlexNet:在2012年以压倒性的优势获得了ImageNet图像识别竞赛的冠军,面对十五万个测试图像时,预测的前五个类别的错误率只有15.3%。
在这里插入图片描述
VGGNet: VGGNet是牛津大学的研究者于2014年提出的网络结构。VGG严格控制卷积核的大小F为3*3,步长S和补零P的大小都是1,只是逐层增加卷积核的数量,并且所有的池化层都是F=2和S=2的最大池化层,网络深度加到16层或者19层。就是靠着这样简单的原则,image把错误率下降到了7.3%.VGGNet的成功充分说明了深度对于CNN由低级到高级提取特征的重要性
在这里插入图片描述
GoogLeNet:
GoogLeNet与VGGNet都参加了2014年imageNet视觉识别竞赛,最终GoogLeNet以6.7%的错误率击败了VGGNet拿下冠军。
这个网络主要有两个贡献:
一是使用1x1的卷积来进行升降维;
二是在多个尺寸上同时进行卷积再聚合。
在这里插入图片描述
在这里插入图片描述
第一点:优化前后两种方案的乘法次数比较,同样是输入一组有192个特征、32x32大小,输出256组特征的数据,第一张图直接用3x3卷积实现,需要192x256x3x3x32x32=452984832次乘法;第二张图先用1x1的卷积降到96个特征,再用3x3卷积恢复出256组特征,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法,使用1x1卷积降维的方法节省了一半的计算量。有人会问,用1x1卷积降到96个特征后特征数不就减少了么,会影响最后训练的效果么?答案是否定的,只要最后输出的特征数不变(256组),中间的降维类似于压缩的效果,并不影响最终训练的结果。
第二点:在多个尺度上同时进行卷积,能提取到不同尺度的特征,
作者认为pooling也能起到提取特征的作用,所以也加入模块中。

ResNet:微软亚洲研究院用152层的ResNet把2015年的ImageNet错误率降低到3.6%,第一次超过了人类专家的识别水平,也把CNN的深度提升到了一个数量级;
ResNet的想法很简单,就是让一个卷积-ReLu-卷积模块去学习输入到残差的映射。这个模块称为残差模块。Mask R-CNN就是以ResNet作为核心的特征提取器的。
在这里插入图片描述
基本概念介绍:
Bounding Box(bbox):bbox是包含物体的最小矩形,该物体应在最小矩形内部.
Intersection over Union(IoU)
在这里插入图片描述
在训练网络的时候,我们常依据侯选区域和标定区域的IoU值来确定正负样本。
非极大值抑制:把不是极大值的抑制掉,在物体检测上,就是对一个目标有多个标定框,使用极大值抑制算法滤掉多余的标定框。
问题引出:
目前我们已经能实现对图像的分类,但是现在的任务不仅仅时对图像进行分类,我们还希望能对目标进行定位,即在图像中标出物体的位置。
如果一幅图中有多个不同的目标物体,我们希望能将它们分别框出来并进行分类。
在这里插入图片描述
首先考虑一副图像中只有一个目标物体,分类网络可以实现分类,那么如何进行定位?
图像识别+定位:
图像识别(classification):
输入:图片
输出:物体的类别
评估方法:准确率
在这里插入图片描述
定位(localization):
输入:图片
输出:方框在图片中的位置(x,y,w,h)
评估方法:检测评价函数 intersection-over-union ( IOU )

在这里插入图片描述
思路一:看做回归问题
看做回归问题,我们需要预测出(x,y,w,h)四个参数的值,从而得出方框的位置。
在这里插入图片描述
步骤1:
  • 先解决简单问题, 搭一个识别图像的神经网络
  • 在AlexNet VGG GoogleLenet上fine-tuning一下
在这里插入图片描述
步骤2:
 • 在上述神经网络的尾部展开(也就说CNN前面保持不变,我们对CNN的结尾处作出改进:加了两个头:“分类头”和“回归头”)
 • 成为classification + regression模式
 在这里插入图片描述步骤3:
  • Regression那个部分用欧氏距离损失
  • 使用SGD训练
步骤4:
  • 预测阶段把2个头部拼上
  • 完成不同的功能
这里需要进行两次fine-tuning
第一次在ALexNet上做,第二次将头部改成regression head,前面不变,做一次fine-tuning
Regression的部分加在哪?
有两种处理方法:
  • 加在最后一个卷积层后面
  • 加在最后一个全连接层后面(如R-CNN)
regression太难做了,应想方设法转换为classification问题。
regression的训练参数收敛的时间要长得多,所以上面的网络采取了用classification的网络来计算出网络共同部分的连接权值。
思路二:取图像窗口
  • 还是刚才的classification + regression思路
  • 咱们取不同的大小的“框”
  • 让框出现在不同的位置,得出这个框的判定得分
  • 取得分最高的那个框
左上角的黑框:得分0.5
在这里插入图片描述
右上角的黑框:得分0.75
在这里插入图片描述
左下角的黑框:得分0.6
在这里插入图片描述
右下角的黑框:得分0.8
在这里插入图片描述
根据得分的高低,我们选择了右下角的黑框作为目标位置的预测。
注:有的时候也会选择得分最高的两个框,然后取两框的交集作为最终的位置预测。
疑惑:框要取多大?

取不同的框,依次从左上角扫到右下角。非常粗暴啊。
总结一下思路:
对一张图片,用各种大小的框(遍历整张图片)将图片截取出来,输入到CNN,然后CNN会输出这个框的得分(classification)以及这个框图片对应的x,y,h,w(regression)。
在这里插入图片描述

对比:
方法二 取图像窗口,遍历图片,使用SVM分类,使用IOU指标训练一个bbox回归器,对正样本对应的bbox回归更靠近真实值,这样是肯定能得到一个不错的结果。
bbox回归是个线性回归器。包括平移和缩放参数
取所有候选区域调整后的结果的平均值作为最终的标定框
具体怎么做自己查!!!!!

方法一 直接使用欧式距离回归,是否收敛?能否得到一个好的结果?

遍历图片需要难以想象多的窗口,于是有人提出了候选框的方法,找出可能含有物体的框(也就是候选框,比如选1000个候选框),这些框之间是可以互相重叠互相包含的,这样我们就可以避免暴力枚举的所有框了。在这里插入图片描述
大牛们发明好多选定候选框的方法,比如EdgeBoxes和Selective Search。
以下是各种选定候选框的方法的性能对比。
在这里插入图片描述

基于以上思路,R-CNN出现
在这里插入图片描述
论文:《Rich feature hierarchies for accurate oject detection and semantic segmentation》
这篇论文也带来了一个观点,那就是当你缺乏大量的标注数据时,比较好的可行的手段是,进行神经网络的迁移学习,采用在其他大型数据集训练过后的神经网络,然后在小规模特定的数据集中进行 fine-tune 微调。
利用预训练与微调解决标注数据缺乏的问题
采用在 ImageNet 上已经训练好的模型,然后在 PASCAL VOC 数据集上进行 fine-tune。
因为 ImageNet 的图像高达几百万张,利用卷积神经网络充分学习浅层的特征,然后在小规模数据集做规模化训练,从而可以达到好的效果。

步骤1:训练(或者下载)一个分类模型,对该模型做fine-tuning
步骤2:去掉网络后面的全连接层
步骤3:提取图像的所有候选框(选择性搜索),对于每一个区域:修正区域大小以适合CNN的输入,做一次前向运算,将第五个池化层的输出(就是对候选框提取到的特征)存到硬盘
步骤4:训练一个SVM分类器(二分类)来判断这个候选框里物体的类别,每个类别对应一个SVM,判断是不是属于这个类别,是就是positive,反之nagative
步骤5:使用回归器精细修正候选框位置:对于每一个类,训练一个线性回归模型去判定这个框是否框得完美。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在测试阶段,R-CNN 在每张图片上抽取近 2000 个候选区域。然后将每个候选区域进行尺寸的修整变换,送进神经网络以读取特征,然后用 SVM 进行类别的识别,并产生分数。候选区域有 2000 个,所以很多会进行重叠。针对每个类,通过计算 IoU 指标,采取非极大性抑制,以最高分的区域为基础,剔除掉那些重叠位置的区域。
R-CNN 采用的是 IoU 的阈值,这个 threshold 取 0.3,如果一个区域与 Ground tureth 的 IoU 值低于设定的阈值,那么可以讲它看成是 Negetive,得到正负样本以此来训练SVM。
Bbox回归:其实回归的输入并不是这些预测的坐标数字,而是预测的坐标对应的feature map中的内容,这个内容与相对于ground truth进行对比,计算,是回归的根本依据。 通过不断的训练,得到了回归的参数,在预测时,网络产生了图像的feature map,对于任意一个预测框,背后对应了一个feature 区域,将学习到的参数与此feature区域进行运算,就会得到调整预测框的参数了。因为同类物体的特征应当相似。

Selective Search方法的主要步骤如下:

  • 使用图像分割方法来获取区域
  • 计算所有区域之间的相似度
  • 合并相似度最高的两个区域
  • 重新计算新合并的区域与其他区域的相似度
  • 重复上述过程直到整张图片都聚合成一整个区域
  • 使用一种随机的计分方式给每个区域打分, 按照分数来进行排序, 取出得分最高的几个区域,即selective search的结果.
  • 在这里插入图片描述
    还有一个问题,深度学习不是可以做到图片的分类吗?那为什么要多此一举去训练SVM?
    在RCNN中采用的分类器是SVM(支持向量机).
    事实上, 每个类别都会有一个配套的SVM, 所以对于VOC(共20个类别+1个背景)来说, 共有21个SVM分类器.
    选择SVM的原因有以下几点:
  • cnn在fine-tuning的时候,对训练数据作了比较宽松的标注, 所谓宽松的标注是指,没有强调标注位置的精确性. (????????)
  • 用于训练softmax分类器的负样本是随机采样得到的.而SVM可以通过hard negative mining的方法来提高mAP.(mAP是一个目标检测准确度的指标)
    什么是 hard negative mining?
    我们先用初始的正负样本(一般是正样本+与正样本同规模的负样本的一个子集)训练分类器, 然后再用训练出的分类器对样本进行分类, 把其中负样本中错误分类的那些样本(hard negative)放入负样本集合, 再继续训练分类器, 如此反复, 直到达到停止条件(比如分类器性能不再提升)(???????)

个人理解(RCNN训练图片时间太长,所以选择的样本量较少,支持向量机在小样本分类上的性能更胜与神经网络)

R-CNN已经可以做到对目标的定位和分类,但是它的速度很慢。
其中最主要的原因是
1、2000多个候选框都要经过神经网络提取特征,这一部分是十分耗时而且做了很多重复工作。
2、图像放缩,将大小不同的候选框缩放成和原图一样大小的图像也会产生问题。

R-CNN的缺点:
缺陷:
(1) 训练分为多个阶段,步骤繁琐:微调网络+训练SVM+训练边框回归器;
(2) 训练耗时,占用磁盘空间大;5000张图像产生几百G的特征文件;
(3) 速度慢:使用GPU,VGG16模型处理一张图像需要47s;
(4) 测试速度慢:每个候选区域需要运行整个前向CNN计算;
(5) SVM和回归是事后操作,在SVM和回归过程中CNN特征没有被学习更新.

SSP:
SPP:Spatial Pyramid Pooling(空间金字塔池化)
1.结合空间金字塔方法实现CNNs的对尺度输入。
2.只对原图提取一次卷积特征
在R-CNN中,每个候选框先resize到统一大小,然后分别作为CNN的输入,这样是很低效的。
所以SPP Net根据这个缺点做了优化:只对原图进行一次卷积得到整张图的feature map,然后找到每个候选框在feature map上的映射patch,将此patch作为每个候选框的卷积特征输入到SPP layer和之后的层。节省了大量的计算时间,比R-CNN有一百倍左右的提速。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
左上角的点(x,y)映射到 feature map上的(x′,y′) :使得(x′,y′) 在原始图上感受野(上图绿色框)的中心点 与(x,y)尽可能接近。
如何
在卷积层和全连接层之间加入了SPP layer。此时网络的输入可以是任意尺度的,在SPP layer中每一个pooling的filter会根据输入调整大小,而SPP的输出尺度始终是固定的。
SPP-net对R-CNN最大的改进就是特征提取步骤做了修改,其他模块仍然和R-CNN一样。特征提取不再需要每个候选区域都经过CNN,只需要将整张图片输入到CNN就可以了,ROI特征直接从特征图获取。和R-CNN相比,速度提高了百倍。
SPP-net缺点也很明显,CNN中的conv层在微调时是不能继续训练的。它仍然是R-CNN的框架,离我们需要的端到端的检测还差很多。既然端到端如此困难,那就先统一后面的几个模块吧,把SVM和边框回归去掉,由CNN直接得到类别和边框可不可以?于是就有了Fast R-CNN。
在这里插入图片描述
Fast R-CNN
针对上述的问题,Fast R-CNN的想法是将整个模型分成两步:
1、第一步是选取候选区域
2、第二步就是提出一个RoI层,整合了整个模型,把CNN、变换层、SVM分类器、bbox回归这几个模块整一起,大家一起训练
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大牛提出了一个可以看做单层sppnet的网络层,叫做ROI Pooling,这个网络层可以把不同大小的输入 映射到一个固定尺度的特征向量,而我们知道,conv、pooling、relu等操作都不需要固定size的输入,因此,在原始图片上执行这些操作后,虽然输入图片size不同导致得到的feature map尺寸也不同,不能直接接到一个全连接层进行分类,但是可以加入这个神奇的ROI Pooling层,对每个region都提取一个固定维度的特征表示,再通过正常的softmax进行类型识别。另外,之前RCNN的处理流程是先提proposal,然后CNN提取特征,之后用SVM分类器,最后再做bbox regression,而在Fast-RCNN中,作者巧妙的把bbox regression放进了神经网络内部,与region分类和并成为了一个multi-task模型,实际实验也证明,这两个任务能够共享卷积特征,并相互促进。Fast-RCNN很重要的一个贡献是成功的让人们看到了Region Proposal+CNN这一框架实时检测的希望,原来多类检测真的可以在保证准确率的同时提升处理速度,也为后来的Faster-RCNN做下了铺垫。

损失函数
Fast R-CNN网络分类损失和回归损失如下图所示【仅针对一个RoI即一类物体说明】,黄色框表示训练数据,绿色框表示输入目标:
在这里插入图片描述
在这里插入图片描述
论文中还包含许多细节,包括损失函数、梯度反向传播计算、候选框正反例的比例以及使用奇异值分解为FC层提速。

Faster R-CNN
Fast R-CNN存在的问题:存在瓶颈:选择性搜索,找出所有的候选框,这个也非常耗时。那我们能不能找出一个更加高效的方法来求出这些候选框呢?
解决:加入一个提取边缘的神经网络,也就说找到候选框的工作也交给神经网络来做了。
做这样的任务的神经网络叫做Region Proposal Network(RPN)。
在这里插入图片描述
侯选区域生成网络架构:
RPN网络基本设想是:在提取好的特征图上,通过一个滑动窗口获取特征向量,然后输出到两个全连接层:
一个是box-regression layer(reg)
另一个是 box-classification layer(cls).

RPN的本质是 “ 基于滑窗的无类别obejct检测器 ” :
RPN所在的位置:
在这里插入图片描述
PRN分解理解:
1、anchor
anchor的窗口尺寸,这个不难理解,三个面积尺寸(1282,2562,512^2),然后在每个面积尺寸下,取三种不同的长宽比例(1:1,1:2,2:1).这样一来,我们得到了一共9个。
在这里插入图片描述
在这里插入图片描述
2.SOFTMAX的两支
在 RPN中部, 分类分支(cls) 和 边框回归分支(bbox reg) 分别对这堆anchor进行各种计算:

全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练。
在这里插入图片描述

3、在 RPN末端,通过对 两个分支的结果进行汇总,来实现对anchor的 初步筛除(先剔除越界的anchor,再根据cls结果通过NMS算法去重)和 初步偏移(根据bbox reg结果),此时输出的都改头换面叫 Proposal 了;

网络训练方法:
我们知道,如果是分别训练两种不同任务的网络模型,即使它们的结构、参数完全一致,但各自的卷积层内的卷积核也会向着不同的方向改变,导致无法共享网络权重,论文作者提出了三种可能的方式。?????????????????????????????????
RPN与Fast R-CNN共享特征图训练
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

MaskRcnn
Mask R-CNN是ICCV 2017的best paper,本篇大作的一作是何凯明。

实例分割Mask R-CNN框架完成了三个功能:
1、目标检测,直接在结果图上绘制了目标框(bounding box)
2、目标分类,对于每一个目标,需要找到对应的类别(class),区分到底是人,是车,还是其他类别
3、像素级目标分割,在每个目标中,需要在像素层面区分,什么是前景,什么是背景
在这里插入图片描述
MaskRCNN结构:
在这里插入图片描述
在这里插入图片描述
1、用RolAlign代替了RoIPooling,RoIPooling使用取整量化,导致特征图RoI映射回原图RoI时空间不对齐明显,造成误差;RolAlign不使用取整量化而是采用双线性插值,完成像素级的对齐
2、FasterRcnn为每个候选对象ROI提供两个输出,一个类标签,一个边界框偏移量,为此,MaskRCNN并行添加了第三个分割mask的分支,mask分支是应用到每一个ROI上的一个小的FCN(Fully Convolutional Network),以pix2pix的方式预测分割mask

maskRcnn中的FPN:

在这里插入图片描述
ROI Pooling 与ROI Align:
ROI Pooling的问题:
在常见的两级检测框架(比如Fast-RCNN,Faster-RCNN,RFCN)中,ROI Pooling 的作用是根据预选框的位置坐标在特征图中将相应区域池化为固定尺寸的特征图,以便进行后续的分类和包围框回归操作。由于预选框的位置通常是由模型回归得到的,一般来讲是浮点数,而池化后的特征图要求尺寸固定。故ROI Pooling这一操作存在两次量化的过程。

1、将候选框边界量化为整数点坐标值。
2、将量化后的边界区域平均分割成 k x k 个单元(bin),对每一个单元的边界进行量化。

事实上,经过上述两次量化,此时的候选框已经和最开始回归出来的位置有一定的偏差,这个偏差会影响检测或者分割的准确度。在论文里,作者把它总结为“不匹配问题(misalignment)

下面我们用直观的例子具体分析一下上述区域不匹配问题。如 图1 所示,这是一个Faster-RCNN检测框架。输入一张800800的图片,图片上有一个665665的包围框(框着一只狗)。图片经过主干网络提取特征后,特征图缩放步长(stride)为32。因此,图像和包围框的边长都是输入时的1/32。800正好可以被32整除变为25。但665除以32以后得到20.78,带有小数,于是ROI Pooling 直接将它量化成20。接下来需要把框内的特征池化77的大小,因此将上述包围框平均分割成77个矩形区域。显然,每个矩形区域的边长为2.86,又含有小数。于是ROI Pooling 再次把它量化到2。经过这两次量化,候选区域已经出现了较明显的偏差(如图中绿色部分所示)。更重要的是,该层特征图上0.1个像素的偏差,缩放到原图就是3.2个像素。那么0.8的偏差,在原图上就是接近30个像素点的差别,这一差别不容小觑。

在这里插入图片描述
ROI Align 的主要思想和具体方法:
为了解决ROI Pooling的上述缺点,作者提出了ROI Align这一改进的方法(如图2)。ROI Align的思路很简单:取消量化操作,使用双线性内插的方法获得坐标为浮点数的像素点上的图像数值,从而将整个特征聚集过程转化为一个连续的操作。
1、遍历每一个候选区域,保持浮点数边界不做量化
2、将候选区域分割成k x k个单元,每个单元的边界也不做量化
3、在每个单元中计算固定四个坐标位置,用双线性内插的方法计算出这四个位置的值,然后进行最大池化操作在这里插入图片描述
在这里插入图片描述

参考博客:
1、https://blog.csdn.net/qq_36269513/article/details/80421990
2、https://blog.csdn.net/ying86615791/article/details/72788414
3、https://www.cnblogs.com/skyfsm/p/6806246.html
4、https://www.cnblogs.com/kk17/p/9748378.html
5、https://blog.csdn.net/u011974639/article/details/78053203#anchors
6、https://blog.csdn.net/u011918382/article/details/79455407
论文:
参考文献:
[1] R. Girshick, J. Donahue, T. Darrell, and J. Malik, “Rich feature hierarchies for accurate object detection and semantic segmentation,”in CVPR, 2014
[2] K. He, X. Zhang, S. Ren, and J. Sun. Spatial pyramid pooling in deep convolutional networks for visual recognition. In ECCV, 2014.
[3] R. Girshick. Fast R-CNN. arXiv:1504.08083, 2015.
[4] Shaoqing Ren Kaiming He Ross Girshick Jian Sun. Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks.arXiv:1506.01497,2015
[5]Mask R-cnn,Kaiming He, Georgia Gkioxari, Piotr Dollár, Ross Girshick,2017

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值