【医学图像分割】Dense U-Net的Pytorch代码实现

本文介绍了作者构建DenseU-Net模型的过程,包括代码实现和遇到的问题。作者首先分享了DenseNet的基础知识,然后提供了DenseU-Net的PyTorch代码,并展示了模型结构。在实践中,作者尝试了不同的网络配置,如DenseNet121结合U-Net,但遇到了过拟合和低准确率的问题。最后,作者调整了模型并实现了基于DenseNet的DenseU-Net,用于图像分割任务。

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


前言

一、DenseNet

在这里插入图片描述

二、代码

找了2个代码,还考虑用H-DenseU-Net的代码。

  1. https://github.com/stefano-malacrino/DenseUNet-pytorch
  2. https://github.com/THUHoloLab/Dense-U-net
    第一次编写代码,感觉很多东西有点冗余,之后在优化,可以运行。(●’◡’●)
import torch
import torch.nn as nn
class conv_block(nn.Module):
    def __init__(self, ch_in, ch_out):
        super(conv_block, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
            nn.BatchNorm2d(ch_out),
            nn.ReLU(inplace=True),
            nn.Conv2d(ch_out, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
            nn.BatchNorm2d(ch_out),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        x = self.conv(x)
        return x


class up_conv(nn.Module):
    def __init__(self, ch_in, ch_out):
        super(up_conv, self).__init__()
        self.up = nn.Sequential(
            nn.Upsample(scale_factor=2),
            nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1, bias=True),
            nn.BatchNorm2d(ch_out),
            nn.ReLU(inplace=True)
        )

    def forward(self, x):
        x = self.up(x)
        return x
class Conv_Block(nn.Module):
    def __init__(self, ch_in, ch_out):
        super(Conv_Block, self).__init__()
        self.conv = nn.Sequential(
            nn.BatchNorm2d(ch_in),
            nn.ReLU(inplace=True),
            nn.Conv2d(ch_in, ch_out, kernel_size=3, stride=1, padding=1)
        )

    def forward(self, x):
        x = self.conv(x)
        return x
class dens_block(nn.Module):
    def __init__(self,ch_in,ch_out):
        super(dens_block, self).__init__()#这三个相同吗????
        self.conv1 = Conv_Block(ch_in,ch_out)
        self.conv2 = Conv_Block(ch_out+ch_in, ch_out)
        self.conv3 = Conv_Block(ch_out*2 + ch_in, ch_out)
    def forward(self,input_tensor):
        x1 = self.conv1(input_tensor)
        add1 = torch.cat([x1,input_tensor
### U-Net模型的基本结构与原理 U-Net 是一种专为医学图像分割设计的卷积神经网络(CNN),最初由 Ronneberger 等人在 2015 年提出。它在处理生物医学图像(如细胞、组织切片等)的像素级分类任务中表现出色,特别是对于小数据集的训练效果尤为突出[^3]。其核心特点包括对称的编码器-解码器结构和跳跃连接(skip connections)。编码器部分通过多次下采样操作提取图像的高层次特征,而解码器则通过上采样操作逐步恢复图像的空间分辨率。跳跃连接将编码器中的特征图直接传递到解码器中的相应层,从而保留了更多的空间信息并提高了分割精度[^1]。 ### U-Net模型的优势与应用 由于其独特的架构,U-Net医学图像分割领域具有显著的优势。首先,U-Net 能够在数据量较少的情况下依然保持良好的性能,这对于医学影像来说尤为重要,因为医学影像的数据获取相对困难,很多比赛只提供不到100例数据[^2]。其次,U-Net 的轻量化设计使其参数量相对较小,减少了过拟合的风险。例如,原始 U-Net 的参数量约为28M,而在通道数缩小两倍后,参数量可以降至7.75M,进一步缩小四倍后甚至可以达到2M以内。此外,U-Net 还具备较强的可解释性,这对于辅助医生进行临床诊断至关重要。通过绘制激活图(activation map),可以直观地展示网络关注的区域,帮助医生理解模型的决策过程[^2]。 ### U-Net模型的实现 在实际应用中,U-Net 可以通过多种方式实现PyTorch 提供了一个简单的方式来调用 U-Net 模型,并结合预训练权重进行训练。以下是一个简单的 U-Net 模型调用示例: ```python import segmentation_models_pytorch as smp # 定义U-Net模型 model = smp.Unet( 'densenet121', # 编码器模型 encoder_weights='imagenet', # 使用ImageNet预训练权重 classes=2, # 输出类别数 activation=None, # 不使用激活函数 encoder_depth=5, # 编码器深度 decoder_channels=[1024, 512, 256, 128, 64] # 解码器通道数 ) # 打印模型信息 print("model", model) ``` 在这个例子中,`segmentation_models_pytorch` 库被用来快速构建 U-Net 模型。用户可以选择不同的编码器(如 `densenet121`),并通过指定 `encoder_weights` 来加载预训练权重。此外,还可以根据具体任务的需求调整输出类别数和其他超参数[^4]。 ### U-Net模型的实际应用场景 U-Net医学图像分割中的应用非常广泛,涵盖了多个领域。例如,在脑梗竞赛 ISLES 中,U-Net 被用于处理多种模态的医学影像数据,包括 CBF、MTT、CBV、TMAX 和 CTP 等。这些多模态数据需要精心设计的网络来提取不同模态的特征,而 U-Net 的灵活性使其成为这一任务的理想选择[^2]。此外,U-Net 还被广泛应用于细胞、组织切片等生物医学图像分割任务中,帮助研究人员更精确地识别和分析感兴趣的区域。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值