目录
R-CNN(SPP-Net)与Fast-RCNN不同的样本采样
上一次分析了YOLO系列的算法:
yolo系列网络算法的演变过程_RayChiu757374816的博客-CSDN博客
本文重点分析一下R-CNN系列算法的演变历史,还是这张图:
R-CNN
论文链接
https://arxiv.org/abs/1311.2524
概述
由于Alex-Net和VGG等深度网络在分类任务的成功应用,大家逐渐发现,深度网络自主提取的特征要比传统的手工方式提取的特征更加丰富,于是开始尝试在检测任务中使用深度网络来提取特征。R-CNN算是很经典的一篇论文,当时很多Detection algorithm都是利用图片本身的颜色,纹理,梯度等low-level图片特征进行检测。R-CNN引进了CNN以及proposal等来进行检测,同时也利用pre-training来解决一些样本量很少的任务。
R-CNN流程
- 先利用Selective Search在每个图片选出大约2k个region proposals
- 由于之后的网络结构只能接受相同大小的proposal,所以需要把每一个proposal拉伸(warp)成227*227大小
- 如果proposal与GT IOU大于阈值(0.5)标记为正样本,否则是负样本
- 对于每一个proposal利用CNN提取特征(效率非常慢)
- 利用这些特征训练一个SVM分类器,从而得出相应类别的分数(单独训练的分类器)
- 利用NMS去掉一些冗余的候选框,大致的Detection就完成了
- 很容易发现许多proposal都不精确,因此使用Bounding Box Regression对候选框进行微调
谈一下R-CNN的pre-training
针对很多数据集样本很少,很难单独的使用一个数据集进行训练跟检测,R-CNN首先在其他样本较多与目标数据集任务相似的副本数据集进行有监督预训练,保留其训练的模型参数,利用目标数据集对某些网络进行微调(domain-specific fine-tuning),这样可以产生更好的性能,这也是本文的亮点之一。
谈一下R-CNN不同阶段正负样本的IOU阈值
首先在fine-tuning阶段,IOU阈值为0.5,即大于0.5的都是目标,小于0.5的都是背景,而在SVM训练时,小于0.3的都是负样本,正样本为GT。
为什么要分开设置阈值呢?在fine-tuning期间,为了防止过拟合,阈值设置的宽松一点,就是就算有一半左右的物体与GT相交,那也是算是物体,而不是背景。在训练SVM的时候,则正样本只有GT,阈值大于0.3的忽略掉,小于0.3的算负样本(0.3也是通过实验挑选出来的)。之所以要重新训练SVM,也是因为在之前fine-tuning网络的时候设置的阈值较为宽松,所以softmax进行分类的性能其实并不是很理想。因此重新训练了一个SVM分类器,效果相比softmax更理想了。
谈一下R-CNN的fine-tuning
fine-tuning用来微调一些参数,毕竟在副本任务训练不是当前数据集本身,肯定还是有差距的,CNN通常第一层提取出一些线条,边缘,之后更深的层则将这些基础特征组合起来,副本任务可以理解为提取大多数图像的共同的基本特征(这也就要求副本任务与目标任务要相近),通过在目标任务fine-tuning进行微调,使得detector对提取到目标数据集独特的特征与信息,同时文章中的实验也体现了fine-tuning的重要性与必要性,本文在fine-tuning时将原来网络1000个分类改为N+1(N为类别数量,1为背景)个分类,为了防止过大的影响原来的参数,学习率为预训练学习率的1/10。
对R-CNN的一些思考
1.输入一个图片会通过ss选择搜索产生2k左右proposals,每一个proposal都需要单独进行CNN提取特征,资源消耗大。
2.特征抽取模型和区域的分类回归SVM模型分开训练,无法进行端到端的模型训练,训练过程需要提取每个包含重叠区域的候选区域特征并保存用于分类和回归训练
3.CNN网络之前必须将proposal进行变形称为固定的227*227是否可以接受任意形状的图片呢。
4.proposals存在重叠,重复编码导致实时性不佳,并且加重了CNN提特征的压力。
SPP-Net
论文地址:
https://arxiv.org/abs/1406.4729
SPP-Net概述
R-CNN在当时取得了很大的成果,但是他还是有一些问题,最突出的就是效率问题:1. 对于每张图片的每个proposal跑一边CNN,做了很多冗余的操作。2.proposal在送进网络之前都要进行拉伸(warp),这样会影响图片的质量以及内容,同时也比较费时费力。
SPP-Net的创新
一次性full-image卷积
SPP-Net依然是提特征和分类分开训练,分类还是SVM,但是R-CNN是先利用SS选择搜索生成2K 个proposals,然后warp后2K个proposals每一个proposal都过一遍CNN提特征,而SPP-Net是先利用SS选择搜索生成2K 个proposals并不马上使用,而是单独将整图过CNN提特征得到feature map,然后拿过来之前proposals对应的位置对应到feature map特征图上,因为任意的原始图像中的输入是可以映射到特征图中的,卷积只会改变空间分辨率,不改变比例和位置。这个操作的结果就是以前需要提2K次特征,现在只需要提一次了。
空间金字塔池化(亮点)
将任意尺度(大于4*4)大小的特征,通过一个“池化金字塔”进行3种pooling,串接起来得到固定的21维作为FC层的输入,从而避免了固定尺寸输入的约束,如下。
以前为了满足全连接层固定大小输入,需要在输入图进行缩放,然后提取特征。现在既然已经可以在特征空间进行缩放了,那么就不必要求输入一样大了。
多尺度训练与测试
理论上SPP-Net可以用于任何尺寸的图片输入,但在训练时候不能随意输入任意大小的图片,因为“池化金字塔”的n x n “bins“需要提前设定,不同的尺寸的图片用同一Spatital Pyramid Pooling可能会输出不同规格的feature map。
训练过程中,其实使用的是共享参数的多个固定尺寸的网络实现了不同输入尺寸的SPP-Net。其中从一个尺寸编导另一个尺寸使用的缩放而不是裁剪,这样不同尺度的区域仅仅是分辨率上的不同,内容与布局没有变化。
为了降低从一个网络(比如224)向另一个网络(比如180)切换的开销,在每个网络上训练一个完整的epoch,然后在下一个完成的epoch再切换到另一个网络(权重保留)。依此往复。实验中发现多尺寸训练的收敛速度和单尺寸差不多。多尺寸训练的主要目的是在保证已经充分利用现在被较好优化的固定尺寸网络实现的同时,模拟不同的输入尺寸.
注意,上面的多尺寸解析度只用于训练。在测试阶段,是直接对各种尺寸的图像应用SPP-net的。
SPP-Net还有些不足
- 虽然解决了R-CNN许多大量冗余计算的问题,但是还是沿用了R-CNN的训练结构,也训练了SVM分类器, 单独进行BBox regression。
- SPP-Net 很难通过fine-tuning对SPP-layer之前的网络进行参数微调,效率会很低,原因具体是(Fast-RCNN中的解释): SPP做fine-tuning时输入是多个不同的图片,这样对于每一个图片都要重新产出新的feature map,效率很低,而Fast-RCNN对其进行了改进。
Fast R-CNN
论文地址
Fast R-CNN网络结构
Fast R-CNN网络结构在R-CNN和SPP-Net做了优化,相比较R-CNN和SPP-Net解决了训练步骤复杂、冗余的缺点,不再最后单独训练一个SVM分类器分类,而是在提完特征后在网络最后接softmax让分类与回归同时进行,实现了端到端模型训练,不需要存储中间特征向量用于SVM分类和回归模型训练。
其次它利用了ROI pooling layer(可以看做SPP的简化版) 进行固定送入FC层的feature尺寸,从而达到对任意尺寸的图像进行训练及测试。
同时还证明了深度网络具有较好的scale-invariance,即对scale并不是特别敏感。
ROI pooling
ROI pooling是一个简化的spp池化,不需要这么复杂,直接一次分块pooling就行了,在经过了从原始空间到特征空间的映射之后,设定好一个pooled_w,一个pooled_h,就是将W*H的输入pooling为pooled_w*pooled_h的特征图,然后放入全连接层。 它完成的下面的输入输出的变换。
SVD分解实现FC层加速
图像分类任务中,用于卷积层计算的时间比用于全连接层计算的时间多,而在目标检测任务中,selective search算法提取的建议框比较多,几乎有一半的前向计算时间被花费于全连接层,因此在Fast R-CNN中可以采用SVD分解加速全连接层计算;
使用softmax进行预测
由于softmax在分类过程中引入了类间竞争,分类效果更好,文中分别进行实验并对比了采用SVM和采用softmax的mAP结果,很多网络采用softmax的mAP都比采用SVM的mAP高。
单尺度训练与测试
brute-force(单一尺度)和image pyramids(多尺度)。单一尺度直接在训练和测试阶段将image定死为某种scale,直接输入网络训练就好,然后期望网络自己能够学习到scale-invariance的表达;多尺度在训练阶段随机从图像金字塔(缩放图片的scale得到,相当于扩充数据集)中采样训练,测试阶段将图像缩放为金字塔中最为相似的尺寸进行测试;
可以看出,多尺度应该比单一尺度效果好。作者在5.2节对单一尺度和多尺度分别进行了实验,不管哪种方式下都定义图像短边像素为s,单一尺度下s=600(维持长宽比进行缩放),长边限制为1000像素;多尺度s={480,576,688,864,1200}(维持长宽比进行缩放),长边限制为2000像素,生成图像金字塔进行训练测试;实验结果表明AlexNet(S for small)、VGG_CNN_M_1024(M for medium)下单一尺度比多尺度mAP差1.2%~1.5%,但测试时间上却快不少,VGG-16(L for large)下仅单一尺度就达到了66.9%的mAP(由于GPU显存限制多尺度无法实现),该实验证明了深度神经网络善于直接学习尺度不变性,对目标的scale不敏感。
R-CNN(SPP-Net)与Fast-RCNN不同的样本采样
R-CNN和SPPnet中采用RoI-centric sampling:从所有图片的所有候选区域中均匀取样,这样每个SGD的mini-batch中包含了不同图像的样本,不同图像之间不能共享卷积计算和内存,运算开销大;
Fast R-CNN中采用image-centric sampling: mini-batch采用层次采样,即先对图像采样(N个),再在采样到的图像中对候选区域采样(每个图像中采样R/N个,一个mini-batch共计R个候选区域样本),同一图像的候选区域卷积共享计算和内存,降低了运算开销;
需要fine-tuning的参数
SPPnet论文中采用ZFnet(AlexNet的改进版)这样的小网络,其在微调阶段仅对全连接层进行微调,就足以保证较高的精度,作者文中采用VGG-16(L for large)网络,若仅仅只对全连接层进行微调,mAP会从66.9%降低到61.4%, 所以文中也需要对RoI池化层之前的卷积层进行微调;
那么问题来了?向前微调多少层呢?所有的卷积层都需要微调吗?
作者经过实验发现仅需要对conv3_1及以后卷积层(即9-13号卷积层)进行微调,才使得mAP、训练速度、训练时GPU占用显存三个量得以权衡;
作者说明所有AlexNet(S for small)、VGG_CNN_M_1024(M for medium)的实验结果都是从conv2往后微调,所有VGG-16(L for large)的实验结果都是从conv3_1往后微调。
Fast R-CNN 多任务训练及损失函数
分类和回归多任务训练训练方便、简洁,任务间共享卷积层,实验发现比不采用多任务模式mAP提高了0.8%~1.1%
图中cls_score层用于分类,输出K+1维数组p,表示属于K类物体和背景的概率;
bbox_predict层用于调整候选区域位置,输出4*K维数组,也就是说对于每个类别都会训练一个单独的回归器;
loss_cls层评估分类代价,由真实分类u对应的概率决定( is log loss for true class .):
loss_bbox评估回归损失代价,比较真实分类u对应的预测平移缩放参数和真实平移缩放参数的差距:
t代表预测值,v代表真实值,u代表类别,其中
L1 loss相对R-CNN与SPP-Net中的L2 loss对异常值更不敏感,同时也能有效防止梯度爆炸
smooth L1损失函数曲线如下图所示,相比于L2损失函数,其对离群点、异常值不敏感,可控制梯度的量级使训练时不容易跑飞;
微调时总得损失函数为:
Fast R-CNN待改进点
沿用了R-CNN SPP-Net的选择性搜索获取候选区算法,效率低下比较耗时,也不能使用GPU资源加速。
Faster R-CNN
论文地址
https://arxiv.org/abs/1506.01497
概述
Fast R-CNN还是用的Selective Search来提取region proposal, Faster R-CNN就此问题提出了使用RPN生成region proposal,然后再接上Fast R-CNN形成了一个完全的end-to-end的CNN对象检测模型,可以完全在GPU运行,同时RPN与后面的detection network 共享full-image convolutional features。
Faster R-CNN算法总体流程:
- 利用预训练的一些网络对原图进行卷积池化等操作得到一个full-image convolutional feature map(这个过程通常会利用padding保证卷积过程中输入size =输出size,这样只有在池化过程中size才会发生改变,从而方便利用feature map找到原图的区域)
- 通过RPN生成一些带着有物体置信度(objectness score)的矩形proposal(RPN通过softmax判断proposal为物体还是背景以及用简单BBox regression 对proposal进行修正)
- 将feature map 与 通过RPN生成的proposal作为RoI pooling layer的输入,从而得到固定size的proposal feature map
- 最后将所有的proposal feature map 送到检测网络中,利用1x1卷积进行分类与BBox回归。
可以发现,其他上述流程等于在Fast RCNN加了一个RPN生成proposal,同时对proposal进行了两次调修与分类,使得结果更加准确。因为两个网络共享相同的full-image convolutional feature map 与 计算,所以相比Fast RCNN效率有了很大的提高。
使用RPN提取候选框
提取候选框方法的发展历程
提取候选框这个事情是有一个发展历程的,最开始古典目标识别采用的是图像金字塔扫描整图,在原图上穷举,后来有了Selective Search选择区域搜索合并颜色纹理等特征相近的区域找到候选框避免了滑动,有点尺寸聚类的意思了,但还是需要在原图中离线操作,因为特征提取不能共享,效率上还是非常不可接受。
region proposal network,是一个小小的网络,它取代Selective Search来得到一系列的proposal,又重新回归到滑动思想上了,但是RPN滑动不是基于的原图,而是基于的卷积后的conv featrue map特征空间(例如原来要基于原图224*224换到了基于特征空间13*13),另外卷积网络让目标检测这个事情更加端到端化。
RPN流程和anchor机制
如上边Faster R-CNN 流程第一步所述,基于卷积层提取的featrue map层,定义了一个anchor锚点概念,以anchor为中心3种不同大小面积3种宽高形状,3*3=9个框在特征图上扫描得出最后的候选框,供给RoI pooling使用
RPN正负样本的定义
a. 对每个标定的真值候选区域,与其重叠比例最大的anchor记为前景样本
b. 对a)剩余的anchor,如果其与某个标定重叠比例大于0.7,记为前景样本;如果其与任意一个标定的重叠比例都小于0.3,记为背景样本
c. 对a),b)剩余的anchor,弃去不用。
d. 跨越图像边界的anchor弃去不用
RPN的损失函数和共享特征训练
RPN的loss function 学习了 Fast R-CNN中的loss function,如下:
其中,i代表anchor在mini-batch里的序号,pi代表预测为物体的概率,pi∗ = 1代表GT是物体,否则为背景。同理titi代表的是预测的proposal框的四个点,ti∗代表GT的坐标点。Lcls代表的是是否为物体的log loss,Lreg用的是Fast R-CNN里的smoothL1,而具体的参数形式为R-CNN附录中的求解方式(边框回归),这两部分通过Ncls,Nreg来标准化,通过λ来进行平衡权重。
值得注意的是, 之前模型的BBox regression通常是所有的尺度共享参数,在Fast R-CNN中,他对不同的anchor分别训练了不同的回归器,共有k个。
RPN用来获取候选框,分类交给Fast R-CNN,如何把这两者放在同一个网络结构中训练出一个共享卷积的Multi-task网络模型。
我们知道,如果是分别训练两种不同任务的网络模型,即使它们的结构、参数完全一致,但各自的卷积层内的卷积核也会向着不同的方向改变,导致无法共享网络权重,论文作者提出了三种可能的方式:Alternating training、Approximate joint training、Non-approximate training,而实际上源码给出的是另外的一种方式4-Step Alternating Training:
FPN(特征金字塔网络多尺度目标检测)
论文地址
https://arxiv.org/abs/1612.03144
概述
在以往的faster rcnn进行目标检测时,无论是rpn还是fast rcnn,roi 都作用在最后一层,这在大目标的检测没有问题,但是对于小目标的检测就有些问题。因为对于小目标来说,当进行卷积池化到最后一层,实际上语义信息已经没有了,因为我们都知道对于一个roi映射到某个feature map的方法就是将底层坐标直接除以stride,显然越后,映射过去后就越小,甚至可能就没有了。 所以为了解决多尺度检测的问题,引入了特征金字塔网络,这个trick被后来的yolo3借鉴使用,对小目标检测效果提升明显。
Mask-RCNN
论文地址
http://cn.arxiv.org/pdf/1703.06870v3
概述
Mask-RCNN 大体框架还是 Faster-RCNN 的框架,可以说在基础特征网络之后又加入了全连接的分割子网,由原来的两个任务(分类+回归)变为了三个任务(分类+回归+分割)。Mask R-CNN 是一个两阶段的框架,第一个阶段扫描图像并生成提议即RPN部分(proposals,即有可能包含一个目标的区域),第二阶段分类提议并生成边界框和掩码即MRCNN部分。
其实来说RoI这块是有所变化,对于语义分割任务来说,一个非常重要的要求便是特征层和输入层像素的一对一,ROI池化显然不满足该要求。为了改进这个问题,Mask-RCNN双线性插值提出了ROIAlign