注:1.本博文持续更新中,文章较长,能够收藏方便下次阅读。2.本人原创,谢绝转载。git
1. R-CNN:Rich feature hierarchies for accurate object detection and semantic segmentationgithub
技术路线: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)ide
训练:提取特征的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.net/pb09013037/article/details/45477591)
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的架构以下图所示(https://github.com/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复用了VGG训练ImageNet获得的网络模型,即VGG16模型以初始化Fast-R-CNN中RoI Layer之前的全部层。Fast R-CNN的网络结构总体能够总结以下:13个convolution layers + 4个pooling layers+RoI layer+2个fc layer+两个parrel层(即SoftmaxLoss layer和SmoothL1Loss layer)。在Fast R-CNN中,原来VGG16中第5个pooling layer被新的ROI layer替换掉。
3.3 Finetuning for detection
3.3.1 fast r-cnn在网络训练阶段采用了一些trick,每一个minibatch是由N幅图片(N=2)中提取获得的R个proposal(R=128)组成的。这种minibatch的构造方式比从128张不一样图片中提取1个proposal的构造方式快64倍。虽然minibatch的构造速度加快,但也在必定程度上形成收敛速度减慢。此外,fast-r-cnn摒弃了以前svm训练分类器的方式,而是选用softmax classifer和bounding-box regressors联合训练的方式更新cnn网络全部层参数。注意:在每2张图中选取128个proposals时,须要严格保证至少25%的正样本类(proposals与groundtruth的IoU超过0.5),剩下的可所有视做背景类。在训练网络模型时,不须要任何其余形式的数据扩增操做。
3.3.2 multi-task loss:fast r-cnn包括两个同等水平的sub-layer,分别用于classification和regression。其中,softmax loss对应于classification,smoothL1Loss对应于regression. 两种Loss的权重比例为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.multi-task loss训练方式能提升算法准确度
2.multi-scale图像训练fast r-cnn相比较single-scale图像训练相比对mAP的提高幅度很小,可是却增长了很高的时间成本。所以,综合考虑训练时间和mAP,做者建议直接用single尺度的图像训练fast-r-cnn。
3.用于训练的图像越多,训练获得的模型准确率也会越高。
4.SoftmaxLoss训练方式比SVMs训练获得的结果略好一点,所以没法证实SoftmaxLoss在效果上必定比svm强,可是简化了训练流程,无需分步骤训练模型。
5.proposal并非提取的越多效果越好,太多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:参考https://github.com/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不共享的层对应的参数。这样就能够实现两个网络卷积层特征共享训练。相应的网络模型请参考https://github.com/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网络。
4.3 实验
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值会比较稳定。
4.4 总结
特征共享方式训练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.非极大抑制优化检测结果。有兴趣的童鞋能够按照http://pjreddie.com/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.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 方法对比
做者将YOLO目标检测与识别方法与其余几种经典方案进行比较可知:
DPM(Deformable parts models): DPM是一种基于滑窗方式的目标检测方法,基本流程包括几个独立的环节:特征提取,区域划分,基于高分值区域预测bounding box。YOLO采用端到端的训练方式,将特征提取、候选框预测,非极大抑制及目标识别链接在一块儿,实现了更快更准的检测模型。
R-CNN:R-CNN方案分须要先用SeletiveSearch方法提取proposal,而后用CNN进行特征提取,最后用SVM训练分类器。如此方案,诚繁琐也!YOLO精髓思想与其相似,可是经过共享卷积特征的方式提取proposal和目标识别。另外,YOLO用网格对proposal进行空间约束,避免在一些区域重复提取Proposal,相较于SeletiveSearch提取2000个proposal进行R-CNN训练,YOLO只须要提取98个proposal,这样训练和测试速度怎能不快?
Fast-R-CNN、Faster-R-CNN、Fast-DPM: Fast-R-CNN和Faster-R-CNN分别替换了SVMs训练和SelectiveSeach提取proposal的方式,在必定程度上加速了训练和测试速度,但其速度依然没法和YOLO相比。同理,将DPM优化在GPU上实现也无出YOLO之右。
5.3 实验
5.3.1 实时检测识别系统对比
5.3.2 VOC2007准确率比较
5.3.3 Fast-R-CNN和YOLO错误分析
如图所示,不一样区域分别表示不一样的指标:
Correct:正确检测和识别的比例,即分类正确且IOU>0.5
Localization:分类正确,但0.1<IOU<0.5
Similar:类别类似,IOU>0.1
Other:分类错误,IOU>0.1
Background: 对于任何目标IOU<0.1
能够看出,YOLO在定位目标位置时准确度不及Fast-R-CNN。YOLO的error中,目标定位错误占据的比例最大,比Fast-R-CNN高出了10个点。可是,YOLO在定位识别背景时准确率更高,能够看出Fast-R-CNN假阳性很高(Background=13.6%,即认为某个框是目标,可是实际里面不含任何物体)。
5.3.4 VOC2012准确率比较
因为YOLO在目标检测和识别是处理背景部分优点更明显,所以做者设计了Fast-R-CNN+YOLO检测识别模式,即先用R-CNN提取获得一组bounding box,而后用YOLO处理图像也获得一组bounding box。对比这两组bounding box是否基本一致,若是一致就用YOLO计算获得的几率对目标分类,最终的bouding box的区域选取两者的相交区域。Fast-R-CNN的最高准确率能够达到71.8%,采用Fast-R-CNN+YOLO能够将准确率提高至75.0%。这种准确率的提高是基于YOLO在测试端出错的状况不一样于Fast-R-CNN。虽然Fast-R-CNN_YOLO提高了准确率,可是相应的检测识别速度大大下降,所以致使其没法实时检测。
使用VOC2012测试不一样算法的mean Average Precision,YOLO的mAP=57.9%,该数值与基于VGG16的RCNN检测算法准确率至关。对于不一样大小图像的测试效果进行研究,做者发现:YOLO在检测小目标时准确率比R-CNN低大约8~10%,在检测大目标是准确率高于R-CNN。采用Fast-R-CNN+YOLO的方式准确率最高,比Fast-R-CNN的准确率高了2.3%。
5.4 总结
YOLO是一种支持端到端训练和测试的卷积神经网络,在保证必定准确率的前提下能图像中多目标的检测与识别。
6.SSD:Single Shot MultiBox Detector