DUC(dense upsampling convolution)模块的实现(Pytorch)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、DUC模块
  • 二、Pytorch实现DUC模块


前言

Understanding Convolution for Semantic Segmentation这篇论文中提出了DUC模块,DUC的全称是dense upsampling convolution,即密集上采样卷积。提出的背景是:在decoder阶段,一般采用双线性插值和转置卷积来实现。第一种的双线性插值其参数不可学习的,这样会造成细节信息的损失,第二种的转置卷积会在原图中填充0,论文中没说这样做有什么不好,我自己的想法是,在特征图之间填充0会导致特征图便模糊,及是细节信息损失。作者于是提出了DUC模块。


提示:以下是本篇文章正文内容,下面案例可供参考

一、DUC模块

DUC(dense upsampling convolution)模块的实现(Pytorch)_第1张图片
在decoder部分的是DUC模块,假设经过encoder部分之后的feature map是
(c, w / d, h / d)
通过卷积将其变为

(c * d * d, w / d, h / d)

然后将该特征图上的每一个patch(所以channel上的一个像素点总数 c*w*h)对应于另一个特征图上的一个像素点(c*w*h
于是特征图就变成了c*w*h
然后通过卷积将channel变为num_class。
以上就是其原理

二、Pytorch实现DUC模块

import torch
import torch.nn as nn
from torchsummary import summary

class DUC(nn.Module):
    def __init__(self, in_channel, num_class, factor):
        super(DUC, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=in_channel, out_channels=in_channel*factor*factor, kernel_size=(1, 1), stride=(1, 1))
        self.pixshuffle = nn.PixelShuffle(upscale_factor=factor)
        self.conv2 = nn.Conv2d(in_channels=in_channel, out_channels=num_class, kernel_size=(1, 1), stride=(1, 1))

    def forward(self, x):
        x = self.conv1(x)
        x = self.pixshuffle(x)
        x = self.conv2(x)
        return x


test = torch.rand((1, 8, 28, 28))
model = DUC(in_channel=8, num_class=1, factor=2)
output = model(test)
print(output.shape)

使用到了torch.nn.PixelShuffle这个类,其作用就是将(c*r*r,w,h)的tensor转换为c,w*r,h*r的tensor
其文档如下:
DUC(dense upsampling convolution)模块的实现(Pytorch)_第2张图片
传入的数据shape是(1,8,28,28),经过该模块之后,其形状变成了(1,1,56,56),成功实现了上采样。
在这里插入图片描述

你可能感兴趣的:(Pytorch,深度学习,图像分割,pytorch,深度学习,人工智能)