当前位置: 首页 > news >正文

基于卷积神经网络U-Net实现生物医学影像分割(PyTorch框架)

DL00642-基于卷积神经网络U-Net实现生物医学影像分割pytorch框架实现 由于数据集标注的困难,并且无法使用之前标注了部分的Mask R-CNN 实例分割数据集,本次仅使用30张语义分割图像,数据增强到100张进行训练,得到的效果较好。

在生物医学影像分析领域,图像分割一直是个关键任务,能帮助医生更好地理解图像结构,辅助疾病诊断。这次我们就来聊聊如何基于卷积神经网络U-Net,在PyTorch框架下实现生物医学影像分割。

数据集的挑战与应对

在这个项目中,我们遭遇了数据集标注的难题。本来想用之前标注了部分的Mask R-CNN实例分割数据集,却发现无法使用。无奈之下,我们仅拿到了30张语义分割图像。为了满足训练需求,数据增强成了我们的“救星”。通过数据增强技术,把这30张图像扩充到了100张,没想到最终训练得到的效果还挺不错。

PyTorch实现U-Net代码解析

导入必要库

import torch import torch.nn as nn import torch.optim as optim from torchvision import transforms, datasets

在PyTorch中,这些库是基础。torch是核心库,提供张量操作、自动求导等功能;nn模块用于构建神经网络层;optim则包含各种优化器;torchvision方便处理图像数据,像这里的transforms用于数据变换,datasets提供了常见数据集的接口。

构建U-Net网络

class DoubleConv(nn.Module): def __init__(self, in_channels, out_channels): super(DoubleConv, self).__init__() self.conv = nn.Sequential( nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True), nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1), nn.BatchNorm2d(out_channels), nn.ReLU(inplace=True) ) def forward(self, x): return self.conv(x) class Down(nn.Module): def __init__(self, in_channels, out_channels): super(Down, self).__init__() self.maxpool_conv = nn.Sequential( nn.MaxPool2d(kernel_size=2, stride=2), DoubleConv(in_channels, out_channels) ) def forward(self, x): return self.maxpool_conv(x) class Up(nn.Module): def __init__(self, in_channels, out_channels): super(Up, self).__init__() self.up = nn.ConvTranspose2d(in_channels, in_channels // 2, kernel_size=2, stride=2) self.conv = DoubleConv(in_channels, out_channels) def forward(self, x1, x2): x1 = self.up(x1) diffY = x2.size()[2] - x1.size()[2] diffX = x2.size()[3] - x1.size()[3] x1 = nn.functional.pad(x1, [diffX // 2, diffX - diffX // 2, diffY // 2, diffY - diffY // 2]) x = torch.cat([x2, x1], dim=1) return self.conv(x) class OutConv(nn.Module): def __init__(self, in_channels, out_channels): super(OutConv, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=1) def forward(self, x): return self.conv(x) class UNet(nn.Module): def __init__(self, n_channels, n_classes): super(UNet, self).__init__() self.n_channels = n_channels self.n_classes = n_classes self.inc = DoubleConv(n_channels, 64) self.down1 = Down(64, 128) self.down2 = Down(128, 256) self.down3 = Down(256, 512) self.down4 = Down(512, 512) self.up1 = Up(1024, 256) self.up2 = Up(512, 128) self.up3 = Up(256, 64) self.up4 = Up(128, 64) self.outc = OutConv(64, n_classes) def forward(self, x): x1 = self.inc(x) x2 = self.down1(x1) x3 = self.down2(x2) x4 = self.down3(x3) x5 = self.down4(x4) x = self.up1(x5, x4) x = self.up2(x, x3) x = self.up3(x, x2) x = self.up4(x, x1) logits = self.outc(x) return logits

U-Net网络结构比较独特,很适合生物医学影像分割。DoubleConv类定义了两次卷积操作,中间加上批归一化和ReLU激活函数,能有效提取特征。Down类先进行最大池化下采样,再用DoubleConv进一步提取特征,逐渐缩小图像尺寸并增加通道数。Up类则相反,通过转置卷积上采样,然后与下采样过程中对应的特征图拼接,再经过DoubleConv处理。OutConv用于输出最终的分割结果。整个UNet类把这些模块按顺序组合起来,完成从输入图像到分割结果的映射。

数据加载与预处理

transform = transforms.Compose([ transforms.Resize((256, 256)), transforms.ToTensor() ]) train_dataset = datasets.ImageFolder(root='train_data_path', transform=transform) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=4, shuffle=True)

这里我们定义了数据变换,先把图像尺寸调整到256x256,再转换成张量。然后用ImageFolder加载训练数据,通过DataLoader按批次加载数据,每个批次大小设为4,并打乱顺序,这样训练时模型能看到更丰富的数据组合,提升泛化能力。

训练过程

device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = UNet(n_channels=3, n_classes=2).to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-4) for epoch in range(10): running_loss = 0.0 for i, data in enumerate(train_loader, 0): inputs, labels = data[0].to(device), data[1].to(device) optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f'Epoch {epoch + 1}, Loss: {running_loss / len(train_loader)}')

首先确定使用GPU还是CPU进行训练。初始化U-Net模型,设置损失函数为交叉熵损失,优化器选用Adam,学习率设为1e-4。在训练循环中,每个epoch遍历所有批次数据。每次迭代,先把输入和标签数据移到指定设备上,然后清空优化器梯度,前向传播得到模型输出,计算损失,反向传播更新梯度,最后记录并打印每个epoch的平均损失。

DL00642-基于卷积神经网络U-Net实现生物医学影像分割pytorch框架实现 由于数据集标注的困难,并且无法使用之前标注了部分的Mask R-CNN 实例分割数据集,本次仅使用30张语义分割图像,数据增强到100张进行训练,得到的效果较好。

尽管数据集一开始很有限,但通过合理的数据增强,结合U-Net在PyTorch中的高效实现,我们还是取得了不错的生物医学影像分割效果。希望这篇博文能给同样在这个领域探索的朋友们一些启发。

http://www.cnnetsun.cn/news/1330354.html

相关文章:

  • Comsol 二维光子晶体计算:缺陷模 BIC 的探索之旅
  • 智能音箱设计必看:LTK5209双声道功放的7大实战技巧(含EMI优化方案)
  • OpenHarmony SELinux实战:如何为SA服务配置安全策略(附避坑指南)
  • 游戏AI实战:基于有限状态机的蚂蚁生存模拟
  • Thinkphp和Laravel框架微信小程序的 畅玩安阳旅游网站平台的景点门票民宿预订-
  • Flowise容器化:Kubernetes集群部署AI工作流平台
  • HG-ha/MTools参数详解:--gpu-mode、--onnx-provider、--max-workers配置说明
  • 结合C++高性能服务框架,构建企业级LiuJuan模型推理网关
  • Autoware实战:深度相机与激光雷达融合标定全流程(附松灵小车代码解析)
  • Java面向对象实战:手把手教你用继承和多态打造租车系统(附完整代码)
  • 影墨·今颜部署教程:Mac M2 Ultra通过CoreML运行轻量版
  • 打造个性化HTML5音乐播放器:从自动解析到动态变色
  • 避开天价邀请码!用MCP协议+Python3.11零成本搭建AI工作流(附Playwright实战)
  • 脑机接口在自闭症治疗中的突破:我们如何用Neurofeedback游戏改善儿童社交能力
  • 深入解析Carry4:从内部结构到加法实现
  • SecGPT-14B实操手册:利用Gradio历史消息功能构建持续进化的安全知识库
  • PyTorch学习笔记|张量的创建和形变
  • ArcMap新手必看:5分钟搞定栅格数据矢量化(附常见错误排查)
  • 坚果云内嵌Zotero同步插件使用指南(适配Zotero 7/8)
  • Stata数据清洗实战:精准定位并处理nonnumeric characters的5种场景
  • Jimeng AI Studio实操手册:LoRA模型兼容性处理与cross_attention优化
  • Phi-3-vision-128k-instruct实际效果:招聘JD截图→岗位核心要求提取→匹配度评分生成
  • Unity游戏开发必备:Reporter插件一键查看日志与性能数据(附手势禁用技巧)
  • 大模型编程:从代码产出者到文档定义者,掌握未来核心竞争力!
  • SecGPT-14B实操手册:WebUI中粘贴1000+行日志后触发截断,如何分段提问保完整性
  • AlexNet网络可视化解析:从ReLU到Dropout的8个关键设计
  • 数据结构学习笔记:冒泡排序(Java)
  • Qwen Pixel Art应用场景:复古电子贺卡、像素化社交媒体Banner动态生成
  • 从存储配置到中文界面:Proxmox VE新手上路全攻略(含ZFS池创建技巧)
  • 联想小新BIOS更新导致PIN失效?手把手教你安全完成系统更新