赞
踩
多尺度融合博文汇总:
多尺度信息的融合是检测和分割中解决小目标和边缘精度的重要方法,广泛应用于各个检测和分割的工作当中。本文以文章为对象,梳理了不同文章用到的多尺度信息融合的方法,从而有一个比较显式的对比。
DeepLab的主要创新就是atrous(dilated) convolution的应用,基于空洞卷积,其提出了ASPP(Atrous Spatial Pyramid Pooling)方法,通过不同尺度的感受野来融合多尺度的上下文信息。
对于DeepLabv1和v2(TPAMI2018),ASPP只是将同一featuremap使用不同的空洞卷积来生成不同尺度的上下文信息。
DeepLab v3除了并行的将下采样16倍的feature map使用ASPP进行concat之外,还通过global average pooling original input (wh3->113)来进一步融入全局上下文信息。
实现:https://github.com/Tramac/awesome-semantic-segmentation-pytorch/blob/b56c4312305e083a93144424d208e548ab5b84fa/core/models/deeplabv3.py
DeepLab v3+和v3在encoder中多尺度融合方法相同,但在v3的基础上增加了decoder层,来避免空洞卷积使feature map变大导致的计算量的增加。实现了feature map分别率和计算量的权衡。
PSPNet处理的任务是场景解析(scene parsing),是一种需要全图标注的语义分割任务。PSPNet主要创新点就是提出了pyramid pooling module来聚合不同区域的上下文以获取全局上下文信息(exploit the capability of global context information by different-region- based context aggregation through our pyramid pooling module together with the proposed pyramid scene parsing network (PSPNet)).
pyramid pooling module可以看做是一种有效的全局上下文的先验信息。通过结合全局和局部上下文的信息来达到更高的预测精度。
pyramid pooling module是对最后一层feature map来进行多尺度的pooling操作(如图3)。其中,红色的是直接global pooling到1,其余的是将feature map分为不同的sub-regions,然后通过设定不同的kernel_size和stride进行不同尺度的pooling(pooling成
1
×
1
、
2
×
2
、
3
×
3
、
6
×
6
1\times1、2\times2、3\times3、6\times6
1×1、2×2、3×3、6×6)。后面再接一个
1
×
1
1\times1
1×1 Conv,使得channel减为
C
/
N
C/N
C/N。然后通过二次线性插值直接上采样到相同大小进行Concat。
图3中backbone用的是dilated ResNet,将原图下采样8倍。
实现:
class _PyramidPooling(nn.Module): def __init__(self, in_channels, **kwargs): super(_PyramidPooling, self).__init__() out_channels = int(in_channels / 4) self.avgpool1 = nn.AdaptiveAvgPool2d(1) self.avgpool2 = nn.AdaptiveAvgPool2d(2) self.avgpool3 = nn.AdaptiveAvgPool2d(3) self.avgpool4 = nn.AdaptiveAvgPool2d(6) self.conv1 = _PSP1x1Conv(in_channels, out_channels, **kwargs) self.conv2 = _PSP1x1Conv(in_channels, out_channels, **kwargs) self.conv3 = _PSP1x1Conv(in_channels, out_channels, **kwargs) self.conv4 = _PSP1x1Conv(in_channels, out_channels, **kwargs) def forward(self, x): size = x.size()[2:] feat1 = F.interpolate(self.conv1(self.avgpool1(x)), size, mode='bilinear', align_corners=True) feat2 = F.interpolate(self.conv2(self.avgpool2(x)), size, mode='bilinear', align_corners=True) feat3 = F.interpolate(self.conv3(self.avgpool3(x)), size, mode='bilinear', align_corners=True) feat4 = F.interpolate(self.conv4(self.avgpool4(x)), size, mode='bilinear', align_corners=True) return torch.cat([x, feat1, feat2, feat3, feat4], dim=1)
HR-Net family有三类模型:
这里主要讨论HRNetV2。
与DeepLab和PSPNet使用dilated convolution来进行多尺度上下文信息的保留和融合不同,HR-Net从另一个角度来保留“高解析”表示(high-resolution representations)。
“高解析”表示是一些需要细节信息的任务(例如:语音分割、姿态预测、目标检测等)非常关键的信息。相对的,对于分类任务而言,只需要低解析的表示即可。
HRNetV2工作中明确了获取高解析表示的几种方法:
本文主要研究的就是第2中方法,通过并行的连接高到低的解析度卷积层来重复的进行多尺度的融合。
An HRNet maintains high-resolution representations by connecting high-to-low resolution convolutions in parallel and repeatedly conducting multi-scale fusions across parallel convolutions.
保留高解析表示的方法通过并行的连接高到低的表示,而不是类似encoder-decoder那样序列式的恢复高解析表示,可以学习到空间上更加精确的表示。此外,与通过上采样的方式来获取高解析表示不同,通过重复多解析的融合,可以通过低解析表示来加强高解析表示,反之亦然。综上,可以获取更加rich的语义信息。
def forward(): 图像先经过两个33conv_s2+bn和一个relu,分别率变为原图的1/4。然后进入如下结构:
上图上采样是通过二次线性插值+11conv来匹配channel实现的。
SPPNet主要运用到了spatial pyramid pooling layer来解决传统CNN中由于FC层维度固定,因此不能处理任意尺寸图像的问题。
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。