paper: U-Net: Convolutional Networks for Biomedical Image Segmentation

以MMSegmentation中unet的实现为例,假设batch_size=4,输入shape为(4, 3, 480, 480)。
- EncoderDecoder(
- (backbone): UNet(
- (encoder): ModuleList(
- (0): Sequential(
- (0): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (1): Sequential(
- (0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
- (1): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (2): Sequential(
- (0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
- (1): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (3): Sequential(
- (0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
- (1): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (4): Sequential(
- (0): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
- (1): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(512, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(1024, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- )
- (decoder): ModuleList(
- (0): UpConvBlock(
- (conv_block): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(128, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- (upsample): InterpConv(
- (interp_upsample): Sequential(
- (0): Upsample()
- (1): ConvModule(
- (conv): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (1): UpConvBlock(
- (conv_block): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(256, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- (upsample): InterpConv(
- (interp_upsample): Sequential(
- (0): Upsample()
- (1): ConvModule(
- (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)
- (bn): _BatchNormXd(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (2): UpConvBlock(
- (conv_block): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(512, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- (upsample): InterpConv(
- (interp_upsample): Sequential(
- (0): Upsample()
- (1): ConvModule(
- (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)
- (bn): _BatchNormXd(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- (3): UpConvBlock(
- (conv_block): BasicConvBlock(
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(1024, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- (1): ConvModule(
- (conv): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- (upsample): InterpConv(
- (interp_upsample): Sequential(
- (0): Upsample()
- (1): ConvModule(
- (conv): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)
- (bn): _BatchNormXd(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- )
- )
- )
- init_cfg=[{'type': 'Kaiming', 'layer': 'Conv2d'}, {'type': 'Constant', 'val': 1, 'layer': ['_BatchNorm', 'GroupNorm']}]
- (decode_head): FCNHead(
- input_transform=None, ignore_index=255, align_corners=False
- (loss_decode): CrossEntropyLoss(avg_non_ignore=False)
- (conv_seg): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1))
- (dropout): Dropout2d(p=0.1, inplace=False)
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- init_cfg={'type': 'Normal', 'std': 0.01, 'override': {'name': 'conv_seg'}}
- (auxiliary_head): FCNHead(
- input_transform=None, ignore_index=255, align_corners=False
- (loss_decode): CrossEntropyLoss(avg_non_ignore=False)
- (conv_seg): Conv2d(64, 2, kernel_size=(1, 1), stride=(1, 1))
- (dropout): Dropout2d(p=0.1, inplace=False)
- (convs): Sequential(
- (0): ConvModule(
- (conv): Conv2d(128, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
- (bn): _BatchNormXd(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
- (activate): ReLU(inplace=True)
- )
- )
- )
- init_cfg={'type': 'Normal', 'std': 0.01, 'override': {'name': 'conv_seg'}}
- )