丹摩智算:如何在云端开发一个AI应用——基于UNet的眼底血管分割案例

目录

  • 0 写在前面
  • 1 云实例:配置选型与启动
    • 1.1 登录注册
    • 1.2 配置SSH密钥对
    • 1.3 创建实例
    • 1.4 登录云实例
  • 2 云存储:数据集上传与下载
  • 3 云开发:眼底血管分割案例
    • 3.1 案例背景
    • 3.2 网络搭建
    • 3.3 网络训练
    • 3.4 模型测试
  • 总结
  • 粉丝福利

0 写在前面

DAMODEL(丹摩智算)是专为AI打造的智算云,致力于提供丰富的算力资源与基础设施助力AI应用的开发、训练、部署。DAMODEL配备124G大内存和100G大空间系统盘,一键部署,三秒启动;覆盖从入门级到专业级GPU,满足各层次开发需求,使每一位开发者都能体验到顶级的计算性能和专属服务。

在这里插入图片描述

接下来,就以一个实际项目作为案例,体验丹摩智算DAMODEL的开发流程,大家也可以滑到最后领取粉丝专属福利

1 云实例:配置选型与启动

1.1 登录注册

首先进入登录界面注册并登录账号

在这里插入图片描述

1.2 配置SSH密钥对

配置SSH密钥对的作用是后续远程登录服务器不需要密码验证,更加方便。

首先创建本地公钥,进入本地.ssh目录输入ssh-keygen -o命令,这里文件名可以设置为id_dsa,也可以是其他任意名字

在这里插入图片描述
之后我们可以在.ssh目录看到刚刚创建的两个文件

  • id_dsa
  • id_dsa.pub

其中id_dsa.pub就是需要的公钥文件

进入密钥对配置,创建密钥对,将id_dsa.pub的内容复制到这里就可以

在这里插入图片描述

1.3 创建实例

进入GPU云实例,点击创建实例。如下图所示,按需选择需要的GPU型号和镜像

在这里插入图片描述

我这里选择的配置如下,大家可以参考。需要注意的是,这里记得选择之前创建的密钥对。一切确认完成后,点击立即创建即可

在这里插入图片描述

1.4 登录云实例

等待实例创建完成后,点击复制“访问链接”。

在这里插入图片描述

接着来到任意一个SSH连接终端进行云实例登录,我这里选择的是VSCode,如下所示

在这里插入图片描述

登录成功后,通过

nvidia-smi
torch.cuda.is_available()

简单验证一下功能即可,如下所示即为成功

在这里插入图片描述

2 云存储:数据集上传与下载

文件存储为网络共享存储,可挂载至的不同实例中。相比本地数据盘,其优势是实例间共享,可以多点读写,不受实例释放的影响;此外存储后端有多冗余副本,数据可靠性非常高;但缺陷是IO性能一般

考虑到以上优劣,推荐使用方式:将重要数据或代码存放于文件存储中,所有实例共享,便利的同时数据可靠性也有保障;在训练时,需要高IO性能的数据(如训练数据),先拷贝到实例本地数据盘,从本地盘读数据获得更好的IO性能。如此兼顾便利、安全和性能。

接下来,我们将训练数据上传到云实例数据盘中。使用scp工具如下

scp -rP 35740 ./DRIVE-SEG-DATA root@cn-north-b.ssh.damodel.com:/root/workspace

具体地:

  • 35740cn-north-b.ssh.damodel.com分别为端口号和远程地址,请参考1.4节替换为自己的参数
  • ./DRIVE-SEG-DATA是本地数据集路径
  • /root/workspace是远程实例数据集路径

可以看到数据上传成功

在这里插入图片描述

数据的下载也是类似的命令

scp -rP 35740 root@cn-north-b.ssh.damodel.com:/root/workspace ./DRIVE-SEG-DATA

本文提到的数据集可以在DRIVE数据集中下载

3 云开发:眼底血管分割案例

3.1 案例背景

眼底也称为眼球的内膜,包括黄斑、视网膜和视网膜中央动静脉等结构。在临床医学中,眼底图像是眼科医生对眼疾病患者进行诊断的重要依据。随着深度学习的发展,医学影像分割技术产生了深远的变化,尤其是卷积神经网络AlexNet、VGGNet、GoogLeNet、ResNet等,能够学习到更加抽象和高级的特征表示,从而实现更加精确的分割结果。深度学习模型在大规模数据上训练后,通常能够获得更好的泛化能力,即对未见过的数据也能做出相对准确的预测。对于医学影像分割来说,这意味着模型可以更好地适应不同类型和来源的医学图像数据,提高了分割结果的可靠性和稳定性。同时,深度学习技术支持端到端的学习方式,即从原始输入数据直接学习到最终的分割结果,无需手工设计复杂的特征提取和预处理流程。这简化了分割算法的开发流程,提高了效率和准确性。此外,医学影像数据常常包含多种模态,如CT、MRI等。深度学习技术能够更好地处理多模态数据,实现不同模态之间的信息融合,从而提高了医学影像分割的准确性和全面性

在这里插入图片描述

本次实践,我们采用UNet进行眼底血管医学图像分割任务。UNet是一种被广泛应用于语义分割任务的网络结构,其编码器-解码器结构以及跳跃连接的设计,使其能够有效地捕获图像中不同尺度的特征信息,从而在眼底血管分割任务中取得较好的效果。同时,在推理阶段,UNet采用全卷积网络结构,能够快速对新的眼底图像进行血管分割,为临床应用提供了实时性支持。

3.2 网络搭建

选用U-Net 网络结构作为基础分割模型的原因在于其通过编解码器架构,有效地结合局部信息和全局信息,提高分割准确性;同时,U-Net的跳跃连接结构有助于保留和恢复图像中的细节和边缘信息,且在小样本情况下表现优异,能够充分利用有限数据进行有效训练,广泛应用于医学图像分割任务中。网络架构如下

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.3 网络训练

基于 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.4 模型测试

测试逻辑如下所示,主要是计算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,其他实例可以直接从共享存储中获取训练后的模型

在这里插入图片描述

在这里插入图片描述

总结

整体体验丹摩智算DAMODEL后,我发现它是一个非常强大且易于使用的代码开发平台。首先它提供了多种不同的开发环境,可以轻松地选择最熟悉或最适合用户需求的环境来构建、训练和部署应用程序,而无需考虑配置的问题。在案例中可以看到,丹摩智算DAMODEL提供了预构建的框架,即使临时安装依赖也很方便。

总的来说,和现有平台相比,丹摩智算DAMODEL核心在于快速启动,便捷开发,非常适合和各个应用领域结合,快速提供相关的解决方案。

粉丝福利

丹摩智算低价狂欢节开始,点击注册链接即可享受免费试用,还有4090、显示器等神秘好礼等待大家!

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

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

相关文章

PHP回收废品平台系统小程序源码

&#x1f30d;绿色行动&#xff0c;从“回收废品平台系统”开始&#xff01;&#x1f69a; &#x1f6aa;【家门口的环保站&#xff0c;废品不再无处安放】 你是否曾为家里的旧报纸、空瓶子、废旧电器等废品头疼不已&#xff0c;不知该如何处理&#xff1f;现在&#xff0c;“…

Vue3 加载条(LoadingBar)

效果如下图&#xff1a;在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小&#xff0c;单位 pxnumber2falsecolorLoading加载中颜色string‘…

二进制部署k8s集群之cni网络插件flannel和calico工作原理

3、部署 CNI 网络组件 在 master01 节点上操作 上传flannel-v0.21.5.zip并解压 unzip flannel-v0.21.5.zipscp flannel*.tar 192.168.80.20:/opt/k8s/ scp flannel*.tar 192.168.80.30:/opt/k8s/ node两个节点操作 cd /opt/k8s/ docker load -i flannel.tar docker load -i …

外设购物平台

目 录 一、系统分析 二、系统设计 2.1 系统功能设计 2.2 数据库设计 三、系统实现 3.1 注册功能 3.2 登录功能 3.3 分页查询所有商品信息功能 3.4 分页条件&#xff08;精确、模糊&#xff09;查询商品信息功能 3.5 购物车功能 3.6 订单管理功能 四、项…

单细胞|MEBOCOST·细胞间代谢通讯

概述 在代谢活跃的细胞中&#xff0c;表达的代谢酶催化代谢反应生成许多代谢物。这些代谢物中的一些可以扩散到细胞外空间并作为信号分子发挥作用。某些细胞外代谢物可以与空间上邻近细胞的感应蛋白结合。我们将分泌代谢物的细胞称为发送细胞&#xff0c;而表达感应蛋白的细胞称…

借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡

原文作者&#xff1a;Chris Akker - F5 技术解决方案架构师&#xff0c;Steve Wagner - F5 NGINX 解决方案架构师 原文链接&#xff1a;借助 NGINX 对本地的 Kubernetes 服务进行自动化的 TCP 负载均衡 转载来源&#xff1a;NGINX 中文官网 NGINX 唯一中文官方社区 &#xff0c…

苹果AI跳票,国产手机厂商们的机会终于来了

“Hi,I’m a Mac” “And I’m a PC” 如果你看过苹果在2006年发布的经典广告《Get a Mac》系列&#xff0c;也许会对这句广告语以及背后的PC和Mac之争印象深刻。 从最开始的《1984》&#xff0c;到之后的《Think Different》&#xff0c;乔布斯在他主导的66部商业广告中向大…

NAT、代理服务、内网穿透

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 NAT 前面我们说过&#xff0c;NAT技术解决了IP地址不足的问题&#xff0c;它能够将私有IP对外通信时转换为全局IP。 NAT转换过程 在私有IP向外通信时&#xff0c;源IP会一直被替换&#xff0c;直到被替换为全局IP&#xff…

java之接口和抽象类的综合案例以及如何用接口优化代码

//定义一个类,这个类里因为有抽象方法,所以我们要把这个类定义为抽象类 public abstract class Sports {private String name;private int age;//空参public Sports() {}//有参public Sports(String name, int age) {this.name name;this.age age;}//定义get和set方法public …

Java数据结构和算法中文版(第2版)详细教程

前言 数据结构是指数据在计算机存储空间中(或磁盘中)的安排方式。算法是指软件程序用来操作这些结构中的数据的过程。几乎所有的计算机程序都使用数据结构和算法&#xff0c;即使最简单的程序也不例外。比如设想一个打印地址标签的程序&#xff0c;这个程序使用一个数组来存储…

如何使用git拉取gitee上面的项目/代码?(超简单)

一、下载git软件 下载地址&#xff1a;git官网地址 1.点击右边小电脑上的按钮下载 2.选择自己电脑对应的系统 3.基本都是默认&#xff0c;这里需要勾一下就ok 4.正在安装 2.使用git软件 1.如何打开git 找到你想要操作的文件夹&#xff0c;右击open git bash here就可以…

内衣洗衣机多维度测评对比,了解觉飞、希亦、鲸立哪款内衣洗衣机更好

想要代替手洗内衣物&#xff0c;那么一台内衣专用的小型洗衣机就必不可少啦&#xff0c;不仅能够为我们节约更多的时间以及精力&#xff0c;还能大大提高内衣物的卫生&#xff0c;面对于市面上各种各样的小型内衣洗衣机&#xff0c;相信很多小伙伴都无从下手&#xff01; 为一…

英飞凌 TC3XX单片机HSM内核开发-Secure Boot(五)

ROM固件和启动过程 AURIX 芯片&#xff0c;带有硬件安全模块 (HSM) 的芯片&#xff0c;包含两个 ROM 固件&#xff1a;TriCore(CPU0) 的启动软件 (SSW) 和 HSM 的启动系统 (BOS)。这些固件不共享相同的指令集架构 (ISA)。 1. 芯片启动 AURIX芯片冷启动和热启动时的启动顺序受…

线程池和进程池,输出有区别吗?

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor def fn(name):for i in range(1000):print(name,i)if __name__ __main__:with ThreadPoolExecutor(10) as t:for i in range(100):t.submit(fn,namef"线程{i}")with ProcessPoolExecutor(10…

Linux第七节课gcc与g++

一、补充权限 普通用户无法执行sudo&#xff1a; 通过sudo执行后显示不在sudoers file中&#xff01;&#xff08;张三不被信任&#xff01;&#xff09; 需要修改配置文件&#xff08;白名单&#xff01;&#xff09; 配置文件位于以下目录&#xff1a; ls /etc/sudoers -…

如何在 Odoo 16 网站中创建高级选择字段

Odoo 在后端用户界面中包含各种小部件&#xff0c;用于执行各种活动&#xff0c;例如 one2many、many2many、many2many_tags 等&#xff0c;这简化并简化了 Odoo 中选择字段的操作。因此&#xff0c;当我们创建包含 one2many 或 many2many 字段的表单时&#xff0c;很难在没有外…

如何在linux中安装搜狗输入法

参考网址&#xff1a;搜狗输入法linux-安装指导 sudo apt-get install fcitx 1.更新源&#xff1a;在终端输入 sudo apt update 2.安装fcitx输入法框架&#xff1a; sudo apt install fcitx 3.设置fcitx开机自启动 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/aut…

航空航天混合动力(1)全权限数字发动机控制器(FADEC)

航空航天混合动力&#xff08;1&#xff09;全权限数字发动机控制器&#xff08;FADEC&#xff09; 1.概况2.什么是全权限数字发动机控制器&#xff08;FADEC&#xff09;&#xff1f;2.1核心技术2.2应用场景2.3国内FADEC供应商2.4近期进展2.5数字发动机控制和全权数字发动机控…

开放式耳机什么牌子的好?看这6大品牌就够了

移动互联网时代&#xff0c;听歌、追剧、网课、短视频……这几年全球青年人对于耳机和耳朵的依赖程度&#xff0c;可谓前所未有的提升。但选择一款好的耳机&#xff0c;也不是一件容易的事&#xff0c;入耳式耳机戴久了耳道会疼&#xff0c;还可能引起一系列不必要的炎症&#…

彻底搞清楚SSR同构渲染的首屏

作为.NET技术栈的全干工程师&#xff0c;Blazor、Vue/Nuxt.js和React/Next.js都会接触到。它们&#xff08;准确的说是Blazor、Nuxt和Next&#xff09;&#xff0c;都实现了SSR同构渲染。要了解同构渲染&#xff0c;需要从服务端渲染开始。 传统的服务端渲染 如下图所示&…