UNet 眼底血管分割实战教程


Blog’s 主页: 白乐天_ξ( ✿>◡❛)
🌈 个人Motto:他强任他强,清风拂山冈!
💫 欢迎来到我的学习笔记!

在医学影像分析领域,准确地分割眼底血管对于眼科疾病的诊断和治疗至关重要。本教程将详细介绍如何利用 UNet 进行眼底血管分割,包括云实例配置、数据集处理以及模型训练和测试。

一、云实例配置与启动

  1. 登录注册
    打开丹摩平台,进入登录界面进行注册并登录账号,为后续操作奠定基础。
  2. 配置 SSH 密钥对
    SSH 密钥对的配置能让远程登录服务器更加便捷。首先在本地.ssh 目录下输入ssh-keygen -o命令创建本地公钥,可自行设置文件名。生成的两个文件中,id_dsa.pub为所需的公钥文件。接着进入密钥对配置,将公钥文件内容复制到此处完成配置。
  3. 创建实例
    进入GPU云实例页面,根据需求选择合适的 GPU 型号和镜像。在配置过程中,务必记得选择之前创建的密钥对。确认所有选项无误后,点击立即创建,等待实例创建完成。
  4. 登录云实例
    实例创建完成后,复制访问链接。然后在任意一个 SSH 连接终端,如 VSCode 中进行云实例登录。登录成功后,可通过 nvidia-smitorch.cuda.is_available () 等命令简单验证功能是否正常。

二、云存储与数据集处理

  1. 文件存储的优势
    1. 可在不同实例间共享。
    2. 支持多点读写。
    3. 不受实例释放影响。
    4. 存储后端有多冗余副本,数据可靠性高。
  2. 文件存储的不足
    IO 性能一般。
  3. 使用建议
    1. 将重要数据或代码存放于文件存储中,以便所有实例共享,保障数据可靠性。
    2. 在训练时,对于需要高 IO 性能的数据(如训练数据),先将其拷贝到实例本地数据盘,从本地盘读取数据以获得更好的 IO 性能。
  4. 上传训练数据的方法
    使用 scp 工具,命令如scp -rP 35740./DRIVE-SEG-DATA root@cn-north-b.ssh.damodel.com:/root/workspace,其中35740为端口号,cn-north-b.ssh.damodel.com为远程地址,./DRIVE-SEG-DATA是本地数据集路径,/root/workspace是远程实例数据集路径,需根据实际情况替换这些参数。数据下载的命令与之类似。

三、云开发之眼底血管分割案例

3.1 案例背景

  1. 眼底结构:包含黄斑、视网膜和视网膜中央动静脉等。
  2. 眼底图像作用:在眼科医生诊断中重要。
  3. 深度学习对医学影像分割的影响:
    • 卷积神经网络能学习高级特征表示,实现更精确分割。
    • 训练后的模型泛化能力好,对未见过数据预测准确。
    • 支持端到端学习,简化开发流程,提高效率和准确性。
    • 能处理多模态数据,融合信息,提高分割准确性和全面性。

3.2 UNet 在眼底血管分割中的优势

  1. 编码器 - 解码器结构和跳跃连接:有效捕获不同尺度特征信息,效果好。
  2. 推理阶段全卷积网络结构:快速分割新眼底图像,提供实时性支持。

3.3 网络搭建

  1. 结合信息提高准确性
    U-Net 通过编解码器架构,有效结合局部和全局信息,提高分割准确性。
  2. 保留细节边缘信息
    跳跃连接结构有助于保留和恢复图像细节及边缘信息。
  3. 小样本表现好
    在小样本情况下表现优异,能充分利用有限数据有效训练。
  4. 广泛用于医学分割
    广泛应用于医学图像分割任务。
  5. 网络架构如下:
class UNet(nn.Module):def __init__(self, n_channels, n_classes, bilinear=True):super(UNet, self).__init__()self.n_channels = n_channelsself.n_classes = n_classesself.bilinear = bilinearself.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, bilinear)self.up2 = Up(512, 128, bilinear)self.up3 = Up(256, 64, bilinear)self.up4 = Up(128, 64, bilinear)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

3.4 网络训练

基于 PyTorch 的神经网络训练流程可以分为以下步骤(不考虑前期数据准备和模型结构):

  1. 定义损失函数 根据任务类型选择合适的损失函数(loss function),如分类任务常用的交叉熵损失(Cross-Entropy Loss)或回归任务中的均方误差(Mean Square Error)。
  2. 选择优化器 选择合适的优化器(optimizer),如随机梯度下降(SGD)、Adam 或 RMSprop,并设置初始学习率及其它优化参数。
  3. 训练模型 在训练过程中,通过迭代训练数据集来调整模型参数。每个迭代周期称为一个epoch。对于每个 epoch,数据会被分成多个 batch,每个 batch 被输入到模型中进行前向传播、计算损失、反向传播更新梯度,并最终优化模型参数。
  4. 保存模型 当满足需求时,可以将训练好的模型保存下来,以便后续部署和使用。
def train_net(net, device, data_path, epochs=40, batch_size=1, lr=0.00001):dataset = Dateset_Loader(data_path)per_epoch_num = len(dataset) / batch_sizetrain_loader = torch.utils.data.DataLoader(dataset=dataset,batch_size=batch_size,shuffle=True)optimizer = optim.Adam(net.parameters(),lr=lr,betas=(0.9, 0.999),eps=1e-08, weight_decay=1e-08,amsgrad=False)criterion = nn.BCEWithLogitsLoss()best_loss = float('inf')loss_record = []with tqdm(total=epochs*per_epoch_num) as pbar:for epoch in range(epochs):net.train()for image, label in train_loader:optimizer.zero_grad()image = image.to(device=device, dtype=torch.float32)label = label.to(device=device, dtype=torch.float32)pred = net(image)loss = criterion(pred, label)pbar.set_description("Processing Epoch: {} Loss: {}".format(epoch+1, loss))if loss < best_loss:best_loss = losstorch.save(net.state_dict(), 'best_model.pth')loss.backward()optimizer.step()pbar.update(1)loss_record.append(loss.item())plt.figure()plt.plot([i+1 for i in range(0, len(loss_record))], loss_record)plt.title('Training Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.savefig('/root/shared-storage/results/training_loss.png')

按照这个脚本进行运行,可以看见进度:

训练损失函数如下,可以看出来已经收敛了:

3.5 模型测试

测试逻辑如下所示,主要是计算 IoU 指标

def cal_miou(test_dir="/root/workspace/DRIVE-SEG-DATA/Test_Images",pred_dir="/root/workspace/DRIVE-SEG-DATA/results", gt_dir="/root/workspace/DRIVE-SEG-DATA/Test_Labels",model_path='best_model_drive.pth'):name_classes = ["background", "vein"]num_classes = len(name_classes)if not os.path.exists(pred_dir):os.makedirs(pred_dir)device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')net = UNet(n_channels=1, n_classes=1)net.to(device=device)net.load_state_dict(torch.load(model_path, map_location=device))net.eval()img_names = os.listdir(test_dir)image_ids = [image_name.split(".")[0] for image_name in img_names]time.sleep(1)for image_id in tqdm(image_ids):image_path = os.path.join(test_dir, image_id + ".png")img = cv2.imread(image_path)origin_shape = img.shapeimg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)img = cv2.resize(img, (512, 512))img = img.reshape(1, 1, img.shape[0], img.shape[1])img_tensor = torch.from_numpy(img)img_tensor = img_tensor.to(device=device, dtype=torch.float32)pred = net(img_tensor)pred = np.array(pred.data.cpu()[0])[0]pred[pred >= 0.5] = 255pred[pred < 0.5] = 0pred = cv2.resize(pred, (origin_shape[1], origin_shape[0]), interpolation=cv2.INTER_NEAREST)cv2.imwrite(os.path.join(pred_dir, image_id + ".png"), pred)hist, IoUs, PA_Recall, Precision = compute_mIoU_gray(gt_dir, pred_dir, image_ids, num_classes, name_classes)miou_out_path = "/root/shared-storage/results/"show_results(miou_out_path, hist, IoUs, PA_Recall, Precision, name_classes)

模型保存的时候保存到共享存储路径/root/shared-storage,其他实例可以直接从共享存储中获取训练后的模型:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544361.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

[产品管理-33]:实验室技术与商业化产品的距离,实验室技术在商业化过程中要越过多少道“坎”?

目录 一、实验室技术 1.1 实验室研究性技术 1.2 技术发展的S曲线 技术发展S曲线的主要阶段和特点 技术发展S曲线的意义和应用 二、实验室技术商业化的路径 2.1 实验室技术与商业化产品的距离 1、技术成熟度与稳定性 - 技术自身 2、市场需求与适应性 - 技术是满足需求 …

关于yolov5训练需要更改的参数汇总

首先我给大家展示一下项目目录 第一步我们需要修改data文件夹下的voc.yaml文件&#xff0c;这里我复制了一份改名为hat.yaml 需要修改第21&#xff0c;22行的路径&#xff0c;train是图片的训练集&#xff0c;val是图片训练的验证集&#xff0c;nc是标签的数量&#xff0c;name…

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题

解决银河麒麟桌面操作系统V10SP1 SSH连接“connection reset by ip地址 port 22”问题 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 遇到SSH连接银河麒麟V10SP1时“connection reset by ip地址 port 22”的错误&#xff0c;可以尝试以下步…

深入浅出热门AI大模型,新手到专家的必备指南《实战AI大模型》

今天&#xff0c;人工智能技术的快速发展和广泛应用已经引起了大众的关注和兴趣&#xff0c;它不仅成为技术发展的核心驱动力&#xff0c;更是推动着社会生活的全方位变革。特别是作为AI重要分支的深度学习&#xff0c;通过不断刷新的表现力已引领并定义了一场科技革命。大型深…

矿区车辆4G视频监控解决方案

一、背景介绍 随着科技的发展和矿山产业的不断进步&#xff0c;矿区的安全问题越来越受到关注。尤其是矿区车辆的运行安全&#xff0c;更是重中之重。为了更好地对矿区车辆进行监控和管理&#xff0c;提高运行安全性&#xff0c;4G视频监控解决方案应运而生。 二、需求分析 1…

Nmap网络扫描器基础功能介绍

怎么快速知道网络中存在哪些设备呢&#xff1f;我们可以借用扫描工具Nmap来实现这个功能。 下载 Windows系统可以前往Nmap官网下载安装包。 Linux使用对应的包管理器可以直接安装&#xff0c;命令如下 # Debian/Ubuntu apt install nmap# RedHat/Fedora yum install nmap …

全西安前十的数字媒体产业链都在这

在古城西安&#xff0c;有一处汇聚着创新与活力的地方&#xff0c;那便是西安国际数字影像产业园。这里&#xff0c;承载着西安数字媒体产业的未来与希望&#xff0c;成为了数字媒体产业链的闪耀聚集地。 西安国际数字影像产业园以其独特的魅力和优势&#xff0c;吸引了众多数字…

Go语言基础学习01-Liunx下Go开发环境配置;源码组织方式;go build/install/get详解

目录 Linux环境下配置安装VScode并配置Go语言开发环境Go语言源码的组织方式Go语言源码安装后的结果Go程序构建和安装的过程go build扩展go get 命令详解 之前学习过Go语言&#xff0c;学习的时候没有记录笔记&#xff0c;最近找了个极客时间的Go语言36讲&#xff0c;打算时间学…

004_动手实现MLP(pytorch)

import torch from torch import nn from torch.nn import init import numpy as np import sys import d2lzh_pytorch as d2l # 1.数据预处理 mnist_train torchvision.datasets.FashionMNIST(root/Users/w/PycharmProjects/DeepLearning_with_LiMu/datasets/FashionMnist, t…

二刷LeetCode:“51.N皇后 37.解数独”题解心得(简单易懂)

引言&#xff08;初遇噩梦&#xff0c;再遇坦然&#xff09; 在阅读本文之前&#xff0c;建议大家已经接触过回溯算法&#xff0c;并完成回溯相关题目&#xff0c;例如&#xff1a;子集问题、组合问题、排列问题。 子集&#xff1a;子集II、子集 组合&#xff1a;组合、组合总和…

多比特AI事业部VP程伟光受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 武汉市多比特信息科技有限公司AI事业部VP程伟光先生受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“AI对于项目经理工作的影响和变化解析”。大会将于10月26-27日在北京举办&am…

Scanner流程控制语句

1. Scanner类 Scanner的意思是扫描 Scanner是JDK提供的一个类&#xff0c;位于java.util包下&#xff0c;所以我们如果需要使用则必须导包&#xff0c;导包的语句必须在声明包之后&#xff0c;在声明类之前 Scanner类是用来接受用户输入的各种信息 Scanner类提供了用于接受…

SpringBoot开发——整合Hutool工具类轻松生成验证码

文章目录 1、Hutool简介2、验证码效果展示2.1 扭曲干扰验证码2.2 线条干扰验证码2.3 圆圈干扰验证码3、验证码应用场景3.1. 用户注册与身份验证3.2. 支付验证3.3. 订单与物流通知3.4. 信息安全与隐私保护3.5. 通知与提醒3.6. 其他应用场景4、Hutool工具类实现验证码生成4.1 引入…

学习threejs,绘制任意字体模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言二、&#x1f340;绘制任意字体模型…

Python邮件发送附件:怎么配置SMTP服务器?

Python邮件发送附件如何实现&#xff1f;Python发送带附件邮件&#xff1f; 在自动化和脚本编写中&#xff0c;使用Python发送带有附件的邮件是一个非常实用的功能。AokSend将详细介绍如何配置SMTP服务器&#xff0c;以便在Python中实现邮件发送附件的功能。 Python邮件发送附…

叉车高位显示器无线摄影,安装更加便捷!

叉车叉货&#xff0c;基本功能&#xff0c;但货叉升降高度确不一定&#xff0c;普通的3米左右&#xff0c;高的十几米&#xff0c;特别是仓储车&#xff0c;仓库叉货空间小&#xff0c;环境昏暗&#xff0c;视线受阻严重&#xff0c;司机叉货升的那么高怎么准确无误的插到货呢&…

艾体宝产品丨无需代码开发!Redis数据集成助你轻松优化数据库

我们不仅致力于加速应用程序的构建过程&#xff0c;更专注于助力您达成最终目标——实现应用的高效运行。因此&#xff0c;我们欣然宣布&#xff0c;Redis 数据集成&#xff08;Redis Data Integration&#xff0c;RDI&#xff09;(https://redis.io/data-integration/) 已经正…

探索LLM中的CoT链式推理:ECHO方法深度解读

近年来&#xff0c;随着大型语言模型&#xff08;LLMs&#xff09;的快速发展&#xff0c;如何有效利用这些模型进行复杂任务的推理成为了研究热点。其中&#xff0c;链式思考&#xff08;Chain-of-Thought, CoT&#xff09;推理方法作为一种有效的策略&#xff0c;能够显著提升…

Windows 安全事件日记中账户登录失败问题处理

一 window系统安全日记 在使用 Windows 系统时&#xff0c;我们可能会在安全事件日记中发现账户登录失败的记录。当遇到这种情况时&#xff0c;不必惊慌。 今天在检查自己的操作系统日记时发现系统的安全事件记录存在大量的-帐户登录失败日记如下&#xff1a; 从上次清除日记到…

Ansys Zemax | 模拟偏振敏感的散射过程

附件下载 联系工作人员获取附件 概述 这篇文章介绍了如何在OpticStudio中使用一个自定义的DLL模拟偏振敏感的体散射和荧光现象。该散射模型由MSP.DLL文件定义&#xff0c;它考虑了非序列模式下入射光的偏振属性&#xff0c;模拟了散射对光线的传播方向和偏振态的影响&#x…