R-CNN系列(2)—— SPP-NET

 

1.CNN的缺点

  CNN有一个问题,那就是需要固定size的输入。
   这个问题会导致什么后果?为了满足这个固定的size,所有输入到CNN的图像都需要经过resize,包括裁剪、拉伸、压缩等等,而这将会扭曲原始图像,使得图像失真,不利于模型的训练与测试效果。
  为什么CNN需要固定size的输入?这需要从CNN的网络结构去分析,CNN可以简单地分为卷积部分和全连接部分。其中卷积包括卷积层和池化层,因为每个层卷积核和池化核的size是固定的,即独立于原始输入图像的size。因此,CNN需要固定input size并非由卷积部分引起的,而是全连接部分。卷积部分的output是三维矩阵,在输入到全连接层之前,需要把这个三维矩阵摊开成一个向量。而如果CNN的输入图像的size是不同的,那么这个矩阵的size也是不同的,这将导致矩阵摊开之后的向量维度不同。而全连接层的输入维度必须是固定的(因为输入维度固定了,参数的个数才能固定,如果连参数个数都无法确定,那模型也就无法训练了),因此也就限制了卷积部分的输出的size是固定的。
  那有没有办法能够改进CNN,使得它能够接受不同size的图像输入?直观的感觉是在卷积部分和全连接部分做一些操作,使得不同size的卷积部分的output,经过这个操作之后,得到一个固定维度的向量,作为紧邻全连接层的input。
 
 

2.空间金字塔池化(The Spatial Pyramid Pooling Layer)

  空间金字塔池化就是在卷积部分和全连接部分之间增加的一种操作,它能够使得不同size的卷积部分的output,经过这个操作之后,得到一个固定维度的向量,作为紧邻全连接层的input。
  具体的做法就是:在最后卷积层(或池化层)输出特征图(feature map)之后,对特征图的每个通道进行3次区域划分,依次为4*4、2*2、1*1。在每次划分中,对每个区域进行最大池化(简而言之就是取这个区域的最大值,代表这个区域),然后再将池化后的结果摊开成一个向量,三次划分则得到三个向量,长度依次为16、4、1,再将三个向量合并成一个向量,一个通道得到一个长度为21的向量,将256个通道的向量拼接在一起,最终得到长度为21*256的向量。因此,即使原始输入图像的size不同导致了特征图的size不同,经过金字塔池化之后,也能得到一个长度固定的向量,作为全连接层的输入。
 
 

3.SPP-NET用于目标检测

3.1.R-CNN的两个弊端

  (1)区域提议需要resize成固定的size,才能输入到CNN中进行特征提取,这将导致图片失真。
  (2)对于每个区域提议,都需要重新输入到CNN进行卷积操作以提取特征。但其实不同区域提议之间经常有重复的部分,也就是说在对所有区域提议进行特征提取时,已经做了很多重复的操作,而将是非常耗时的。
 

3.2.SPP-NET改进R-CNN

    针对R-CNN上述的两个弊端,SPP-NET有应对方法。
  (1)对于R-CNN在特征提取之前需要resize区域提议的弊端,SPP-NET通过空间金字塔池化进行优化,使得不同size的特征图(feature map)能够转换成维度固定的向量,然后再输入全连接层,最后再输入SVM中用于判别区域提议的类型。
  (2)只对原始输入图进行一次特征提取,得到整幅图的feature map。然后区域提议映从原始图像的位置映射到在feature map的位置中,从而找到该特征提议的自己的feature map(原始图与feature map的大小虽不同,但是卷积操作与池化操作的特点,长宽比例是相同的。所以可以进行映射,原图像是精细的,而特征图是粗糙的)
 
 
 
 
 
 
 

你可能感兴趣的:(R-CNN系列(2)—— SPP-NET)