深度学习物体检测

深度学习物体检测

一、R-CNN(Region-CNN)

1、文章:《Rich feature hierarchies for accurate object detection and semantic segmentation》2014
【用于精确物体定位和语义分割的丰富特征层次结构】
文章翻译:https://blog.csdn.net/v1_vivian/article/details/78599229

2、R-CNN框架:
(1)候选区域生成(region proposal):Selective Search(选择性搜索)
(2)对每个候选区域利用深度学习网络(AlexNet),进行特征提取
(3)特征送入每一类SVM分类器中判别
(4)回归器修正候选框位置

细节:
(1)Selective Search:
选择搜索算法的主要观点:图像中物体可能存在的区域应该是有某些相似性或者连续性区域的。因此,选择搜索基于上面这一想法采用子区域合并的方法进行提取bounding boxes候选边界框。
首先,对输入图像进行分割算法产生许多小的子区域。
其次,根据这些子区域之间相似性(相似性标准主要有颜色、纹理、大小等等)进行区域合并,不断的进行区域迭代合并。
每次迭代过程中对这些合并的子区域做bounding boxes(外切矩形),这些子区域外切矩形就是通常所说的候选框。
Selective search 原理+代码:https://blog.csdn.net/guoyunfei20/article/details/78723646

(2.1)CNN的输入 / 图片变化(只接受固定大小 277*277)
图片变形之前,我们现在候选框周围加上16的padding,再进行各向异性缩放

@各向异性缩放:
这种方法很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227,如下图(D)所示

@各项同性缩放:
因为图片扭曲后,估计会对后续CNN的训练精度有影响,于是作者也测试了“各向同性缩放”方案。这个有两种办法:
A、直接在原始图片中,把bounding box的边界进行扩展延伸成正方形,然后再进行裁剪;如果已经延伸到了原始图片的外边界,那么就用bounding box中的颜色均值填充;如下图(B)所示;
B、先把bounding box图片裁剪出来,然后用固定的背景颜色填充成正方形图片(背景颜色也是采用bounding box的像素颜色均值);如下图(C)所示;
在这里插入图片描述
(2.2)CNN的训练
a. 预训练 ( ImageNet数据集 ILVCR 2012 + AlexNet )
i. 此网络提取的特征为4096维,之后送入一个4096->1000的全连接(fc)层进行分类,学习率0.01。
ii. 使用ILVCR 2012的全部数据进行训练,输入一张图片,输出1000维的类别标号。在这里插入图片描述

b. 调优训练 (PASCAL VOC 2007数据集 + AlexNet修改)
i. 同样使用上述网络Alexnet,最后一层换成4096->21的全连接网络。学习率0.001,每一个batch包含32个正样本(属于20类)和96个背景。
ii. 使用PASCAL VOC 2007的训练集,输入一张图片,输出21维的类别标号,表示20类+1背景。

注1:既然这里CNN已经训练好了,可以用于20类+1个背景的分类的,那为什么还需要再把提取的特征用于训练svm分类器?
答:事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding box可能只包含物体的一部分,那么我也把它标注为正样本,用于训练cnn;采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding box的位置限制条件限制的比较松(IOU只要大于0.5都被标注为正样本了);
然而svm训练的时候,因为svm适用于少样本训练,所以对于训练样本数据的IOU要求比较严格,我们只有当bounding box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。
总的来说,就是加上一个SVM分类器,识别精度更高了!

注2:使用什么网络?
答:网络架构我们有两个可选方案:第一选择经典的Alexnet;第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个模型的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。后面为了简单起见,我们就直接选用Alexnet,并进行讲解;Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为9216、 f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。

(3)SVM分类器
对每一类目标,都训练一个线性的SVM分类器,输入为深度网络输出的4096维特征,输出是否属于此类。
训练
正样本
本类的真值标定框
负样本
考察每一个候选框,如果和本类所有标定框的重叠IOU都小于0.3,认定其为负样本
方法
由于训练数据太大,难以装进内存,我们选择了标准的hard negative mining method

注1:难负例挖掘算法,用途就是正负例数量不均衡,而负例分散代表性又不够的问题,hard negative就是每次把那些顽固的棘手的错误,再送回去继续练,练到你的成绩不再提升为止.这一个过程就叫做’hard negative mining‘。高难负例挖掘算法收敛很快,实践中只要在所有图像上经过一轮训练,mAP就可以基本停止增加了。

注2: 为什么在fine-tunning和SVM训练这两个阶段,我们定义得正负样例是不同的?
答:fine-tunning阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松: IoU>0.5的建议框为正样本,否则为负样本; SVM这种机制是由于其适用于小样本训练,故对样本IoU限制严格:Ground Truth为正样本,与Ground Truth相交IoU<0.3的建议框为负样本。

注3:为什么训练一个分类器是必要的,而不只是简单地使用来自调优后的CNN的最终fc8层的输出?
答:为什么单独训练了一个SVM而不是直接用softmax,作者提到,刚开始时只是用了ImageNet预训练了CNN,并用提取的特征训练了SVMs,此时用正负样本标记方法就是前面所述的0.3,后来刚开始使用fine-tuning时,也使用了这个方法,但是发现结果很差,于是通过调试选择了0.5这个方法,作者认为这样可以加大样本的数量,从而避免过拟合。然而,IoU大于0.5就作为正样本会导致网络定位准确度的下降,故使用了SVM来做检测,全部使用ground-truth样本作为正样本,且使用非正样本的,且IoU大于0.3的“hard negatives”,提高了定位的准确度

(4)回归器(Bounding-box regression)
对每一类目标,使用一个线性回归器进行精修。正则项 λ=10000
输入为深度网络pool5层的4096维特征
输出为xy方向的缩放和平移。
训练样本
判定为本类的候选框中,和真值重叠面积 IoU大于0.6 的候选框。

二、SPP(Spatial Pyramid Pooling)

文章:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》

存在问题R-CNN要求输入图像有一个固定大小
解决方法将SSP结构放在卷积层和全连接层之间
在这里插入图片描述
SPP核心思想
在这里插入图片描述

  1. SPP的核心在于使用多个不同尺寸sliding window pooling(上图中的蓝色44、青色22、灰色1*1窗口)对上层(卷积层)获得的feature maps 进行采样(池化,文中使用最大池化),将分别得到的结果进行合并就会得到固定长度的输出。
  2. 上图可以看出SPP层就是在前一卷积层得到的feature maps上进行了3个池化操作(实际情况根据自己设定的池化个数,控制全连接层的输入,下面会讲)。最右边的就是原图像,中间的是把图像分成大小是4的特征图,最右边的就是把图像分成大小是16的特征图。这样每一个feature map就会变成固定的21(16+4+1)个feature maps。

通俗的讲,SPP就相当于标准通道层,不管任何大小的图像,我都用一套标准的pool (文中说叫: l-level pyramid)对图像进行池化,最后组合成一列相同大小的特征,作为全连接层的输入,这一组相同大小的特征是固定的,可以提前进行计算,计算的方法和规则下面进行讲解。

参考文章:https://blog.csdn.net/qq_27871973/article/details/81037751

三、Fast R-CNN

相对于R-CNN与SPP-net,Fast R-cnn的主要亮点有
(1)Fast R-CNN将借助多任务损失函数,将物体识别和位置修正合成到一个网络中,不再对网络进行分步训练,不需要大量内存来存储训练过程中特征的数据;
(2) 用ROI层代替SPP层,可以使用BP(反向传播)算法更高效的训练更新整个网络。

1. Fast R-CNN框架介绍
在这里插入图片描述
一张包含多个ROI(regions of interest)的图片(上图便于说明只显示一个ROI,灰色部分)输入一个多层的卷积网络中,获得Conv feature map,然后每一个ROI被池化成一个固定大小的feature map,feature map被全连接层拉伸成一个特征向量;
对于每一个ROI,经过FC层后得到的feature vector最终被分享:一个进行全连接之后用来做softmax回归,用来对ROI区域做物体识别,另一个经过全连接之后用来做b-box regression做修正定位,使得定位框更加精准。

2.主要内容
2.1 ROI Pooling Layer
不同于前面的SPP,在Fast RCNN网络中,RoI来完成SPP层的作用。RoI指的是在一张图片上完成Selective Search后得到的“候选框”在特征图上的一个映射,RoI层的作用主要有两点:
(1)考虑到感兴趣区域(RoI)尺寸不一,但是输入图中后面FC层的大小是一个统一的固定值,因为ROI池化层的作用类似于SPP-net中的SPP层,即将不同尺寸的RoI feature map池化成一个固定大小的feature map。具
(2)其次RoI有四个参数(r,c,h,w)除了尺寸参数h,w外,还有两个位置参数r,c、表示RoI的左上角在整个图片中的坐标。

2.2 从与训练网络中初始化
作者使用有5个最大池化层和5到13个不等的卷积层的三种网络进行预训练:CaffeNet,VGG_CNN_M_1024,VGG-16,使用这些网络初始化Fast R-CNN前,需要以下修改:
(1)用RoI pooling layer取代网络的最后一个池化层
(2)最后一个FC层和softmax被替换成fast R-CNN框架图介绍的两个并列层
(3)输入两组数据到网络:一组图片和每一个图片的一组RoIs

2.3 微调网络用来检测
不同于SPP-net,Fast R-CNN整个网络可以被使用BP算法训练是一个极大的优点,论文中作者提到SPP层中的感受野非常大,使用BP算法训练时效率低。作者利用特征分享的优势,提出一个更加有效的训练方法:SGD mini_batch分层采样方法

首先随机取样N张图片,然后每张图片取样R/N个RoIs 。除此之外,网络在一次微调中将softmax分类器和bbox回归一起优化,区别于R-CNN的softmax回归,SVM,bbox回归的三步分开优化。

一步优化中涉及到:多任务损失(multi-task loss)、小批量取样(mini-batch sampling)、RoI pooling层的反向传播(back-propagation through RoI pooling layers)、SGD超参数(SGD hyperparameters),其中multi-task loss在论文里对应着分类任务和定位任务的结合,back-propagation through RoI pooling layers在论文里作者详细讲解了如何使用BP算法对RoI层训练,这两个小部分比较重要,也是论文的核心亮点,以后有机会单独拿出来学习一下。

2.4 尺度不变性
作者测试了两种方法来实现目标检测的尺度不变性:“强制”学习和图像金字塔方法。在“强制”方法中,在训练和测试过程中,每个图像都按照预先定义的像素大小进行处理。网络直接从训练数据中学习尺度不变性检测。相比之下,多尺度方法通过图像金字塔为网络提供了近似的尺度不变性。在测试时,使用图像金字塔方法对each object proposal进行标准化。

3.训练过程/测试过程
3.1 训练过程
对训练集中的图片,用selective search提取出每一个图片对应的一些proposal,保存图片路径和bounding box信息;

对每张图片,根据图片中bounding box的ground truth信息,给该图片的每一个proposal标记类标签,并保存。具体操作:对于每一个proposal,如果和ground truth中的proposal的IOU值超过了阈值(IOU>=0.5),则把ground truth中的proposal对应的类标签给原始产生的这个proposal,其余的proposal都标为背景;

使用mini-batch=128,25%来自非背景标签的proposal,其余来自标记为背景的proposal;

训练CNN,最后一层的结果包含分类信息和位置修正信息,用多任务的loss,一个是分类的损失函数,一个是位置的损失函数。

3.2 测试过程
用selective search方法提取图片的2000个proposal,并保存到文件;

将图片输入到已经训好的多层全卷积网络,对每一个proposal,获得对应的RoI Conv featrue map;

对每一个RoI Conv featrue map,按照2.1中的方法进行池化,得到固定大小的feture map,并将其输入到后续的FC层,最后一层输出类别相关信息和4个boundinf box的修正偏移量;

对bounding box 按照上述得到的位置偏移量进行修正,再根据nms对所有的proposal进行筛选,即可得到对该张图片的bounding box预测值以及每个bounding box对应的类和score。

参考文章:https://blog.csdn.net/qq_27871973/article/details/81121995

四、Faster R-CNN

1.文章:《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》
亮点:因为在Fast R-CNN文章中的测试时间是不包括search selective时间的,而在测试时很大的一部分时间要耗费在候选区域的提取上。
Faster R-CNN提出了一个叫RPN(Region Proposal Networks)的网络,专门用来推荐候选区域的,RPN可以理解为一种全卷积网络,该网络可以进行end-to-end的训练,最终目的是为了推荐候选区域。

2. Faster R-CNN结构
在这里插入图片描述
通过上面两张图可以看出Faster R-CNN由四个部分组成:
1)卷积层(conv layers),用于提取图片的特征,输入为整张图片,输出为提取出的特征称为feature maps
2)RPN网络(Region Proposal Network),用于推荐候选区域,这个网络是用来代替之前的search selective的。输入为图片(因为这里RPN网络和Fast R-CNN共用同一个CNN,所以这里输入也可以认为是featrue maps),输出为多个候选区域,这里的细节会在后面详细介绍。
3)RoI pooling,和Fast R-CNN一样,将不同大小的输入转换为固定长度的输出,输入输出和Faste R-CNN中RoI pooling一样。
4)分类和回归,这一层的输出是最终目的,输出候选区域所属的类,和候选区域在图像中的精确位置。

注1RPN网络
在这里插入图片描述
原文中RPN网络为CNN后面接一个33的卷积层,再接两个11的卷积层(原文称这两个卷积层的关系为sibling),其中一个是用来给softmax层进行分类,另一个用于给候选区域精确定位

到这里其实有个疑问没有说清楚,也算是理解这篇文章的重点,通过CNN得到的feature map怎么可以通过RPN得到与原图对应的候选区域的,换句话说,RPN输出的候选区域和softmax的结构怎么与原图中的区域进行对应的。要解决这个疑问就得先理解anchors的概念。

RPN网络与Fast R-CNN网络的权值共享
RPN最终目的是得到候选区域,但在目标检测的最终目的是为了得到最终的物体的位置和相应的概率,这部分功能由Fast R-CNN做的。因为RPN和Fast R-CNN都会要求利用CNN网络提取特征,所以文章的做法是使RPN和Fast R-CNN共享同一个CNN部分。
Faster R-CNN的训练方法主要分为两个,目的都是使得RPN和Fast R-CNN共享CNN部分,如下图所示
在这里插入图片描述
一个是迭代的,先训练RPN,然后使用得到的候选区域训练Fast R-CNN,之后再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次训练RPN(这里不更新CNN,仅更新RPN特有的层),最后再次训练Fast R-CNN(这里不更新CNN,仅更新Fast R-CNN特有的层)。

从R-CNN到Faster R-CNN
https://www.cnblogs.com/skyfsm/p/6806246.html

五、Mask RCNN

六、YOLO

  1. YOLO V1:https://blog.csdn.net/shuiyixin/article/details/82533849
    https://blog.csdn.net/shuiyixin/article/details/82560920
    https://blog.csdn.net/m0_37192554/article/details/81092514

  2. YOLO V2:https://blog.csdn.net/wfei101/article/details/78944891
    https://blog.csdn.net/lwplwf/article/details/82895409
    1)BatchNorm: https://www.cnblogs.com/guoyaohua/p/8724433.html
    2)AnchorBox: https://www.jianshu.com/p/91744fa8a195

  3. YOLO V3:https://blog.csdn.net/leviopku/article/details/82660381

七、SSD

八、FPN

九、Overfeat

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值