第四弹:overfeat
overfeat是在AlexNet出现后,推出来的模型,其不仅用于物体分类,来用于定位,检测等,可以说是一个涉及很多应用场景的通用模型,值得看看。
本文将从两个方面来讲解,第一部分从论文角度来说一说,第二部分谈一些理解。
一、论文详解
一,介绍
卷积网络的主要优势是提供end-to-end解决方案;劣势就是对于标签数据集很贪婪。所以在大的数据集上面取得了很大的突破,但是在小的数据集上面突破不是很大。
ImageNet数据集上的分类图片,物体大致分布在图片中心,但是感兴趣的物体常常在尺寸和位置(以滑窗的方式)上有变化;解决这个问题的第一个想法想法就是在不同位置和不同缩放比例上应用卷积网络。但是种滑窗的可视窗口可能只包涵物体的一个部分,而不是整个物体;对于分类任务是可以接受的,但是对于定位和检测有些不适合。第二个想法就是训练一个卷积网络不仅产生类别分布,还产生一个物体位置的预测和bounding box的尺寸;第三个想法就是积累在每个位置和尺寸对应类别的置信度。
在多缩放尺度下以滑窗的方式利用卷积网络用了侦测和定位很早就有人提出了,一些学者直接训练卷积网络进行预测物体的相对于滑窗的位置或者物体的姿势。还有一些学者通过基于卷积网络的图像分割来定位物体。
二,视觉任务
分类:是啥 预测top-5分类
定位:在哪是啥 预测top-5分类+每个类别的bounding box(50%以上的覆盖率认为是正确的)
检测:在哪都有啥
定位是介于分类和检测的中间任务,分类和定位使用相同的数据集,检测的数据集有额外的数据集(物体比较小)。
三,分类
3.1 参数设置
提取221*221的图片,batch大小,权值初始值,权值惩罚项,初始学习率和Alex-net一样。不同地方时就动量项权重从0.9变为0.6;在30, 50, 60, 70, 80次迭代后,学习率每次缩减0.5倍。
3.2模型设计
作者提出了两种模型,fast模型和accurate模型。
Fast模型:
Input(231,231,3)→96F(11,11,3,s=4)→max-p(2,2,s=2)→256F(5,5,96,1) →max-p(2,2,2) →512F(3,3,512,1) →1024F(3,3,1024,1) →1024F(3,3,1024) →max-p(2,2,2) →3072fc→4096fc→1000softmax
Fast模型改进:
1,不使用LRN;
2,不使用over-pooling使用普通pooling;
3,第3,4,5卷基层特征数变大,从Alex-net的384→384→256;变为512→1024→1024.
4,fc-6层神经元个数减少,从4096变为3072
5,卷积的方式从valid卷积变为维度不变的卷积方式,所以输入变为231*231
Accurate模型改进:
Input(231,231,3)→96F(7,7,3,s=2)→max-p(3,3,3)→256F(7,7,96,1)→max-p(2,2,2) →512F(3,3,512,1) →512F(3,3,512,1) →1024F(3,3,1024,1) →1024F(3,3,1024,1) →max-p(3,3,3) →4096fc→4096fc→1000softmax
1,不使用LRN;
2,不使用over-pooling使用普通pooling,更大的pooling间隔S=2或3
3第一个卷基层的间隔从4变为2(accurate 模型),卷积大小从11*11变为7*7;第二个卷基层filter从5*5升为7*7
4增加了一个第三层,是的卷积层变为6层;从Alex-net的384→384→256;变为512→512→1024→1024.
感觉这个调整和上一篇ZF-net的结构调整很像,毕竟他们都是纽约大学里面一个团队的;fast模型使用更小的pooling局域2*2,,增加3,4,5层特征情况下,减少fc-6层的神经元,保持网络复杂度较小的变化;accurate模型感觉有些暴力,缩小间隔,增加网络深度,增加特征数;通过提升计算复杂度,来提取更多的信息,从而提升效果,感觉这个多少有些任性。
两个模型参数和连接数目对比:
Fast模型比accurate模型的参数还多,这个让我比较意外;感觉fast模型和Alex-net参数应该差不多,而应该和accurate差很多。但是计算结果让我有些意外:
每层参数个数:=特征数M*每个filter大小(filter_x*filter_y*连接特征数(由于本文是全连接,所以连接特征数就等于前一层特征个数))没有把bias计算在内。
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
|
Fast |
3.5万 |
61 |
118 |
0 |
472 |
944 |
11324 |
1678 |
409 |
Accurate |
1.4万 |
120 |
118 |
236 |
472 |
944 |
10485 |
1678 |
409 |
通过计算发现,连接方式,特征数目,filter尺寸是影响参数个数的因素;
1连接方式是关键因素,例如主要参数都分布在全连接层;
2最后一个卷基层特征图的大小也是影响参数个数的关键,例如第七层fast模型的特征图为6*6; accurate模型的输入特征为5*5,所以尽管accurate比fast多了1024个全连接神经元,但是由于输入特征图相对较小,多所以本层两个模型的参数差的不多。所以最后一个卷基层特征图大小对参数影响较大。
3.2 多尺寸分类测试
Alex-net中,使用multi-view的方式来投票分类测试;然而这种方式可能忽略图像的一些区域,在重叠的view区域会有重复计算;而且还只在单一的图片缩放比例上测试图片,这个单一比例可能不是反馈最优的置信区域。
作者在多个缩放比例,不同位置上,对整个图片密集地进行卷积计算;这种滑窗的方式对于一些模型可能由于计算复杂而被禁止,但是在卷积网络上进行滑窗计算不仅保留了滑窗的鲁棒性,而且还很高效。每一个卷积网络的都输出一个m*n-C维的空间向量,C是分类的类别数;不同的缩放比例对应不同的m和n。
整个网络的子采样比例=2*3*2*3=36,即当应用网络计算时,输入图像的每个维度上,每36个像素才能产生一个输出;在图像上密集地应用卷积网络,对比10-views的测试分类方法,此时粗糙的输出分布会降低准确率(没想明白,怎么就粗糙了);因为物体和view可能没有很好的匹配分布(物体和view越好的匹配,网络输出的置信度越高)。为了绕开这个问题,我们采取在最后一个max-pooling层换成offset max-pooling,平移pooling;这种平移max-pooling是一种数据增益技术。
offset max-pooling:
平移量△:x,y连个维度平移量都为0,1,2(由于pooling区域为3*3)
Step1计算特征图:计算layer-5未pooling的特征图unpooling-FM
Step2平移特征图:按照平移量产生不同的平移特征图;本文是x,y连个维度,每个维度平移量为0,1,2.所以每个unpooling-FM,产生9种平移特征图offset-pooling FM(一维的是3种)。
Step3 max-pooling:在每个平移offset-pooling FM图上,进行普通的max-pooling操作产生pooled FM。
Step4滑窗提取输入:由于全连接层fc的输入维数和pooled FM特征维数不同,一般pooled FM较大,例如上图中一维的例子,pooled FM维数为6,而fc的输入维数为5,所以可以采用滑窗的方式来提取不同的输入向量。
Step5 输入分类器:产生分类向量
Step6 交叉融合。
通过上面的这种方式,可以减少子采样比例,从36变为12;因为通过offset,每个维度产生了3个pooled输出。此外,由于每个输入窗口对应不同的原始图像位置,所以通过这种密集滑窗的方式可以找到物体和窗口很好的匹配,从而增加置信度;但是感觉好复杂啊。
实验结果:
1,fast模型,比Alex-net结果提升了近1%,但是fast模型修改了很多地方,具体哪一个地方的修改其作用,这个不清楚。本文Alex-net模型结果为18.2%比他们自己测试的高2%左右
2,accurate模型单个模型提升了近4%,说明增大网络可以提高分类效果。
3,采用offset max-pooling感觉提升效果很小,感觉是因为卷积特征激活值具有很高的聚集性,每个offset特征图很相似,max-pooling后也会很相似。
4,多个缩放比例测试分类对于结果提升比较重要,通过多个比例可以把相对较小的物体放大,以便于特征捕捉。
3.5 卷积网络和滑窗效率
对比很多sliding-windows方法每次都需要计算整个网络,卷积网络非常高效,因为卷积网络在重叠区域共享计算。
例如训练阶段在小的view(如图,14*14)下,训练网络;测试阶段在多个较大的图片上测试,由于每个14*14的view区域产生一个分类预测分布,上图在16*16的图片上测试,有4个不同的14*14的view,所以最后产生一个4个分类预测分布;组成一个具有C个特征图的2*2分类结果图,然后按照1*1卷积方式计算全连接部分;这样整个系统类似可以看做一个完整的卷积系统。
四 定位
基于训练的分类网络,用一个回归网络替换分类器网络;并在各种缩放比例和view下训练回归网络来预测boundingbox;然后融合预测的各个bounding box。
4.1 生成预测
同时在各个view和缩放比例下计算分类和回归网络,分类器对类别c的输出作为类别c在对应比例和view出现的置信分数;
4.2 回归训练
如上图所示,每个回归网络,以最后一个卷积层作为输入,回归层也有两个全连接层,隐层单元为4096,1024(为什么作者没有说,估计也是交叉实验验证的),最后的输出层有4个单元,分别是预测bounding box的四个边的坐标。和分类使用offset-pooling一样,回归预测也是用这种方式,来产生不同的预测结果。
使用预测边界和真实边界之间的L2范数作为代价函数,来训练回归网络。最终的回归层是一个类别指定的层,有1000个不同的版本。训练回归网络在多个缩放比例下对于不同缩放比例融合非常重要。在一个比例上训练网络在原比例上表现很好,在其他比例上也会表现的很好;但是多个缩放比例训练让预测在多个比例上匹配更准确,而且还会指数级别的增加预测类别的置信度。
上图展示了在单个比例上预测的在各个offset和sliding window下 pooling后,预测的多个bounding box;从图中可以看出本文通过回归预测bounding box的方法可以很好的定位出物体的位置,而且bounding box都趋向于收敛到一个固定的位置,而且还可以定位多个物体和同一个物体的不同姿势。但是感觉offset和sliding window方式,通过融合虽然增加了了准确度,但是感觉好复杂;而且很多的边框都很相似,感觉不需要这么多的预测值。就可以满足超过覆盖50%的测试要求。
4.3结合预测
a)在6个缩放比例上运行分类网络,在每个比例上选取top-k个类别,就是给每个图片进行类别标定Cs
b)在每个比例上运行预测boundingbox网络,产生每个类别对应的bounding box集合Bs
c)各个比例的Bs到放到一个大集合B
d)融合bounding box。具体过程应该是选取两个bounding box b1,b2;计算b1和b2的匹配分式,如果匹配分数大于一个阈值,就结束,如果小于阈值就在B中删除b1,b2,然后把b1和b2的融合放入B中,在进行循环计算。
最终的结果通过融合具有最高置信度的bounding box给出。
具体融合过程见下图:
1,不同的缩放比例上,预测结果不同,例如在原始图像上预测结果只有熊,在放大比例后(第三,第四个图),预测分类中不仅有熊,还有鲸鱼等其他物体
2通过offset和sliding window的方式可以有更多的类别预测
3在每个比例上预测bounding box,放大比例越大的图片,预测的bounding box越多
4,融合bouding box
在最终的分类中,鲸鱼预测和其他的物体消失不仅使因为更低的置信度,还有就是他们的bounding box集合Bs不像熊一样连续,具有一致性,从而没有持续的置信度积累。通过这种方式正确的物体持续增加置信度,而错误的物体识别由于缺少bounding box的一致性和置信度,最终消失。这种方法对于错误的物体具有鲁棒性(但是图片中确实有一些鱼,虽然不是鲸鱼;但是系统并没有识别出来;也可能是类别中有鲸鱼,但是没有此种鱼的类别)。
4.4实验
本文多个multi-scale和multi-view的方式非常关键,multi-view降低了4%,multi-scale降低了6%。令人惊讶的是本文PCR的结果并没有SCR好,原因是PCR的有1000个模型,每个模型都是用自己类别的数据来进行训练,训练数据不足可能导致欠拟合。而SCR通过权值共享,得到了充分的训练。
五,检测
检测和分类训练阶段相似,但是是以空间的方式进行;一张图片中的多个位置可能会同时训练。和定位不通过的是,图片内没有物体的时候,需要预测背景。
这个地方由于作者叙述的有些简略,没怎么看懂;本文的方法在ILSVRC中获得了19%,在赛后改进到24.3%;赛后主要是使用更长的训练时间和利用“周围环境”(每一个scale也同时使用低像素scale作为输入;介个有点不明白)。
六,总结
1,multi-scale sliding window方式,用来分类,定位,检测
2,在一个卷积网络框架中,同时进行3个任务
本文还可以进一步改进,
1,在定位实验总,没有整个网络进行反向传播训练
2,用评价标准的IOU作为损失函数,来替换L2
3,交换bounding box的参数,帮助去掉结果的相关性(这个有点不明白)。
后来工作2被牛津大学作者做了出来。
一些困惑和理解
感觉卷积网络真的好强大,干啥都行,而且还能相互间共享特征;虽然分类,定位,和检测的难度是递增的,但是感觉分类是最基础的,分类结果的好坏决定了后面两个任务的好坏,因为图片中物体分类准确了,才能进行定位和检测;在分类阶段调整网络部分并没有过多的叙述原因,只是给出了最后的网络结构,通过暴力式的增加复杂度,提取更多信息。
本文multi-scale测试的处理方式和SPP-net(下一篇博文)的方式有些不同,本文是通过multi-view的方式采用滑窗的方式产生多个数据结果,而Spp-net通过改变子采样比例,来得到固定的特征层输出。感觉本文的滑窗方式更适合预测bounding box和detection;因为这种方式可以是物体和view很好的匹配,从而得到很好置信得分,但是还是感觉有些复杂,例如offset是否可以使用两个,sliding window感觉可以像Alex-net那样采用5-view的方式,在特征图中选取上下左右和中间5个view进行预测就可以了,因为pooling的特征具有聚集性,感觉每个view会有很大的相似性。
图中对熊的定位实例中,卷积网络在不同的scale上面会得到不同的分类结果,在联合上一篇博文中两位作者对平移,缩放和翻转不变形的探讨;卷积网络的优势就是对于平移具有不变形,但是感觉对于平移和缩放的识别能力是有限的,对于大的物体能够很好的识别,对于小的物体感觉网络有些乏力,这可能也就是为什作者在multi-scale时,从来都是放大而不是缩小;还有就是感觉和每个高层对应底层的感受野有关,例如才本文中一个layer-5的特征激活值,对应输入层图像36*36的一个小区域,如果物体比36*36区域小,或者稍微大一些;感觉网络就会识别困难。感觉后面GoogLeNet,里面的Inception模型,就和这个有关系,不同的filter和pooling可以对应不同的初始感受野(个人观点)。
这篇文献最牛逼的地方,在于充分利用了卷积神经网络的特征提取功能,它把分类过程中,提取到的特征,同时又用于定位检测等各种任务,牛逼哄哄啊。只需要改变网络的最后几层,就可以实现不同的任务,而不需要从头开始训练整个网络的参数。
其主要是把网络的第一层到第五层看做是特征提取层,然后不同的任务共享这个特征提取层。基本用了同一个网络架构模型(特征提取层相同,分类回归层根据不同任务稍作修改、训练)、同时共享基础特征。
二、计算机视觉的三大任务
开始讲解paper算法前,先让我们来好好学习一下计算机视觉领域中:分类、定位、检测这三者的区别。因为文献要一口气干掉这三个任务,所以先让我们需要好好区分一下这三个任务的区别:
A、图片分类:给定一张图片,为每张图片打一个标签,说出图片是什么物体,然而因为一张图片中往往有多个物体,因此我们允许你取出概率最大的5个,只要前五个概率最大的包含了我们人工标定标签(人工标定每张图片只有一个标签,只要你用5个最大概率,猜中其中就可以了),就说你是对的。
B、定位任务:你除了需要预测出图片的类别,你还要定位出这个物体的位置,同时规定你定位的这个物体框与正确位置差不能超过规定的阈值。
C、检测任务:给定一张图片,你把图片中的所有物体全部给我找出来(包括位置、类别)。
OK,解释完三个任务,我们接着就要正式开始学习算法了,我们先从最简单的任务开始讲起,然后讲定位,最后讲物体检测,分三大部分进行讲解。
三、Alexnet图片分类回顾
因为paper的网络架构方面与Alexnet基本相同,所以先让我们来好好回顾一下Alexnet的训练、测试:
(1)训练阶段:每张训练图片256*256,然后我们随机裁剪出224*224大小的图片,作为CNN的输入进行训练。
(2)测试阶段:输入256*256大小的图片,我们从图片的5个指定的方位(上下左右+中间)进行裁剪出5张224*224大小的图片,然后水平镜像一下再裁剪5张,这样总共有10张;然后我们把这10张裁剪图片分别送入已经训练好的CNN中,分别预测结果,最后用这10个结果的平均作为最后的输出。
overfeat这篇文献的图片分类算法,在训练阶段采用与Alexnet相同的训练方式,然而在测试阶段可是差别很大,这就是文献最大的创新点(overfeat的方法不是裁剪出10张224*224的图片进行结果预测平均,具体方法请看下面继续详细讲解)。
四、基础学习
开始讲解overfeat这篇文献的算法前,让我们先来学两招很重要的基础招式:FCN、offset max-pooling,等我们学完这两招,再来学overfeat这篇paper算法。
1、FCN招式学习
FCN又称全卷积神经网络,这招是现如今是图片语义分割领域的新宠(来自文献:《Fully Convolutional Networks for Semantic Segmentation》),同时也看懂overfeat这篇文献所需要学会的招式。
我们知道对于一个各层参数结构都设计好的网络模型来说,输入的图片大小是固定的,比如Alexnet设计完毕后,网络输入图片大小就是227*227。这个时候我们如果输入一张500*500的图片,会是什么样的结果?我们现在的希望是让我们的网络可以一直前向传导,让一个已经设计完毕的网络,也可以输入任意大小的图片,这就是FCN的精髓。FCN算法灵魂:
1、把卷积层-》全连接层,看成是对一整张图片的卷积层运算。
2、把全连接层-》全连接层,看成是采用1*1大小的卷积核,进行卷积层运算。
下面用一个例子,讲解怎么让一个已经设计好的CNN模型,可以输入任意大小的图片:
如上图所示,上面图中绿色部分表示:卷积核大小。假设我们设计了一个CNN模型,输入图片大小是14*14,通过第一层卷积后我们得到10*10大小的图片,然后接着通过池化得到了5*5大小的图片。OK,关键部分来了,接着要从:5*5大小的图片-》1*1大小的图片:
(1)传统的CNN:如果从以前的角度进行理解的话,那么这个过程就是全连接层,我们会把这个5*5大小的图片,展平成为一个一维的向量,进行计算(写cnn代码的时候,这个时候经常会在这里加一个flatten函数,就是为了展平成一维向量)。
(2)FCN:FCN并不是把5*5的图片展平成一维向量,再进行计算,而是直接采用5*5的卷积核,对一整张图片进行卷积运算。
其实这两个本质上是相同的,只是角度不同,FCN把这个过程当成了对一整张特征图进行卷积,同样,后面的全连接层也是把它当做是以1*1大小的卷积核进行卷积运算。
从上面的例子中,我们看到网络的输入是一张14*14大小的图片,这个时候加入我就用上面的网络,输入一张任意大小的图片,比如16*16大小的图片,那么会是什么样的结果?具体请看下面的示意图:
这个时候你就会发现,网络最后的输出是一张2*2大小的图片。这个时候,我们就可以发现采用FCN网络,可以输入任意大小的图片。同时需要注意的是网络最后输出的图片大小不在是一个1*1大小的图片,而是一个与输入图片大小息息相关的一张图片了。
OK,这个时候我们回来思考一个问题,比如Alexnet网络设计完毕后,我们也用FCN的思想,把全连接层看成是卷积层运算,这个时候你就会发现如果Alexnet输入一张500*500图片的话,那么它将得到1000张10*10大小的预测分类图,这个时候我们可以简单采用对着每一张10*10大小的图片求取平均值,作为图片属于各个类别的概率值。
其实Alexnet在测试阶段的时候,采用了对输入图片的四个角落进行裁剪,进行预测,分别得到结果,最后的结果就是类似对应于上面2*2的预测图。这个2*2的每个像素点,就类似于对应于一个角落裁剪下来的图片预测分类结果。只不过Alexnet把这4个像素点,相加在一起,求取平均值,作为该类别的概率值。
需要注意的是,一会儿overfeat就是把采用FCN的思想把全连接层看成了卷积层,让我们在网络测试阶段可以输入任意大小的图片。
2、offset max-pooling
再让我们来学习一招大招,这一招叫offset 池化。为了简单起见,我们暂时不用二维的图像作为例子,而是采用一维作为示例,来讲解池化:
如上图所示,我们在x轴上有20个神经元,如果我们选择池化size=3的非重叠池化,那么根据我们之前所学的方法应该是:对上面的20个,从1位置开始进行分组,每3个连续的神经元为一组,然后计算每组的最大值(最大池化),19、20号神经元将被丢弃,如下图所示:
我们也可以在20号神经元后面,人为的添加一个数值为0的神经元编号21,与19、20成为一组,这样可以分成7组:[1,2,3],[4,5,6]……,[16,17,18],[19,20,21],最后计算每组的最大值,这就是我们以前所学CNN中池化层的源码实现方法了。
上面我们说到,如果我们只分6组的话,我们除了以1作为初始位置进行连续组合之外,也可以从位置2或者3开始进行组合。也就是说我们其实有3种池化组合方法:
A、△=0分组:[1,2,3],[4,5,6]……,[16,17,18];
B、△=1分组:[2,3,4],[5,6,7]……,[17,18,19];
C、△=2分组:[3,4,5],[6,7,8]……,[18,19,20];
对应图片如下:
以往的CNN中,一般我们只用了△=0,得到池化结果后,就送入了下一层。于是文献的方法是,把上面的△=0、△=1、△=2的三种组合方式的池化结果,分别送入网络的下一层。这样的话,我们网络在最后输出的时候,就会出现3种预测结果了。
我们前面说的是一维的情况,如果是2维图片的话,那么(△x,△y)就会有9种取值情况(3*3);如果我们在做图片分类的时候,在网络的某一个池化层加入了这种offset 池化方法,然后把这9种池化结果,分别送入后面的网络层,最后我们的图片分类输出结果就可以得到9个预测结果(每个类别都可以得到9种概率值,然后我们对每个类别的9种概率,取其最大值,做为此类别的预测概率值)。
OK,学完了上面两种招式之后,文献的算法,就是把这两种招式结合起来,形成了文献最后测试阶段的算法,接着我们就来讲讲怎么结合。
五、overfeat图片分类
我们先从文献是怎么搞图片分类的开始说起,训练阶段基本变化不大,最大的区别在于网络的测试阶段。
1、paper网络架构与训练阶段
(1)网络架构
对于网络的结构,文献给出了两个版本,快速版、精确版,一个精度比较高但速度慢;另外一个精度虽然低但是速度快。下面是高精度版本的网络结构表相关参数:
表格参数说明:
网络输入:从上面的表格,我们知道网络输入图片大小为221*221;
网络结构方面基本上和AlexNet是一样的,也是使用了ReLU激活,最大池化。不同之处在于:(a)作者没有使用局部响应归一化层;(b)然后也没有采用重叠池化的方法;(c)在第一层卷积层,stride作者是选择了2,这个与AlexNet不同(AlexNet选择的跨步是4,在网络中,如果stride选择比较大得话,虽然可以减少网络层数,提高速度,但是却会降低精度)。
这边需要注意的是我们需要把f7这一层,看成是卷积核大小为5*5的卷积层,总之就是需要把网络看成我们前面所学的FCN模型,没有了全连接层的概念,因为在测试阶段我们可不是仅仅输入221*221这样大小的图片,我们在测试阶段要输入各种大小的图片,具体请看后面测试阶段的讲解。
(2)网络训练
训练输入:对于每张原图片为256*256,然后进行随机裁剪为221*221的大小作为CNN输入,进行训练。
优化求解参数设置:训练的min-batchs选择128,权重初始化选择高斯分布的随机初始化:
然后采用随机梯度下降法,进行优化更新,动量项参数大小选择0.6,L2权重衰减系数大小选择10-5次方。学习率一开始选择0.05,然后根据迭代次数的增加,每隔几十次的迭代后,就把学习率的大小减小一半。
然后就是DropOut,这个只有在最后的两个全连接层,才采用dropout,dropout比率选择0.5,也就是网络的第6、7层。
2、网络测试阶段
这一步需要声明一下,网络结构在训练完后,参数的个数、结构是固定的,而这一步的算法并没有改变网络的结构,也更不肯可能去改变网络参数。
我们知道在Alexnet的文献中,他们预测的方法是输入一张图片256*256,然后进行multi-view裁剪,也就是从图片的四个角进行裁剪,还有就是一图片的中心进行裁剪,这样可以裁剪到5张224*224的图片。然后把原图片水平翻转一下,再用同样的方式进行裁剪,又可以裁剪到5张图片。把这10张图片作为输入,分别进行预测分类,在后在softmax的最后一层,求取个各类的总概率,求取平均值。
然而Alexnet这种预测方法存在两个问题:首先这样的裁剪方式,把图片的很多区域都给忽略了,说不定你这样的裁剪,刚好把图片物体的一部分给裁剪掉了;另外一方面,裁剪窗口重叠存在很多冗余的计算,像上面我们要分别把10张图片送入网络,可见测试阶段的计算量还是蛮大的。
Overfeat算法:训练完上面所说的网络之后,在测试阶段,我们不再是用一张221*221大小的图片了作为网络的输入,而是用了6张大小都不相同的图片,也就是所谓的多尺度输入预测,如下表格所示:
测试阶段网络输入图片大小分别是245*245,281*317……461*569。
然后当网络前向传导到layer 5的时候,就使出了前面我们所讲的FCN、offset pooling这两招相结合的招式。在这里我们以输入一张图片为例(6张图片的计算方法都相同),讲解layer 5后面的整体过程,具体流程示意图如下:
从layer-5 pre-pool到layer-5 post-pool:这一步的实现是通过池化大小为(3,3)进行池化,然后△x=0、1、2,△y=0、1、2,这样我们可以得到对于每一张特征图,我们都可以得到9幅池化结果图。以上面表格中的sacle1为例,layer-5 pre-pool大小是17*17,经过池化后,大小就是5*5,然后有3*3张结果图(不同offset得到的结果)。
从layer-5 post-pool到classifier map(pre-reshape):我们知道在训练的时候,从卷积层到全连接层,输入的大小是4096*(5*5),然后进行全连接,得到4096*(1*1)。但是我们现在输入的是各种不同大小的图片,因此接着就采用FCN的招式,让网络继续前向传导。我们从layer-5 post-pool到第六层的时候,如果把全连接看成是卷积,那么其实这个时候卷积核的大小为5*5,因为训练的时候,layer-5 post-pool得到的结果是5*5。因此在预测分类的时候,假设layer-5 post-pool 得到的是7*9(上面表格中的scale 3),经过5*5的卷积核进行卷积后,那么它将得到(7-5+1)*(9-5+1)=3*5的输出。
然后我们就只需要在后面把它们拉成一维向量摆放就ok了,这样在一个尺度上,我们可以得到一个C*N个预测值矩阵,每一列就表示图片属于某一类别的概率值,然后我们求取每一列的最大值,作为本尺度的每个类别的概率值。
最后我们一共用了6种不同尺度(文献好像用了12张,另外6张是水平翻转的图片),做了预测,然后把这六种尺度结果再做一个平均,作为最最后的结果。
OK,至此overfeat图片分类的任务就结束了,从上面过程,我们可以看到整个网络分成两部分:layer 1~5这五层我们把它称之为特征提取层;layer 6~output我们把它们称之为分类层。
六、定位任务
后面我们用于定位任务的时候,就把分类层(上面的layer 6~output)给重新设计一下,把分类改成回归问题,然后在各种不同尺度上训练预测物体的bounding box。
我们把用图片分类学习的特征提取层的参数固定下来,然后继续训练后面的回归层的参数,网络包含了4个输出,对应于bounding box的上左上角点和右下角点,然后损失函数采用欧式距离L2损失函数。
说到这边,感觉好累,因为后面基本上没有比较好玩的算法,所以就讲到这边,不然这篇文章就又要写十几页了。
个人总结:个人感觉学习这篇文献最重要的在于学习FCN、offset pooling,然后把它们结合起来,提高分类任务的精度,同时也让我们看到了CNN特征提取、迁移学习的强大威力。
二、模型理解
亮点1:多尺度-classification
通常的分类是给了一个东西,然后判定类别,但是给了一张图,不知道东西在哪该如何分类?所以一般的方法是“金字塔+sliding window”结构,然后对每一个window做一次分类。这样的算法是非常耗时的,作者认为,不需要sliding window的过程,我们可以在同一个网络里面完成。这里插一句:为什么不用直接输入图像就给出类别呢?那是因为像ImageNet这样的数据,主要的物体是在图像中央,并且大小是填充了图像相当大的部分的,所以就算是有一些variation,那也是CNN能handle的,但是如果在测试中物体只是一个很小尺寸,并且出现在图像的一个角落,那么这个variation对于训练数据来说是完全impossible的。所以直接CNN分类的效果会很差。除非训练数据覆盖了各种尺寸和位置,当然这是non-sense的。那么这篇文章是怎么实现的呢?在原图上滑窗是笨拙的,那么就在输出的feature map上滑。
我们从网络入手,红色标记的stride表示的就相当于对原图降采样,所以才会有作者说的:“However, thetotal subsampling ratio in the network described above is 2x3x2x3, or 36.”那么对于221*221的图像来说,通过了前面的conv+pooling就瞬间变成了6*6了。现在可以开心的在这个feature map上做滑动了。可以看到layer7(第一个fc层)的输入是5*5的,也就是说用这个5*5的窗口去6*6的上面滑,就可以得到2*2的窗口了,每一个窗口对应一个位置,将这4个5*5的作为输入,分别输入fc,这样就可以得到4个C向量,C代表要分的1000个类。炫酷吧。这样实现了一个coarse滑窗。
但是作者觉得不够,这样的不够精细,*36倍呢。所以想到了一个offset的方法(灵感来自Ref【9】),参考下面图
然后作者还是觉得不够,就在输入图像就做了手脚,又从Ref【15】里面得到灵感,【15】将图像做了crop,四个corner,加一个中间,总共变成了5个子图像,然后对图像进行翻转,这样就变成了10个图像。本文作者不知道为什么采用的是“We then extract 5 random crops(and their horizontal flips)”不过核心思想是一样的,这样sliding window又变多了。
作者最后还做了一个scale上的变换,这个就没什么好说的了,把图像放缩到6个尺度上,所以,最终,这个多尺度的滑窗思想就得到实现了。
得到了那么多的窗口,就有那么多的classification结果,平均一下概率值,就可以得到最终的classification结果了。其实有了那么多的结果也未必是好事,融合结果会导致有些尺度上的强响应会丢失。不过鲁棒性会变好。我们来看看分类的结果
从结果来看,整体是变好了的,主要应该还是因为sliding window和scale的功劳。至于那个offset的改进,从第3,4行来看,好像并没有什么大的提升,说明差这几个像素,对于不停做convolution的图像来说,真的没啥影响。另外最后看到多模型的融合,这还是王道啊。侧面也说明了,这样的模型的学习和样本的影响在深度学习中还是有很多问题的,不稳定。
亮点2:多任务
上面说完了classification,localization就简单多了,反正就是在刚才那个架构上去regression出四个参数,表达box的四个角。输出了再combine一下,总的来说就没有什么新意了。Detection就更没什么说的了,连作者都懒得说了。
同时做了多个任务,这个做法我有一些看法,就是多任务一起做到底是好还是坏?我没有定论,个人感觉是要看任务的相关性,比如说classification和localization,classification会帮助提取物体自身的feature,而打破了纯粹的localization中的combined context的影响,当然这个还是要看样本的选择。当然这个还需要今后进一步的去论证。
滑窗,利用feature map来避免大量的sliding window,个人感觉肯定只是在原始图像上做sliding window的一种折衷方案,毕竟太耗时了。不过方法还是有一定的启发的,不知道什么时候能出一个好的解决框架。
多模型,多尺度,没什么说的,踏踏实实的好东西
讨论
- “打破了纯粹的localization中的combined context的影响“?
—— 做localization实际项目时,一般物体都是处于图像的某个小区域,所以对全图做训练很容易把物体和经常出现的context combine在一起,这样一旦样本不够充分,就很容易学出combine在一起的context特征而不是单纯的object特征。 - 如果我是用原图做多scale的滑窗,和现在这个方法在feature map上做sliding window比,哪个性能好?
—— 这个没有具体的对比试验佐证,但是在最后输出的feature map上做sliding window,更像是选取了相应更好的特征区域,所以和在原图上做sliding window是不同的,从感觉上来说,对于classification这个任务来说应该是更好的,因为它打破了bounding box的约束,更好的“包含”了好的特征。另外,因为max pooling的非线性操作,所以不可能往回找到sliding window在原图上的位置 - 再插一句,如果最后出来的36个vector,直接全部fc,而不是做平均,估计效果会更好,只是怕参数量太大了。这样样本的需求也太大。不过如果这样直接连接FC层的话,才会更好的体现end-to-end的精神。
相关博客:
http://blog.csdn.net/hjimce/article/details/50187881
http://blog.csdn.net/whiteinblue/article/details/43374195
http://blog.csdn.net/seavan811/article/details/49825891
第四弹:overfeat的更多相关文章
- 前端学习 第四弹: HTML(一)
前端学习 第四弹: HTML(一) 元素分类:块元素 内联元素 块级元素在浏览器显示时,通常会以新行来开始(和结束). 例子:<h1>, <p>, <ul>, &l ...
- 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...
- jQuery 关于IE9上传文件无法进入后台问题的原因及解决办法(ajaxfileupload.js第四弹)
第四弹的诞生完全不在自己最初的计划之中,是有个网友看了先前关于<ajaxfileupload.js系列>的文章后提出的问题,由于自己一直是用chrome浏览器去测试demo,完全忽略IE浏 ...
- 模式匹配第四弹:if case,guard case,for case
2016-06-06 7388 作者:Olivier Halligon,原文链接,原文日期:2016-05-16 译者:walkingway:校对:Cee:定稿:numbbbbb 现在我们来重新回顾下 ...
- 好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果
原文:好玩的WPF第四弹:用Viewport2DVisual3D实现3D旋转效果 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https:// ...
- 关于『进击的Markdown』:第四弹
关于『进击的Markdown』:第四弹 建议缩放90%食用 美人鱼(Mermaid)悄悄的来,又悄悄的走,挥一挥匕首,不留一个活口 又是漫漫画图路... 女士们先生们,大家好! 我们要接受Markd ...
- ActiveMQ第四弹:在HermesJMS中创建ActiveMQ Session
Hermes JMS是一个开源免费的跨平台的JMS消息监听工具.它可以很方便和各种JMS框架集成和交互,可以用来监听.发送.接收.修改.存储消息等.这篇文章将讲解HermesJMS如何集成Active ...
- Python3 学习第四弹:编码问题(转载)
关于python的编码问题一直以来不得解,终于在今天从这篇博文中明白了. 原文地址: http://nedbatchelder.com/text/unipain.html 译文地址:http://py ...
- 暑假集训(4)第四弹 -----排列,计数(hdu1465)
题意概括:嗯,纵使你数次帮助小A脱离困境,但上一次,小A终于还是失败了.那数年的奔波与心血,抵不过轻轻一指,便彻底 湮灭,多年的友谊终归走向末路.这一切重击把小A彻底击溃! 不为什么,你到底还是要继续 ...
随机推荐
- 浅谈测试rhel7新功能时的感受及遇到的问题【转载】
半夜起来看世界杯,没啥激情,但是又怕错误意大利和英格兰的比赛,就看了rhel7 相关新功能的介绍. rhel7的下载地址: https://access.redhat.com/site/downloa ...
- 多项目中SVN权限管理精辟解析
本节和大家讨论一下多项目SVN权限管理,主要包括建立版本库,修改版本库配置文件,配置允许访问的用户,设置用户访问权限.下面我们就来看一下SVN权限管理.svn权限管理svn的权限管理涉及到一下文件:p ...
- Oracle 游标及存储过程实例
/*********实例一*********/ create or replace procedure users_procedure is cursor users_cursor is select ...
- load
http://blog.scoutapp.com/articles/2009/07/31/understanding-load-averages http://blog.scoutapp.com/ar ...
- pch文件的配置与路径修改
- Mybatis——helloWorld级程序
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC & ...
- js的各种错误类型
1.SyntaxError(语法错误) 解析代码时发生的语法错误 eg:var 1a; Uncaught SyntaxError: Unexpected number 2.ReferenceError ...
- OpenGL ES一些函数详解(一)
glLoadIdentity和glMultMatrix glLoadIdentity的作用是将当前模型视图矩阵转换为单位矩阵(行数和列数相同的矩阵,并且矩阵的左上角至右下角的连线上的元素都为1,其 ...
- Tomcat服务器
常见的web服务器 1. WebLogic是BEA公司的产品,是目前应用最广泛的web服务器,支持J2EE规范(J2EE里有13种技术),商业产品,收费的.银行,证券等对并发,安全要求高的时候用,一般 ...
- Properties集合
Map |--Hashtable |--Properties Properties集合特点: 1.该集合中的键和值都是字符串类型 2.集合中的数据可以保存在IO流中或者从IO流中获取数据. 通常该集合 ...