深度学习训练中bounding box有什么用

深度学习入门(19)
& & & & & & Faster R-CNN:&
& &rcnn的提出,用cnn来进行特征提取,进行classification之后,在分类的基础上进行稍微的fine-tuning之后在对每一个region proposal作为输入,大于IOU&0.5的region就是我们标记为positive其他的就是负样本,来训练detection网络。最后才开始在detection上进行特征提取。在特征提取结束之后并且训练的labels都准备好了(这里的labels指的是在训练SVM的时候进行的标记,大于0.3认为是正样本,并且这里对SVM现行分类器的数据标记IOU到底是多少有严格的界限,很重要,很重要)就可以开始运行整个框架啦。对每一个特征feed
into SVM进行分类,对score进行排序,在上canny。总之,好麻烦,好麻烦。那么问题是,fast rcnn有什么特点呢?他为什么就敢说自己比别人快呢?原因就是它直接产生一个层叫做ROI层,本质上相当于一个SPP的简化,只有一个平面。它会直接就会一次性输出分类的结果和bounding-box的那个框框。具体架构如下:
& & 上面显示的是fast-rcnn的框架,概述如下:fast rcnn的输入包括两个,一整张图片和一些候选区域(例如上面图片中的一个方框,这是用selective search选择的)。首先,在整幅图片上(region prosoal也进行相同的操作)进行卷积和最大化池操作,得到feature map.然后,用ROI层去从这些feature map中提取固定长度的feature
vector,然后这些feature vector fed into 层,最终会产生两个分支,一个是和softmax相关的多分类器,另一个会输出bounding-box。
& & 那什么是RoI层呢?该层主要使用maxPooling把任意有效的ROI转化成比较小,大小固定的H*W区域。也就是把大小是h*w的ROI转化成为大小H*W的窗口,估计有(h/H)*(w/W)个子窗口,然后把这些对应的子窗口经过maxPooling输出到对应的cell上(cell不好翻译,具体去看SPP)。你可以认为ROI层是SPP层的特例--仅仅有一层金字塔。
& & 在pre-trained的时候主要改变了AlexNet的三个地方:
& & 1):最后一个maxPooling被RoI层所代替。
& & 2):最后一个fc层和softmax层被被两个姊妹层所代替,一个是softmax用于分类,一个是用于得到边框。
& & 3):该网络的输入是有两个输入层。
& & 你会想到,同事以下运行两个任务,那他是怎样进行工作的,这里需要看看他的损失函数的定义,来看看:
& & 上面的表达式分为两个部分,前一个是和classification相关的分类损失函数。u代表的是当前的class,p是一个vector,代表每一个输入属于一个class的概率。后一个是和bounding-box相关的损失函数,其中u&=1表示,当u&=1的时候u=1,否则就是说u=0,也就是意味当你的region被标记为false的时候,就不要边框啦,没必要存取训练后面这个损失函数。例如对于background,u就是0.其中代表预测的位置,V=代表的是目标的坐标。具体的表达式如下,这个表达式也会在faster中用到。
& & 之后就可以进行实验结果的测评了,具体的明儿再说。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:17212次
排名:千里之外
原创:79篇
(2)(6)(5)(7)(26)(24)(1)(9)基于的人脸特征点定位作者:hjimce一、相关理论本篇博文主要讲解2013年CVPR的一篇利用做人脸特征点定位的经典paper:《Deep Convolutional Network Cascade for Facial Point Detection》,论文的主页为: 。网页提供了训练数据、测试demo,但是我却没有找到源码,所以只能自己写代码实现。这篇paper是利用深度学习搞人脸特征点定位的开山之作,想当年此算法曾经取得了state-of-art 的结果。后来face++发表的几篇paper的思想,都是在这篇paper的算法上进行扩展的。如果之前没有学过类似DCNN的思想的话,那么会感觉相当难,至少我是这么觉得的。在之前学过的各种模型中,一般就只有一个CNN,可这篇paper是由十几个CNN组成的。我一看到文献中如下网络结构图片:作为菜鸟的我,就已经晕了,然后在看一下文献的一些公式,我彻底没了耐性。因为我看外文paper,一般首先会直接看图、看公式,可这篇paper的图,一上来就把我吓到了。之前学过反,FCN、R-CNN、FR-CNN、OverFeat、Siamese Network、NIN等等各种网络,感觉花个一两天的时间,总可以把算法想通。可是学了这篇paper之后,感觉难度完全不是一个等级的,因为初次接触这种DCNN,花了好几周的时间,才把源码实现出来,过程相当痛苦,好吧,还是不罗嗦了,这篇博文将仔细讲解paper算法的实现过程,领略不一样的CNN模型,也就是传说中的DCNN(这篇paper,后来人们又把这种多层次的CNN模型称之为DCNN)。接着我将先简单介绍,文章的主要思想。1、回顾paper的总思想是一种从粗到精的定位思想,如果你之前已经对R-CNN有所了解,我们就回忆一下现在的一些物体检测的大体算法思路,因为我觉得RCNN也是一种从粗定位,到精识别的过程,跟本篇paper的思想很相似,下面是RCNN的流程图(RCNN文献《Region-based Convolutional Networks for Accurate Object Detection and Segmentation》):首先输入一张图片,然后的思路是:(1)采用传统的方法,先把一张图片中各个可能的物体的bounding box分割出来(2)把各个可能的裁剪出来的物体检测框,输入cnn,进行,最后进行物体分类识别OK,算法的总体思路很简单。其实这也是一种从粗到精的思想,就是我们对输入的一整张图片先进行粗定位,先定位出物体的bounding box,也就是物体的大体的位置。然后进行裁剪(bouding box),这样我们裁剪出来的图片范围就变小了,外界背景因素的干扰就减小了,然后我们在把裁剪后的图片,作为CNN的输入,这样有利于提高精度。总之,假设你要用CNN做,那么你就不应该把一整张图片,包括风景、背景、身体、头发这些背景因素都扔进CNN中,这样的精度会比较小。你应该是先用,把人脸部位的图片裁剪出来,送入CNN中,精度才会较高。OK,可能你觉得,我这边讲的话题有点废话,其实《Deep Convolutional Network Cascade for Facial Point Detection》这篇paper的思想就是这样,很简单的一个思想。2、paper的思想图 1回到本篇文章的主题,特征点定位。以上面的图片为例,假设我们要定位出上面的5个人脸特征点,从粗定位到精定位的过程如下(下面我先用最简单的理解方式,讲解粗到精的定位过程,先不根据paper的算法进行讲解,等明白了粗定精的定位过程,我们再结合paper的算法进行细讲):(1) level1。首先我们要做的第一步,把人脸图片裁剪出来,而不是直接把上面的一整张图片,扔到CNN中,因为上面图片包含的范围太大了,我们需要使得输入CNN的图片范围越小越好,比如裁剪成下面的图片,然后输入CNN中(我们只需要保证要定位的5个特征点包含在里面就可以了):图 2因此网络的第一层次CNN模型,我们的目标就是要定位出包含这5个特征点的最小包围盒,缩小搜索范围(paper没有这一层,它所采用的算法是直接采用人脸检测器,但是如果采用cnn,先定位出5个特征点的bounding box 精度会比直接采用人脸检测器,定位精度来的高,这个可以从后面face++发表的paper:《Extensive Facial Landmark Localization with Coarse-to-fine Convolutional Network Cascade》中看到,这篇我以后会在另外一篇博文中讲解,这边只是为了方便理解)本层次CNN模型的输入:原始图片(图1)本层次CNN模型的输出:包含五个特征点的bonding box,预测出bounding box后,把它裁剪出来,得到图2(2) level2。接着我们采用CNN,粗定位出这五个特征点,如下图所示(换了一张示例图片,将就一下):图 3上面示例图中,蓝色的点是正确的点;然后红色的点是,我们采用本层次网络CNN模型,预测定位出来的特征点。可以看到红色的点和正确的蓝色点,之间还是有很大的误差,这就是所谓的粗定位,只能大体的搜索到各个点的位置,精度还有待提高。这一层次,又称之为网络特征点的初始定位层,很粗糙的一个定位。然后根据我们cnn的粗定位点,也就是红色的点,作为中心,进行裁剪出一个小的矩形区域,进一步缩小搜索范围:鼻子 左右嘴角 左右眼睛图 4本层次CNN模型输入:包含五个特征点的bounding box图片(也就是图 2)本层次CNN模型输出:预测出五个特征点的初始位置,得到图3的红色特征点位置,预测出来以后,进行裁剪,把各个特征点的一个小区域范围中的图片裁剪出来,得到图4(3) level3。这一层又称之位精定位。因此接着我们就要分别设计5个CNN模型,用于分别输入上面的5个特征点所对应的图片区域了,然后用于分别定位,找到蓝色正确点的坐标。通过图4的裁剪,我们的搜索的范围一下子小了很多,就只有小小的一个范围而已了。这边需要注意,各个部位的CNN模型参数是不共享的,也就是各自独立工作,5个CNN用于分别定位5个点。每个CNN的输出是两个神经元(因为一个CNN,只定位1个特征点,一个特征点,包含了(x,y)两维)。声明:这一层次的网络,文献不仅仅包含了5个CNN,它是用了10个CNN,每个特征点有两个CNN训练预测,然后进行平均,我们这里可以先忽略这一点,影响不大。本层次CNN模型输入:各个特征点,对应裁剪出来的图片区域,如图4本层次CNN模型输出:各个特征点的精定位位置。OK,到了这里,基本讲完了,从粗定位到精定位的思想了,如果看不懂,就得结合文献,反复的读了,因为只有懂了这个思想,才能进行下一步。二、网络架构上面只是对从粗到精的思想,大体的思路进行了讲解,但是具体我们要怎么实现,代码要怎么实现,各个网络是如何训练的?因此接着我要讲的就是细节、代码实现问题,上面讲解从粗到精的思想的时候,我为了方便理解,所以有的一些细节也没有根据文献的讲。这一部分,我们将根据文献的一步一步,每个细节,网络结构进行讲解。首先我们先再次看一下网络的结构图:这篇papar的,总体上分成三大部分,分别是:level 1、level 2、level 3。每个level 里面,包含着好几个CNN模型,我们将一步一步剖析这个网络结构。在最开始的时候,首先,我们利用人脸检测器,裁剪出人脸图片,具体的人脸检测器的就是用我们传统的方法,比如haar特征。然后把我们裁剪出来的人脸图片,作为level 1的输入。下面开始分层次讲解各个level 的具体细节(在此不要纠结level 这个词怎么,如果非要理解这个词,可以用“等级”,leve 1表示最粗糙的等级,然后level 2表示精等级,level 3表示更精的等级)。1、level 1网络架构网络的输入:我们通过,裁剪出face bounding box,然后把它转换成灰度图像,最后缩放到39*39大小的图片,这个39*39的图片,将作为我们level 1的输入。在网络的第一层次上,由三个卷积神经网络组成,这三个卷积神经网络分别命名为:F1(网络的输入为一整张人脸图片),(输入图片包含了眼睛和鼻子)、(包含了鼻子和嘴巴区域)。这三个区别在于输入的图片区域不同:第一层次网络A、F1结构F1的输入为整个人脸图片(39*39的大小),输出为我们所要预测的五个特征点。F1的网络结构如下:F1的网络结构图输入一张人脸图片大小为39*39,然后通过卷积神经网络,输出一个10维的特征向量(5个特征点)。F1的结构,第一个层特征图选择20,第二次卷积特征图个数选择40,然后接着是60、80。具体各层的参数可以参考下面表格:F1网络参数I(39,39)表示输入图片大小为39*39,P(2)应该表示池化为stride大小为2。具体的各层参数我就不再详解,因为这个不是重点,而且即便是你没有根据paper的结构进行设计,对精度的影响也不大(只要你设计的网络合理,不要出现过拟合、欠拟合都OK)B、EN1、NM1的网络结构这两个CNN和F1基本相同,不过输入图片的大小不同,输出神经元的个数也不相同。EN1用于定位:左眼+右眼+鼻子 三个特征点,因此自然而然,网络设计的时候,输出层的神经元个数就是6。然后输入的图片,是我们根据比例裁剪的,我们把39*39图片的上半部分裁剪出来,裁剪出31*39大小的图片,当然裁剪大小比例这个是一个经验裁剪,我们只要保证裁剪的区域包含了眼睛和鼻子区域就好了。NM1用于定位:左嘴角+右嘴角+鼻子 三个特征点。同样的,网络的输出就是6个神经元,输入部分,从人脸的底部往上裁剪,也是裁剪出31*39的图片,只要裁剪出来的区域,只包含嘴巴和鼻子,就OK了。具体这两个CNN的各层相关参数,如下表格中的S1行所示(S0是F1,S1是EN1、NM1):EN1\NM1网络参数那么F1、EN1、三个网络是怎么连接在一起的?我们通过平均的方法,把重复预测的特征点进行位置平均。比如我们的鼻子点,三个网络都可以预测到位置,那么我们就把这三个网络预测出来的鼻子点,三个点相加,然后除以3,就可以得到平均位置了。再如,右眼睛,我们F1、这两个网络有预测,我们就把这两个网络预测到的右眼睛点相加在一起,然后除以2,就得到平均位置了。那么为什么要搞得这么复杂了,为什么要用三个网络进行分别预测,然后进行平均呢?其实这个就像Alexnet一样,采用平均预测的方法,可以提高网络的稳定性,提高精度,如果你之前已经学过Alexnet,就会明白作者为什么要用平均预测。总之”平均“,可以提高网络的稳定性、防止预测特征点的位置偏差过大,提高精度。OK,我们大体知道了level 1由三个CNN组成,三个CNN分别预测各自所需要的特征点,然后进行位置平均。这三个CNN都包含了9层(如上面的表格所示),算是一个深度网络。level 1因为是粗定位,输入的图片区域比较大,难度比较大,所以我们设计这一层级网络的时候,需要保证网络的深度,用于提取复杂的特征(原理解释请自己查看paper)。突然感觉讲到这边,有点累了,好漫长的算法,感觉才讲了一半左右,坚持……2、level 2 网络架构A、level 2的输入经过了level 1 我们大体可以知道了,各个特征点的位置,接着我们要减小搜索范围,我们以第一层级预测到的特征点,以这五个预测特征点为中心,然后用一个较小的bbox,把这五个特征点的小区域范围内的图片裁剪出来,如下图所示:鼻子 左右嘴角 左右眼睛level 2 输入上图中,红色的点就是我们用level 1 预测出来的位置,然后在进行裁剪(上面图,我是自己手动随便裁剪的,因为比较懒,所以就随便做了一个示意图,我们程序裁剪的时候,是以预测点为中心点,裁剪出一个矩形框)。OK,既然是裁剪,那么我们要裁剪多大?这个可以从下面表格参数中知道,level 2采用的是S2行,我们只需要看S2那一行参数就可以了:我们裁剪的时候,是以level 1的特征点为中心,裁剪出小区域范围的图片。B、网络总体结构level 2 组成本层次的网络CNN个数可就多了,level 2 由10个CNN组成,每个CNN网络层数、每层的相关参数,如上面的表格中S2那一行所示。总之就是leve 2 和level 3的结构都是用了S2那一行的参数,每个CNN包含6层。哎,看到上面level 2的10个CNN,估计会有点晕,其实很简单,且听我细细道来:这10个CNN,分别用于预测5个特征点,每个特征点用了两个CNN,然后两个CNN对预测的结果进行平均。我们以左眼特征点为例,我们用表格S2行的参数设计出了LE21、LE22,我们在训练的时候,训练了两个模型,这两个CNN都是用于预测左眼特征点,然后我们使用的时候,就直接用这两个CNN预测到的特征点,做位置平均。总之一句话就是:还是平均,跟level 1一样,也是用多个CNN进行位置平均。3、level 3网络架构level 3是在level 2得到预测点位置的基础上,重新进行裁剪。我们知道由level 2的网络,我们可以进一步得到那5个特征点的位置(离正确的点越近了),然后我们利用level 2的预测位置,重新进行裁剪。然后在重新进行预测,level 3的总体结构如下: 与level 2结构相同,也是由10个CNN组成,每两个CNN预测1个特征点。那么level 3和level 2的区别在哪里呢?首先我们的裁剪区域发生了变化,我们也可以让level 3的裁剪图片大小再变得更小一些。三、网络训练测试误差评价标准公式如下:其中l是人脸框的长度。其它细节:1、采用local shared weights 有助于level 1的精度提高2、采用abs+tanh 激活,可以提高网络性能:OK,终于解放了,讲解完毕,对于人脸特征点的定位,出了从粗到精的定位方法,后面还有一些paper采用的是mutil-task方法,好像很不错的样子,以后在慢慢学习。参考文献:1、《Deep Convolutional Network Cascade for Facial Point Detection》2、《Extensive Facial Landmark Localization with Coarse-to-fine Convolutional Network Cascade》3、《Face Alignment at 3000 FPS via Regressing Local Binary Features》4、《Face Alignment by Explicit Shape Regression》将为您减少类似内容我要收藏120个赞不感兴趣分享到分享到:相关文章还可以输入140字热门频道25.2万人订阅18.4万人订阅38.9万人订阅20.3万人订阅30.3万人订阅你还可用第三方账号来登录请输入你注册的电子邮件地址绑定密保手机*您可用使用此密保手机找回密码及登录*请勿随意泄露手机号,以防被不法分子利用,骗取帐号信息手机号码发送验证码确定电子邮件请输入您的意见和建议请您输入正确的邮箱地址,以便我们和您联系,帮您解决问题。扫描下载手机客户端热门搜词 深度学习(十八)基于R-CNN的物体检测-CVPR 2014-未完待续
 深度学习(十八)基于R-CNN的物体检测-CVPR 2014-未完待续
基于R-CNN的物体检测
原文地址:
作者:hjimce
一、相关理论
& & 本篇博文主要讲解2014年CVPR上的经典paper:《Rich feature hierarchies&for&Accurate Object Detection and Segmentation》,这篇文章的算法思想又被称之为:R-CNN(Regions
with Convolutional Neural Network Features),是物体检测领域曾经获得state-of-art精度的经典文献,2013年ILSVRC2013的冠军,一口气把原来的物体检测的精度从40%提高到了53%,引用率非常高。所以如果你搞物体检测方面,肯定会接触到这个算法。
& &这篇paper的思想,改变了物体检测的总思路,现在好多文献关于深度学习的物体检测的算法,基本上都是继承了这个思想,比如:《Spatial Pyramid Pooling in Deep Convolutional&Networks for Visual Recognition》,所以学习经典算法,有助于我们以后搞物体检测的其它paper。
& & 之前刚开始接触物体检测算法的时候,老是分不清deep learning中,物体检测和图片分类算法上的区别,弄得我头好晕,终于在这篇paper上,看到了解释。物体检测和图片分类的区别:图片分类不需要定位,而物体检测需要定位出物体的位置,也就是相当于把物体的bbox检测出来,还有一点物体检测是要把所有图片中的物体都识别定位出来。
二、基础知识
1、有监督预训练与无监督预训练
(1)无监督预训练(Unsupervised pre-training)
无监督预训练这个名词我们比较熟悉,栈式自编码、DBM采用的都是都是无监督预训练。因为预训练阶段的样本不需要自己标注数据,所以就叫做无监督预训练。
(2)有监督预训练(Supervised pre-training)
所谓的有监督预训练,我们也可以把它称之为迁移学习。比如你已经有一大堆标注好的人脸年龄分类的图片数据,训练了一个CNN,用于人脸的年龄识别。然后当你遇到新的项目任务是:人脸性别识别,那么这个时候你可以已经训练好的年龄识别这个CNN模型,去掉最后一层,然后其它的网络层参数就直接复制过来,继续进行训练。这就是所谓的迁移学习,说的简单一点就是把一个任务的训练好的参数,拿到另外一个任务,作为神经网络的初始参数值,这样相比于你直接采用随机初始化的方法,精度可以有很大的提高。
图片分类标注好的训练数据非常多,但是物体检测的标注数据却很少,如何用少量的标注数据,训练高质量的模型,这就是文献最大的特点,这篇paper采用了迁移学习的思想。文献就先用了ILSVRC2012这个训练数据库(这是一个图片分类训练数据库),先进行网络的图片分类训练。这个数据库有大量的标注数据,共包含了1000种类别物体,因此预训练阶段cnn模型的输出是1000个神经元,或者我们也直接可以采用Alexnet训练好的模型参数。
2、IOU的定义
三、算法总体思路&
开始讲解算法前,我们需要算法的总体思路,把握总体思路,才容易理解paper的算法。
& 图片分类与物体检测不同,物体检测需要定位出物体的位置,这种就相当于回归问题,求解一个包含物体的方框。而图片分类其实是逻辑回归。这种方法对于单物体检测还不错,但是对于多物体检测就……因此paper采用的方法是:
首先输入一张图片,我们先定位出个物体候选框,然后采用提取每个候选框中图片的特征向量,特征向量的维度为维,接着采用算法对各个候选框中的物体进行分类识别。也就是总个过程分为三个程序:a、找出候选框。b、利用CNN提取特征向量
c、利用SVM进行特征向量分类。具体的流程如下图片所示:
接着后面我们将根据三个过程,进行每个步骤的详细讲解。
四、候选框搜索阶段
1、实现方式
让我们输入一张图片时,我们要搜索出所有是物体的区域,这个采用的方法是传统文献的算法:《search for object recognition》,这个我们搜索出2000个候选框。然后我们从上面的总流程图中可以看到,我们搜出的候选框,是矩形的,而且是大小各不相同。但是我们知道CNN对输入图片的大小是有固定的,如果把搜索到的矩形选框不做处理,就扔进CNN中,肯定不行。因此对于每个输入的候选框都需要缩放到固定的大小,当然paper的缩放很简单,就是不管图片的长宽比例,管它是否扭曲,进行缩放就是了,全部缩放到CNN输入的大小227*227。(这个时候其实我们可以想到,一张矩形图片,如果强制把它缩放到227*227的正方形图片,肯定会发生扭曲,就像上面总流程图中的图3,这个方法可定会识别精度,所以在后来的另外一篇paper中:《Spatial
Pyramid Pooling in Deep Convolutional&Networks for Visual Recognition》才改进了这个输入图片的扭曲问题,在这篇博文中,我们暂且不考虑图片是否发生扭曲)。经过resize后的图片如下:
不管你物体是长的,总之最后都要强制resize到一个正方形图片。
2、问题解答
问题一:OK,看完这一部分我们会有这么一个疑问:作者为什么不用背景填充的方式呢?
问题二:2000个候选框的正样本与负样本的标注问题,因为svm训练和cnn训练过程的正负样本定义方式各有不同。
五、CNN特征提取阶段
1、网络描述
a、网络设计
CNN的网络结构方面与Alexnet网络相同(除了最后一层的softmax层之外),图片输入的大小是227*227,如果还不知道Alexnet的,还是先好好学习经典paper《ImageNet&Classification&with&Deep&Convolutional》。Alexnet特征提取部分包含了5个卷积层、2个全连接层,在Alexnet中p5层神经元个数为
f6、f7的神经元个数都是4096,通过这个网络训练完毕后,最后提取特征每个输入候选框图片都能得到一个4096维的特征向量。
b、网络训练
参数初始化部分:物体检测的一个难点在于,物体标签训练数据少,如果要直接采用随机初始化CNN参数的方法,那么目前的训练数据量是远远不够的。这种情况下,最好的是采用某些方法,把参数初始化了,然后在进行有监督的参数微调,这边文献采用的是有监督的预训练。所以paper在设计网络结构的时候,是直接用Alexnet的网络,然后连参数也是直接采用它的参数,作为初始的参数值,然后再fine-tuning训练。
网络优化求解:采用随机梯度下降法,学习速率大小为0.001;、
2、问题解答
问题一:反正CNN都是用于提取特征,那么我直接用Alexnet做特征提取,省去fine-tuning阶段可以吗?这个是可以的,你可以不需重新训练CNN,直接采用Alexnet模型,提取出p5、或者f6、f7的特征,作为特征向量,然后进行训练svm。那么问题又来了,没有fine-tuning的时候,要选择哪一层的特征作为cnn提取到的特征呢?我们有可以选择p5、f6、f7,这三层的神经元个数分别是9216、。从p5到p6这层的参数个数是:&,从f6到f7的参数是。那么具体是选择p5、还是f6,又或者是f7呢?
文献paper给我们证明了一个理论,如果你不进行fine-tuning,也就是你直接把Alexnet模型当做万金油使用,类似于HOG、SIFT一样做特征提取,不针对特定的任务。然后把提取的特征用于分类,结果发现p5的精度竟然跟f6、f7差不多,而且f6提取到的特征还比f7的精度略高。如果你进行fine-tuning了,那么f7、f6的提取到的特征最会训练的svm分类器的精度就会飙涨。
据此我们明白了一个道理,如果不针对特定任务进行fine-tuning,而是把CNN当做特征提取器,卷积层所学到的特征其实就是基础的共享特征提取层,就类似于SIFT算法一样,可以用于提取各种图片的特征,而f6、f7所学习到的特征是用于针对特定任务的特征。打个比方:对于人脸性别识别来说,一个CNN模型前面的卷积层所学习到的特征就类似于学习人脸共性特征,然后全连接层所学习的特征就是针对性别分类的特征了。
问题二:CNN训练的时候,本来就是对bounding&box的物体进行识别分类训练,是一个端到端的任务,在训练的时候最后一层softmax就是分类层,那么为什么作者闲着没事干要先用CNN做特征提取(提取fc7层数据),然后再把提取的特征用于训练svm分类器?
事情是这样的,cnn在训练的时候,对训练数据做了比较宽松的标注,比如一个bounding&box可能只包含物体的一部分,那么我也把它标注为该物体类别,用于训练cnn,然而svm训练的时候,标注数据是比较严格的,我们只有当bounding&box把整个物体都包含进去了,我们才把它标注为物体类别,然后训练svm。采用这个方法的主要原因在于因为CNN容易过拟合,所以需要大量的训练数据,所以在CNN训练阶段我们是对Bounding
box的位置限制条件限制的比较松。
看完上面的算法总体过程,我们会有好几个疑问,第一:上面的CNN先用迁移学习进行参数预训练,然后又进行微调,那么问题来了在进行预训练的时候,我们本来就是用了图片分类数据库ILSVRC2012进行训练,然后我们微调的任务也是图片分类,这会有差别吗?其实这两个阶段的数据最大的差别在于数据分布,而且微调阶段的训练数据是经过强制缩放的指定的大小的,必然会与ILSVRC2012的训练数据会有很大的差别。
3.2&测试阶段
当我们输入一张图片的时候,我们首先用&selective&search&搜索出2000个候选框,然后把所有候选框缩放到cnn的输入大小,送入cnn中,然后我们提取cnn的第?层特征。然后对于每个类别,我们用cnn的提取的特征送入已经训练好的这个类别所对应的svm中,对该特征向量进行评分(难道训练阶段每个物体有训练一个svm模型?),然后我们对所有的候选框的评分结果,采用非极大值抑制?的方法:如果一个候选框A,比另外一个候选框B的评分还低,并且A和B的两个候选框的重叠区域超过了一个一定的数值,我们就扔掉A(把它当做背景,没用的东西)。
(1)测试阶段运行效率分析
首先所有的类别分类,他们共用一个CNN模型,用于特征提取,所以当要分类的时候,我们只跑了一个CNN前向传导(一个候选框);另外通过cnn提取的特征的维数和其它的方法相比,算是比较少的,所以效率会比较高。
我们知道svm预测阶段的时候,我们只需要计算:
判断阈值就ok了。当我们用CNN提取2000个候选框,可以得到这样的特征向量矩阵,然后我们只需要把这样的一个矩阵与svm权值矩阵4096*N点乘(N为分类类别数目,因为我们训练的N个svm,每个svm包好了4096个W),就可以得到结果了。
3.3&训练过程
3.3.1有监督预训练
3.3.2&指定任务有监督微调
我们接着采用selective&search&搜索出来的候选框,然后resize到指定大小,继续对我们的cnn模型进行训练。假设我们要检测的物体类别有N类,那么我们就需要把上面预训练阶段的CNN模型的最后一层给替换掉,替换成N+1个输出的神经元(加1,表示还有一个背景),然后这一层直接采用参数随机初始化的方法,其它网络层的参数不变。
接着就可以开始继续SGD训练了。
我们定义一下,我们的标注数据box,然后我们用selective&search挑选出来的候选框,如果与物体的标签bounding&box的重叠区域大于0.5IoU,那么我们就把这个候选框标注成物体类别,否则我们就把它当做背景。
开始的时候,SGD学习率选择0.001,在每次训练的时候,我们batch&size大小选择128,其中32个事正样本、96个事负样本(背景)
3.3.3&物体分类
这是一个二分类问题,我么假设我们要检测车辆。我们知道只有当bounding&box把整量车都包含在内,那才叫正样本。但问题是当我们的检测窗口只有部分包好物体,那该怎么定义是否正确。我们定义IOU为代表人工标注的bounding&box与算法检测出来的bounding&box的重叠度,不过重叠度阈值选择多少合适,文献作者就测试了数值0,0.1,0.2,0.3,0.4,0.5。最后我们通过训练发现,如果选择IOU阈值为0.3效果最好(选择为0精度下降了4个百分点,选择0.5精度下降了5个百分点),因此当重叠度小于0.3的时候,我们就把它标注为负样本。
一旦特征被提取出来,那么我们将为每个物体累训练一个svm分类器。文献7.2部分即将解释为什么cnn&微调阶段和svm对于正负样本定义的区别,同时我们也将会解释为什么我们不采用cnn的softmax输出结果,反而是要先把特征提取出来,在用svm来训练分类器。
4.2.2&fine-tuning的时候
我们发现f6、f7、p5,最后f7层精度最高。根据这样的一个实验,我们可以推断,对于一个完整的cnn来说,卷积层学习到的是基础特征提取,而全连层学习到的则是针对特定任务的特征。
4.3&网络架构
网络架构我们有两个可选方案:第一选择经典的Alexnet,第二选择VGG16。经过测试Alexnet精度为58.5%,VGG16精度为66%。VGG这个算法的特点是选择比较小的卷积核、选择较小的跨步,这个网络的精度高,不过计算量是Alexnet的7倍。
参考文献:
1、《Rich feature hierarchies&for&Accurate Object Detection and Segmentation》
2、《Spatial Pyramid Pooling in Deep Convolutional&Networks for Visual Recognition》
**********************作者:hjimce & 时间: &联系QQ: & 地址:&
&原创文章,版权所有,转载请保留本行信息************
发表评论:
馆藏&34603
TA的推荐TA的最新馆藏[转]&}

我要回帖

更多推荐

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

点击添加站长微信