faster r cnn中的rpnrcnn rpn 怎么训练

「一图看懂」计算机视觉识别简史:从AlexNet ResNet到Mask RCNN – 默默的点滴
2017年十月
171819202122
23242526272829
最近,物体识别已经成为计算机视觉和AI最令人激动的领域之一。即时地识别出场景中所有的物体的能力似乎已经不再是秘密。随着卷积神经网络架构的发展,以及大型训练数据集和高级计算技术的支持,计算机现在可以在某些特定设置(例如人脸识别)的任务中超越人类的识别能力。
我感觉每当计算机视觉识别方面有什么惊人的突破发生了,都得有人再讲一遍是怎么回事。这就是我做这个图表的原因。它试图用最简洁的语言和最有吸引力的方式讲述物体识别的现代史。故事开始于2012年AlexNet赢得了ILSVRC(ImageNet大规模视觉识别挑战赛)。信息图由2页组成,第1页总结了重要的概念,第2页则勾画了历史。每一个图解都是重新设计的,以便更加一致和容易理解。所有参考文献都是精挑细选的,以便读者能够知道从哪里找到有关细节的解释。
计算机视觉6大关键技术
图像分类:根据图像的主要内容进行分类。数据集:MNIST,CIFAR,ImageNet物体定位:预测包含主要物体的图像区域,以便识别区域中的物体。数据集:ImageNet物体识别:定位并分类图像中出现的所有物体。这一过程通常包括:划出区域然后对其中的物体进行分类。数据集:PASCAL,COCO语义分割:把图像中的每一个像素分到其所属物体类别,在样例中如人类、绵羊和草地。数据集:PASCAL,COCO实例分割:把图像中的每一个像素分到其物体类别和所属物体实例。数据集:PASCAL,COCO关键点检测:检测物体上一组预定义关键点的位置,例如人体上或者人脸上的关键点。数据集:COCO
这种图列出了物体识别技术中的关键人物:
J.Schmidhuber;YoshuaBengio;YannLecun;GeoreyHinton;AlexGraves;AlexKrizhevsky;IlyaSutskever;AndrejKarpathy;ChristopherOlah;RossGirshick;MatthewZeiler;RobFergus;KaimingHe;PierreSermanet;ChristianSzegedy;JosephRedmon;ShaoqingRen;WeiLiu;KarenSimonyan;AndrewZisserman;EvanShelhamer;JonathanLong;TrevorDarrell;Springenberg;Mordvintsev;V.Dumoulin;FrancescoVisin;AditDeshpande……
重要的CNN概念
1.特征(图案,神经元的激活,特征探测)
当一个特定的图案(特征)被呈现在输入区(接受域)中时,一个隐藏的神经元就被会被激活。
神经元识别的团可以被进行可视化,其方法是:1)优化其输入区,将神经元的激活(deepdream)最大化;2)将梯度(gradient)可视化或者在其输入像素中,引导神经元激活的梯度(反向传播以及经引导的反向传播)3)将训练数据集中,激活神经元最多的图像区域进行可视化。
2.感受野(特征的输入区)
输入图像区会影响特征的激活。换句话说,它就是特征参考的区域。
通常,越高层上的特征会的接受域会更宽,这能让它能学会捕捉更多的复杂/抽象图案。ConvNet的架构决定了感受野是如何随着层数的改变而改变的。
3.特征地图(featuremap,隐藏层的通道)
指的是一系列的特征,通过在一个滑动窗口(例如,卷积)的方式,在一个输入地图中的不同位置应用相同的特征探测器来创造。在相同的特征地图上的特征,有着一致的可接收形状,并且会寻找不同位置上的相同图案。这构成了ConvNet的空间不变性。
4.特征量(卷积中的隐藏层)
这是一组特征地图,每一张地图会在输入地图中的一些固定位置搜寻特定的特征。所有的特征的接受域大小都是一样的。
5.作为特征量的全连接层
全连接层(fclayers,在识别任务中通常粘附在一个ConvNet的尾端),这一特征量在每一张特征滴入上都有一个特征,其接收域会覆盖整张图像。全连接层中的权重矩阵W可以被转化成一个CNN核。
将一个核wxhxk卷积成一个CNN特征量wxhxd会得到一个1x1xk特征量(=FClayerwithknodes)。将一个1x1xk的过滤核卷积到一个1x1xd特征量,得到一个1x1xk的特征量。通过卷积层替换完全连接的图层可以使ConvNet应用于任意大小的图像。
这一操作对卷积中的梯度进行反向传播。换句话说,它是卷积层的反向传递。反向的卷积可以作为一个正常的卷积部署,并且在输入特征中不需要任何插入。
左图,红色的输入单元负责上方四个单元的激活(四个彩色的框),进而能从这些输出单元中获得梯度。这一梯度反向传播能够通过反卷积(右图)部署。
7.端到端物体识别管道(端到端学习/系统)
这是一个包含了所有步骤的物体识别管道(预处理、区域建议生成、建议分类、后处理),可以通过优化单个对象函数来进行整体训练。单个对象函数是一个可差分的函数,包含了所有的处理步骤的变量。这种端到端的管道与传统的物体识别管道的完全相反。在这些系统中,我们还不知道某个步骤的变量是如何影响整体的性能的,所以,么一个步骤都必须要独立的训练,或者进行启发式编程。
重要的目标识别概念
1.Boundingboxproposal
提交边界框(Boundingboxproposal,又称兴趣区域,提交区域,提交框)
输入图像上的一个长方形区域,内含需要识别的潜在对象。提交由启发式搜索(对象、选择搜索或区域提交网络RPN)生成。
一个边界框可以由4元素向量表示,或表达为2个角坐标(x0,y0,x1,y1),或表达为一个中心坐标和宽与高(x,y,w,h)。边界框通常会配有一个信心指数,表示其包含对象物体的可能性。
两个边界框的区别一般由它们的向量表示中的L2距离在测量。w和h在计算距离前会先被对数化。
2.IntersectionoverUnion
重叠联合比(IntersectionoverUnion,又称IoU,Jaccard相似度)
两个边界框相似度的度量值=它们的重叠区域除以联合区域
3.非最大抑制(NonMaxiumSuppression,又称NMS)
一个融合重叠边界框(提交或侦测出的)的一般性算法。所有明显和高信度边界框重叠的边界框(IoU&IoU_threshold)都会被抑制(去除)。
4.边界框回归(边界框微调)
观察一个输入区域,我们可以得到一个更适合隐含对象的边界框,即使该对象仅部分可见。下图显示了在只看到一部分对象时,得出真实边界框(groundtruthbox)的可能性。因此,可以训练回归量,来观察输入区域,并预测输入区域框和真实框之间的offset△(x,y,w,h)。如果每个对象类别都有一个回归量,就称为特定类别回归量,否则就称为不可知类别(class-agnostic,一个回归量用于所有类别)。边界框回归量经常伴有边界框分类器(信度评分者),来评估边界框中在对象存在的可信度。分类器既可以是特定类别的,也可以是不可知类别的。如果不定义首要框,输入区域框就扮演首要框的角色。
5.首要框(Priorbox,又称默认框、锚定框)
如果不使用输入区域作为唯一首要框,我们可以训练多个边界框回归量,每一个观测相同的输入区域,但它们各自的首要框不同。每一个回归量学习预测自己的首要框和真实框之间的offset。这样,带有不同首要框的回归量可以学习预测带有不同特性(宽高比,尺寸,位置)的边界框。相对于输入区域,首要框可以被预先定义,或者通过群集学习。适当的框匹配策略对于使训练收敛是至关重要的。
6.框匹配策略
我们不能指望一个边界框回归量可以预测一个离它输入区域或首要框(更常见)太远的对象边界框。因此,我们需要一个框匹配策略,来判断哪一个首要框与真实框相匹配。每一次匹配对回归来说都是一个训练样本。可能的策略有:(多框)匹配每一个带有最高IoU的首要框的真实框;(SSD,FasterRCNN)匹配带有任何IoU高于0.5的真实框的首要框。
7.负样本挖掘(Hardnegativeexamplemining)
对于每个首要框,都有一个边界框分类器来评估其内部含有对象的可能性。框匹配之后,所有其他首要框都为负。如果我们用了所有这些负样本,正负之间本会有明显的不平衡。可能的解决方案是:随机挑选负样本(FasterRCNN),或挑选那些分类器判断错误最严重的样本,这样负和正之间的比例大概是3:1。
重要视觉模型发展:AlexNet→ZFNet→VGGNet→ResNet→MaskRCNN
一切从这里开始:现代物体识别随着ConvNets的发展而发展,这一切始于2012年AlexNet以巨大优势赢得ILSVRC2012。请注意,所有的物体识别方法都与ConvNet设计是正交的(任意ConvNet可以与任何对象识别方法相结合)。ConvNets用作通用图像特征提取器。
2012年AlexNet:AlexNet基于有着数十年历史的LeNet,它结合了数据增强、ReLU、dropout和GPU实现。它证明了ConvNet的有效性,启动了ConvNet的光荣回归,开创了计算机视觉的新纪元。
RCNN:基于区域的ConvNet(RCNN)是启发式区域提案法(heuristicregionproposalmethod)和ConvNet特征提取器的自然结合。从输入图像,使用选择性搜索生成约2000个边界框提案。这些被推出区域被裁剪并扭曲到固定大小的227x227图像。然后,AlexNet为每个弯曲图像提取4096个特征(fc7)。然后训练一个SVM模型,使用4096个特征对该变形图像中的对象进行分类。并使用4096个提取的特征来训练多个类别特定的边界框回归器来改进边界框。
OverFeat:OverFeat使用AlexNet在一个输入图像的多个层次下的多个均匀间隔方形窗口中提取特征。训练一个对象分类器和一个类别不可知盒子回归器,用于对Pool5层(339x339接收域窗口)中每5x5区域的对象进行分类并对边界框进行细化。OverFeat将fc层替换为1x1xN的卷积层,以便能够预测多尺度图像。因为在Pool5中移动一个像素时,接受场移动36像素,所以窗口通常与对象不完全对齐。OverFeat引入了详尽的池化方案:Pool5应用于其输入的每个偏移量,这导致9个Pool5卷。窗口现在只有12像素而不是36像素。
2013年ZFNet:ZFNet是ILSVRC2013的冠军得主,它实际上就是在AlexNet的基础上做了镜像调整(mirrormodification):在第一个卷积层使用7×7核而非11×11核保留了更多的信息。
SPPNet:SPPNet(SpatialPyramidPoolingNet)本质上是RCNN的升级,SPPNet引入了2个重要的概念:适应大小池化(adaptively-sizedpooling,SPP层),以及对特征量只计算一次。实际上,Fast-RCNN也借鉴了这些概念,通过镜像调整提高了RCNN的速度。
SPPNet用选择性搜索在每张图像中生成2000个区域(regionproposal)。然后使用ZFNet-Conv5从整幅图像中抓取一个共同的全体特征量。对于每个被生成的区域,SPPNet都使用spatialpyramidpooling(SPP)将该区域特征从全体特征量中pool出来,生成一个该区域的长度固定的表征。这个表征将被用于训练目标分类器和boxregressor。从全体特征量pooling特征,而不是像RNN那样将所有图像剪切(crops)全部输入一个完整的CNN,SPPNet让速度实现了2个数量级的提升。需要指出,尽管SPP运算是可微分的,但作者并没有那么做,因此ZFNet仅在ImageNet上训练,没有做finetuning。
MultiBox:MultiBox不像是目标识别,更像是一种基于ConvNet的区域生成解决方案。MultiBox让区域生成网络(regionproposalnetwork,RPN)和priorbox的概念流行了起来,证明了卷积神经网络在训练后,可以生成比启发式方法更好的regionproposal。自此以后,启发式方法逐渐被RPN所取代。MultiBox首先将整个数据集中的所有真实boxlocation聚类,找出200个质心(centroid),然后用将其用于priorbox的中心。每幅输入的图像都会被从中心被裁减和重新调整大小,变为220×220。然后,MultiBox使用ALexNet提取4096个特征(fc7)。再加入一个200-sigmoid层预测目标置信度分数,另外还有一个4×200-linear层从每个priorbox预测centreoffset和boxproposal。注意下图中显示的boxregressors和置信度分数在看从整幅图像中抓取的特征。
2014年VGGNet:虽然不是ILSVRC冠军,VGGNet仍然是如今最常见的卷积架构之一,这也是因为它简单有效。VGGNet的主要思想是通过堆叠多层小核卷积层,取代大核的卷积层。VGGNet严格使用3×3卷积,步长和padding都为1,还有2×2的步长为2的maxpooling层。
2014年Inception:Inception(GoogLeNet)是2014年ILSVRC的冠军。与传统的按顺序堆叠卷积和maxpooling层不同,Inception堆叠的是Inception模块,这些模块包含多个并行的卷积层和许多核的大小不同的maxpooling层。Inception使用1×1卷积层减少特征量输出的深度。目前,Inception有4种版本。
FastRCNN:FastRCNN本质上SPPNet,不同的是FastRCNN带有训练好的特征提取网络,用RolPooling取代了SPP层。
YOLO:YOLO(YouOnlyLookOnce)是由MultiBox直接衍生而来的。通过加了一层softmax层,与boxregressor和box分类器层并列,YOLO将原本是区域生成的MultiBox转为目标识别的方法,能够直接预测目标的类型。
2015ResNet:ResNet以令人难以置信的3.6%的错误率(人类水平为5-10%)赢得了2015年ILSVRC比赛。ResNet不是将输入表达式转换为输出表示,而是顺序地堆叠残差块,每个块都计算它想要对其输入的变化(残差),并将其添加到其输入以产生其输出表示。这与boosting有一点关。
FasterRCNN:受Multibox的启发,FasterRCNN用启发式区域生成代替了区域生成网络(RPN)。在FasterRCNN中,PRN是一个很小的卷积网络(3×3conv→1×1conv→1×1conv)在移动窗口中查看conv5_3全体特征量。每个移动窗口都有9个跟其感受野相关的priorbox。PRN会对每个priorbox做boundingboxregression和boxconfidencescoring。通过结合以上三者的loss成为一个共同的全体特征量,整个管道可以被训练。注意,在这里RPN只关注输入的一个小的区域;priorbox掌管中心位置和box的大小,FasterRCNN的box设计跟MultiBox和YOLO的都不一样。
2016年SSD:SSD利用FasterRCNN的RPN,直接对每个先前的box内的对象进行分类,而不仅仅是对对象置信度(类似于YOLO)进行分类。通过在不同深度的多个卷积层上运行RPN来改善前一个box分辨率的多样性。
2017年MaskRCNN:通过增加一支特定类别对象掩码预测,MaskRCNN扩展了面向实例分割的FasterRCNN,与已有的边界框回归量和对象分类器并行。由于RolPool并非设计用于网络输入和输出间的像素到像素对齐,MaskRCNN用RolAlign取代了它。RolAlign使用了双线性插值来计算每个子窗口的输入特征的准确值,而非RolPooling的最大池化法。6164人阅读
目标检测(8)
本文转载自:
http://blog.csdn.net/yimingsilence/article/details/
早期,使用窗口扫描进行物体识别,计算量大。&
RCNN去掉窗口扫描,用聚类方式,对图像进行分割分组,得到多个侯选框的层次组。
原始图片通过Selective Search提取候选框,约有2k个侯选框缩放成固定大小经过CNN经两个全连接后,分类
RCNN中有CNN重复计算,Fast RCNN则去掉重复计算,并微调选框位置。
整图经过CNN,得到特征图提取域候选框把候选框投影到特征图上,Pooling采样成固定大小经两个全连接后,分类与微调选框位置
Faster RCNN
提取候选框运行在CPU上,耗时2s,效率低下。&
Faster RCNN使用CNN来预测候选框。
整图经过CNN,得到特征图经过核为&3×3×2563×3×256&的卷积,每个点上预测k个anchor
box是否是物体,并微调anchor box的位置提取出物体框后,采用Fast RCNN同样的方式,进行分类选框与分类共用一个CNN网络
anchor box的设置应比较好的覆盖到不同大小区域,如下图:
一张1000×600的图片,大概可以得到20k个anchor
box(60×40×960×40×9)。
RCNN系列(RCNN、Fast RCNN、Faster RCNN)中,网络由两个子CNN构成。在图片分类中,只需一个CNN,效率非常高。所以物体检测是不是也可以只用一个CNN?&&
图片分类需要兼容形变,而物体检测需要利用形变,如何平衡?&&
R-FCN利用在CNN的最后进行位置相关的特征pooling来解决以上两个问题。
经普通CNN后,做有&k2(C+1)k2(C+1)&个
channel 的卷积,生成位置相关的特征(position-sensitive score maps)。&
CC&表示分类数,加&11&表示背景,kk&表示后续要pooling
的大小,所以生成&k2k2&倍的channel,以应对后面的空间pooling。
普通CNN后,还有一个RPN(Region Proposal Network),生成候选框。&
假设一个候选框大小为&w×hw×h,将它投影在位置相关的特征上,并采用average-pooling的方式生成一个&k×k×k2(C+1)k×k×k2(C+1)&的块(与Fast
RCNN一样),再采用空间相关的pooling(k×kk×k平面上每一个点取channel上对应的部分数据),生成&k×k×(C+1)k×k×(C+1)的块,最后再做average-pooling生成&C+1C+1&的块,最后做softmax生成分类概率。&
类似的,RPN也可以采用空间pooling的结构,生成一个channel为&4k24k2的特征层。&
空间pooling的具体操作可以参考下面。
训练与SSD相似,训练时拿来做lost计算的点取一个常数,如128。&&
除去正点,剩下的所有使用概率最高的负点。
Faster RCNN需要对20k个anchor box进行判断是否是物体,然后再进行物体识别,分成了两步。&
YOLO则把物体框的选择与识别进行了结合,一步输出,即变成”You Only Look Once”。
把原始图片缩放成448×448448×448大小运行单个CNN计算物体中心是否落入单元格、物体的位置、物体的类别
把缩放成统一大小的图片分割成S×SS×S的单元格每个单元格输出B个矩形框(冗余设计),包含框的位置信息(x, y, w, h)与物体的Confidence每个单元格再输出C个类别的条件概率P(Class∣Object)P(Class∣Object)最终输出层应有S×S×(B*5+C)S×S×(B*5+C)个单元x, y 是每个单元格的相对位置w, h 是整图的相对大小
Conficence定义如下:
Confidence=P(Class)?IOUtruthpred=P(Class∣Object)?P(Object)?IOUtruthpredConfidence=P(Class)?IOUpredtruth=P(Class∣Object)?P(Object)?IOUpredtruth
在原论文中,S = 7,B = 2,C = 20,所以输出的单元数为7×7×307×7×30。
J=λcoord∑i=0S2∑j=0B1objij(xi-x?&i)2+(yi-y?&i)2+λcoord∑i=0S2∑j=0B1objij(wi??√-w?&i??√)2+(hi??√-h?&i??√)2+∑i=0S2∑j=0B1objij(Ci-C?&i)2+λnoobj∑i=0S2∑j=0B1noobjij(Ci-C?&i)2+∑i=0S21objij∑c∈classes(pi(c)-p?&i(c))2J=λcoord∑i=0S2∑j=0B1ijobj(xi-x^i)2+(yi-y^i)2+λcoord∑i=0S2∑j=0B1ijobj(wi-w^i)2+(hi-h^i)2+∑i=0S2∑j=0B1ijobj(Ci-C^i)2+λnoobj∑i=0S2∑j=0B1ijnoobj(Ci-C^i)2+∑i=0S21ijobj∑c∈classes(pi(c)-p^i(c))2
其中&λcoord=5λcoord=5,λnoobj=0.5λnoobj=0.5。&
一般,ww&与&hh&不是在&[0,1][0,1]&上的均匀分布,偏小,所以开方。&&
注: 开方的解释是我自己的估计,可能不对。&
YOLO在&7×77×7&的框架下识别物体,遇到大量小物体时,难以处理。&
SSD则在不同层级的feature map下进行识别,能够覆盖更多范围。
假设在&mm&层
feature map 上进行识别,则第&kk&层的基本比例为
sk=smin+smax-sminm-1(k-1)k∈[1,m]sk=smin+smax-sminm-1(k-1)k∈[1,m]
比如&smin=0.2smin=0.2,smax=0.95smax=0.95,表示整张图片识别物体所占比最小
0.2,最大 0.95。&
在基本比例上,再取多个长宽比,令&a={1,2,3,1/2,1/3}a={1,2,3,1/2,1/3},长宽分别为
wik=skai??√hik=sk/ai??√i∈[1,5]wki=skaihki=sk/aii∈[1,5]
w6k=sksk+1??????√h6k=sksk+1??????√wk6=sksk+1hk6=sksk+1
Match策略上,取ground truth与以上生成的格子重叠率大于0.5的。
SSD vs YOLO
位置采用Smooth L1 Regression,分类采用Softmax。&
代价函数为
L=Lconf(x,c)+α?Lloc(c,l,g))L=Lconf(x,c)+α?Lloc(c,l,g))
xx&表示类别输出,cc&表示目标分类,ll&表示位置输出,gg&表示目标位置,&αα是比例常数,可取1。&
训练过程中负点远多于正点,所以只取负点中,概率最大的几个,数量与正点成&3:13:1&。
以上方法,同一物体可能有多个预测值。&
可用NMS(Non-maximum suppression,非极大值抑制)来去重。
如上图所示,一共有6个识别为人的框,每一个框有一个置信率。&
现在需要消除多余的:
按置信率排序: 0.95, 0.9, 0.9, 0.8, 0.7, 0.7取最大0.95的框为一个物体框剩余5个框中,去掉与0.95框重叠率大于0.6(可以另行设置),则保留0.9, 0.8, 0.7三个框重复上面的步骤,直到没有框了,0.9为一个框选出来的为: 0.95, 0.9
两个矩形的重叠率计算方式如下:
如图,两个矩形的面积分别为A, B
取两个矩形左上角坐标的最大值x1_max, y1_max取两个矩形右下角坐标的最小值x2_min, y2_min重叠区域的宽w为max(0, x2_min - x1_max),高h为max(0, y2_min - y1_max)重叠率为&w×hA+B-w×hw×hA+B-w×h
xywh VS xyxy
系列论文中,位置都用&(x,y,w,h)(x,y,w,h)&来表示,没有用左上角、右下角&(x,y,x,y)(x,y,x,y)&来表示。&
初衷是当&(w,h)(w,h)&正确时,(x,y)(x,y)&一点错,会导致整个框就不准了。&
在初步的实际实验中,(x,y,x,y)(x,y,x,y)&效果要差一些。
背后的逻辑,物体位置用&(x,y,w,h)(x,y,w,h)&来学习比较容易。&&
(x,y)(x,y)&只需要位置相关的加权就能计算出来;&&
(w,h)(w,h)&就更简单了,直接特征值相加即可。
1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation
论文:https://arxiv.org/abs/
代码:/rbgirshick/rcnn
技术路线:selective search + CNN + SVMs
Step1:候选框提取(selective&search)
训练:给定一张图片,利用seletive search方法从中提取出2000个候选框。由于候选框大小不一,考虑到后续CNN要求输入的图片大小统一,将2000个候选框全部resize到227*227分辨率(为了避免图像扭曲严重,中间可以采取一些技巧减少图像扭曲)。
:给定一张图片,利用seletive search方法从中提取出2000个候选框。由于候选框大小不一,考虑到后续CNN要求输入的图片大小统一,将2000个候选框全部resize到227*227分辨率(为了避免图像扭曲严重,中间可以采取一些技巧减少图像扭曲)。
Step2:特征提取(CNN)
训练:提取特征的CNN模型需要预先训练得到。训练CNN模型时,对训练数据标定要求比较宽松,即SS方法提取的proposal只包含部分目标区域时,我们也将该proposal标定为特定物体类别。这样做的主要原因在于,CNN训练需要大规模的数据,如果标定要求极其严格(即只有完全包含目标区域且不属于目标的区域不能超过一个小的阈值),那么用于CNN训练的样本数量会很少。因此,宽松标定条件下训练得到的CNN模型只能用于特征提取。
测试:得到统一分辨率227*227的proposal后,带入训练得到的CNN模型,最后一个全连接层的输出结果---4096*1维度向量即用于最终测试的特征。
Step3:分类器(SVMs)
训练:对于所有proposal进行严格的标定(可以这样理解,当且仅当一个候选框完全包含ground truth区域且不属于ground truth部分不超过e.g,候选框区域的5%时认为该候选框标定结果为目标,否则位背景),然后将所有proposal经过CNN处理得到的特征和SVM新标定结果输入到SVMs分类器进行训练得到分类器预测模型。
测试:对于一副测试图像,提取得到的2000个proposal经过CNN特征提取后输入到SVM分类器预测模型中,可以给出特定类别评分结果。
结果生成:得到SVMs对于所有Proposal的评分结果,将一些分数较低的proposal去掉后,剩下的proposal中会出现候选框相交的情况。采用非极大值抑制技术,对于相交的两个框或若干个框,找到最能代表最终检测结果的候选框(非极大值抑制方法可以参考:http://blog.csdn/pb/article/details/)
R-CNN需要对SS提取得到的每个proposal进行一次前向CNN实现特征提取,因此计算量很大,无法实时。此外,由于全连接层的存在,需要严格保证输入的proposal最终resize到相同尺度大小,这在一定程度造成图像畸变,影响最终结果。&
2. SPP-Net : Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)
论文:&https://arxiv.org/abs/
代码:/ShaoqingRen/SPP_net
技术路线:selective search + spp-net + SVMs
传统CNN和SPP-Net流程对比如下图所示(引自http://www.image-net.org/challenges/LSVRC/2014/slides/sppnet_ilsvrc2014.pdf)
SPP-net具有以下特点:
1.传统CNN网络中,卷积层对输入图像大小不作特别要求,但全连接层要求输入图像具有统一尺寸大小。因此,在R-CNN中,对于selective search方法提出的不同大小的proposal需要先通过Crop操作或Wrap操作将proposal区域裁剪为统一大小,然后用CNN提取proposal特征。相比之下,SPP-net在最后一个卷积层与其后的全连接层之间添加了一个SPP&(spatial pyramid pooling)&layer,从而避免对propsal进行Crop或Warp操作。总而言之,SPP-layer适用于不同尺寸的输入图像,通过SPP-layer对最后一个卷积层特征进行pool操作并产生固定大小feature
map,进而匹配后续的全连接层。
2.由于SPP-net支持不同尺寸输入图像,因此SPP-net提取得到的图像特征具有更好的尺度不变性,降低了训练过程中的过拟合可能性。
3.R-CNN在训练和测试是需要对每一个图像中每一个proposal进行一遍CNN前向特征提取,如果是2000个propsal,需要2000次前向CNN特征提取。但SPP-net只需要进行一次前向CNN特征提取,即对整图进行CNN特征提取,得到最后一个卷积层的feature map,然后采用SPP-layer根据空间对应关系得到相应proposal的特征。SPP-net速度可以比R-CNN速度快24~102倍,且准确率比R-CNN更高(下图引自SPP-net原作论文,可以看到SPP-net中spp-layer前有5个卷积层,第5个卷积层的输出特征在位置上可以对应到原来的图像,例如第一个图中左下角车轮在其conv5的图中显示为“^”的激活区域,因此基于此特性,SPP-net只需要对整图进行一遍前向卷积,在得到的conv5特征后,然后用SPP-net分别提取相应proposal的特征)。
SPP-Layer原理:
在RNN中,conv5后是pool5;在SPP-net中,用SPP-layer替代原来的pool5,其目标是为了使不同大小输入图像在经过SPP-Layer后得到的特征向量长度相同。其原理如图如下所示
SPP与金字塔pooling类似,即我们先确定最终pooling得到的featuremap大小,例如4*4 bins,3*3 bins,2*2 bins,1*1 bins。那么我们已知conv5输出的featuremap大小(例如,256个13*13的feature map).那么,对于一个13*13的feature map,我们可以通过spatial pyramid pooling (SPP)的方式得到输出结果:当window=ceil(13/4)=4, stride=floor(13/4)=3,可以得到的4*4
bins;当window=ceil(13/3)=5, stride=floor(13/3)=4,可以得到的3*3 bins;当window=ceil(13/2)=7, stride=floor(13/2)=6,可以得到的2*2 bins;当window=ceil(13/1)=13, stride=floor(13/1)=13,可以得到的1*1 bins.因此SPP-layer后的输出是256*(4*4+3*3+2*2+1*1)=256*30长度的向量。不难看出,SPP的关键实现在于通过conv5输出的feature
map宽高和SPP目标输出bin的宽高计算spatial pyramid pooling中不同分辨率Bins对应的pooling window和pool stride尺寸。
&原作者在训练时采用两种不同的方式,即1.采用相同尺寸的图像训练SPP-net 2.采用不同尺寸的图像训练SPP-net。实验结果表明:使用不同尺寸输入图像训练得到的SPP-Net效果更好。
SPP-Net +SVM训练:
&采用selective search可以提取到一系列proposals,由于已经训练完成SPP-Net,那么我们先将整图代入到SPP-Net中,得到的conv5的输出。接下来,区别于R-CNN,新方法不需要对不同尺寸的proposals进行Crop或Wrap,直接根据proposal在图中的相对位置关系计算得到proposal在整图conv5输出中的映射输出结果。这样,对于2000个proposal,我们事实上从conv1---&conv5只做了一遍前向,然后进行2000次conv5 featuremap的集合映射,再通过SPP-Layer,就可以得到的2000组长度相同的SPP-Layer输出向量,进而通过全连接层生成最终2000个proposal的卷积神经网络特征。接下来就和R-CNN类似,训练SVMs时对于所有proposal进行严格的标定(可以这样理解,当且仅当一个候选框完全包含ground
truth区域且不属于ground truth部分不超过e.g,候选框区域的5%时认为该候选框标定结果为目标,否则位背景),然后将所有proposal经过CNN处理得到的特征和SVM新标定结果输入到SVMs分类器进行训练得到分类器预测模型。
当然,如果觉得SVM训练很麻烦,可以直接在SPP-Net后再加一个softmax层,用好的标定结果去训练最后的softmax层参数。
3. Fast-R-CNN
论文:http://arxiv.org/abs/
代码:/rbgirshick/fast-rcnn
技术路线:selective search +&vgg16 + ROI pooling&+ 2 loss
基于R-CNN和SPP-Net思想,RBG提出了Fast-R-CNN。如果选用VGG16网络进行特征提取,在训练阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升9倍和3倍;在测试阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升213倍和10倍。
R-CNN和SPP-Net缺点:
1.R-CNN和SPP-Net的训练过程类似,分多个阶段进行,实现过程较复杂。这两种方法首先选用Selective Search方法提取proposals,然后用CNN实现特征提取,最后基于SVMs算法训练分类器,在此基础上还可以进一步学习检测目标的boulding box。
2.R-CNN和SPP-Net的时间成本和空间代价较高。SPP-Net在特征提取阶段只需要对整图做一遍前向CNN计算,然后通过空间映射方式计算得到每一个proposal相应的CNN特征;区别于前者,RCNN在特征提取阶段对每一个proposal均需要做一遍前向CNN计算,考虑到proposal数量较多(~2000个),因此RCNN特征提取的时间成本很高。R-CNN和SPP-Net用于训练SVMs分类器的特征需要提前保存在磁盘,考虑到2000个proposal的CNN特征总量还是比较大,因此造成空间代价较高。
3.R-CNN检测速度很慢。RCNN在特征提取阶段对每一个proposal均需要做一遍前向CNN计算,如果用VGG进行特征提取,处理一幅图像的所有proposal需要47s。
4.特征提取CNN的训练和SVMs分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,因此即使采用更深的CNN网络进行特征提取,也无法保证SVMs分类器的准确率一定能够提升。
&Fast-R-CNN亮点:
1.Fast-R-CNN检测效果优于R-CNN和SPP-Net
2.训练方式简单,基于多任务Loss,不需要SVM训练分类器。
3.Fast-R-CNN可以更新所有层的网络参数(采用ROI Layer将不再需要使用SVM分类器,从而可以实现整个网络端到端训练)。
4.不需要将特征缓存到磁盘。
Fast-R-CNN:
Fast-R-CNN的架构如下图所示(/rbgirshick/fast-rcnn/blob/master/models/VGG16/train.prototxt,可以参考此链接理解网络模型):输入一幅图像和Selective Search方法生成的一系列Proposals,通过一系列卷积层和Pooling层生成feature map,然后用RoI(region of ineterst)层处理最后一个卷积层得到的feature map为每一个proposal生成一个定长的特征向量roi_pool5。RoI层的输出roi_pool5接着输入到全连接层产生最终用于多任务学习的特征并用于计算多任务Loss。全连接输出包括两个分支:1.SoftMax
Loss:计算K+1类的分类Loss函数,其中K表示K个目标类别,1表示背景;2.Regression Loss:即K+1的分类结果相应的Proposal的Bounding Box四个角点坐标值。最终将所有结果通过非极大抑制处理产生最终的目标检测和识别结果。
3.1 RoI Pooling Layer
事实上,RoI Pooling Layer是SPP-Layer的简化形式。SPP-Layer是空间金字塔Pooling层,包括不同的尺度;RoI Layer只包含一种尺度,如论文中所述7*7。这样对于RoI Layer的输入(r,c,h,w),RoI Layer首先产生7*7个r*c*(h/7)*(w/7)的Block(块),然后用Max-Pool方式求出每一个Block的最大值,这样RoI Layer的输出是r*c*7*7。
3.2 预训练网络初始化
RBG采用前辈们训练ImageNet时得到的网络模型(例如VGG16模型)初始化Fast-R-CNN模型中RoI层之前的所有层,我们可以把网络结构总结如下:13个卷积层+4个Pooling层+RoI层+2个FC层+两个平级层(即SoftmaxLoss层和SmoothL1Loss层)。其中,VGG16的第5个Pool层倍RoI层替换掉。
3.3 Finetuning for detection
3.3.1 Fast-R-CNN在网络训练阶段采用了一些trick,每个minibatch由N个图片(N=2)中的R个Proposal(R=128)组成。这种方式比从128张不同图片中提取1个Proposal的方式块64倍。当然,这种方式在一定程度会造成收敛速度变慢。另外,Fast-R-CNN无需SVM分类器,而是通过Softmax Classifer和Bounding-Box Regressors联合训练的方式更新所有参数。注意:从2张图中选取128个proposals时,需要保证至少25%的proposals与groundtruth的IoU超过0.5,剩下的全部作为背景类。不需要其它任何数据扩增操作。
3.3.2 多任务Loss:Fast R-CNN网络有两个同级别子Layer,分别用于分类和回归。分类选用SoftmaxLoss,回归使用SmoothL1Loss.两者的权重比例为1:1
3.3.3 SGD hyer-parameters:用于softmax分类任务和bounding-box回归的fc层参数用标准差介于0.01~0.001之间的高斯分布初始化。
3.4 Truncated SVD快速检测
在检测段,RBG使用truncated SVD优化较大的FC层,这样RoI数目较大时检测端速度会得到的加速。
Fast-R-CNN实验结论:
1.多任务Loss学习方式可以提高算法准确率
2.多尺度图像训练Fast-R-CNN与单尺度图像训练相比只能提升微小的mAP,但是时间成本却增加了很多。因此,综合考虑训练时间和mAP,作者建议直接用一种尺度的图像训练Fast-R-CNN.
3.基本上没人不会赞成:训练图像越多,模型准确率也会越高。
4.RBG的结果表明SoftmaxLoss的方式比SVMs分类器的结果略好一点点,虽然这不能绝对性说明自己的SoftmaxLoss好到哪儿去,但是至少大家不用再那么麻烦的去分步训练一个检测和识别网络了。
5.不是说Proposal提取的越多效果会越好,提的太多反而会导致mAP下降。
4. Faster-R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
论文:http://arxiv.org/abs/
代码:/ShaoqingRen/faster_rcnn【matlab】
/rbgirshick/py-faster-rcnn【】
技术路线:vgg16卷积层+ RPN&+ Fast-r-cnn
在之前介绍的Fast-R-CNN中,第一步需要先使用Selective Search方法提取图像中的proposals。基于CPU实现的Selective Search提取一幅图像的所有Proposals需要约2s的时间。在不计入proposal提取情况下,Fast-R-CNN基本可以实时进行目标检测。但是,如果从端到端的角度考虑,显然proposal提取成为影响端到端算法性能的瓶颈。目前最新的EdgeBoxes算法虽然在一定程度提高了候选框提取的准确率和效率,但是处理一幅图像仍然需要0.2s。因此,Ren
Shaoqing提出新的Faster-R-CNN算法,该算法引入了RPN网络(Region Proposal Network)提取proposals。RPN网络是一个全卷积神经网络,通过共享卷积层特征可以实现proposal的提取,RPN提取一幅像的proposal只需要10ms.
Faster-R-CNN算法由两大模块组成:1.PRN候选框提取模块 2.Fast R-CNN检测模块。其中,RPN是全卷积神经网络,用于提取候选框;Fast R-CNN基于RPN提取的proposal检测并识别proposal中的目标。
4.1 Region Proposal Network (RPN)
RPN网络的输入可以是任意大小(但还是有最小分辨率要求的,例如VGG是228*228)的图片。如果用VGG16进行特征提取,那么RPN网络的组成形式可以表示为VGG16+RPN。
VGG16:参考/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt,可以看出VGG16中用于特征提取的部分是13个卷积层(conv1_1----&conv5.3),不包括pool5及pool5后的网络层次结构。
RPN:RPN是作者重点介绍的一种网络,如下图所示。RPN的实现方式:在conv5-3的卷积feature map上用一个n*n的滑窗(论文中作者选用了n=3,即3*3的滑窗)生成一个长度为256(对应于ZF网络)或512(对应于VGG网络)维长度的全连接特征。然后在这个256维或512维的特征后产生两个分支的全连接层:1.reg-layer,用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h;2.cls-layer,用于判定该proposal是前景还是背景。sliding
window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间。事实上,作者用全连接层实现方式介绍RPN层实现容易帮助我们理解这一过程,但在实现时作者选用了卷积层实现全连接层的功能。个人理解:全连接层本来就是特殊的卷积层,如果产生256或512维的fc特征,事实上可以用Num_out=256或512, kernel_size=3*3, stride=1的卷积层实现conv5-3到第一个全连接特征的映射。然后再用两个Num_out分别为2*9=18和4*9=36,kernel_size=1*1,stride=1的卷积层实现上一层特征到两个分支cls层和reg层的特征映射。注意:这里2*9中的2指cls层的分类结果包括前后背景两类,4*9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数。采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活。在RPN网络中,我们需要重点理解其中的anchors概念,Loss
fucntions计算方式和RPN层训练数据生成的具体细节。
Anchors:字面上可以理解为锚点,位于之前提到的n*n的sliding window的中心处。对于一个sliding window,我们可以同时预测多个proposal,假定有k个。k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定。所以,我们在后面说一个anchor,你就理解成一个anchor
box 或一个reference box.作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4*k个reg-layer的输出和2*k个cls-layer的score输出。对于一幅W*H的feature map,对应W*H*k个锚点。所有的锚点都具有尺度不变性。
Loss functions:在计算Loss值之前,作者设置了anchors的标定方法。正样本标定规则:1.如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;2.如果Anchor对应的reference box与ground truth的IoU&0.7,标记为正样本。事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference
box与groud truth的IoU不大于0.7,可以采用第一种规则生成。负样本标定规则:如果Anchor对应的reference box与ground truth的IoU&0.3,标记为负样本。剩下的既不是正样本也不是负样本,不用于最终训练。训练RPN的Loss是有classification loss (即softmax loss)和regression
loss (即L1 loss)按一定比重组成的。计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:1.预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;2.锚点reference box:之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a。3.ground
truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*。因此计算regression loss和总Loss方式如下:
RPN训练设置:在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然。训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化。
4.2 RPN与Faster-R-CNN特征共享
RPN在提取得到proposals后,作者选择使用Fast-R-CNN实现最终目标的检测和识别。RPN和Fast-R-CNN共用了13个VGG的卷积层,显然将这两个网络完全孤立训练不是明智的选择,作者采用交替训练阶段卷积层特征共享:
交替训练(Alternating training): Step1:训练RPN;Step2:用RPN提取得到的proposal训练Fast R-CNN;Step3:用Faster R-CNN初始化RPN网络中共用的卷积层。迭代执行Step1,2,3,直到训练结束为止。论文中采用的就是这种训练方式,注意:第一次迭代时,用ImageNet得到的模型初始化RPN和Fast-R-CNN中卷积层的参数;从第二次迭代开始,训练RPN时,用Fast-R-CNN的共享卷积层参数初始化RPN中的共享卷积层参数,然后只Fine-tune不共享的卷积层和其他层的相应参数。训练Fast-RCNN时,保持其与RPN共享的卷积层参数不变,只Fine-tune不共享的层对应的参数。这样就可以实现两个网络卷积层特征共享训练。相应的网络模型请参考/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt
4.3 深度挖掘
1.由于Selective Search提取得到的Proposal尺度不一,因此Fast-RCNN或SPP-Net生成的RoI也是尺度不一,最后分别用RoI Pooling Layer或SPP-Layer处理得到固定尺寸金字塔特征,在这一过程中,回归最终proposal的坐标网络的权重事实上共享了整个FeatureMap,因此其训练的网络精度也会更高。但是,RPN方式提取的ROI由k个锚点生成,具有k种不同分辨率,因此在训练过程中学习到了k种独立的回归方式。这种方式并没有共享整个FeatureMap,但其训练得到的网络精度也很高。这,我竟然无言以对。有什么问题,请找Anchors同学。
2.采用不同分辨率图像在一定程度可以提高准确率,但是也会导致训练速度下降。采用VGG16训练RPN虽然使得第13个卷积层特征尺寸至少缩小到原图尺寸的1/16(事实上,考虑到kernel_size作用,会更小一些),然并卵,最终的检测和识别效果仍然好到令我无言以对。
3.三种scale(128*128,256*256,512*512),三种宽高比(1:2,1:1,2:1),虽然scale区间很大,总感觉这样会很奇怪,但最终结果依然表现的很出色。
4.训练时(例如600*1000的输入图像),如果reference box (即anchor box)的边界超过了图像边界,这样的anchors对训练Loss不产生影响,即忽略掉这样的Loss.一幅600*1000的图经过VGG16大约为40*60,那么anchors的数量大约为40*60*9,约等于20000个anchor boxes.去除掉与图像边界相交的anchor boxes后,剩下约6000个anchor boxes,这么多数量的anchor boxes之间会有很多重叠区域,因此使用非极值抑制方法将IoU&0.7的区域全部合并,剩下2000个anchor
boxes(同理,在最终检测端,可以设置规则将概率大于某阈值P且IoU大于某阈值T的预测框(注意,和前面不同,不是anchor boxes)采用非极大抑制方法合并)。在每一个epoch训练过程中,随机从一幅图最终剩余的这些anchors采样256个anchor box作为一个Mini-batch训练RPN网络。
1.PASCAL VOC 2007:使用ZF-Net训练RPN和Fast-R-CNN,那么SelectiveSearch+Fast-R-CNN, EdgeBox+Fast-R-CNN,
RPN+Fast-R-CNN的准确率分别为:58.7%,58.6%,59.9%. SeletiveSeach和EdgeBox方法提取2000个proposal,RPN最多提取300个proposal,因此卷积特征共享方式提取特征的RPN显然在效率是更具有优势。
2.采用VGG以特征不共享方式和特征共享方式训练RPN+Fast-R-CNN,可以分别得到68.5%和69.9%的准确率(VOC2007)。此外,采用VGG训练RCNN时,需要花320ms提取2000个proposal,加入SVD优化后需要223ms,而Faster-RCNN整个前向过程(包括RPN+Fast-R-CNN)总共只要198ms.
3.Anchors的scales和aspect_ratio的数量虽然不会对结果产生明显影响,但是为了算法稳定性,建议两个参数都设置为合适的数值。
4.当Selective Search和EdgeBox提取的proposal数目由2000减少到300时,Faste-R-CNN的Recall&vs. IoU overlap ratio图中recall值会明显下降;但RPN提取的proposal数目由2000减少到300时,Recall&vs.
IoU overlap ratio图中recall值会比较稳定。
特征共享方式训练RPN+Fast-R-CNN能够实现极佳的检测效果,特征共享训练实现了买一送一,RPN在提取Proposal时不仅没有时间成本,还提高了proposal质量。因此Faster-R-CNN中交替训练RPN+Fast-R-CNN方式比原来的SlectiveSeach+Fast-R-CNN更上一层楼。
5.YOLO: You Only Look Once:Unified, Real-Time Object Detection
论文:https://arxiv.org/abs/
代码:/frischzenger/yolo-windows 【darknet】
/xingwangsfu/caffe-yolo
技术路线:端到端的回归和分类的CNN
YOLO是一个可以一次性预测多个Box位置和类别的卷积神经网络,能够实现端到端的目标检测和识别,其最大的优势就是速度快。事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑窗或提取proposal的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用proposal训练方式的Fast-R-CNN常常把背景区域误检为特定目标。当然,YOLO在提升检测速度的同时牺牲了一些精度。下图所示是YOLO检测系统流程:1.将图像Resize到448*448;2.运行CNN;3.非极大抑制优化检测结果。有兴趣的童鞋可以按照/darknet/install/的说明安装测试一下YOLO的scoring流程,非常容易上手。接下来将重点介绍YOLO的原理。
5.1 一体化检测方案
YOLO的设计理念遵循端到端训练和实时检测。YOLO将输入图像划分为S*S个网络,如果一个物体的中心落在某网格(cell)内,则相应网格负责检测该物体。在训练和测试时,每个网络预测B个bounding boxes,每个bounding box对应5个预测参数,即bounding box的中心点坐标(x,y),宽高(w,h),和置信度评分。这里的置信度评分(Pr(Object)*IOU(pred|truth))综合反映基于当前模型bounding box内存在目标的可能性Pr(Object)和bounding
box预测目标位置的准确性IOU(pred|truth)。如果bouding box内不存在物体,则Pr(Object)=0。如果存在物体,则根据预测的bounding box和真实的bounding box计算IOU,同时会预测存在物体的情况下该物体属于某一类的后验概率Pr(Class_i|Object)。假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率Pr(Class_i|Object), i=1,2,...,C;每一个网格预测B个bounding box的位置。即这B个bounding
box共享一套条件类概率Pr(Class_i|Object), i=1,2,...,C。基于计算得到的Pr(Class_i|Object),在测试时可以计算某个bounding box类相关置信度:Pr(Class_i|Object)*Pr(Object)*IOU(pred|truth)=Pr(Class_i)*IOU(pred|truth)。
注意:类别是针对每个网格的,置信度评分是针对每个bounding box的。
如果将输入图像划分为7*7网格(S=7),每个网格预测2个bounding box (B=2),有20类待检测的目标(C=20),则相当于最终预测一个长度为S*S*(B*5+C)=7*7*30的向量,从而完成检测+识别任务,整个流程可以通过下图理解。
&5.1.1 网络设计
YOLO网络设计遵循了GoogleNet的思想,但与之有所区别。YOLO使用了24个级联的卷积(conv)层和2个全连接(fc)层,其中conv层包括3*3和1*1两种Kernel,最后一个fc层即YOLO网络的输出,长度为S*S*(B*5+C)=7*7*30.此外,作者还设计了一个简化版的YOLO-small网络,包括9个级联的conv层和2个fc层,由于conv层的数量少了很多,因此YOLO-small速度比YOLO快很多。如下图所示我们给出了YOLO网络的架构。
5.1.2 训练
作者训练YOLO网络是分步骤进行的:首先,作者从上图网络中取出前20个conv层,然后自己添加了一个average pooling层和一个fc层,用1000类的ImageNet数据与训练。在ImageNet2012上用224*224d的图像训练后得到的top5准确率是88%。然后,作者在20个预训练好的conv层后添加了4个新的conv层和2个fc层,并采用随即参数初始化这些新添加的层,在fine-tune新层时,作者选用448*448图像训练。最后一个fc层可以预测物体属于不同类的概率和bounding box中心点坐标x,y和宽高w,h。Boundingbox的宽高是相对于图像宽高归一化后得到的,Bounding
box的中心位置坐标是相对于某一个网格的位置坐标进行过归一化,因此x,y,w,h均介于0到1之间。
在设计Loss函数时,有两个主要的问题:1.对于最后一层长度为7*7*30长度预测结果,计算预测loss通常会选用平方和误差。然而这种Loss函数的位置误差和分类误差是1:1的关系。2.整个图有7*7个网格,大多数网格实际不包含物体(当物体的中心位于网格内才算包含物体),如果只计算Pr(Class_i),很多网格的分类概率为0,网格loss呈现出稀疏矩阵的特性,使得Loss收敛效果变差,模型不稳定。为了解决上述问题,作者采用了一系列方案:
1.增加bounding box坐标预测的loss权重,降低bounding box分类的loss权重。坐标预测和分类预测的权重分别是λcoord=5,λnoobj=0.5.
2.平方和误差对于大和小的bounding box的权重是相同的,作者为了降低不同大小bounding box宽高预测的方差,采用了平方根形式计算宽高预测loss,即sqrt(w)和sqrt(h)。
训练Loss组成形式较为复杂,这里不作列举,如有兴趣可以参考作者原文慢慢理解体会。
5.1.3 测试
作者选用PASAL VOC图像测试训练得到的YOLO网络,每幅图会预测得到98个(7*7*2)个bouding box及相应的类概率。通常一个cell可以直接预测出一个物体对应的bounding box,但是对于某些尺寸较大或靠近图像边界的物体,需要多个网格预测的结果通过非极大抑制处理生成。虽然YOLO对于非极大抑制的依赖不及R-CNN和DPM,但非极大抑制确实可以将mAP提高2到3个点。
5.2.1 实时检测识别系统对比
5.2.2 VOC2007准确率比较
5.2.3 YOLO的缺点:
YOLO对相互靠的很近的物体,还有很小的群体 检测效果不好,这是因为一个网格中只预测了两个框,并且只属于一类。
对测试图像中,同一类物体出现的新的不常见的长宽比和其他情况是。泛化能力偏弱。
由于损失函数的问题,定位误差是影响检测效果的主要原因。尤其是大小物体的处理上,还有待加强。
YOLO是一种支持端到端训练和测试的卷积神经网络,在保证一定准确率的前提下能图像中多目标的检测与识别。
6.SSD:Single Shot MultiBox Detector
论文:http://arxiv.org/abs/
技术路线:端到端的回归和分类的CNN
&由于YOLO简单粗暴的将图像进行网格划分,然后对每个网格进行处理,这样导致不精确等一系列问题,而基于proposal的faster r-cnn定位较为精确的优点,SSD就结合了YOLO和faster的anchor进行检测。
6.1 网络模型
SSD网络包括两个部分,前面的是基础网络,用于图像分类的标准网络,但是把涉及到分类的层全部裁掉,后面的网络是作者设计的Extra
Feature layers,主要实现以下目标:&
Multi-scale feature maps for detection:加入卷积特征层,得到不同尺度的特征层,从而实现多尺度目标检测 ,用于不同尺度的目标预测的卷积模型是不同的。
Convolutional predictors for detection :对于每个添加的特征层,使用一组卷积滤波器,可以得到一组固定数目的目标检测的预测
。对于一个尺寸为m*n,p通道的特征层,使用一个 3*3*p 的小核作为一个基础元素来预测一个可能检测的信息(类别信息,位置信息)
Default boxes and aspect ratios :&在 Faster R-CNN中使用了 anchor boxes 实现不同大小和宽高比的物体提取 ,本文使用了类似的一组 default bounding
boxes,和 Faster R-CNN 主要区别是在不同尺度的特征层上进行这些default bounding boxes 检测运算的。
& &在训练时,建立ground truth和 default boxes的对应关系。对于每个ground truth,我们选择不同位置、宽高比、尺度的
default boxes 与之匹配,选择重合最大的 default boxe。这个和 original MultiBox [7] 是相似的。但是不同于 MultiBox,我们match default boxes to any ground truth with jaccard overlap higher than a threshold(0.5),这么做是为了简化学习问题。训练SSD和训练使用候选区域及池化的标准检测器最大不同之处在于,ground truth需要被赋予一组固定集合检测输出中某一个特定输出。当这个赋值确定之后,损失函数和后向传播就可以被端到端的应用。
&SSD能达到58帧每秒,精度有72.1。速度超过Faster
R-CNN 有8倍,但达到类似的精度。
作者代码:&#matlab版本
这里使用python版本的代码:
1.下载代码
2.克隆caffe
cd py-R-FCN
git clone&&#Microsoft的源
git reset --hard 1a2be8e
3.编译Cython模块
cd py-R-FCN/lib
4.编译caffe和pycaffe
这里Makefile.config要支持Python layers!
In your Makefile.config, make sure to have this line uncommented
WITH_PYTHON_LAYER := 1
cd py-R-FCN/caffe
cp Makefile.config.example Makefile.config&
make -j8 && make pycaffe
5.下载resnet caffemodel
从OneDriver下载rfcn_models&
解压到:py-R-FCN/data下
解压后的目录:
py-R-FCN/data/rfcn_models/resnet50_rfcn_final.caffemodel
py-R-FCN/data/rfcn_models/resnet101_rfcn_final.caffemodel
6.运行demo
python py-R-FCN/tools/demo_rfcn.py --net ResNet-50
python py-R-FCN/tools/demo_rfcn.py --net ResNet-101
ResNet-50效果图:
ResNet-101效果图:
7.准备训练和测试
笔者这里简单使用VOC2007,并且修改名称VOC0712,笔者把数据集直接放在py-R-FCN/data下
官网使用VOC2007和VOC2012,使用的时候要合并数据集,具体参考官网的Preparation for Training & Testing 第四点
8.下载ImageNet 与预训练的ResNet-50和ResNet-100
OneDriver:(在KaimingHe的github&&)
mkdir py-R-FCN/data/imagenet_models
将model放到该目录
9.可自己修改模型,类别,修改相应的py-r-fcn/py-R-FCN/models/pascal_voc/目录下对应的文件和py-r-fcn/lib/datasets/pascal_voc.py。笔者这里还是使用默认的。
10.修改迭代次数
vi py-r-fcn/experiments/scripts/rfcn_end2end_ohem.sh
把pascal_voc的ITERS 调小
./py-r-fcn/experiments/scripts/rfcn_end2end_ohem.sh 0 ResNet-50 pascal_voc&
其他训练方式请自行参考官网Usage
将训练好的模型py-r-fcn/py-R-FCN/output/rfcn_end2end_ohem/voc_0712_trainval/resnet50_rfcn_ohem_iter_x.caffemodel,放到 py-r-fcn/py-R-FCN/data/rfcn_models
下,修改 py-R-FCN/tools/demo_rfcn.py的NETS,运行
作者代码:
1.下载代码:
git clone&
git checkout ssd
2.编译代码
cp Makefile.config.example Makefile.config
make test -j8
make runtest -j8
1.下载caffemodel和prototxt&
从上边地址下载完放到/models/VGGNET/
4.下载VOC2007和VOC2012
cd /root/data
tar -xvf VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_06-Nov-2007.tar
tar -xvf VOCtest_06-Nov-2007.tar
5.创建LMDB文件
cd $CAFFE_ROOT
./data/VOC0712/create_list.sh
./data/VOC0712/create_data.sh
6.训练模型
python examples/ssd/ssd_pascal.py&
也可以从这里&下训练好的模型。
7.评估模型
python examples/ssd/score_ssd_pascal.py
8.测试模型
python examples/ssd/ssd_pascal_webcam.py #笔者这步忽略
贴几张youtube的SSD实时检测效果,视频地址:
直接用ssd_detect.ipynb(examples/ssd_detect.ipynb)测试
9.训练其他数据集忽略
mxnet 版本的ssd
代码地址:
1.下载代码
git clone --recursive&
2.编译mxnet
cd mxnet-ssd/mxnet
cp make/config.mk ./config.mk #自行修改配置文件
3.下载预训练模型
地址:。下载后解压到model下
4.测试demo
python demo.py --epoch 0 --images ./data/demo/dog.jpg --thresh 0.5
5.其他的训练数据忽略
1.下载代码
git clone&
cd darknet
2.下载模型
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg
其他效果图
4.所有检测
./darknet detect cfg/yolo.cfg yolo.weights data/dog.jpg -thresh 0
5.在视频上检测
./darknet detector demo cfg/coco.data cfg/yolo.cfg yolo.weights &video file&
faster-rcnn
官方版本:&#matlab
这里使用python版本:
1.下载代码
git clone --recursive&
笔者这里换了官方的源,没问题的同学可忽略
cd caffe-fast-rcnn
git remote add caffe&86Xgit
fetch caffe
git merge caffe/master&&
2.编译Cython模块
cd $FRCN_ROOT/lib
3.编译caffe和pycaffe
这里Makefile.config要支持Python layers!
In your Makefile.config, make sure to have this line uncommented
WITH_PYTHON_LAYER := 1
cd $FRCN_ROOT/caffe-fast-rcnn
make -j8 && make pycaffe
4.下载预训练模型
cd $FRCN_ROOT
./data/scripts/fetch_faster_rcnn_models.sh
5.测试demo
cd $FRCN_ROOT
./tools/demo.py
6.其他数据集训练的此处忽略
笔者使用的图像标注工具是labelImg,制作的格式和PASCAL VOC一样,可在windows、linux和Mac使用。
代码地址:
1.环境依赖
至少python2.6和PyQt 4.8
2.Linux/Ubuntu/Mac 安装
sudo apt-get install pyqt4-dev-tools
sudo pip install lxml
./labelImg.py
在文件目录下执行
pyrcc4 -o resources.py resources.qrc
python labelImg.py
3.常规使用步骤
python labelImg.py
在File菜单选Change default saved annotation folder
点击Open Dir,打开图片路径
点击Create RectBox,画标注
4.常用快捷键
Ctrl + r 选择annotation的默认存放路径
Ctrl + n 新建一个标注
Ctrl + s 保存图片
n:下张图片
p:上一张图片
5.预先可以在 labelImg/data/predefined_classes.txt 定义标注类别
1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentation
技术路线:selective search + CNN + SVMs
Step1:候选框提取(selective&search)
训练:给定一张图片,利用seletive search方法从中提取出2000个候选框。由于候选框大小不一,考虑到后续CNN要求输入的图片大小统一,将2000个候选框全部resize到227*227分辨率(为了避免图像扭曲严重,中间可以采取一些技巧减少图像扭曲)。
测试:给定一张图片,利用seletive search方法从中提取出2000个候选框。由于候选框大小不一,考虑到后续CNN要求输入的图片大小统一,将2000个候选框全部resize到227*227分辨率(为了避免图像扭曲严重,中间可以采取一些技巧减少图像扭曲)。
Step2:特征提取(CNN)
训练:提取特征的CNN模型需要预先训练得到。训练CNN模型时,对训练数据标定要求比较宽松,即SS方法提取的proposal只包含部分目标区域时,我们也将该proposal标定为特定物体类别。这样做的主要原因在于,CNN训练需要大规模的数据,如果标定要求极其严格(即只有完全包含目标区域且不属于目标的区域不能超过一个小的阈值),那么用于CNN训练的样本数量会很少。因此,宽松标定条件下训练得到的CNN模型只能用于特征提取。
测试:得到统一分辨率227*227的proposal后,带入训练得到的CNN模型,最后一个全连接层的输出结果---4096*1维度向量即用于最终测试的特征。
Step3:分类器(SVMs)
训练:对于所有proposal进行严格的标定(可以这样理解,当且仅当一个候选框完全包含ground truth区域且不属于ground truth部分不超过e.g,候选框区域的5%时认为该候选框标定结果为目标,否则位背景),然后将所有proposal经过CNN处理得到的特征和SVM新标定结果输入到SVMs分类器进行训练得到分类器预测模型。
测试:对于一副测试图像,提取得到的2000个proposal经过CNN特征提取后输入到SVM分类器预测模型中,可以给出特定类别评分结果。
结果生成:得到SVMs对于所有Proposal的评分结果,将一些分数较低的proposal去掉后,剩下的proposal中会出现候选框相交的情况。采用非极大值抑制技术,对于相交的两个框或若干个框,找到最能代表最终检测结果的候选框(非极大值抑制方法可以参考:http://blog.csdn/pb/article/details/)
R-CNN需要对SS提取得到的每个proposal进行一次前向CNN实现特征提取,因此计算量很大,无法实时。此外,由于全连接层的存在,需要严格保证输入的proposal最终resize到相同尺度大小,这在一定程度造成图像畸变,影响最终结果。&
2. SPP-Net : Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition)
&传统CNN和SPP-Net流程对比如下图所示(引自http://www.image-net.org/challenges/LSVRC/2014/slides/sppnet_ilsvrc2014.pdf)
SPP-net具有以下特点:
1.传统CNN网络中,卷积层对输入图像大小不作特别要求,但全连接层要求输入图像具有统一尺寸大小。因此,在R-CNN中,对于selective search方法提出的不同大小的proposal需要先通过Crop操作或Wrap操作将proposal区域裁剪为统一大小,然后用CNN提取proposal特征。相比之下,SPP-net在最后一个卷积层与其后的全连接层之间添加了一个SPP&(spatial pyramid pooling)&layer,从而避免对propsal进行Crop或Warp操作。总而言之,SPP-layer适用于不同尺寸的输入图像,通过SPP-layer对最后一个卷积层特征进行pool操作并产生固定大小feature
map,进而匹配后续的全连接层。
2.由于SPP-net支持不同尺寸输入图像,因此SPP-net提取得到的图像特征具有更好的尺度不变性,降低了训练过程中的过拟合可能性。
3.R-CNN在训练和测试是需要对每一个图像中每一个proposal进行一遍CNN前向特征提取,如果是2000个propsal,需要2000次前向CNN特征提取。但SPP-net只需要进行一次前向CNN特征提取,即对整图进行CNN特征提取,得到最后一个卷积层的feature map,然后采用SPP-layer根据空间对应关系得到相应proposal的特征。SPP-net速度可以比R-CNN速度快24~102倍,且准确率比R-CNN更高(下图引自SPP-net原作论文,可以看到SPP-net中spp-layer前有5个卷积层,第5个卷积层的输出特征在位置上可以对应到原来的图像,例如第一个图中左下角车轮在其conv5的图中显示为“^”的激活区域,因此基于此特性,SPP-net只需要对整图进行一遍前向卷积,在得到的conv5特征后,然后用SPP-net分别提取相应proposal的特征)。
SPP-Layer原理:
在RNN中,conv5后是pool5;在SPP-net中,用SPP-layer替代原来的pool5,其目标是为了使不同大小输入图像在经过SPP-Layer后得到的特征向量长度相同。其原理如图如下所示
SPP与金字塔pooling类似,即我们先确定最终pooling得到的featuremap大小,例如4*4 bins,3*3 bins,2*2 bins,1*1 bins。那么我们已知conv5输出的featuremap大小(例如,256个13*13的feature map).那么,对于一个13*13的feature map,我们可以通过spatial pyramid pooling (SPP)的方式得到输出结果:当window=ceil(13/4)=4, stride=floor(13/4)=3,可以得到的4*4
bins;当window=ceil(13/3)=5, stride=floor(13/3)=4,可以得到的3*3 bins;当window=ceil(13/2)=7, stride=floor(13/2)=6,可以得到的2*2 bins;当window=ceil(13/1)=13, stride=floor(13/1)=13,可以得到的1*1 bins.因此SPP-layer后的输出是256*(4*4+3*3+2*2+1*1)=256*30长度的向量。不难看出,SPP的关键实现在于通过conv5输出的feature
map宽高和SPP目标输出bin的宽高计算spatial pyramid pooling中不同分辨率Bins对应的pooling window和pool stride尺寸。
&原作者在训练时采用两种不同的方式,即1.采用相同尺寸的图像训练SPP-net 2.采用不同尺寸的图像训练SPP-net。实验结果表明:使用不同尺寸输入图像训练得到的SPP-Net效果更好。
SPP-Net +SVM训练:
&采用selective search可以提取到一系列proposals,由于已经训练完成SPP-Net,那么我们先将整图代入到SPP-Net中,得到的conv5的输出。接下来,区别于R-CNN,新方法不需要对不同尺寸的proposals进行Crop或Wrap,直接根据proposal在图中的相对位置关系计算得到proposal在整图conv5输出中的映射输出结果。这样,对于2000个proposal,我们事实上从conv1---&conv5只做了一遍前向,然后进行2000次conv5 featuremap的集合映射,再通过SPP-Layer,就可以得到的2000组长度相同的SPP-Layer输出向量,进而通过全连接层生成最终2000个proposal的卷积神经网络特征。接下来就和R-CNN类似,训练SVMs时对于所有proposal进行严格的标定(可以这样理解,当且仅当一个候选框完全包含ground
truth区域且不属于ground truth部分不超过e.g,候选框区域的5%时认为该候选框标定结果为目标,否则位背景),然后将所有proposal经过CNN处理得到的特征和SVM新标定结果输入到SVMs分类器进行训练得到分类器预测模型。
当然,如果觉得SVM训练很麻烦,可以直接在SPP-Net后再加一个softmax层,用好的标定结果去训练最后的softmax层参数。
3. Fast-R-CNN
基于R-CNN和SPP-Net思想,RBG提出了Fast-R-CNN算法。如果选用VGG16网络进行特征提取,在训练阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升9倍和3倍;在测试阶段,Fast-R-CNN的速度相比RCNN和SPP-Net可以分别提升213倍和10倍。
R-CNN和SPP-Net缺点:
1.R-CNN和SPP-Net的训练过程类似,分多个阶段进行,实现过程较复杂。这两种方法首先选用Selective Search方法提取proposals,然后用CNN实现特征提取,最后基于SVMs算法训练分类器,在此基础上还可以进一步学习检测目标的boulding box。
2.R-CNN和SPP-Net的时间成本和空间代价较高。SPP-Net在特征提取阶段只需要对整图做一遍前向CNN计算,然后通过空间映射方式计算得到每一个proposal相应的CNN特征;区别于前者,RCNN在特征提取阶段对每一个proposal均需要做一遍前向CNN计算,考虑到proposal数量较多(~2000个),因此RCNN特征提取的时间成本很高。R-CNN和SPP-Net用于训练SVMs分类器的特征需要提前保存在磁盘,考虑到2000个proposal的CNN特征总量还是比较大,因此造成空间代价较高。
3.R-CNN检测速度很慢。RCNN在特征提取阶段对每一个proposal均需要做一遍前向CNN计算,如果用VGG进行特征提取,处理一幅图像的所有proposal需要47s。
4.特征提取CNN的训练和SVMs分类器的训练在时间上是先后顺序,两者的训练方式独立,因此SVMs的训练Loss无法更新SPP-Layer之前的卷积层参数,因此即使采用更深的CNN网络进行特征提取,也无法保证SVMs分类器的准确率一定能够提升。
&Fast-R-CNN亮点:
1.Fast-R-CNN检测效果优于R-CNN和SPP-Net
2.训练方式简单,基于多任务Loss,不需要SVM训练分类器。
3.Fast-R-CNN可以更新所有层的网络参数(采用ROI Layer将不再需要使用SVM分类器,从而可以实现整个网络端到端训练)。
4.不需要将特征缓存到磁盘。
Fast-R-CNN架构:
Fast-R-CNN的架构如下图所示(/rbgirshick/fast-rcnn/blob/master/models/VGG16/train.prototxt,可以参考此链接理解网络模型):输入一幅图像和Selective Search方法生成的一系列Proposals,通过一系列卷积层和Pooling层生成feature map,然后用RoI(region of ineterst)层处理最后一个卷积层得到的feature map为每一个proposal生成一个定长的特征向量roi_pool5。RoI层的输出roi_pool5接着输入到全连接层产生最终用于多任务学习的特征并用于计算多任务Loss。全连接输出包括两个分支:1.SoftMax
Loss:计算K+1类的分类Loss函数,其中K表示K个目标类别,1表示背景;2.Regression Loss:即K+1的分类结果相应的Proposal的Bounding Box四个角点坐标值。最终将所有结果通过非极大抑制处理产生最终的目标检测和识别结果。
3.1 RoI Pooling Layer
事实上,RoI Pooling Layer是SPP-Layer的简化形式。SPP-Layer是空间金字塔Pooling层,包括不同的尺度;RoI Layer只包含一种尺度,如论文中所述7*7。这样对于RoI Layer的输入(r,c,h,w),RoI Layer首先产生7*7个r*c*(h/7)*(w/7)的Block(块),然后用Max-Pool方式求出每一个Block的最大值,这样RoI Layer的输出是r*c*7*7。
3.2 预训练网络初始化
RBG采用前辈们训练ImageNet时得到的网络模型(例如VGG16模型)初始化Fast-R-CNN模型中RoI层之前的所有层,我们可以把网络结构总结如下:13个卷积层+4个Pooling层+RoI层+2个FC层+两个平级层(即SoftmaxLoss层和SmoothL1Loss层)。其中,VGG16的第5个Pool层倍RoI层替换掉。
3.3 Finetuning for detection
3.3.1 Fast-R-CNN在网络训练阶段采用了一些trick,每个minibatch由N个图片(N=2)中的R个Proposal(R=128)组成。这种方式比从128张不同图片中提取1个Proposal的方式块64倍。当然,这种方式在一定程度会造成收敛速度变慢。另外,Fast-R-CNN无需SVM分类器,而是通过Softmax Classifer和Bounding-Box Regressors联合训练的方式更新所有参数。注意:从2张图中选取128个proposals时,需要保证至少25%的proposals与groundtruth的IoU超过0.5,剩下的全部作为背景类。不需要其它任何数据扩增操作。
3.3.2 多任务Loss:Fast R-CNN网络有两个同级别子Layer,分别用于分类和回归。分类选用SoftmaxLoss,回归使用SmoothL1Loss.两者的权重比例为1:1
3.3.3 SGD hyer-parameters:用于softmax分类任务和bounding-box回归的fc层参数用标准差介于0.01~0.001之间的高斯分布初始化。
3.4 Truncated SVD快速检测
在检测段,RBG使用truncated SVD优化较大的FC层,这样RoI数目较大时检测端速度会得到的加速。
Fast-R-CNN实验结论:
1.多任务Loss学习方式可以提高算法准确率
2.多尺度图像训练Fast-R-CNN与单尺度图像训练相比只能提升微小的mAP,但是时间成本却增加了很多。因此,综合考虑训练时间和mAP,作者建议直接用一种尺度的图像训练Fast-R-CNN.
3.基本上没人不会赞成:训练图像越多,模型准确率也会越高。
4.RBG的结果表明SoftmaxLoss的方式比SVMs分类器的结果略好一点点,虽然这不能绝对性说明自己的SoftmaxLoss好到哪儿去,但是至少大家不用再那么麻烦的去分步训练一个检测和识别网络了。
5.不是说Proposal提取的越多效果会越好,提的太多反而会导致mAP下降。
4. Faster-R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
在之前介绍的Fast-R-CNN中,第一步需要先使用Selective Search方法提取图像中的proposals。基于CPU实现的Selective Search提取一幅图像的所有Proposals需要约2s的时间。在不计入proposal提取情况下,Fast-R-CNN基本可以实时进行目标检测。但是,如果从端到端的角度考虑,显然proposal提取成为影响端到端算法性能的瓶颈。目前最新的EdgeBoxes算法虽然在一定程度提高了候选框提取的准确率和效率,但是处理一幅图像仍然需要0.2s。因此,Ren
Shaoqing提出新的Faster-R-CNN算法,该算法引入了RPN网络(Region Proposal Network)提取proposals。RPN网络是一个全卷积神经网络,通过共享卷积层特征可以实现proposal的提取,RPN提取一幅像的proposal只需要10ms.
Faster-R-CNN算法由两大模块组成:1.PRN候选框提取模块 2.Fast R-CNN检测模块。其中,RPN是全卷积神经网络,用于提取候选框;Fast R-CNN基于RPN提取的proposal检测并识别proposal中的目标。
4.1 Region Proposal Network (RPN)
RPN网络的输入可以是任意大小(但还是有最小分辨率要求的,例如VGG是228*228)的图片。如果用VGG16进行特征提取,那么RPN网络的组成形式可以表示为VGG16+RPN。
VGG16:参考/rbgirshick/py-faster-rcnn/blob/master/models/pascal_voc/VGG16/faster_rcnn_end2end/train.prototxt,可以看出VGG16中用于特征提取的部分是13个卷积层(conv1_1----&conv5.3),不包括pool5及pool5后的网络层次结构。
RPN:RPN是作者重点介绍的一种网络,如下图所示。RPN的实现方式:在conv5-3的卷积feature map上用一个n*n的滑窗(论文中作者选用了n=3,即3*3的滑窗)生成一个长度为256(对应于ZF网络)或512(对应于VGG网络)维长度的全连接特征。然后在这个256维或512维的特征后产生两个分支的全连接层:1.reg-layer,用于预测proposal的中心锚点对应的proposal的坐标x,y和宽高w,h;2.cls-layer,用于判定该proposal是前景还是背景。sliding
window的处理方式保证reg-layer和cls-layer关联了conv5-3的全部特征空间。事实上,作者用全连接层实现方式介绍RPN层实现容易帮助我们理解这一过程,但在实现时作者选用了卷积层实现全连接层的功能。个人理解:全连接层本来就是特殊的卷积层,如果产生256或512维的fc特征,事实上可以用Num_out=256或512, kernel_size=3*3, stride=1的卷积层实现conv5-3到第一个全连接特征的映射。然后再用两个Num_out分别为2*9=18和4*9=36,kernel_size=1*1,stride=1的卷积层实现上一层特征到两个分支cls层和reg层的特征映射。注意:这里2*9中的2指cls层的分类结果包括前后背景两类,4*9的4表示一个Proposal的中心点坐标x,y和宽高w,h四个参数。采用卷积的方式实现全连接处理并不会减少参数的数量,但是使得输入图像的尺寸可以更加灵活。在RPN网络中,我们需要重点理解其中的anchors概念,Loss
fucntions计算方式和RPN层训练数据生成的具体细节。
Anchors:字面上可以理解为锚点,位于之前提到的n*n的sliding window的中心处。对于一个sliding window,我们可以同时预测多个proposal,假定有k个。k个proposal即k个reference boxes,每一个reference box又可以用一个scale,一个aspect_ratio和sliding window中的锚点唯一确定。所以,我们在后面说一个anchor,你就理解成一个anchor
box 或一个reference box.作者在论文中定义k=9,即3种scales和3种aspect_ratio确定出当前sliding window位置处对应的9个reference boxes, 4*k个reg-layer的输出和2*k个cls-layer的score输出。对于一幅W*H的feature map,对应W*H*k个锚点。所有的锚点都具有尺度不变性。
Loss functions:在计算Loss值之前,作者设置了anchors的标定方法。正样本标定规则:1.如果Anchor对应的reference box与ground truth的IoU值最大,标记为正样本;2.如果Anchor对应的reference box与ground truth的IoU&0.7,标记为正样本。事实上,采用第2个规则基本上可以找到足够的正样本,但是对于一些极端情况,例如所有的Anchor对应的reference
box与groud truth的IoU不大于0.7,可以采用第一种规则生成。负样本标定规则:如果Anchor对应的reference box与ground truth的IoU&0.3,标记为负样本。剩下的既不是正样本也不是负样本,不用于最终训练。训练RPN的Loss是有classification loss (即softmax loss)和regression
loss (即L1 loss)按一定比重组成的。计算softmax loss需要的是anchors对应的groundtruth标定结果和预测结果,计算regression loss需要三组信息:1.预测框,即RPN网络预测出的proposal的中心位置坐标x,y和宽高w,h;2.锚点reference box:之前的9个锚点对应9个不同scale和aspect_ratio的reference boxes,每一个reference boxes都有一个中心点位置坐标x_a,y_a和宽高w_a,h_a。3.ground
truth:标定的框也对应一个中心点位置坐标x*,y*和宽高w*,h*。因此计算regression loss和总Loss方式如下:
RPN训练设置:在训练RPN时,一个Mini-batch是由一幅图像中任意选取的256个proposal组成的,其中正负样本的比例为1:1。如果正样本不足128,则多用一些负样本以满足有256个Proposal可以用于训练,反之亦然。训练RPN时,与VGG共有的层参数可以直接拷贝经ImageNet训练得到的模型中的参数;剩下没有的层参数用标准差=0.01的高斯分布初始化。
4.2 RPN与Faster-R-CNN特征共享
RPN在提取得到proposals后,作者选择使用Fast-R-CNN实现最终目标的检测和识别。RPN和Fast-R-CNN共用了13个VGG的卷积层,显然将这两个网络完全孤立训练不是明智的选择,作者采用交替训练阶段卷积层特征共享:
交替训练(Alternating training): Step1:训练RPN;Step2:用RPN提取得到的proposal训练Fast R-CNN;Step3:用Faster R-CNN初始化RPN网络中共用的卷积层。迭代执行Step1,2,3,直到训练结束为止。论文中采用的就是这种训练方式,注意:第一次迭代时,用ImageNet得到的模型初始化RPN和Fast-R-CNN中卷积层的参数;从第二次迭代开始,训练RPN时,用Fast-R-CNN的共享卷积层参数初始化RPN中的共享卷积层参数,然后只Fine-tune不共享的卷积层和其他层的相应参数。训练Fast-RCNN时,保持其与RPN共享的卷积层参数不变,只Fine-tune不共享的层对应的参数。这样就可以实现两个网络卷积层特征共享训练。相应的网络模型请参考/rbgirshick/py-faster-rcnn/tree/master/models/pascal_voc/VGG16/faster_rcnn_alt_opt
4.3 深度挖掘
1.由于Selective Search提取得到的Proposal尺度不一,因此Fast-RCNN或SPP-Net生成的RoI也是尺度不一,最后分别用RoI Pooling Layer或SPP-Layer处理得到固定尺寸金字塔特征,在这一过程中,回归最终proposal的坐标网络的权重事实上共享了整个FeatureMap,因此其训练的网络精度也会更高。但是,RPN方式提取的ROI由k个锚点生成,具有k种不同分辨率,因此在训练过程中学习到了k种独立的回归方式。这种方式并没有共享整个FeatureMap,但其训练得到的网络精度也很高。这,我竟然无言以对。有什么问题,请找Anchors同学。
2.采用不同分辨率图像在一定程度可以提高准确率,但是也会导致训练速度下降。采用VGG16训练RPN虽然使得第13个卷积层特征尺寸至少缩小到原图尺寸的1/16(事实上,考虑到kernel_size作用,会更小一些),然并卵,最终的检测和识别效果仍然好到令我无言以对。
3.三种scale(128*128,256*256,512*512),三种宽高比(1:2,1:1,2:1),虽然scale区间很大,总感觉这样会很奇怪,但最终结果依然表现的很出色。
4.训练时(例如600*1000的输入图像),如果reference box (即anchor box)的边界超过了图像边界,这样的anchors对训练Loss不产生影响,即忽略掉这样的Loss.一幅600*1000的图经过VGG16大约为40*60,那么anchors的数量大约为40*60*9,约等于20000个anchor boxes.去除掉与图像边界相交的anchor boxes后,剩下约6000个anchor boxes,这么多数量的anchor boxes之间会有很多重叠区域,因此使用非极值抑制方法将IoU&0.7的区域全部合并,剩下2000个anchor
boxes(同理,在最终检测端,可以设置规则将概率大于某阈值P且IoU大于某阈值T的预测框(注意,和前面不同,不是anchor boxes)采用非极大抑制方法合并)。在每一个epoch训练过程中,随机从一幅图最终剩余的这些anchors采样256个anchor box作为一个Mini-batch训练RPN网络。
1.PASCAL VOC 2007:使用ZF-Net训练RPN和Fast-R-CNN,那么SelectiveSearch+Fast-R-CNN,
EdgeBox+Fast-R-CNN, RPN+Fast-R-CNN的准确率分别为:58.7%,58.6%,59.9%. SeletiveSeach和EdgeBox方法提取2000个proposal,RPN最多提取300个proposal,因此卷积特征共享方式提取特征的RPN显然在效率是更具有优势。
2.采用VGG以特征不共享方式和特征共享方式训练RPN+Fast-R-CNN,可以分别得到68.5%和69.9%的准确率(VOC2007)。此外,采用VGG训练RCNN时,需要花320ms提取2000个proposal,加入SVD优化后需要223ms,而Faster-RCNN整个前向过程(包括RPN+Fast-R-CNN)总共只要198ms.
3.Anchors的scales和aspect_ratio的数量虽然不会对结果产生明显影响,但是为了算法稳定性,建议两个参数都设置为合适的数值。
4.当Selective Search和EdgeBox提取的proposal数目由2000减少到300时,Faste-R-CNN的Recall&vs. IoU overlap ratio图中recall值会明显下降;但RPN提取的proposal数目由2000减少到300时,Recall&vs.
IoU overlap ratio图中recall值会比较稳定。
特征共享方式训练RPN+Fast-R-CNN能够实现极佳的检测效果,特征共享训练实现了买一送一,RPN在提取Proposal时不仅没有时间成本,还提高了proposal质量。因此Faster-R-CNN中交替训练RPN+Fast-R-CNN方式比原来的SlectiveSeach+Fast-R-CNN更上一层楼。
5.YOLO: You Only Look Once:Unified, Real-Time Object Detection
YOLO是一个可以一次性预测多个Box位置和类别的卷积神经网络,能够实现端到端的目标检测和识别,其最大的优势就是速度快。事实上,目标检测的本质就是回归,因此一个实现回归功能的CNN并不需要复杂的设计过程。YOLO没有选择滑窗或提取proposal的方式训练网络,而是直接选用整图训练模型。这样做的好处在于可以更好的区分目标和背景区域,相比之下,采用proposal训练方式的Fast-R-CNN常常把背景区域误检为特定目标。当然,YOLO在提升检测速度的同时牺牲了一些精度。下图所示是YOLO检测系统流程:1.将图像Resize到448*448;2.运行CNN;3.非极大抑制优化检测结果。有兴趣的童鞋可以按照/darknet/install/的说明安装测试一下YOLO的scoring流程,非常容易上手。接下来将重点介绍YOLO的原理。
&5.1 一体化检测方案
YOLO的设计理念遵循端到端训练和实时检测。YOLO将输入图像划分为S*S个网络,如果一个物体的中心落在某网格(cell)内,则相应网格负责检测该物体。在训练和测试时,每个网络预测B个bounding boxes,每个bounding box对应5个预测参数,即bounding box的中心点坐标(x,y),宽高(w,h),和置信度评分。这里的置信度评分(Pr(Object)*IOU(pred|truth))综合反映基于当前模型bounding box内存在目标的可能性Pr(Object)和bounding
box预测目标位置的准确性IOU(pred|truth)。如果bouding box内不存在物体,则Pr(Object)=0。如果存在物体,则根据预测的bounding box和真实的bounding box计算IOU,同时会预测存在物体的情况下该物体属于某一类的后验概率Pr(Class_i|Object)。假定一共有C类物体,那么每一个网格只预测一次C类物体的条件类概率Pr(Class_i|Object), i=1,2,...,C;每一个网格预测B个bounding box的位置。即这B个bounding
box共享一套条件类概率Pr(Class_i|Object), i=1,2,...,C。基于计算得到的Pr(Class_i|Object),在测试时可以计算某个bounding box类相关置信度:Pr(Class_i|Object)*Pr(Object)*IOU(pred|truth)=Pr(Class_i)*IOU(pred|truth)。如果将输入图像划分为7*7网格(S=7),每个网格预测2个bounding box (B=2),有20类待检测的目标(C=20),则相当于最终预测一个长度为S*S*(B*5+C)=7*7*30的向量,从而完成检测+识别任务,整个流程可以通过下图理解。
&5.1.1 网络设计
YOLO网络设计遵循了GoogleNet的思想,但与之有所区别。YOLO使用了24个级联的卷积(conv)层和2个全连接(fc)层,其中conv层包括3*3和1*1两种Kernel,最后一个fc层即YOLO网络的输出,长度为S*S*(B*5+C)=7*7*30.此外,作者还设计了一个简化版的YOLO-small网络,包括9个级联的conv层和2个fc层,由于conv层的数量少了很多,因此YOLO-small速度比YOLO快很多。如下图所示我们给出了YOLO网络的架构。
5.1.}

我要回帖

更多关于 faster rcnn rpn 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信