U-Net模型

        U-Net模型是一种改进的FCN结构,因其结构经论文作者画出来形似字母U而得名,应用于医学图像的语义分割。它由左半边的压缩通道(Contracting Path)和右半边扩展通道(Expansive Path)组成。压缩通道是典型的卷积神经网络结构,它重复采用2个卷积层和1个最大池化层的结构,每进行一次池化操作后特征图的维数就增加1倍。在扩展通道,先进行1次反卷积操作,使特征图的维数减半,然后拼接对应压缩通道裁剪得到的特征图,重新组成一个2倍大小的特征图,再采用2个卷积层进行特征提取,并重复这一结构。在最后的输出层,用2个卷积层将64维的特征图映射成2维的输出图。

        U-Net模型是FCN的改进和延伸,它沿用了FCN进行图像语义分割的思想,即利用卷积层、池化层进行特征提取,再利用反卷积层还原图像尺寸。然而U-Net融合了编码-解码结构和跳跃网络的特点,在模型结构上更加优雅且巧妙,主要体现在以下两点:

(1)U-Net模型是一个编码-解码的结构,压缩通道是一个编码器,用于逐层提取影像的特征,扩展通道是一个解码器,用于还原影像的位置信息,且U-Net模型的每一个隐藏层都有较多的特征维数,这有利于模型学习更加多样、全面的特征。

(2)U-Net模型的“U形”结构让裁剪和拼接过程更加直观、合理,高层特征图与底层特征图的拼接以及卷积的反复、连续操作,使得模型能够从上下文信息和细节信息由组合得到更加精确的输出特征图。实验证明,U-Net模型在较少训练样本情况下也能得到更加准确的分类结果。

 

 

  • 4
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一个使用 U-Net 模型进行测试的示例代码,使用 PyTorch 框架: ```python import torch import torch.nn as nn from PIL import Image class UNet(nn.Module): def __init__(self, in_channels, out_channels): super(UNet, self).__init__() # Encoder self.conv1 = nn.Conv2d(in_channels, 64, kernel_size=3, padding=1) self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.conv3 = nn.Conv2d(128, 256, kernel_size=3, padding=1) self.conv4 = nn.Conv2d(256, 512, kernel_size=3, padding=1) # Decoder self.upconv1 = nn.ConvTranspose2d(512, 256, kernel_size=2, stride=2) self.conv5 = nn.Conv2d(512, 256, kernel_size=3, padding=1) self.upconv2 = nn.ConvTranspose2d(256, 128, kernel_size=2, stride=2) self.conv6 = nn.Conv2d(256, 128, kernel_size=3, padding=1) self.upconv3 = nn.ConvTranspose2d(128, 64, kernel_size=2, stride=2) self.conv7 = nn.Conv2d(128, 64, kernel_size=3, padding=1) self.conv8 = nn.Conv2d(64, out_channels, kernel_size=1) self.relu = nn.ReLU(inplace=True) def forward(self, x): # Encoder x1 = self.relu(self.conv1(x)) x2 = self.relu(self.conv2(x1)) x3 = self.relu(self.conv3(x2)) x4 = self.relu(self.conv4(x3)) # Decoder x = self.relu(self.upconv1(x4)) x = torch.cat([x, x3], dim=1) x = self.relu(self.conv5(x)) x = self.relu(self.upconv2(x)) x = torch.cat([x, x2], dim=1) x = self.relu(self.conv6(x)) x = self.relu(self.upconv3(x)) x = torch.cat([x, x1], dim=1) x = self.relu(self.conv7(x)) x = self.conv8(x) return x # 测试模型 model = UNet(3, 1) # 输入通道数为3,输出通道数为1 model.load_state_dict(torch.load('model.pth')) # 加载保存的模型参数 model.eval() # 切换到评估模式 image = Image.open('test.jpg') # 读取测试图像 image = image.convert('RGB') # 转换为RGB格式 image = image.resize((256, 256)) # 缩放为256x256大小 image = torch.tensor([transforms.ToTensor()(image)]) # 转换为张量 with torch.no_grad(): output = model(image) # 模型输出 output = output.sigmoid() # 将输出映射到0~1之间 output = (output > 0.5).float() # 将输出二值化 output = output.squeeze().cpu().numpy() # 转换为NumPy数组并去除批次维度 output = (output * 255).astype('uint8') # 将输出转换为0~255之间的整数 Image.fromarray(output).save('output.jpg') # 保存输出图像 ``` 在这个示例代码中,我们首先定义了一个 U-Net 模型,并加载了保存的模型参数。然后,我们读取一张测试图像,并将其转换为 PyTorch 张量。我们使用 `with torch.no_grad()` 上下文管理器来关闭自动求导,以减少内存占用和计算时间。 我们将测试图像输入到模型中,得到模型的输出。由于模型输出的值域为 $(-\infty, \infty)$,我们使用 `sigmoid()` 函数将其映射到 $(0, 1)$,然后使用阈值为 $0.5$ 的二值化操作将其转换为二值图像。最后,我们将输出转换为 NumPy 数组,并将其保存为图像文件。 在实际应用中,我们可以使用测试代码来评估模型的性能,并调整模型的超参数以获得更好的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值