clDice-一种新的分割标准-能够促进管状结构分割的连接性

news2024/10/6 14:31:08

clDice-a Novel Topology-Preserving Loss Function for Tubular StructureSegmentation论文总结

论文:clDice-A Novel Topology-Preserving Loss Function for Tubular Structure

源码:GitHub - jocpae/clDice

目录

一、论文背景和出发点

二、创新点

三、clDice指标

四、clDice的拓扑保证

五、使用clDice训练神经网络

六、Cost函数

七、实验

八、结论

九、代码实现cldice指标


一、论文背景和出发点

精确分割管状网络状结构,如血管、神经元或道路时,拓扑结构的连通性十分重要,在血管网络的情况下,错过连接的血管会完全改变血流动力学,为了评估这种管状网络结构中的分割,传统的基于体积的性能指标不是最优的。在类似网络拓扑提取的任务中,空间连续的正确体素预测序列比空间体积的正确预测更有意义

因此本文提出了一种新的相似性度量系数,称为中心线Dice(short-clDice),它是在分割掩模及其(形态学)骨架的截面上计算的

由上图可见,对于传统dice,这两种不同模型的训练效果达到了相同的数值,可见对于传统dice而言,评价分割管状网络的拓扑结构并不是最优的选择

二、创新点

作者提出了一种新的连接感知相似性度量clDice,用于基准管状分割算法。作者展示了各种2D和3D网络分割任务的实验结果,以证明提出的相似性测度和损失函数的实际应用性。

三、clDice指标

通过观察,在测量拓扑精度易受假阳性影响,而测量拓扑灵敏度易受假阴性影响。由于希望最大限度地提高精度和灵敏度(recall),于是将clDice定义为两个度量的调和均值(也称之为F1)。

1. Tprec:计算骨架S_PS_L的分数

Tprec(S_PV_L):计算骨架S_P的分数,即拓扑精度

Tprec(S_LV_P):计算骨架S_L的分数,即拓扑灵敏度。对应算子公式如下:

其中,V_L为真值mask,V_P预测分割mask,S_P为从V_P中提取骨架,S_LV_L从中提取骨架。

2. clDice:计算拓扑精度和拓扑灵敏度的调和均值

cldice算子公式如下:

其中,Tprec(S_PV_L)为拓扑精度,Tprec(S_LV_P)为拓扑灵敏度。

cldice是参考F1公式推导而成

四、clDice的拓扑保证(推理证明)

拓扑保持:某些已存在嵌套包含了对前景和背景的同构等价的暗示,我们称之为拓扑保持。

定理1(同伦等价:设L_A\subseteq A \subseteq K_AL_B\subseteq B\subseteq K_B是某些单元复合体的连通子复合体。假设上述包含是同伦等价。如果子复形也通过包含L_A\subseteq B \subseteq K_AL_B\subseteq A\subseteq K_B相关,则这些包含也必须是同伦等价。特别地,A和B是同伦等价的。

推论1:设V_LV_P是两个二进制掩码都包含前景和背景骨架,V_L的前景骨架包含在V_P的前景中,反之亦然,背景也类似。那么V_LV_P的前景是同伦等价的,它们的背景也是同伦等价的。

clDice的拓扑保证

当且仅当clDice在(V_LV_P)的前景和背景上的计算结果均为1时,才满足此推论1中的包含条件

也就是说,clDice能够证明真值和预测掩码之间的是否具有同伦等价关系,推论出clDice能证明预测掩码是否具有和真值一样的拓扑连接性

这个证明为clDice作为拓扑保持度量的一般解释奠定了基础。

五、使用clDice训练神经网络

1. 软骨架化(Soft-skeletonization)

目的为了精确地从mask中提取骨架

原理:在曲线结构上使用形态学操作(骨架化)进行细化可以保持拓扑结构。最小和最大过滤器(filters)通常用作形态膨胀和腐蚀的灰度替代方案

方法:提出了“软骨架化”,其中应用迭代最小和最大池化作为形态侵蚀和扩张。算法1如下,描述了其计算中涉及的迭代过程

其中,算法1中涉及的超参数k表示迭代次数,必须大于或等于最大观测半径。

软骨骼化的详细步骤如下

在早期迭代中,半径较小的结构被骨架化并保留,直到后来的迭代中,较厚的结构变为骨架化。这使得能够提取无参数的,被形态驱动的软骨骼。

算法2描述了它的实现。我们称之为soft-clDice。如下图所示:

其中,V_P是来自分段网络的实值概率预测V_L真值掩码\circ表示Hadamard乘积

六、Cost函数

目的:实现精确分割的同时,保留拓扑结构。

方法:将soft-clDice与soft-Dice结合,得到L_c。对应公式如下:

其中\alpha \in [0,0.5]

soft-cldice能够分割不错的拓扑结构,soft-dice能够分割不错的空间结构,二者结合。

七、实验

数据集:DRIVE(2D视网膜)、CREMI(3D神经元)。

网络:2D、3D U-Net 和2D、3D FCN。

评估指标:Dice、Accuracy、clDice。

由上图可见,在多种不同的数据集不同的网络中,在L_c中使用soft-cldice训练与soft-dice相比,可以提高Accuracy分数。由此可见soft-cldice指数可以有效的提高分割的精确度。

八、结论

本文介绍了一种新的用于管状结构分割的拓扑保持相似性度量cl-Dice。本文提供了一个理论保证,即clDice同伦等价证明。接下来,在损失函数中使用clDice的可微版本,即soft-clDice,来训练最先进的2D和3D神经网络。我们发现,在soft-clDice上进行训练可以实现具有更准确的连接信息、更好的图相似性、更好的欧拉特性以及改进的Dice和准确性的分割。soft-clDice在计算上是高效的,可以很容易地部署到任何其他基于深度学习的分割任务中,例如生物医学成像中的神经元分割,工业质量控制中的裂纹检测或遥感。

九、代码实现cldice指标

cldice.py

import torch
import torch.nn as nn
from soft_skeleton import soft_skel


class soft_cldice(nn.Module):
    def __init__(self, iter_=3, smooth = 1.):
        super(soft_cldice, self).__init__()
        self.iter = iter_
        self.smooth = smooth

    def forward(self, y_true, y_pred):
        skel_pred = soft_skel(y_pred, self.iter)
        skel_true = soft_skel(y_true, self.iter)
        tprec = (torch.sum(torch.multiply(skel_pred, y_true)[:,1:,...])+self.smooth)/(torch.sum(skel_pred[:,1:,...])+smooth)
        tsens = (torch.sum(torch.multiply(skel_true, y_pred)[:,1:,...])+self.smooth)/(torch.sum(skel_true[:,1:,...])+smooth)
        cl_dice = 1.- 2.0*(tprec*tsens)/(tprec+tsens)
        return cl_dice


def soft_dice(y_true, y_pred):
    """[function to compute dice loss]

    Args:
        y_true ([float32]): [ground truth image]
        y_pred ([float32]): [predicted image]

    Returns:
        [float32]: [loss value]
    """
    smooth = 1
    intersection = torch.sum((y_true * y_pred)[:,1:,...])
    coeff = (2. *  intersection + smooth) / (torch.sum(y_true[:,1:,...]) + torch.sum(y_pred[:,1:,...]) + smooth)
    return (1. - coeff)


class soft_dice_cldice(nn.Module):
    def __init__(self, iter_=3, alpha=0.5, smooth = 1.):
        super(soft_cldice, self).__init__()
        self.iter = iter_
        self.smooth = smooth
        self.alpha = alpha

    def forward(self, y_true, y_pred):
        dice = soft_dice(y_true, y_pred)
        skel_pred = soft_skel(y_pred, self.iter)
        skel_true = soft_skel(y_true, self.iter)
        tprec = (torch.sum(torch.multiply(skel_pred, y_true)[:,1:,...])+self.smooth)/(torch.sum(skel_pred[:,1:,...])+self.smooth)    
        tsens = (torch.sum(torch.multiply(skel_true, y_pred)[:,1:,...])+self.smooth)/(torch.sum(skel_true[:,1:,...])+self.smooth)    
        cl_dice = 1.- 2.0*(tprec*tsens)/(tprec+tsens)
        return (1.0-self.alpha)*dice+self.alpha*cl_dice

 soft_skeleton.py

import torch
import torch.nn as nn
import torch.nn.functional as F


def soft_erode(img):
    if len(img.shape)==4:
        p1 = -F.max_pool2d(-img, (3,1), (1,1), (1,0))
        p2 = -F.max_pool2d(-img, (1,3), (1,1), (0,1))
        return torch.min(p1,p2)
    elif len(img.shape)==5:
        p1 = -F.max_pool3d(-img,(3,1,1),(1,1,1),(1,0,0))
        p2 = -F.max_pool3d(-img,(1,3,1),(1,1,1),(0,1,0))
        p3 = -F.max_pool3d(-img,(1,1,3),(1,1,1),(0,0,1))
        return torch.min(torch.min(p1, p2), p3)


def soft_dilate(img):
    if len(img.shape)==4:
        return F.max_pool2d(img, (3,3), (1,1), (1,1))
    elif len(img.shape)==5:
        return F.max_pool3d(img,(3,3,3),(1,1,1),(1,1,1))


def soft_open(img):
    return soft_dilate(soft_erode(img))


def soft_skel(img, iter_):
    img1  =  soft_open(img)
    skel  =  F.relu(img-img1)
    for j in range(iter_):
        img  =  soft_erode(img)
        img1  =  soft_open(img)
        delta  =  F.relu(img-img1)
        skel  =  skel +  F.relu(delta-skel*delta)
    return skel

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

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

相关文章

动态规划III (买股票-121、122、123、188、309)

CP121 买股票的最佳时机 题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利…

Advanced-C.04.函数

函数 函数的定义 包括两个部分,“函数头"和"函数体” 返回值类型 函数名(形参1,形参2,...)//函数头{}//函数体 函数类型决定返回值类型,执行函数需要调用 函数的返回值和参数可以是任何类型,包括空类型!!函…

Android adb shell命令捕获systemtrace

Android adb shell命令捕获systemtrace (1)抓取trace文件: adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 20s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory -t 时长,20s&a…

Java学习笔记23——集合进阶

集合进阶 集合进阶CollectionCollection集合常用方法Collection集合的遍历Iterator中的常用方法集合的使用步骤 List集合概述和特点List集合的特点List集合的特有方法并发修改异常ListIterator 列表迭代器常用方法增强for循环 数据结构栈队列数组链表 Set集合Set特点实现类Hash…

Presto(Trino)的逻辑执行计划和Fragment生成过程

文章目录 1. 前言2. 从SQL提交到Fragment计划生成全过程2.1 Statement生成2.2 对结构化的Statement进行分析2.3 生成未优化的逻辑执行计划2.4 基于Visitor模型对逻辑执行计划进行优化2.4.1 Visitor模型介绍2.4.2 Presto中常见的逻辑执行计划优化器常规OptimizerIterativeOptimi…

阿里月薪23k软件测试工程师:必备的6大技能(建议收藏)

随着软件开发行业的日益发展,岗位需求量和行业薪资都不断增长,想要入行的人也是越来越多,但不知道从哪里下手,今天,就给大家分享一下,软件测试行业都有哪些必会的方法和技术知识点,作为小白该从…

EmGU(4.7) 和C#中特征检测算法详解集合

C#联合Emgu实现计算机视觉任务(特征提取篇) 文章目录 C#联合Emgu实现计算机视觉任务(特征提取篇)前言一、Emgu库中特征提取有哪些类函数?二、特征提取函数1.AgastFeatureDetector类2.AKAZE 类3.FastFeatureDetector类4…

Docker部署(2)——实现两个容器互相访问并运行项目

一、拉取MySQL镜像,并启动镜像对应的容器 由于上一篇文章实现了拉取jdk8的环境,同时将jar包打成了一个镜像。但是要想真正的把项目运行起来(此处仅以单体项目为例)还需要MySQL的容器提供数据支持(当然这里面方法有多种…

深蓝学院C++基础与深度解析笔记 第 4 章 表达式

第 4 章 表达式 一、表达式基础 A、表达式: 由一到多个操作数组成&#xff0c;可以求值并 ( 通常会 ) 返回求值结果: #include <iostream> int main(){int x;x 3; }最基本的表达式&#xff1a;变量、字面值通常来说&#xff0c;表达式会包含操作符&#xff08;运算符…

Vue3项目中引入ElementUI使用详解

目录 Vue3项目中引入 ElementUI1.安装2.引入2.1 全局引入2.2 按需引入viteWebpack 3.使用 Vue3项目中引入 ElementUI ElementUI是一个强大的PC端UI组件框架&#xff0c;它不依赖于vue&#xff0c;但是却是当前和vue配合做项目开发的一个比较好的ui框架&#xff0c;其包含了布局…

TensorFlow详细配置(Python版本)

文章目录 TensorFlow详细配置(Python版本)安装Python环境&#xff08;Python全家桶 Anaconda3&#xff09;环境配置TensorFlow官网对照表CUDA安装cuDNN 安装TensorFlow安装Jupyter Notebook使用方法其他问题 TensorFlow详细配置(Python版本) 安装Python环境&#xff08;Python…

51 最佳实践-安全最佳实践-qemu-ga

文章目录 51 最佳实践-安全最佳实践-qemu-ga51.1 概述51.2 操作方法 51 最佳实践-安全最佳实践-qemu-ga 51.1 概述 qemu-ga&#xff08;Qemu Guest Agent&#xff09;它是运行在虚拟机内部的守护进程&#xff0c;它允许用户在host OS上通过QEMU提供带外通道实现对guest OS的多…

【面试】线上Java程序占用 CPU 过高请说一下排查方法?

文章目录 前言模拟一个高 CPU 场景排查步骤第一步&#xff0c;使用 top 找到占用 CPU 最高的 Java 进程第二步&#xff0c;用 top -Hp 命令查看占用 CPU 最高的线程第三步&#xff0c;保存线程栈信息第四步&#xff0c;在线程栈中查找最贵祸首的线程 前言 这个问题可以说是 Ja…

【java】JDK21 要来了

文章目录 前言更丝滑的并发编程模式虚拟线程&#xff08;Virtual Threads&#xff09;结构化并发&#xff08;Structured Concurrency&#xff09;作用域值&#xff08;Scoped Values&#xff09; 试验一下虚拟线程的例子结构化编程的例子Scoped Values 的例子 前言 不过多久&…

算法与数据结构——递归算法+回溯算法——八皇后问题

八皇后问题 八皇后问题是一个经典的回溯算法问题&#xff0c;目的是在88的国际象棋棋盘上放置八个皇后&#xff0c;使得没有皇后可以互相攻击&#xff08;即没有两个皇后在同一行、同一列或同一对角线上&#xff09;。 回溯算法是一种解决问题的算法&#xff0c;它通过尝试所有…

软件质量保障QA

软件质量保障 目录概述需求&#xff1a; 设计思路实现思路分析1.alibaba guileline2.ckeckstyle3.findBugs4.PMD5.SourceMononiot 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness…

2014年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2014年全国硕士研究生入学考试英语(二)试题 Section I Use of English Directions:   Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on ANSWER SHEET. (10 points)   Thinner isn’t always better. A number of st…

软考A计划-网络工程师-交换机与路由器的配置

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

MyBatis­-Plus入门

目录 1.特性&#xff1a; 2.mybatis-plus 快速使用 3.mybatis与mybatis-plus实现方式对比 4.BaseMapper接口介绍 5.mybatis-plus中常用的注解 7.全局ID生成策略 8.逻辑删除&#xff08;1&#xff1a;局部逻辑删除&#xff1b;2&#xff1a;全局逻辑删除&#xff09; 8.…

Java代码质量分析Sonar

目录 1. sonar安装1.1 简介1.1.1 客户端1.1.2 sonar 版本区分1.1.2.1 社区版1.1.2.2 开发者版1.1.2.3 企业版 1.2 安装部署1.2.1 修改文件句柄数1.2.2 创建挂载目录1.2.3 创建docker-compose.yml1.2.4 启动1.2.4.1 访问测试 1.2.5 安装插件1.2.5.1 汉化插件 1.3 静态分析插件介…