Mindspore大模型平台脑部MRI图像分割任务

本文介绍了如何在昇思大模型平台上使用Res-UNet模型对脑部MRI图像进行分割,包括模型架构、迁移学习应用、数据集来源、训练与评估过程,以及图像增强和可视化推理的详细步骤。
摘要由CSDN通过智能技术生成

👉基于Res-UNet的脑部MRI图像分割

快速体验在昇思大模型平台实现AI全流程开发——训练、推理和评估。

目录

基本介绍

UNet模型架构

UNet是一种经典的神经网络架构,最初由Olaf Ronneberger等人于2015年提出。UNet主要应用于图像分割任务,特别是医学图像分割。该架构以其U形状的网络结构而得名,因为它由对称的收缩路径(编码器)和扩展路径(解码器)组成,形成了一个U形状的整体结构。

UNet由编码器和解码器组成

image0
[论文]U-Net论文链接

Res-UNet模型架构

res-Unet模型结合了ResNet和Unet两个经典模型的优点,该模型引入了跨层连接,使得网络可以直接传递跨层的信息,从而减轻了信息在网络中传播时的退化问题。残差连接是指当网络从编码器到解码器的特征传递时,如果当前层的特征与上一层特征相同,则直接传递当前层的特征,而不进行任何变换。这种连接方式可以避免梯度消失问题,使网络能够更好地学习复杂的特征表示。

image1

任务简介

本项目基于公开的模型仓库 lycmindspore/ResUnetcheckpoint 下的MindSpore预训练文件 resunet_medical_adam-2_600.ckpt 和公开的数据集 lycmindspore/BrainMRI 实现迁移学习,在昇思大模型平台体验训练、评估和推理可视化全流程MRI图像分割的开发体验。

项目地址

  • 预训练模型:lycmindspore/ResUnetcheckpoint
  • 数据集:lycmindspore/BrainMRI
    本项目所用数据集来源于癌症成像档案馆(TCIA),该数据集包含大脑 MRI 图像以及手动 FLAIR 异常分割掩码,大小为1.06GB。其中包含了110个文件夹,每个文件夹中都至少有23张大脑MRI图像和23张对应的手动FLAIR异常分割掩码图像,一共7860张tif格式的图片)

image2

目录结构

.
├── inference # 推理可视化相关代码
│   ├── app.py # 推理核心启动文件
│   └── requirements.txt # 推理可视化相关依赖文件
└── train # 训练可视化相关代码
    ├── pip-requirements.txt # 训练相关依赖文件,必须和启动文件同一级
    ├── ResUnetseg.ipynb #全流程开发notebook文件
    ├── ResUNetet_utl.py #网络模型工具
    ├── enhance_utl.py #图像增强工具
    └── train.py # LossMonitor训练代码,支持标准评估

注:建议将推理可视化相关的代码放在inference文件夹下,训练相关的代码放在train文件夹下。注意该项目下不能有lfs文件,否则会调度失败。

效果展示

图像增强

尝试使用1)基于直方图均衡化
2)基于拉普拉斯算子
3)基于对数变换
4)基于伽马变换
5) CLAHE
6) retinex-SSR
7) retinex-MSR七种方法对图像进行增强处理

image3

训练

训练列表


image4

训练日志


image5

推理


image6


image7

快速开始

Fork 样例仓

1.在项目搜索页中,搜索样例仓 lycmindspore/MRI-seg,或直接点击链接。

2.点击Fork

训练与评估

1.由于大模型平台现不支持Ascend NPU训练,所以可以下载项目到启智平台进行训练,在train.py中更改环境配置。

# train.py,更改环境配置
...
from mindspore import Model, context
...
# Ascend环境设置
device_id = 2
try:
    context.set_context(mode=context.GRAPH_MODE, device_target="Ascend", save_graphs=False)
    print("Ascend NPU环境设置成功!")
except ValueError:
    print("错误!当前是系统硬件不支持Asend NPU,请返回上一步重新选择合适的硬件设备")
epochs = 400
resume = False
...

在本地克隆项目

image20

2.也可以在此大模型平台使用cuda进行训练,这里我使用自定义Callback,进行评估,跟踪每个epoch之后训练集和测试集的dice系数。(训练代码在train/下)。

  • 自定义评估
# train.py
...
from aim import Run
...
# 自定义Callback
class StepLossTimeMonitor(Callback):
    # 创建callback用于监控训练。
    def __init__(self, batch_size, per_print_times=per_print_times):
        super(StepLossTimeMonitor, self).__init__()
        if not isinstance(per_print_times, int) or per_print_times < 0:
            raise ValueError("print_step must be int and >= 0.")
        self._per_print_times = per_print_times
        self.batch_size = batch_size

    def step_begin(self, run_context):
        self.step_time = time.time()

    def step_end(self, run_context):

        step_seconds = time.time() - self.step_time
        step_fps = self.batch_size * 1.0 / step_seconds

        cb_params = run_context.original_args()
        loss = cb_params.net_outputs

        if isinstance(loss, (tuple, list)):
            if isinstance(loss[0], Tensor) and isinstance(loss[0].asnumpy(), np.ndarray):
                loss = loss[0]

        if isinstance(loss, Tensor) and isinstance(loss.asnumpy(), np.ndarray):
            loss = np.mean(loss.asnumpy())

        cur_step_in_epoch = (cb_params.cur_step_num - 1) % cb_params.batch_num + 1

        if isinstance(loss, float) and (np.isnan(loss) or np.isinf(loss)):
            raise ValueError("epoch: {} step: {}. Invalid loss, terminating training.".format(
                cb_params.cur_epoch_num, cur_step_in_epoch))
        if self._per_print_times != 0 and cb_params.cur_step_num % self._per_print_times == 0:
            # TEST
            print("step: %s, loss is %s, fps is %s" % (cur_step_in_epoch, loss, step_fps), flush=True)

# 训练网络模型
model.train(2, train_dataset, callbacks=[StepLossTimeMonitor(batch_size=batch_size), ckpoint_cb],dataset_sink_mode=False)
# 推理测试
def test_net(data_dir, ckpt_path, cross_valid_ind=1, cfg=None):
    net = UNet(n_channels=cfg['num_channels'], n_classes=cfg['num_classes'])
    param_dict = load_checkpoint(ckpt_path)
    load_param_into_net(net, param_dict)

    criterion = CrossEntropyWithLogits()
    _, valid_dataset = create_dataset(data_dir, 1, 1, False, cross_valid_ind, False)
    model = Model(net, loss_fn=criterion, metrics={"dice_coeff": dice_coeff()})

    print("============== Starting Evaluating ============")
    dice_score = model.eval(valid_dataset, dataset_sink_mode=False)
    print("Cross valid dice coeff is:", dice_score)
...

2.选择训练页签,点击创建训练实例按钮


image8

:一个仓库同时只能有一个运行中的训练实例,且训练实例最多只能5个

3.填写相关配置


image9

4.查看训练列表和训练日志

4.1查看训练列表


image10

4.2点击训练名称查看训练日志


image11

点击日志文件或训练输出可以下载输出的日志和训练输出。

推理可视化在线体验:

在线体验:可以下载测试数据集进行在线体验,网站基于Streamlit框架搭建,部署在华为云服务器。

选择Image_enhancement页签,点击Browse files按钮上传图像,点击开始进行图像增强可视化



image12


选择Supervise dsegmentation页签,点击Browse files按钮上传图像(支持上传多张图像-同时进行推理),选择使用模型,点击开始进行ResUNet分割



image13


选择Unsupervised dsegmentation页签,点击Browse files按钮上传图像(支持上传多张图像-同时进行推理),点击开始进行无监督分割



image14


  • 16
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lyc_QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值