空间金字塔思想在图像处理中的应用:SPP,PPM、ASPP和FPN结构理解和总结

图像空间金字塔思想在图像处理中被广泛应用,本文主要针对具体的 SPP ,PPM,ASPP和 FPN 结构,以及传统图像处理的SIFT等进行简单的介绍和总结。

欢迎各位进行交流学习。【人肉整理,转载请注明出处】

1 综述

SPP论文链接:
Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition

pspNet论文链接:
Pyramid Scene Parsing Network

ASPP论文链接(此处已deeplab v3为例):
deeplab v3(2017年):Rethinking Atrous Convolution for Semantic Image Segmentation
deeplab v3+(2018年):Encoder-Decoder with Atrous Separable
Convolution for Semantic Image Segmentation

FPN论文连接:
Feature Pyramid Networks for Object Detection

1.1 SPP结构(Spatial Pyramid Pooling)

在何恺明2015年《Spatial Pyramid Pooling in Deep ConvolutionalNetworks for Visual Recognition》被提出,改论文主要改进两点:

解决CNN需要固定输入图像的尺寸,导致不必要的精度损失的问题;

因为带有全连接层的网络结构都需要固定输入图像的尺度,当然后期也有直接用conv层代替FC层的,比如SSD网络直接用conv层来计算边界框坐标和置信度的。

解决R-CNN对候选区域进行重复卷积计算,导致计算冗余的问题;

因为R-CNN网络中基于segment seletive输出的2000个候选框都要重新计算feature map较为耗时,因此提出了候选区域到全图的特征(feature map)之间的对应映射,这样图像只需计算一次前向传播即可。
在之后的 fast R-CNN 和 faster R-CNN 都采用这种映射关系,为ROI pooling层。
但在mask R-CNN中,用ROI Align替代了ROI pooling层,其认为两次量化的候选框与最开始的回归候选框有一定偏差,影响检测和分割准确度,ROI Align中不进行float量化,通过双线性内插计算四个坐标点,然后进行max pooling

SPP结构如下:
在这里插入图片描述
将256 channels 的 feature map 作为输入,在SPP layer被分成1x1,2x2,4x4三个pooling结构,对每个输入都作max pooling(论文使用的),这样无论输入图像大小如何,出来的特征固定是(16+4+1)x256维度。这样就实现了不管图像中候选区域尺寸如何,SPP层的输出永远是(16+4+1) x 256 特征向量。

1.2 PPM结构(Pyramid Pooling Module)

应用在语义分割中,PSPNet网络结构如下:
在这里插入图片描述
(1)Input Image:即自然场景下拍摄的包含不同目标的原始图;
(2)Feature Map:即通过前面CNN获得的特征图,,这个CNN是预训练的ResNet
(3)Pyramid Pooling Module:上图中方框POOL表示采用1x1、2x2、3x3和6x6四种不同尺寸的pooling操作得到多个尺寸的特征图,并对这些尺寸的特征图再次进行“1x1的Conv”来减少通道数。然后采用双线性插值进行UPSAMPLE,即通过上采样来获得金字塔模块前相同尺寸的特征图,并在通道上进行拼接;
(4)Final Prediction:即最终预测结果;

PPM模块代码如下,结合代码更直观:

#下面是单个PPM模块
def interp_block(prev_layer, level, feature_map_shape, input_shape):
    if input_shape == (473, 473):
        kernel_strides_map = {1: 60,
                              2: 30,
                              3: 20,
                              6: 10}
    elif input_shape == (713, 713):
        kernel_strides_map = {1: 90,
                              2: 45,
                              3: 30,
                              6: 15}
    else:
        print("Pooling parameters for input shape ",
              input_shape, " are not defined.")
        exit(1)

    names = [
        "conv5_3_pool" + str(level) + "_conv",
        "conv5_3_pool" + str(level) + "_conv_bn"
    ]
    kernel = (kernel_strides_map[level], kernel_strides_map[level])
    strides = (kernel_strides_map[level], kernel_strides_map[level])
    prev_layer = AveragePooling2D(kernel, strides=strides)(prev_layer)  #或者maxPooling;
    prev_layer = Conv2D(512, (1, 1), strides=(1, 1), name=names[0],
                        use_bias=False)(prev_layer)
    prev_layer = BN(name=names[1])(prev_layer)
    prev_layer = Activation('relu')(prev_layer)
    # prev_layer = Lambda(Interp, arguments={
    #                    'shape': feature_map_shape})(prev_layer)
    prev_layer = Interp(feature_map_shape)(prev_layer) #此处进行上采样,resize到原来feature map的size;
    return prev_layer

#下面是1,2,3,6的PPM模块
def build_pyramid_pooling_module(res, input_shape):
    """Build the Pyramid Pooling Module."""
    # ---PSPNet concat layers with Interpolation
    feature_map_size = tuple(int(ceil(input_dim / 8.0))
                             for input_dim in input_shape)  #原图经过resnet后变为1/8;
    print("PSP module will interpolate to a final feature map size of %s" %
          (feature_map_size, ))

    interp_block1 = interp_block(res, 1, feature_map_size, input_shape)
    interp_block2 = interp_block(res, 2, feature_map_size, input_shape)
    interp_block3 = interp_block(res, 3, feature_map_size, input_shape)
    interp_block6 = interp_block(res, 6, feature_map_size, input_shape)

    # concat all these layers. resulted
    # shape=(1,feature_map_size_x,feature_map_size_y,4096)
    res = Concatenate()([res,
                         interp_block6,
                         interp_block3,
                         interp_block2,
                         interp_block1])
    return res

#pspnet网络结构
def build_pspnet(nb_classes, resnet_layers, input_shape, activation='softmax'):
    """Build PSPNet."""
    print("Building a PSPNet based on ResNet %i expecting inputs of shape %s predicting %i classes" % (
        resnet_layers, input_shape, nb_classes))

    inp = Input((input_shape[0], input_shape[1], 3))
    res = ResNet(inp, layers=resnet_layers)
    psp = build_pyramid_pooling_module(res, input_shape)
#后面是经过3×3,1×1的卷积后一次上采样到原图
    x = Conv2D(512, (3, 3), strides=(1, 1), padding="same", name="conv5_4",
               use_bias=False)(psp)
    x = BN(name="conv5_4_bn")(x)
    x = Activation('relu')(x)
    x = Dropout(0.1)(x)

    x = Conv2D(nb_classes, (1, 1), strides=(1, 1), name="conv6")(x)
    # x = Lambda(Interp, arguments={'shape': (
    #    input_shape[0], input_shape[1])})(x)
    x = Interp([input_shape[0], input_shape[1]])(x)
    x = Activation('softmax')(x)

    model = Model(inputs=inp, outputs=x)

    # Solver
    sgd = SGD(lr=learning_rate, momentum=0.9, nesterov=True)
    model.compile(optimizer=sgd,
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    return model

1.3 ASPP结构(Atrous Spatial Pyramid Pooling)

可以认为是SPP在语义分割中的应用,结合了空洞卷积可在不丢失分辨率(不进行下采样)的情况下扩大卷积核的感受野。此处已deeplab v3网络为例,deeplab v3论文中的ASPP结构如下如所示。

在这里插入图片描述

  • 其中的1*1卷积,论文中的解释是当 rate = feature map size 时,dilation conv 就变成了 1 ×1 conv,所以这个 1 × 1 conv相当于rate很大的空洞卷积。还加入了全局池化,再上采样到原来的 feature map size,思想来源于PSPnet。为什么用 rate = [6, 12, 18] ?是论文实验得到的,因为这个搭配比例的 mIOU 最高。
  • 在 backbone 的每一个block里面又参考了HDC的思想,设置了 [1,2,1] 的rate,所以每个conv的rate = Rate * rate。论文给出的 Multi-grid 部分结果如下所示。
    在这里插入图片描述

这里提一下deeplab v3+ 结构,是对V3的一个加强,主要有两个改进点:

  • 对ASPP中的 upsample 进行了改进;

下图来自 deeplab v3+ 论文中,(a) 是deeplab v3的结构,( c) 是deeplab v3+的结构,v3+ 中将上采样变成了2次 4× 的 upsample,相比于v3中直接进行 8× 的 upsample,具有更丰富的语义信息,所以对物体边缘分割效果较好。
在这里插入图片描述

  • deeplab v3+中另一个改进点,将 modify xception 作为 backbone;(这个改进点与ASPP无关)

如此下图所示,(1)加深了网络结构层数,且利用了 Atrous Separable Convolution 来减少权重参数;(2)利用 stride = 2 的 depthwise conv 来替代max pooling 进行下采样;(3)在每一个 depthwise conv 后都加了 BN 和 relu 层。作者在论文中做了各种尝试组合,有兴趣的可查看论文;
大家对 depthwise conv 有兴趣的可以阅读 Mobile Net 系列等轻量网络结构,论文可自行查找。
在这里插入图片描述

1.4 FPN结构(Feature Pyramid Networks for Object Detection)

FPN通常用在 object detection 网络中,通常低层的特征语义信息比较少,但是目标位置准确;高层的特征语义信息比较丰富,但是目标位置比较粗略。FPN 即是对两者进行了融合,同时利用低层特征高分辨率和高层特征的高语义信息,通过融合这些不同层的特征达到预测的效果。并且预测是在每个融合后的特征层上单独进行的,这和常规的特征融合方式不同。

FPN结构如下图:
在这里插入图片描述
自底向上的路径:
具体而言,当 backbone 是 ResNet 时,我们使用每个阶段的最后一个residual block输出的特征激活输出。 对于conv2,conv3,conv4 和 conv5 输出,我们将这些最后residual block的输出表示为 {C2,C3,C4,C5},并且它们相对于输入图像具有 {4, 8, 16, 32} 的步长。

自顶向下的路径:
通过对在空间上更抽象但语义更强高层特征图进行上采样来幻化高分辨率的特征。在C5上附加一个1×1卷积层来生成低分辨率图P5,随后通过侧向连接从底向上的路径,使得高层特征得到增强。将低分辨率的特征图做2倍上采样,最终的特征映射集称为{P2,P3,P4,P5},分别对应于{C2,C3,C4,C5},具有相同的尺寸。通过按元素相加,将上采样映射与相应的自底而上映射合并。
最后,在每个合并的图上附加一个3×3卷积来生成最终的特征映射,这是为了减少上采样的混叠效应。

作者在将其应用到 RPN 和 fast / faster R-CNN 中,在论中有详细的实验数据,大家有兴趣可自行查阅。

在YOLO v3中也采用了类似 FPN 的结构,但里面用了concat 进行特征融合;

2 总结

空间金字塔思想在图像处理中具有很重要的作用,
传统图像处理中:

  • 在SIFT 中利用高斯差分金字塔 (DOG) 保持尺度不变性;
  • 在配准 / 匹配算法中利用空间金字塔进行粗匹配和细匹配达到效率优化;

CNN 网络中:

  • 在含有FC层网络中利用 SPP 改进输入需要固定尺度的问题;
  • 在语义分割中利用 ASPP 在不丢失信息时组合不同感受野的语义信息,提高分割精度;
  • 在 object detection 网络中利用 FPN 改善小目标难检测的问题;

有错误之处请多多指教哈!!

  • 15
    点赞
  • 101
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: Structure-Process-Performance Model 模型是一种组织研究常用的模型。它认为组织的绩效取决于三个因素:组织结构、组织过程和组织绩效。 优点: 1. 模型易于理解和使用,它把组织研究分为三个维度,每个维度都有明确的定义和内容。 2. 模型能够帮助研究者更好地理解组织的内部关系和外部环境对组织绩效的影响。 3. 模型能够帮助管理者识别并解决组织存在的问题。 缺点: 1. 模型假设组织结构、组织过程和组织绩效之间存在着确定的因果关系,这可能并不总是符合实际情况。 2. 模型忽略了组织其他因素对绩效的影响,如文化、领导等 3. 模型并没有解释组织绩效的具体机制,缺乏对组织绩效产生影响的因素的深入研究 ### 回答2: Structure-Process-Performance Model(SPP模型)是一种用于评估组织绩效的模型。该模型主要关注组织的结构、过程和绩效之间的关系。 优点: 1. 综合性:SPP模型综合考虑了组织的结构、过程和绩效,能够提供一个全面的组织绩效评估框架。 2. 适用性:SPP模型适用于各种类型的组织,无论是企业、非营利组织或政府机构,都可以使用该模型来评估其绩效。 3. 可操作性:SPP模型提供了可操作的指导,可以帮助组织识别和解决存在的问题,并改善绩效。 4. 强调过程:SPP模型强调组织的过程,而不仅仅关注结果。这有助于组织关注质量管理、组织能力和效率提升。 缺点: 1. 缺乏具体指导:尽管SPP模型提供了框架和指导,但它缺乏具体的操作指导,例如如何收集和分析数据,以及如何制定改进策略。 2. 过于简化:SPP模型将组织的绩效仅仅归因于结构和过程,忽略了其他可能的影响因素,例如外部环境变化和领导风格。 3. 可伸缩性:SPP模型对于大型、复杂的组织可能不够适用。在这样的组织,绩效的影响因素更为复杂,需要更多的细致分析。 总体来说,SPP模型是一个综合的、可适用于多种组织类型的评估模型,它的结构-过程-绩效框架为组织提供了一个全面的绩效评估视角。然而,它也存在一些缺点,如缺乏具体指导和过度简化的问题,需要在具体应用进行补充和改进。 ### 回答3: Structure-Process-Performance Model (SPPM) 是一种用于研究组织绩效的模型。该模型有以下几个优点和缺点: 优点: 1.综合性:SPPM模型综合考虑了组织核心要素,包括结构、过程和绩效。它提供了一种综合评估组织绩效的方法,有助于全面了解组织的工作方式和表现。 2.可操作性:SPPM模型将组织绩效分解为结构和过程两个方面,使管理者可以更具体地了解绩效状况,并针对性地进行改进。通过分析结构和过程的问题,管理者可以采取相应的措施来提高组织绩效。 3.定量分析:SPPM模型提供了一种定量分析组织绩效的方法,可以通过具体的指标和数据来评估和比较不同组织的绩效表现。这种定量分析有助于提供客观和可比较的结果,帮助管理者做出准确的决策。 缺点: 1.数据获取困难:SPPM模型需要大量的数据支持,包括组织结构、业务流程和绩效指标等。然而,有时候获取这些数据可能会非常困难,特别是对于一些小型组织或者刚刚建立的组织来说,可能没有足够的数据来支持模型的分析。 2.主观性:SPPM模型的结果可能受到主观因素的影响。在评估组织结构和过程时,可能会存在个人偏见和评估者的主观判断,从而影响到绩效的评估结果。 3.复杂性:SPPM模型涉及到很多变量和指标,包括组织结构、过程和绩效的各个方面。这使得模型相对复杂,需要较高的专业知识和经验才能正确应用和解释模型的结果。 综上所述,SPPM模型有其优点和缺点,虽然有一些挑战和限制,但仍然是一种有价值的工具,可以帮助管理者评估和改进组织的绩效。在实际应用,需要克服数据获取困难和主观性等问题,并结合实际情况灵活运用,以取得最佳效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值