【技术追踪】SegGuidedDiff:基于分割引导扩散模型实现解剖学可控的医学图像生成(MICCAI-2024)

news2024/10/5 12:58:15

  它来了它来了,它带着 mask 做生成了~

  SegGuidedDiff:提出一种用于解剖学可控医学图像生成的扩散模型,在每个采样步骤都遵循多类解剖分割掩码并结合了随机掩码消融训练算法,可助力乳房 MRI 和 腹部/颈部到骨盆 CT 等任务涨点。


论文:Anatomically-Controllable Medical Image Generation with Segmentation-Guided Diffusion Models
代码:https://github.com/mazurowski-lab/segmentation-guided-diffusion


0、摘要

  扩散模型能够实现高质量的医学图像生成,但在生成的图像中实现解剖约束具有挑战性。
  为此,本文提出了一种基于扩散模型的方法,通过支持解剖可控的医学图像生成,在每个采样步骤中遵循多类解剖分割 mask。
  此外,还引入了一种随机 mask 消融训练算法,以实现对选定的解剖约束组合的调节,同时允许其他解剖区域的灵活性。
  本文将所提出的方法 SegGuidedDiff 与乳腺MRI和腹部/颈部到骨盆CT数据集的现有方法进行了比较,这些数据集具有广泛的解剖目标。
  结果表明,本文的方法在生成图像的忠实性方面达到了SOTA效果,并与一般的解剖现实相符。
  该模型还有额外的好处,即可通过潜在空间的插值来调整生成图像与真实图像的解剖相似性。
  SegGuidedDiff 有许多应用,包括跨模态转译,以及成对数据或反事实数据的生成。(好像很厉害~


1、引言

1.1、DDPM的不足

  DDPM这样的标准生成模型仍然无法创建解剖学上合理的组织(图1),并且这种解剖结构无法精确定制。
  本文提出的解决方案是将不同类型的组织、器官的分割 mask,作为解剖信息先验,以此来生成图像,为网络提供更直接的学习信号,实现解剖真实感。

标准的扩散模型即使生成高质量图像,但无法创建真实的组织:
在这里插入图片描述

1.2、从mask生成图像:图像转译任务难点

  (1)现有模型没有直接实现精确的像素级解剖约束;
  (2)LDM已用于对自然图像的 mask 引导,但其在医学图像上的适应性并不好;
  故,本文实现的是图像空间的扩散模型,转换到潜在空间可能会丢失精确的空间引导;


2、方法

2.1、扩散模型简要概述

  原文略,可参考:【Diffusion综述】医学图像分析中的扩散模型(一)中2.2节;

2.2、在扩散模型中添加分割引导

  主要思想是以分割mask为引导条件生成更符合真实解剖的图像,故本文不直接从非条件分布 p ( x 0 ) {p(x_0)} p(x0) 中采样,而是从 p ( x 0 ∣ m ) {p(x_0|m)} p(x0m) 中采样,其中 x 0 ∈ R c × h × w {x_0 \in \mathbb{R}^{c×h×w}} x0Rc×h×w m ∈ { 0 , . . . , C − 1 } h × w {m \in \{ 0,...,C-1 \}}^{h×w} m{0,...,C1}h×w,C为多类别标注 mask 的类别数,包括背景。

  这样添加引导条件不会改变前向过程 q ( x t ∣ x t − 1 ) {q(x_t|x_{t-1})} q(xtxt1) ,但会修改反向过程 p θ ( x t − 1 ∣ x t , m ) {p_{\theta}(x_{t-1}|x_t,m)} pθ(xt1xt,m) 和噪声预测网络 ϵ θ {{\epsilon}_{\theta}} ϵθ ,损失函数如下:
在这里插入图片描述
  每一个训练 x 0 {x_0} x0 都有一些配对的 mask m {m} m ,在网络中如何实现呢,在去噪过程中,将 m {m} m 个 mask 直接 concat 到 Unet 的输入 x t {x_t} xt 就可以了。

  其原代码实现如下:

def convert_segbatch_to_multiclass(imgs_shape, segmentations_batch, config, device):
    # NOTE: this generic function assumes that segs don't overlap
    # put all segs on same channel
    segs = torch.zeros(imgs_shape).to(device)
    for k, seg in segmentations_batch.items():
        if k.startswith("seg_"):
            seg = seg.to(device)
            segs[segs == 0] = seg[segs == 0]

    if config.use_ablated_segmentations:
        # randomly remove class labels from segs with some probability
        segs = ablate_masks(segs, config)

    return segs
    
def add_segmentations_to_noise(noisy_images, segmentations_batch, config, device):
    """
    concat segmentations to noisy image
    """
    if config.segmentation_channel_mode == "single":
        segs = convert_segbatch_to_multiclass(noisy_images.shape, segmentations_batch, config, device) 
        # concat segs to noise
        noisy_images = torch.cat((noisy_images, segs), dim=1)  # 这里,cat在一起!
        
    elif config.segmentation_channel_mode == "multi":
        raise NotImplementedError

    return noisy_images

2.3、Mask-Ablated训练和采样

  本文作者认为,用于引导生成的 mask 质量非常重要,若 mask 标注不全,可能会误导生成图像,因此,作者希望模型可以简单地填充或推断未提供的目标。
  那咋整呢,提出了一种 mask-ablated 训练(MAT)策略,该策略提供了具有各种数量和类别组合的 mask 示例,供模型在训练过程中学习生成图像。这可以被认为是解剖对象表征的一种自监督学习形式。
  算法中,采用伯努利分布,随机将一些类的 mask 置 0 ,构成各种类别 mask 的组合。

算法流程:
在这里插入图片描述

  其原代码实现如下:

def ablate_masks(segs, config, method="equal_weighted"):
    # randomly remove class label(s) from segs with some probability 
    if method == "equal_weighted":
        """
        # give equal probability to each possible combination of removing non-background classes
        # NOTE: requires that each class has a value in ({0, 1, 2, ...} / 255)
        # which is by default if the mask file was saved as {0, 1, 2 ,...} and then normalized by default to [0, 1] by transforms.ToTensor()
        # num_segmentation_classes
        """
        # 随机将某一类mask置为False,删除
        class_removals = (torch.rand(config.num_segmentation_classes - 1) < 0.5).int().bool().tolist()
        for class_idx, remove_class in enumerate(class_removals):
            if remove_class:
                segs[(255 * segs).int() == class_idx + 1] = 0

    elif method == "by_class":
        class_ablation_prob = 0.3
        for seg_value in segs.unique():
            if seg_value != 0:
                # remove seg with some probability
                if torch.rand(1).item() < class_ablation_prob:
                    segs[segs == seg_value] = 0
    
    else:
        raise NotImplementedError
    return segs

3、实验与结果

3.1、数据集

(1)杜克大学乳腺癌MRI数据集:
  ①100例,T1图像,70例训练,15例测试,保留15例训练集做其他实验;
  ②所有数据有乳腺、血管(BV)、纤维腺/致密组织(FGT)的分割标注,FGT和BV在形状、大小和其他形态特征上具有非常高的变异性,这为生成模型的真实特征捕获提出了挑战;

(2)CT器官:
  ①40例,腹部CT扫描,包括肝脏、膀胱、肺、肾和骨的分割标注;
  ②24例训练,8例测试,保留8例训练集;

  所有生成模型都是在训练集上进行训练的,辅助分割网络是在保留训练集上进行训练的;

3.2、实施细节

  (1)图像大小256×256,归一化到 [0,255];
  (2)正向过程: β t {\beta_t} βt 线性从 0.0001 到 0.02;
  (3)AdamW优化器,余弦调整学习率,初始0.0001,500 linear warm-up steps;
  (4)epoch:400;
  (5)batch size:64;
  (6)显卡:4块 48 GB NVIDIA A6000;

3.3、与现有图像生成模型的比较

  STD为标准模型,MAT则采用了mask-ablated 训练策略:

在这里插入图片描述

3.4、评估生成的图像对输入掩码的忠实度

  使用在真实训练集上训练的辅助分割网络(MONAI UNet),预测从测试集生成的图像的分割mask: m g e n p r e d {m_{gen}^{pred}} mgenpred,计算其与 m {m} m m g e n p r e d {m_{gen}^{pred}} mgenpred 的 Dice 值:

在这里插入图片描述

3.5、评估生成图像质量

  作者认为,FID 这样的基于 CNN 特征的指标无法捕捉到解剖学真实性的全局特征,而这些特征在这些模型生成的图像中可能会有所不同;
  作者利用辅助分割网络在合成的图像上训练,将测试集分为两部分,分别验证在真实图像和合成图像上训练的模型,证明了在合成图像训练的模型表现比真实图像训练的模型差不多(≤ 0.04 Dice):

在这里插入图片描述

3.6、MAT的优势

  MAT的好处是它能够从缺少类的引导 mask 中生成图像:

在这里插入图片描述

3.7、生成的图像与真实图像的可调解剖相似性

  通过在模型的潜在空间中对合成图像和真实图像进行插值来调整由 m {m} m 生成的图像与 x 0 {x_0} x0 的解剖相似性;

  在反向过程中, t = T {t=T} t=T,在 t = t ~ {t=\tilde{t} } t=t~ (本文使用 t ~ = 240 {\tilde{t} = 240} t~=240)时获得一个潜在表示 x t ~ ′ {x_{\tilde{t}}^{\prime}} xt~;使用正向过程,从 x 0 {x_0} x0 获得 t = t ~ {t=\tilde{t} } t=t~ 时的图像 x t ~ {x_{\tilde{t}}} xt~ ,使用 x t ~ λ = ( 1 − λ ) x t ~ + λ x t ~ ′ {x_{\tilde{t}}^{\lambda} = (1-\lambda) x_{\tilde{t}} + \lambda x_{\tilde{t}}^{\prime}} xt~λ=(1λ)xt~+λxt~ 融合这两幅图的特征, λ ∈ ( 0 , 1 ] {\lambda \in (0,1]} λ(0,1] 控制混合特征与真实图像的相似性; x t ~ λ {x_{\tilde{t}}^{\lambda}} xt~λ 接着去噪,获得 x 0 λ {x_{0}^{\lambda}} x0λ

  乳腺MRI中只有FGT+BV对受限,而CT器官中只有骨骼受限:
在这里插入图片描述


  又是羡慕别人diffusion 的一天,怎么拥有一个好用的 diffusion,在线等,挺着急的 (;′⌒`)

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

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

相关文章

基于pycharm对每个工程配置python环境

目录 1 生成环境2 配置pycharm 1 生成环境 设定一个存放虚拟环境的目录&#xff0c;比如可以放在如下目录下&#xff1a; /Users/Name/PycharmProjects/env 然后生成虚拟环境&#xff0c;执行如下操作&#xff1a; python3 -m venv /Users/Name/PycharmProjects/env/agent_pr…

AI基本概念(人工智能、机器学习、深度学习)

人工智能 、 机器学习、 深度学习的概念和关系 人工智能 &#xff08;Artificial Intelligence&#xff09;AI- 机器展现出人类智慧机器学习 &#xff08;Machine Learning) ML, 达到人工智能的方法深度学习 &#xff08;Deep Learning&#xff09;DL,执行机器学习的技术 从范围…

视频转音频:怎样提取视频中的音频?6个提取音频的小技巧(建议收藏)

怎样提取视频中的音频&#xff1f;当我们想从视频中提取出声音时&#xff0c;通常会遇到很多问题。无论是想单独提取出视频里的音频&#xff0c;还是把它转成方便储存或者分享的音频格式&#xff0c;这都会涉及到视频转音频的一个需求。因此&#xff0c;在这篇指南里&#xff0…

网络变压器和RJ45接线的方法

网络变压器在以太网硬件电路设计中扮演着重要的角色&#xff0c;它主要用于信号电平耦合、隔离外部干扰、实现阻抗匹配以及增加传输距离。而RJ45接口则是以太网连接的标准化接口&#xff0c;它提供了与网络电缆的连接点。 网络变压器与RJ45的接线方法通常遵循以下步骤&#xf…

Android- Framework 非Root权限实现修改hosts

一、背景 修改system/etc/hosts&#xff0c;需要具备root权限&#xff0c;而且remount后&#xff0c;才能修改&#xff0c;本文介绍非root状态下修改system/etc/hosts方案。 环境&#xff1a;高通 Android 13 二、方案 非root&#xff0c;system/etc/hosts只有只读权限&…

Linux源码阅读笔记08-进程调度API系统调用案例分析

kthread_create_on_node kthread_create_on_node函数功能&#xff1a;指定存储节点创建新内核线程。源码如下&#xff1a; 操作实战 #include <linux/module.h> #include <linux/pid.h> #include <linux/sched.h> #include <linux/kthread.h> #inclu…

Docker 镜像导出和导入

docker 镜像导出 # 导出 docker 镜像到本地文件 docker save -o [输出文件名.tar] [镜像名称[:标签]] # 示例 docker save -o minio.tar minio/minio:latest-o 或 --output&#xff1a;指定导出文件的路径和名称[镜像名称[:标签]]&#xff1a;导出镜像名称以及可选的标签 dock…

一招解决 | IP地址访问怎么实现https

没有域名的情况下&#xff0c;使用IP地址实现HTTPS访问是可以的&#xff0c;但相比使用域名会有些许限制&#xff0c;需要通过部署专用于IP地址的SSL/TLS证书来实现。 IP地址实现HTTPS访问的过程与使用域名类似&#xff0c;但有几个关键的区别。以下是使用IP地址实现HTTPS访问…

CrimsonEDR:一款恶意软件模式识别与EDR策略评估工具

关于CrimsonEDR CrimsonEDR是一个功能强大的开源项目&#xff0c;该项目旨在帮助广大研究人员识别特定的恶意软件模式&#xff0c;以此来优化终端检测与响应&#xff08;EDR&#xff09;的策略方案。通过使用各种不同的检测方案&#xff0c;可以加深开发人员与研究人员加深对安…

Nginx 配置文件

Nginx的配置文件的组成部分&#xff1a; 主配置文件&#xff1a;nginx.conf子配置文件&#xff1a;include conf.d/*.conf 全局配置 nginx 有多种模块 核心模块&#xff1a;是 Nginx 服务器正常运行必不可少的模块&#xff0c;提供错误日志记录 、配置文件解析 、事件驱动机…

python基础语法 004-2流程控制- for遍历

1 遍历 1.1 什么是遍历&#xff1f; 可以遍历的元素&#xff1a;字符串、列表、元组、字典、集合字符串是可以进行for 循环。&#xff08;容器对象&#xff0c;序列&#xff09;可迭代对象iterable 例子&#xff1a; 1 &#xff09;、for遍历字符串&#xff1a; name xiao…

Ubuntu20.04 安装 cudatookit 12.2 + cudnn 安装

最简约的部署Ubuntu20.04深度学习环境的教程 1. 安装Ubuntu20.04 系统 B站详细的安装教程 简约安装版 2. 安装Nvidia显卡驱动 我参考了各种资料&#xff0c;重装系统&#xff0c;完美解决开机显示器黑屏无法进入桌面的情况 黑屏问题主要是由linux内核更新导致&#xff0c;…

携程礼品卡能转出去吗?

携程的卡好像只能在旅游的时候用 像买车票啊&#xff0c;机票啊&#xff0c;酒店&#xff0c;景点门票啥的&#xff0c;但是如果我没有出游计划的话 这个卡是不是就要被闲置下来&#xff1f; 这个问题一直让我感到很苦恼&#xff0c;还好有收卡云&#xff0c;不然我的携程卡…

你还搞不懂串口的格式转换问题吗?

相信大多数人在使用串口传输不同单片机之间的数据时都会运到数据格式怎么对应起来的问题&#xff0c;今天我们就来聊聊&#xff01; 在开始之前我插一个内容&#xff0c;就是不同的单片机之间的电平可能不相同&#xff0c;是不能直接使用杜邦线连接通信的&#xff0c;需要进行电…

centos7搭建zookeeper 集群 1主2从

centos7搭建zookeeper 集群 准备前提规划防火墙开始搭建集群192.168.83.144上传安装包添加环境变量修改zookeeper 的配置 192.168.83.145 和 192.168.83.146 配置 启动 集群 准备 vm 虚拟机centos7系统zookeeper 安装包FinalShell或者其他shell工具 前提 虚拟机安装好3台cen…

私域打造朋友圈秘诀

内容比例把控 朋友圈内容应遵循9:1原则&#xff0c;即90%的人设内容与10%的营销内容。 朋友圈的内容比例非常关键。大部分内容应聚焦在展示个人形象和生活&#xff0c;以此建立信任&#xff0c;而仅有10%的内容用于营销&#xff0c;实现商业价值。 人设内容构建 通过生活圈、工…

从新手到高手:Scala函数式编程完全指南,Scala 数据类型(4)

1、Scala 数据类型 Scala 与 Java有着相同的数据类型&#xff0c;下表列出了 Scala 支持的数据类型&#xff1a;

【鸿蒙学习笔记】基础组件Progress:进度条组件

官方文档&#xff1a;Progress 目录标题 作用最全属性迭代追加进度赋值风格样式 作用 进度条组件 最全属性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 颜色.width(200)// 大小.height(50)// 高度.value(50)// 进度可更…

多域名聊天:TTKefu如何助力企业实现高效沟通与灵活扩展

在当今数字化时代&#xff0c;企业与客户之间的沟通方式已经发生了翻天覆地的变化。随着互联网的普及和移动设备的普及&#xff0c;企业越来越依赖于线上聊天工具来与客户建立联系。而在这个背景下&#xff0c;TTKefu作为一款先进的多域名聊天工具&#xff0c;凭借其强大的功能…

大促前夕即高点,综合电商平台的“稀缺”魔法正在消失?

新一期618大促早已结束良久了&#xff0c;但似乎其产生的余韵却仍旧未消散。 从最直观的资本市场走势来看&#xff0c;自这一波618大促陆续开展之后&#xff0c;包括京东、阿里巴巴、拼多多等港美股股价就一改此前的上行态势&#xff0c;持续下滑至今。 事实上&#xff0c;早…