上回书详细的介绍了R-CNN的前世今生,在文章的最后同样抛出了R-CNN中的不足点:其一是检测的精度相对而言比较低,这主要是图像归一化时对图像过度拉伸造成的,其二是检测速度慢,这个是由于每张图像需要分割成2000多个特征区域,然后依次进入卷积网络造成的。
发现问题下一步就是要解决问题。
首先我们来说一下为什么要进行图像的归一化。
这样做的目的是因为R-CNN采用的是Alexnet网络,而需要特别注意的是Alexnet网络的输入图像大小是固定大小的。即227*227像素。但是呢,通过SS算法产生的候选区域的大小是随机的,也就是说,等待进入神经网络进行特征提取的候选区域大小是不一样的,有的大有的小,这样的话,我们就给他归一化大小呗,统一归一化成227*227的了。
某国的整形文化十分厉害,但是长相不同的人都整成“网红脸”后,必然不是太自然。即使再高超的整形医师,再精湛的“刀工”也是会留下痕迹的,更何况是简单的拉扯,将大的小的长的方的图像强行归一化成227*227呢?
那么可不可以通过网络结构的整改,使得任意大小的图像都可以输入到卷积神经网络之中呢?当然可以了!!!下面祭出大神何凯明!
如果你想在目标检测领域有所斩获,那么以后你会经常读到它的论文!
前文中说到AlexNet需要固定大小的输入,那么究竟是什么地方需要固定大小呢?通过分析网络,不难发现,在卷积层以及池化层就是在做一些基本的卷集运算,并不需要固定大小的图像,只不过是你来多大的图像经过运算之后,我给你输出相应大小的图像罢了。需要固定大小是因为在卷积层后边连接的全连接层(FC层),FC层需要进行全连接操作,然而一般全连接的节点数是固定的吗,这就造成了输入进全连接层的大小必须是固定的,要不然没办法做运算啊!图像小了,节点有富裕,不合适,图像大了,节点又不够用了,更不合适。
分析到这里,何凯明大神好像发现了其中的玄机。既然只要输入给FC层的图像大小固定就好了,我为什么需要在一开始就做成一般大的啊?基于此,何凯明博士发表了论文:《Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition》,里面提出了空间金字塔池化,将其接在最后一层卷积层(池化层)与FC层之间,实现了可以输入任意大小图像进卷积神经网络的目的。
在最后一层卷积层后面加上了如图所示的结构,具体的做法是在Conv5层会得到256层的特征图,对每一层均进行空间金字塔池化(Spatial Pyramid Pooling,SSP)。首先要获得不同尺寸大小的蒙版,图中所示为三种不同大小,分别是4*4,2*2和1*1,将该蒙板盖在每一种特征图像,在每个网格中做max pooling,这样这256层特征图就做成了16*256、4*256和1*256维特征,将其连接起来便得到了固定长度的特征向量了,将这个特征向量输入到全连接层便可以啦!
既然不需要将2000张候选区域进行归一化了,那么自然也就不再需要将每一种候选区域做一次卷积运算了,直接将原图扔进卷积网络就可以啦,这可是一件了不起的改进,速度可以提升百倍!
其具体的做法是将整张图像输入到CNN中,进行特征提取,从而得到特征图(Feature Map),然后再特征图中寻找早先利用SS算法得到的2K个候选区域,再将其通过空间金字塔池化层便OK了。
以上便是SPP-Net的精髓了,其改进的就是特征提取的步骤。其优点是非常明显的:提高检测速度!
但是其并没有对R-CNN进行深层次的优化,并不是一种end-to-end (端到端)的检测算法,并且距离端到端的检测还稍微有那么一点距离。
有困难不可怕,我们前进的路上有大神,下一步便是对SVM和BBox下手了。
未完待续。。。
网友评论