深入浅出之SPPNET网络

一、定义

SPP-Net(Spatial Pyramid Pooling Network),即空间金字塔池化网络,是由何凯明等人在2015年提出的一种深度学习框架,旨在解决卷积神经网络(CNN)对输入图像尺寸严格要求的问题。SPP-Net通过引入空间金字塔池化层(SPP Layer),使得网络能够处理任意尺寸的输入图像,并输出固定长度的特征向量,从而提高了目标检测、图像分类等任务的灵活性和效率。

二、研究背景

SPPNet的研究动机主要包括两个方面:

第一:卷积神经网络的全连接层需要固定输入的尺寸,而Selective search所得到的候选区域存在尺寸上的差异,无法直接输入到卷积神经网络中实现区域的特征提取,因此RCNN先将候选区缩放至指定大小随后再输入到模型中进行特征提取。

无论是通过区域裁剪还是缩放来实现区域大小的固定,其实都是一种次优的操作。如下图所示:


可以很明显的看到,直接对候选框进行crop或者warp操作,会使图像出现失真。

为何全连接层需要固定输入?

众所周知,CNN一般都含有卷积部分和全连接部分,其中,卷积层不需要固定尺寸的图像,而全连接层是需要固定大小的输入。

全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。

由于其全相连的特性,一般全连接层的参数也是最多的。全连接层的权重矩阵是固定的,即每一次feature map的输入必须都得是一定的大小(即与权重矩阵正好可以相乘的大小),所以网络一开始输入图像的尺寸必须固定,才能保证传送到全连接层的feature map的大小跟全连接层的权重矩阵匹配。
                   

所以当全连接层面对各种尺寸的输入数据时,就需要对输入数据进行crop(crop就是从一个大图扣出网络输入大小的patch,比如227×227),或warp(把一个边界框bounding box的内容resize成227×227)等一系列操作以统一图片的尺寸大小,比如224224(ImageNet)、3232(LenNet)、96*96等。

所以才如我们在上文中看到的,在R-CNN中,“因为取出的区域大小各自不同,所以需要将每个Region Proposal缩放(warp)成统一的227x227的大小并输入到CNN”。

但warp/crop这种预处理,导致的问题要么被拉伸变形、要么物体不全,限制了识别精确度
SPP Net的作者Kaiming He等人逆向思考,既然由于全连接FC层的存在,普通的CNN需要通过固定输入图片的大小来使得全连接层的输入固定。那借鉴卷积层可以适应任何尺寸,为何不能在卷积层的最后加入某种结构,使得后面全连接层得到的输入变成固定的呢?

这个“化腐朽为神奇”的结构就是spatial pyramid pooling layer。

第二:RCNN使用Selective Search从图像中获取候选区域,然后依次将候选区域输入到卷积神经网络中进行图像特征提取,如果有2000个候选区域,则需要进行2000次独立的特征提取过程。然后,这2000个候选区域是存在一定程度的重叠的,所以如此设计会导致大量的冗余计算。

四、SPP-Net主要贡献

 主要贡献:

  1. 减少卷积计算
  2. 防止图片内容变形

1. 与传统CNN的对比


SPP Net第一个贡献就是在最后一个卷积层后,接入了金字塔池化层,保证传到下一层全连接层的输入固定。

在普通的CNN机构中,输入图像的尺寸往往是固定的(比如224*224像素),输出则是一个固定维数的向量。SPP Net在普通的CNN结构中加入了ROI池化层(ROI Pooling),使得网络的输入图像可以是任意尺寸的,输出则不变,同样是一个固定维数的向量。

2. 与R-CNN的对比

对于多个候选区域依次进入特征提取网络进行图像特征提取,SPPNet采用直接将全图输入到卷积神经网络中提取图像特征,然后在图像特征图上找到候选区域的图像特征。此外,采用Spatial Pyramid Pooling将不同尺寸的候选区域特征转化为固定尺寸的值,避免了RCNN采用的缩放操作。

R-CNN要对每个区域计算卷积,而SPPNet只需要计算一次卷积,从而节省了大量的计算时间,比R-CNN有一百倍左右的提速。

1)R-CNN模型

  1. R-CNN是让每个候选区域经过crop/wrap等操作变换成固定大小的图像
  2. 固定大小的图像塞给CNN 传给后面的层做训练回归分类操作

2)SPP-Net模型

  1. SPPNet把全图塞给CNN得到全图的feature map
  2. 让候选区域与feature map直接映射,得到候选区域的映射特征向量

映射过来的特征向量大小不固定,这些特征向量塞给SPP层(空间金字塔变换层),SPP层接收任何大小的输入,输出固定大小的特征向量,再塞给FC层

五、SPPNet实现方法


1.SPP层(spatial pyramid pooling)
首先要明确的是这一层的位置,这一层加在最后一个卷积层与全连接层之间,目的就是为了输出固定长度的特征传给要求固定输入的全连接层
SPP层的结构如下图所示


SPP层的输入:
如下图灰色框所示
最后一层卷积输出的特征(我们称为feature map),feature map为下图的黑色部分表示,SPP层的输入为与候选区域对应的在feature map上的一块区域
上面这句话可能有点绕,我们可以理解为一张图有约2000个候选区域,而对一张图做完卷积后得到feature map,在这个feature map上也有约2000个与候选区域对应的区域(这里的对应关系下面会详细讲解)


SPP层的输出:
SPP layer分成1x1,2x2,4x4三个pooling结构(这部分结构如下图所示),对每个输入(这里每个输入大小是不一样的)都作max pooling(论文使用的),出来的特征再连接到一起,就是(16+4+1)x256的特征向量。


无论输入图像大小如何,出来的特征固定是(16+4+1)x256维度。这样就实现了不管图像中候选区域尺寸如何,SPP层的输出永远是(16+4+1)x256特征向量。

 2.候选区域在原图与feature map之间的映射关系
这部分的计算其实就是感受野大小的计算。
在CNN中感受野(receptive fields)是指某一层输出结果中一个元素所对应的上一层的区域大小,如下图所示。


先定义几个参数,参数的定义参考吴恩达在cousera讲解中对符号的定义,然后再讲解怎么计算

  

到这里就把SPPNet的核心思想讲完了,SPPNet网络后面和R-CNN类似。 

六、特点

  1. 任意尺寸输入:SPP-Net能够接收任意尺寸的输入图像,无需进行裁剪(crop)或缩放(warp)等预处理操作,避免了图像信息的丢失和变形。
  2. 多尺度特征提取:SPP层通过空间金字塔结构,以不同大小的网格块来提取特征,实现了多尺度特征提取,提高了模型对不同尺度目标的适应能力。
  3. 固定长度输出:经过SPP层处理后,无论输入图像尺寸如何变化,输出特征向量的长度都保持不变,便于后续的全连接层处理。
  4. 高效性:相比于传统的R-CNN等方法,SPP-Net在速度和准确性上均有显著提升,特别是在处理大量候选区域(region proposals)时,其效率更高。

七、pytorch实现

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
class SpatialPyramidPooling2d(nn.Module):  
    def __init__(self, num_level, pool_type='max_pool'):  
        super(SpatialPyramidPooling2d, self).__init__()  
        self.num_level = num_level  
        self.pool_type = pool_type  
  
    def forward(self, x):  
        N, C, H, W = x.size()  
        for i in range(self.num_level):  
            level = i + 1  
            kernel_size = (ceil(H / level), ceil(W / level))  
            stride = (ceil(H / level), ceil(W / level))  
            padding = (floor((kernel_size[0] * level - H + 1) / 2), floor((kernel_size[1] * level - W + 1) / 2))  
            if self.pool_type == 'max_pool':  
                tensor = F.max_pool2d(x, kernel_size=kernel_size, stride=stride, padding=padding).view(N, -1)  
            else:  
                tensor = F.avg_pool2d(x, kernel_size=kernel_size, stride=stride, padding=padding).view(N, -1)  
            if i == 0:  
                res = tensor  
            else:  
                res = torch.cat((res, tensor), 1)  
        return res  
  
class SPPNet(nn.Module):  
    def __init__(self, num_level=3, pool_type='max_pool'):  
        super(SPPNet, self).__init__()  
        self.feature = nn.Sequential(  
            nn.Conv2d(3, 64, 3, padding=1),  
            nn.ReLU(),  
            nn.MaxPool2d(2),  
            nn.Conv2d(64, 128, 3, padding=1),  
            nn.ReLU(),  
            nn.MaxPool2d(2)  
        )  
        self.spp_layer = SpatialPyramidPooling2d(num_level, pool_type)  
        self.fc = nn.Linear(num_level * (num_level + 1) * (num_level + 2) // 6 * 128, 10)  # 假设输出为10类  
  
    def forward(self, x):  
        x = self.feature(x)  
        x = self.spp_layer(x)  
        x = x.view(x.size(0), -1)  # Flatten the feature maps  
        x = self.fc(x)  
        return x  
  
# 示例使用  
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')  
input_tensor = torch.randn(1, 3, 224, 224).to(device)  
model = SPPNet(num_level=3, pool_type='max_pool').to(device)  
output = model(input_tensor)  
print(output.shape)  # 输出应为[1, 10]

 注意:上述代码仅为示例,实际使用中需要根据具体任务和数据集调整网络结构和参数。此外,SPP-Net的完整实现可能还包括更多的细节和优化措施,如多尺度训练、数据增强等。

八、SPPNet 与 ROI Pooling区别 

SPPNet(空间金字塔池化网络)与ROI Pooling(感兴趣区域池化)在深度学习,特别是计算机视觉领域,是两种用于处理图像特征的重要技术。它们在目标检测、图像分类等任务中发挥着关键作用,但各自具有不同的特点和实现方式。以下是对两者区别的详细分析:

1. 定义与目的

  • SPPNet:SPPNet通过引入空间金字塔池化层(SPP Layer),解决了卷积神经网络(CNN)对输入图像尺寸严格要求的问题。它允许网络接收任意尺寸的输入图像,并输出固定长度的特征向量,提高了模型的灵活性和效率。
  • ROI Pooling:ROI Pooling是区域感兴趣池化的简称,主要用于从特征图中提取固定大小的特征向量,这些特征向量对应于输入图像中的特定区域(即感兴趣区域ROI)。它主要用于目标检测任务中,以便对候选区域进行进一步的分析和分类。

2. 实现方式

  • SPPNet:SPP Layer采用空间金字塔结构,将特征图分割成多个不同尺度的网格块,并对每个网格块进行池化操作(如最大池化)。这些池化操作的结果被拼接起来,形成固定长度的特征向量。SPP Layer可以处理任意尺寸的特征图,并输出固定长度的特征向量。
  • ROI Pooling:ROI Pooling首先根据输入的ROI(感兴趣区域)坐标和特征图的比例关系,确定ROI在特征图上对应的区域。然后,将该区域分割成固定数量的子区域(如7x7的网格),并对每个子区域进行池化操作(如最大池化),以提取固定大小的特征向量。

3. 特点与优势

  • SPPNet
    • 灵活性:能够接受任意尺寸的输入图像,无需进行裁剪或缩放等预处理操作。
    • 多尺度特征提取:通过空间金字塔结构实现多尺度特征提取,提高了模型对不同尺度目标的适应能力。
    • 高效性:相比传统方法,SPP-Net在速度和准确性上均有显著提升。
  • ROI Pooling

    • 针对性:专注于从特征图中提取特定区域的特征向量,适用于目标检测等任务。
    • 固定输出:无论输入ROI的大小如何变化,输出特征向量的长度都保持不变。
    • 减少重复计算:在Fast R-CNN等框架中,ROI Pooling使得网络只需对整张图像进行一次卷积操作,即可获取所有候选区域的特征,大大减少了计算量。

4. 应用场景

  • SPPNet:广泛应用于图像分类、目标检测等领域,特别是当输入图像尺寸不确定或需要处理多尺度目标时。
  • ROI Pooling:主要用于目标检测任务中,作为从特征图中提取候选区域特征的关键步骤。

综上所述,SPPNet和ROI Pooling在深度学习领域各有其独特的应用场景和优势。SPPNet通过空间金字塔池化层实现了对任意尺寸输入图像的处理,提高了模型的灵活性和效率;而ROI Pooling则专注于从特征图中提取特定区域的特征向量,为目标检测等任务提供了有力支持。

九、SPPNET 与 RCNN区别

SPP-Net(Spatial Pyramid Pooling in Deep Convolutional Networks)与RCNN(Regions with CNN features)在目标检测领域都是具有重要影响力的算法,它们之间存在明显的区别,主要体现在以下几个方面:

1. 输入处理方式的差异

  • SPP-Net
    • 多尺度输入:SPP-Net支持任意大小的图像作为输入,这得益于其引入的空间金字塔池化(SPP)层。SPP层能够处理不同尺度的特征图,并生成固定大小的输出,这使得SPP-Net能够直接处理多尺度的原始图像,无需像RCNN那样对候选区域进行尺寸归一化。
    • 特征提取:SPP-Net只对整个图像进行一次特征提取,然后在特征图上找到候选区域对应的映射,避免了RCNN中对每个候选区域进行独立特征提取的冗余计算。
  • RCNN
    • 固定尺度输入:RCNN要求将每个候选区域(region proposal)的尺寸归一化到固定大小(如227x227),然后送入CNN进行特征提取。这种方式会导致图像信息的丢失和变形,影响识别精度。
    • 独立特征提取:RCNN对每个候选区域都进行独立的特征提取,这种重复计算导致了大量的计算冗余。

2. 网络结构与训练方式

  • SPP-Net
    • SPP层:SPP层位于CNN的最后一个卷积层之后,用于将不同尺度的特征图转换成固定大小的输出,以便与后续的全连接层连接。
    • 训练方式:SPP-Net支持多尺度训练,即在训练过程中使用不同尺度的图像来防止过拟合,并提升模型的泛化能力。
  • RCNN
    • 结构:RCNN的网络结构相对简单,主要由CNN和SVM分类器组成。CNN用于特征提取,SVM用于分类。
    • 训练方式:RCNN的训练过程包括多个阶段,如候选区域生成、特征提取、SVM分类和边框回归等,这些阶段相对独立且计算量大。

3. 性能与效率

  • SPP-Net
    • 速度提升:由于SPP-Net避免了大量重复计算,其检测速度比RCNN快得多,据称在速度上比R-CNN快24-102倍。
    • 精度:在保持较高检测精度的同时,SPP-Net还能够在图像变形情况下表现稳定。
  • RCNN
    • 速度较慢:由于RCNN需要对每个候选区域进行独立的特征提取和分类,其检测速度相对较慢。
    • 精度:尽管RCNN在目标检测领域取得了显著进展,但其速度和效率问题限制了其在实际应用中的广泛推广。

综上所述,SPP-Net与RCNN在输入处理方式、网络结构与训练方式以及性能与效率等方面都存在显著差异。SPP-Net通过引入SPP层和支持多尺度输入等方式,有效解决了RCNN在速度和效率方面存在的问题,并提升了目标检测的精度和稳定性。

十、应用场景

SPP-Net广泛应用于目标检测、图像分类、人脸识别等领域。由于其对输入图像尺寸的灵活性和高效性,使得SPP-Net在处理复杂场景和大规模数据集时具有显著优势。

十一、优势

  1. 提高灵活性:不再受限于固定尺寸的输入图像,使得在实际应用中更加便捷。
  2. 提升准确性:多尺度特征提取和固定长度输出有助于模型更好地捕捉图像中的关键信息,提高分类和检测的准确性。
  3. 加快处理速度:通过减少预处理步骤和优化计算过程,SPP-Net在处理大量数据时能够显著加快处理速度。

参考:

  1. 【目标检测】SPP-Net论文理解(超详细版本)
  2. SPP-net文章详细解读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值