池化和空洞卷积_CNN模型合集 | 14 Dilated Convolutions(空洞卷积)

本文介绍了空洞卷积(Dilated Convolution)在语义分割中的重要作用,它能增大感受野而不损失信息。对比传统卷积,空洞卷积感受野呈指数增长,参数数量线性增长。同时,文章提到了空洞卷积的潜在问题,如不连续的kernel可能导致信息丢失。为了解决这个问题,提出了HDC(混合空洞卷积)原则,通过设计特定的dilation rate序列实现全面覆盖。此外,DUC(密集上采样卷积)用于恢复上采样过程中的信息损失。空洞卷积在像素级任务如语义分割中表现优越,相关实验证实在多个数据集上取得最佳结果。
摘要由CSDN通过智能技术生成

7751a848d4f6078fa1066d8a1e611213.png

2017年Panqu Wang发表,空洞卷积用于语义分割,提出了HDC和DUC设计原则,取得了图像分割的好效果,Understanding Convolution for Semantic Segmentation,官方代码(MXNet)设计思想:

  • 空洞卷积(扩张卷积):尽量保留内部数据结构和避免下采样,就是增大感受野的情况下保留更多信息,代替pooling
    • 卷积前的下采样可以增大卷积核的感受野,作用的每一点就相当于以前的两个点。即便再上采样不行,信息无法重建。
    • 反卷积:反方向卷积,完成上采样。
  • HDC 混合空洞卷积设计原则,为了消除在连续使用dilation convolution时容易出现的网格影响(像素点丢失)。
  • DUC 密集上采样卷积设计原则,相当于用通道数来弥补卷积/池化等操作导致的尺寸的损失。
  • 语义分割的难点:
    • 分类任务pooling损失可以接受,但像素级别的图像分割任务中,pooling丢失的信息对拼合能力很不利,很难准确的对像素分割。
    • pixel-wise的输出,需要pooling来增大感受野,再upsampling还原尺寸
    • 内部数据结构丢失、空间层级化信息丢失。
    • 小物体信息无法重建。假设有四个pooling层则任何小于2^4 = 16pixel的物体信息将理论上无法重建

网络结构:
展示了有 HDC 和 DUC 层的ResNet-101网络的语义分割网络结构。HDC应用于ResNet块内,用于编码;DUC应用于网络顶部,用于解码。

b09de1a4d51b0161002b90a6f2e35bf4.png

空洞卷积

  • 在卷积核中间填充0,扩大感受野,但没用下采样,没用大卷积核
  • (a) 1-dilated conv,等于普通3*3卷积,没有填充空洞0
  • (b) 2-dilated conv,卷积核3*3,空洞1,1-dilated + 2-dilated = 7*7conv大小的感受野。只用2倍空洞卷积会忽略掉很多点,可以与1倍的结合起来用。
  • (c) 4-dilated conv,卷积核3*3,空洞4, 1-dilated + 2-dilated + 4-dilated = 15*15conv。每个元素的感受野为15*15,与每个层相关联的参数的数量是相同的,感受野呈指数增长,而参数数量呈线性增长。
  • 对比传统的conv操作,3层3x3的卷积加起来,stride为1的话,只能达到(kernel-1)*layer+1=7的感受野(7->5->3),也就是和层数layer成线性关系,而dilated conv的感受野是指数级的增长。

7c5b534827de95211957db642e2da9f0.png

Dilated Conv的潜在问题

  • kernel 并不连续,也就是并不是所有的 pixel 会被计算到,同样会忽略掉一些点的信息。
  • 只采用大 dilation rate conv 检测小体积效果不理想,很多像素点考虑不到。可以做多尺度的变换,但会增加网络复杂度。

HDC

  • HDC原则 (Hybrid Dilated Convolution) - 图森组
    • 混合空洞卷积,在每一层使用不同的rate,把dilatioin rate 变成锯齿形式的也就是不同层之间的dilation不断变化。目标是最后的接收野全覆盖整个区域。
  • 1. 叠加卷积的 dilation rate 不能有大于1的公约数。比如 [2, 4, 6] 则不是一个好的三层卷,有些点永远不会被考虑
  • 2. 将 dilation rate 设计成锯齿状结构。例如[1, 2, 3, 1, 2, 3] 循环结构,覆盖了所有点,如上图
  • 3. 需要满足一下这个式子,M<=K:

8d476ec7dc1672730e9a5ab2b14ea2ac.png
    • dilation rate是空洞卷积率,记为 ri,就是扩张倍数;K是卷积核尺寸
  • 举例:对于常见的扩张卷积核大小K=3,如果r=[1,2,5] 则

c88d4af8c95dc02d549c886bd9ba004b.png
    • 此时M2=2 ≤ K=3 满足设计要求,设计的示意图如下:

10086bedf72f5f47b3a7f5eacbc09eba.png

DUC

  • 双线性插值问题:如果模型的d=16 d=16d=16,即输入到输出下采样了16倍。如果一个目标物的长或宽长度小于16个pixel,训练label map需要下采样到与模型输出维度相同,即下采样16倍时已经丢失了许多细节, 对应的模型预测结果双线性插值上采样是无法恢复这个信息。
  • 密集上采样卷积DUC (Dense Upsampling Convolution),做的事情就是改变原本top layer输出的shape,提高了小目标物的识别率,验证了DUC可以恢复双线性插值上采样损失的信息。
  • DUC模块,将所有特征图分成d^2个子集(d代表图像的降维比例)。假如原始图像大小为H*W,卷积之后变为H/d*W/d,用h*w代替,具体为:
    • 先将原先的h*w*c变成h*w*(d^2*L),L为分割的类别数目
    • 将此后的输出reshape为H*W*L,以此引入多个学习的参数,提升对细节的分割效果

反卷积 VS 空洞卷积

  • Decon是上采样,Dilated Conv是增大感受野但不下采样
  • Deconv是在像素之间填充空白的像素
  • Dilated Conv是忽略掉了一些像素
  • 反卷积还原图像尺寸,要下采样

空洞卷积的应用场景

  • 像素级任务,属于背景还是前景,前景中的哪一种
  • 如语义分割任务,明显HDC原则的空洞卷积ResNet更好实现了语义分割网络

1e34492a4e01bee74ea4dd3d8c2fae69.png

论文实验结果
在语义分割领域的CityScapes、PASCAL VOC 2012、Kitti Road benchmark数据集取得了当时最先进的成果。

2b938d0ef0d7573f9be3c57f76169f70.png

推荐阅读:
本论文解析:https://blog.csdn.net/u011974639/article/details/79460893
反卷积: https://www.zhihu.com/question/43609045/answer/132235276
ASPP网络(Atrous Spatial Pyramid Pooling)-港中文和商汤组

另外在我的主页中还能看到其他系列专栏:【OpenCV图像处理】【斯坦福CS231n笔记】
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个使用PyTorch实现CNN空洞卷积Dilated Convolution)的示例代码: ```python import torch import torch.nn as nn class DilatedCNN(nn.Module): def __init__(self): super(DilatedCNN, self).__init__() self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=3, dilation=2) self.relu = nn.ReLU() self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, dilation=2) self.fc = nn.Linear(32*5*5, 10) # 假设输入图像大小为28x28 def forward(self, x): x = self.relu(self.conv1(x)) x = self.relu(self.conv2(x)) x = x.view(x.size(0), -1) x = self.fc(x) return x # 创建模型实例 model = DilatedCNN() # 创建输入数据张量(假设为单通道的28x28图像) input_data = torch.randn(1, 1, 28, 28) # 使用模型进行预测 output = model(input_data) print("预测结果:", output) ``` 在这个示例中,我们定义了一个名为`DilatedCNN`的模型类,继承自`nn.Module`。在构造函数中,我们定义了两个卷积层(`conv1`和`conv2`),它们的`kernel_size`都是3,同时设置了`dilation`参数为2,表示使用2倍的空洞卷积。 在`forward`函数中,我们先通过卷积层和ReLU激活函数进行特征提取,然后使用`view`函数将特征张量展平成一维向量,最后通过全连接层得到最终的预测结果。 在示例的后面部分,我们创建了一个`DilatedCNN`的实例`model`,并生成了一个随机的输入数据张量`input_data`(假设为单通道的28x28图像)。然后,我们使用模型进行预测,并输出预测结果。 请注意,这只是一个简单的示例,你可以根据自己的需求和数据进行相应的调整和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值