【每日一网】Day4:OverFeat流程简单理解

OverFeat

算法背景

overfeat是2013年imagenet定位任务的冠军,同时在分类和检测任务也取得了不错的成果,分类,定位,检测。
overfeat使用单个共享网络,完成了分类,定位,检测任务,并且提出了一个多尺度的测试方法。
overfeat的主要创新点是multiscale 、sliding window、offset pooling。

分类器

overfeat的网络结构类似于alexnet,作者提出两种模型,分别为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

accurat模型

在这里插入图片描述
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
accurate的改进:
1,不使用LRN;

2,不使用over-pooling使用普通pooling,更大的pooling间隔S=2或3

3第一个卷基层的间隔从4变为2(accurate 模型),卷积大小从1111变为77;第二个卷基层filter从55升为77

4增加了一个第三层,是的卷积层变为6层;从Alex-net的384→384→256;变为512→512→1024→1024.

FCN

测试阶段OverFeat没有采用AlexNet的multi-crop (10 view)方法,而是直接采用了六种不同尺度的测试图像输入(每个尺度的图像还增加了水平翻转),结合全卷积网络结构,最终输出的维度是不同的,体现了不同尺寸输入图像的实际候选区域数目的不同。(Class种类数目这个维度是一致的,最后一个维度是1000,代表1000种分类预测)
我们知道对于一个各层参数结构都设计好的网络模型来说,输入的图片大小是固定的,比如Alexnet设计完毕后,网络输入图片大小就是227227。这个时候我们如果输入一张500500的图片,会是什么样的结果?我们现在的希望是让我们的网络可以一直前向传导,让一个已经设计完毕的网络,也可以输入任意大小的图片,这就是FCN的精髓。FCN算法灵魂:

1、把卷积层-》全连接层,看成是对一整张图片的卷积层运算。

2、把全连接层-》全连接层,看成是采用1*1大小的卷积核,进行卷积层运算。

下面用一个例子,讲解怎么让一个已经设计好的CNN模型,可以输入任意大小的图片:
在这里插入图片描述
如上图所示,上面图中绿色部分表示:卷积核大小。假设我们设计了一个CNN模型,输入图片大小是1414,通过第一层卷积后我们得到1010大小的图片,然后接着通过池化得到了55大小的图片。OK,关键部分来了,接着要从:55大小的图片-》1*1大小的图片:

(1)传统的CNN:如果从以前的角度进行理解的话,那么这个过程就是全连接层,我们会把这个5*5大小的图片,展平成为一个一维的向量,进行计算(写cnn代码的时候,这个时候经常会在这里加一个flatten函数,就是为了展平成一维向量)。

(2)FCN:FCN并不是把55的图片展平成一维向量,再进行计算,而是直接采用55的卷积核,对一整张图片进行卷积运算。

其实这两个本质上是相同的,只是角度不同,FCN把这个过程当成了对一整张特征图进行卷积,同样,后面的全连接层也是把它当做是以1*1大小的卷积核进行卷积运算。

从上面的例子中,我们看到网络的输入是一张1414大小的图片,这个时候加入我就用上面的网络,输入一张任意大小的图片,比如1616大小的图片,那么会是什么样的结果?具体请看下面的示意图:在这里插入图片描述
这个时候你就会发现,网络最后的输出是一张22大小的图片。这个时候,我们就可以发现采用FCN网络,可以输入任意大小的图片。同时需要注意的是网络最后输出的图片大小不在是一个11大小的图片,而是一个与输入图片大小息息相关的一张图片了。

OK,这个时候我们回来思考一个问题,比如Alexnet网络设计完毕后,我们也用FCN的思想,把全连接层看成是卷积层运算,这个时候你就会发现如果Alexnet输入一张500500图片的话,那么它将得到1000张1010大小的预测分类图,这个时候我们可以简单采用对着每一张10*10大小的图片求取平均值,作为图片属于各个类别的概率值。

其实Alexnet在测试阶段的时候,采用了对输入图片的四个角落进行裁剪,进行预测,分别得到结果,最后的结果就是类似对应于上面22的预测图。这个22的每个像素点,就类似于对应于一个角落裁剪下来的图片预测分类结果。只不过Alexnet把这4个像素点,相加在一起,求取平均值,作为该类别的概率值。

需要注意的是,一会儿overfeat就是把采用FCN的思想把全连接层看成了卷积层,让我们在网络测试阶段可以输入任意大小的图片。

offset max-pooling

在这里插入图片描述
如上图所示,我们在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种池化组合方法
以往的CNN中,一般我们只用了△=0,得到池化结果后,就送入了下一层。于是文献的方法是,把上面的△=0、△=1、△=2的三种组合方式的池化结果,分别送入网络的下一层。这样的话,我们网络在最后输出的时候,就会出现3种预测结果了。
在这里插入图片描述
这里说的只是一维的情况,如果是2维图片,那么(△x,△y)就会有9种取值情况,我们在做图片分类的时候,在网络的某一个池化层加入这种offset pooling,然后把这9种池化结果,分别送入后边的网络层,最后我们的图片分类输出结果就可以得到9个预测结果,然后我们对每个类别的9种概率,取最大值,作为此类别的预测概率。

overfeat图片分类

从layer-5 pre-pool到layer-5 post-pool:这一步的实现是通过池化大小为(3,3)进行池化,然后△x=0、1、2,△y=0、1、2,这样我们可以得到对于每一张特征图,我们都可以得到9幅池化结果图。以上面表格中的sacle1为例,layer-5 pre-pool大小是1717,经过池化后,大小就是55,然后有3*3张结果图(不同offset得到的结果)。

从layer-5 post-pool到classifier map(pre-reshape):我们知道在训练的时候,从卷积层到全连接层,输入的大小是4096*(55),然后进行全连接,得到4096(11)。但是我们现在输入的是各种不同大小的图片,因此接着就采用FCN的招式,让网络继续前向传导。我们从layer-5 post-pool到第六层的时候,如果把全连接看成是卷积,那么其实这个时候卷积核的大小为55,因为训练的时候,layer-5 post-pool得到的结果是55。因此在预测分类的时候,假设layer-5 post-pool 得到的是79(上面表格中的scale 3),经过55的卷积核进行卷积后,那么它将得到(7-5+1)(9-5+1)=3*5的输出。

然后我们就只需要在后面把它们拉成一维向量摆放就ok了,这样在一个尺度上,我们可以得到一个C*N个预测值矩阵,每一列就表示图片属于某一类别的概率值,然后我们求取每一列的最大值,作为本尺度的每个类别的概率值。

最后我们一共用了6种不同尺度(文献好像用了12张,另外6张是水平翻转的图片),做了预测,然后把这六种尺度结果再做一个平均,作为最最后的结果。

OK,至此overfeat图片分类的任务就结束了,从上面过程,我们可以看到整个网络分成两部分:layer 1~ 5这五层我们把它称之为特征提取层;layer 6~output我们把它们称之为分类层。

定位任务

我们在定位的时候,把分类层重新设计一下,将分类问题改为回归问题,然后在不同尺度上训练预测物体的bbox。
我们把图片分类学习的特征提取层的参数固定下来,然后继续训练后边的回归层的参数,网络包含四个输出,对应bbox的左上角和右下角,损失函数采用欧式距离L2损失函数。
回归器的最终输出结果是4个单元,代表bounding box边缘的坐标,每个类都有回归器的预测结果,即尽管多尺度的输入图像尺寸不同,回归器输出结果的最后两维是4*1000;而且与分类器的预测结果可以表征回归器预测的置信度(针对1000种不同识别对象而言)。

训练回归器时,前五层不参与训练;如果样本和真实标签的重叠小于50%,则样本不参与回归器的训练。(由于样本预处理和增强的原因,可能导致样本的范围和真实标签已经重叠较小)。

如何决定最终bounding box的问题,与如何决定分类结果的问题类似;区别是这里的输出扩大了4维。不同于其他研究只取最大置信结果的方法,OverFeat设计了一种融合的方法呢,即选取高置信的一批预测结果,然后merge出最终的bounding box。

从OverFeat定位方法的描述中,已经可以看出其可以做多目标检测;模型是一样的,区别是最后结果生成的方法不同。

下图可以看出定位时回归器的工作过程:
在这里插入图片描述

总结

overfeat主要的亮点在于使用了全卷积神经网络和offset pooling,还有分类任务跟定位任务可以使用同一个网络结构

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值