打开网易新闻 查看精彩图片

深度学习目标检测R-CNN,快,快
流程图

2022全新千峰JavaEE+分布式开发

download:https://www.zxit666.com/5468/

备用 3w zxit666 com

R-CNN(具有CNN特征的区域)是深度学习领域的经典框架之一。卷积神经网络(CNN)首次被引入目标检测领域,并取得了优异的效果。为了实现这一目标,本文解决了两个主要问题:用深度网络定位目标,用少量标注数据集训练高容量模型。
结构
目标检测包括三个模块。
生成独立的区域候选框。
更大的卷积网络用于从每个区域提取固定长度的特征向量。
用于分类的一些线性SVM(支持向量机)
最后其实还有一部分,用回归算法来细化候选区域。基本流程图如下:
确定候选区域
文章的这一部分使用选择性搜索,这是一种传统的目标检测算法文章只是顺带一提,这里就不赘述了。算法的具体原理可以参考:了解选择性搜索-Zhihu (zhihu.com)。
这里使用它来生成两千个候选区域。
特征抽出
在该部分中,通过五个卷积层和两个全连接层,将输入的227*227 RGB图像提取为4096维特征向量。卷积网络的结构如下:

打开网易新闻 查看精彩图片

对于任意面积大小的图像,这里最后的方法是直接拉伸,换算成227*227。但是在拉伸之前,面积框会被放大,这样拉伸出来的图片就有了原图的P像素上下文(这里p = 16)。
在本文的支持材料中讨论了几种不同的warp方法。
SVM+NMS
对于每个类别,作者使用相应的训练SVM对提取的特征向量进行评分。当对所有候选区域进行评分时,对每个类别使用NMS(非最大抑制)算法,并扔掉那些具有较高白条的区域。
给定阈值的区域。这一部分的详细描述如下:
借据
顾名思义,交集超过并集计算两个矩形框的交集面积除以并集面积。
该值的取值范围为[0,1],0表示完全不相交,1表示完全相同。
网络管理站(Network Management System)
NMS用于删除重复的框,效果如下
其算法原理并不复杂,主要有以下几个步骤:
给定n个候选框,按照分数排序。
遍历每个框,计算它与其他框的IoU,如果它大于某个阈值,则丢弃相应的框(因为这两个框很可能是同一个东西)
重复上述步骤,直到所有盒子都被处理(保留或丢弃)。
Python代码如下:
将numpy作为np导入
def nms(dets,thresh):
" " ":dets给出的候选人框
:阈值
预定的退货箱
"""
#获取关于dets的各种信息
x1 = dets[:,0]
y1 = dets[:,1]
x2 = dets[:,2]
y2 = dets[:,3]
分数=细节[:,4]
面积= (x2 - x1 + 1) * (y2 - y1 + 1)
order = scores.argsort()[::-1]
keep = []
当order.size > 0时:
i =顺序[0]
keep.append(i)
xx1 = np.maximum(x1[i],x1[order[1:]])
yy1 = np.maximum(y1[i],y1[order[1:]])
xx2 = np.minimum(x2[i],x2[order[1:]])
yy2 = np.minimum(y2[i],y2[order[1:]])
w = np.maximum(0.0,xx2 - xx1 + 1)
h = np.maximum(0.0,yy2 - yy1 + 1)
inter = w * h
#计算欠条
ovr = inter/(areas[I]+areas[order[1:]]-inter)
#保留那些IoU低于thresh的盒子
inds = np.where(ovr
order = order[inds + 1]
返回保留
复制代码
火车
预培训
在CNN ILSVRC 2012训练集上进行预训练,训练集有图像级标注(即没有候选框)。
调整
为了使细胞神经网络适应目标检测的新任务,作者使用缩放后的候选区域对网络进行微调。在这个过程中,网络的最后一层(分类输出层)由1000维变为21维(20个不同的目标+背景),其他层的结构不变。作者将所有人工标注方框的IOU大于0.5的区域都视为正常类(即对应的分类),IoU小于0.3的区域为背景(这两个值分别为{0,0.1,...,0.5}通过网格搜索四舍五入)。
梯度下降的初始学习率为0.001(预训练的10%),每轮采样32个正样本区域和96个背景区域,形成一批,规模为128。相比背景,正态类比较少见,所以采样会偏向正态类。
包围盒回归
作者使用D. Hoiem、Y. Chod Pathum Wan和Q. Dai提出的目标检测分析工具。诊断对象检测器中的错误。在Eccv。2012.探究这种方法的误差模式并理解微调是如何工作的。在一次操作之后,使用包围盒回归来减小定位误差。通过使用从选择性搜索中选择的区域(CNN的第五卷积层之后的最大池层)的pool5pool_5pool5特征,作者训练了线性回归模型来预测新的候选区域。结果表明,这有助于修复大量错误定位,并将MAP提高3到4个百分点。
结果和问题
当时这个模型在PASCAL VOC 2012数据集上提高了30%(与之前最好的结果相比),效果可以说是显著的。
但是,R-CNN也有很多问题:
慢点。虽然在原论文中,作者一直在强调“我们的方法快”;但在今天,显示的数据慢得可怕:用GPU(当时)检测一张图像需要13s,CPU甚至达到50s+。这点耗时不难理解:每张图片需要通过选择性搜索提取2000个候选区域,每个候选区域需要通过CNN提取特征,通过SVM分类,这也是后期改进的重点。
很大。因为后一个过程需要前一个过程生成的特征,保存这些特征会占用大量的存储空间。
图像变形。因为图片发到CNN时被强制缩放到227*227,所以不可避免的失真。
因为这个问题,R-CNN做了很多改进。下面继续介绍。
快速R-CNN
顾名思义,Fast R-CNN是对R-CNN的改进。这样一来,它不仅可以使用更深的卷积神经网络(VGG16),而且训练速度只提高了9倍,测试速度提高了200+倍。检测一张图只需要0.3s(不包括生成候选区域的时间);其在VOC 2012上的地图也达到了66% (R-CNN为62%)。
不过在正式介绍之前,我们先来看看R-CNN的另一个改进:SPPnet。
SPPnet
SPPnet是在视觉识别的深度进化网络中的空间金字塔池中提出的,它通过共享部分计算来加速R-CNN。简单来说,SPPnet就是把整幅图片进行卷积,计算它的特征(而不是像R-CNN那样在一个候选区域内一次),然后利用对应部分的特征对每个物体进行分类。通过最大池化,候选帧中的特征图被转换成固定大小的输出(例如,6×6)以提取相应候选帧的特征。输出大小被汇集并连接成一个空间金字塔池。SPPnet在测试期间将R-CNN的速度提高了10到100倍。由于候选帧的特征提取更快,训练时间也减少了3倍。
简而言之,SPP可以实现任意大小的输入和固定大小的输出(针对全连接层)。基于此,SPPnet实现了对不同输入大小的适应性。
然而,SPPnet也有缺点。和R-CNN类似,也是多级流水线,包括特征提取,微调,训练SVM,最后是盒子回归,也是写到磁盘的。所以我们回到正题,看看Fast R-CNN的改进。
优势
总的来说,与R-CNN和SPPnet相比,它有以下优点:

打开网易新闻 查看精彩图片

高级地图
单阶段训练,采用多任务损耗。
所有网络层都将在训练期间更新。
没有必要在磁盘上存储特征。
结构
快速R-CNN仍然使用选择性搜索来生成候选区域,并将图片和这些候选区域作为输入。与对每个候选进行卷积不同,Fast R-CNN对整个画面体积生成卷积特征图,然后用RoI pool层对每个候选RoI(感兴趣区域)生成定长特征向量,并将其抛入全连接层。最后会生成两个对等输出:第一个是分类结果,第二个是细化后的区域位置。
这里可以看到,另一个有趣的点是,Fast R-CNN巧妙地将R-CNN的最后一个盒子回归整合到了全网。但是让我们先来看看另外一个提到的东西:RoI pooling layer。
RoI池层
在这一层中,最大池用于将任何有效的感兴趣区域转换成一个小的、固定长度的特征图(长度H*W,如7*7,H和W是超参数)。本文用一个四元组(r,c,h,w)(r,c,h,w)(r,c,h,w)定义RoI,分别对应左、上、高、宽。
在具体操作时,RoI pooling层将h*w RoI窗口划分为h*w个网格,然后将每个网格对应位置的最大值进行池化,放入对应的网格中。对于特征图的每个通道,该操作是独立的。
这一层其实就是SPP的简化版,就是把金字塔池化到一层。丢入不同大小的输入,最后可以得到固定维度的特征,可以丢到全连接层。
h*w = 5*5的输入通过H*W = 2*2后,结果如下所示
火车
初始化
本文尝试从ImageNet训练出来的三个模型,分别是Caffeinet(Alex Net的改进版)用于R-CNN,VGG_CNN_M_1024和VGG16,从小到大分别称为S,M,L。为了适应本文的效果,模型做了以下三个变换:
最后将的最大池层改为RoI池层,该层的输出大小H*W对于每个模型是固定的(例如L模型为7*7)
最后,全连接层和softmax被上述的并行层取代。
模型的输入分为两部分:图像本身和对应的RoI区域。
调整
对于R-CNN和SPPnet,训练时随机选取一定数量的候选区域。例如,128个候选区域可能来自128个不同的图片,但是快速R-CNN来自N个图片的每一个中R/N的候选区域,例如,N = 2和R = 128的两个图片的每一个中的64个。更重要的是,由于同一个图片的RoI可以分担计算,相比之前的两个网络可以大大加快计算速度。
多任务损失
因为输出是两个平行层,所以快速R-CNN的损失函数是它们的和。具体定义为
L(p,u,tu,v)=Lcls(p,u)+λ[u≥1]Lloc(tu,v)L(p,u,t^u,v) = L_{cls}(p,u) + λ[u ≥ 1]L_{loc}(t^u,v)L(p,u,tu,v)=Lcls (p,u)+λ[u≥1]Lloc (tu,v)
LCLS (p,u) = logpul _ {cls} (p,u) =-\ logp _ ulcls (p,u) = logpu是预测范畴(p)和真实范畴(u)的对数损失;后半部分是区域的丢失。其中λ\λλ是两者的平衡系数(本文使用1),[u ≥ 1]表示只在u为实类时计算,u = 0(背景类)时不计算。的最后一部分定义如下:
与R-CNN使用的L2L_2L2损耗(x2x^2x2)不同,这里的损耗更平滑。当x较大时,前者的梯度较大(2x2x2x),容易导致梯度爆炸;这里的公式将保持梯度等于或小于1。
小批量取样
如上面已经示出的,快速R-CNN使用2 * 64 rois来形成小批量,其类似于R-CNN,并且包含25%的目标样本(IoU >= 0.5)和75%的背景样本(0.1
训练的其他细节,比如超参数的选取,这里就省略了,有兴趣的可以参考原文。
考试
检测的基本过程已经在结构中概述了,这里不再赘述。顺便说一下,在得到结果的分类框和各自的分数后,Fast R-CNN还使用NMS处理了每个类别的重复框。
在测试过程中,作者发现在全连接层上花费的时间更多。而且我们知道全连接层其实是在计算矩阵WxWxWx。为了加快这个过程,作者使用了SVD(奇异值分解)。
德拉贡诺夫狙击步枪(Snayperskaya Vinyovka Dragunov的缩写)
简单地说,对于给定的任意形状矩阵MMM,它可以分解成以下形式
假设原始矩阵大小为n*m,三个分解矩阵的大小如下
矩阵σ\σσ只有对角线上的值,称为奇异值,按照重要性从左上到右下排序。所以只能保留第一个kkk奇异值,同时丢弃U和VTU以及V tu和VT的冗余行列,可以达到压缩的效果。保留区域如下图所示:
三个压缩后的矩阵相乘后,大小仍然是m*n,信息基本保持不变(k值合适时)。
在实现结束时,相当于将一个全连接层改为两个,第一个无偏置,第二个有偏置。
一些结果
下表来自原文,分别显示了三者的训练和测试速度。
可以看出,对于L模型,Fast R-CNN在训练时比R-CNN快8.8倍,在测试时快213倍(加上SVD);同时,它的地图比R-CNN高。
此外,作者还做了大量的对比实验来检查微调层的选择,多任务训练是否有帮助,规模的策略,增加训练数据是否有帮助,softmax和SVM的比较,更多的候选框是否有效等有兴趣的同学可以阅读原文,这里就不赘述了。
劣势
虽然快速R-CNN有很多优点,但还是有一些缺点。其中,由于它仍然使用选择性搜索算法来选择候选盒,因此成为耗时的主要来源。后来更快的R-CNN对此做了改进。
更快的R-CNN
这部分是我的好朋友@Zee写的PPT整理的。我真诚地感谢他的支持。
通讯文章:更快的R-CNN:用区域提议网络进行实时目标检测
结构
与Fast R-CNN相比,Fast R-CNN最大的改进是提出RPN结构代替选择性搜索生成候选帧,并与目标检测的卷积层共享,以缩短训练时间和测试时间,同时提高目标检测的准确率。这两种结构之间的比较如下:
看上图可以发现,更快的R-CNN使用RPN结构从特征图中生成候选区域,其余的和Fast R-CNN差不多。在本文中,作者使用了两个卷积网络:ZF和VGG16。下图显示了ZF网络的详细结构。
那么接下来,我们来看看什么是RPN。
RPN
对于特征图×××,我们使用n*n(文中n=3)的滑动窗口为每个中心点生成锚点(原文为3x3,九个,三个比例分别为1:1、1:2、2:1,三个尺寸分别为128、256、512)。生成的锚点如下所示:
然后对所有的锚点做包围盒回归回归,这样如果对应的锚点有对应的目标,就能找到大小最好的盒子。
每个滑动窗口经过3×3卷积层后,映射成一个维数为D的低纬度特征向量(ZF为256,VGG16为512),分别送入两个并行的1×1卷积层,生成×× 2和×× 4的输出。前一个H*W代表锚的组数,每组包含k个锚,相邻两个数分别代表预测目标物体和背景的概率;其余部分类似,四个数字代表最终帧的宽度和高度以及相关的位置偏移量。
最后,将这两个输出与整形信息相结合,以生成对应于原始图像大小的建议,该建议与特征图一起被发送到RoI池层。以下结构与快速RCNN一致。
损失函数
与Fast R-CNN类似,Fast的损失函数也由两部分组成:
分类损失是log损失,I是每个minibatch中每个锚的索引。
如果anchor为正,pip _ i * pi为1,否则为0;Pip_ipi表示锚为正的概率
回归损失函数是光滑的L1L_1L1。
Tit_iti是表示四个参数(、、、、)的预测向量,tit _ i * ti是表示对应的地面真实的向量。
最后,我们使用nn _ {} ncls和_ {} nreg进行标准化。在原文中,我们设置n = 256n _ {} = 256ncls = 256,Nreg=2400N_{reg}=2400Nreg =2400,λ= 10 \ lambda = 10λ= 10;代码n = 256n _ {} = 256ncls = 256,Nreg=128N_{reg}=128Nreg =128,λ= 1 \λ= 1λ= 1。因为回归损失只会计算正锚,而mini-batch一般是128个正样本,128个负样本。
火车
在训练过程中,作者采用四步训练法实现了RPN和更快的R-CNN卷积层的参数共享。具体步骤如下:
实验
为了验证各种因素对算法的影响,进行了大量的实验。
劣势
当然,更快的R-CNN也有一些缺点,总结如下
卷积提取网络:无论是VGGNet还是ResNet,其特征图都只有单层,分辨率通常较小,不利于小物体和多尺度物体的检测。所以,特征图的多层融合,提高特征图的分辨率,都是可以优化的方向。
NMS:当RPN生成建议书时,为了避免重叠框,使用NMS,并使用分类分数作为筛选标准。但是NMS本身的过滤对于遮挡物体并不是特别友好,属于两个物体的提议可能会因为NMS而被过滤成一个,导致漏检。因此,改进和优化NMS可以提高检测性能。
ROI Pooling:速度更快的R-CNN原来的RoI Pooling被四舍五入了两次,造成了准确性的损失。所以后来的Mask RCNN改进了这种池化来提高定位精度。
全连接:原本更快的R-CNN最终使用全连接网络,占用了大部分网络参数,而RoI池化后,每个RoI都要经过一次全连接网络,没有共享计算。
正负样本:在RPN和RCNN中,正负样本的数量受到超参数的限制,以保证正负样本的平衡。对于不同的任务和数据,这种正负样本平衡方法是否最有效值得考虑,现实生活中正负样本平衡有时很难实现。
两级网络:更快的R-CNN和R-CNN的RPN分工明确,带来的是准确率的提升,但速度相对较慢,实际实现并没有达到实时。所以网络秩序也是一个值得考虑的问题。