8. 语义分割竞赛 MICCAI 2023 Challenges :STS-基于2D 全景图像的牙齿分割任务

568 阅读5分钟

1. 背景介绍

为了促进计算机辅助设计技术的发展,举办了半监督牙齿分割挑战赛。

2. 数据集

初赛:

训练集 2000张牙齿图像(RGB通道图像),2000张Mask(1通道图像)。

测试集 500张牙齿图像,没有对应的Mask。

复赛:

训练集 4000张牙齿图像,2000张有Mask,2000张无Mask。

测试集 1000张牙齿图像,没有对应的Mask。

3. 评价指标

参照

  • Dice系数
  • IoU
  • 二维豪斯多夫距离

得分主要依据上述三个评分指标:

score=0.4Dice+0.3IOU+0.3(1H(d))score=0.4∗Dice+0.3∗IOU+0.3∗(1−H(d))

4. 项目难点和解决方法

5. 实现方法和思路

模型一:Unet + FCN-Head + ASPP-Head

使用了MMSegmentation框架构建模型。

模型结构

模型结构,看这篇文章

图片.png

辅助解码头通过低层次特征(in_index=2)作为输入去产生一个 loss,并进行反向传播,可以鼓励主干网络学习更好的低层特征。主解码头和辅助解码头产生的 loss 共同优化可以得到更好的分割效果。两个loss相加作为总的loss,主解码头loss权重比辅助解码头的 loss 权重要高。

Trick

膨胀腐蚀

  • 背景:预测出来的Mask在分割出来的物体边缘处会存在连接、噪声的情况。
  • 方法:腐蚀会让分割区域变小,膨胀会让分割区域变大。

使用了cv2.dilate(膨胀)和cv2.erode(腐蚀)与下面代码是等价的。

def open_img(a, k_erode, k_dliate):
    a_tensor = torch.tensor(a, dtype=torch.float32)
    max_pool1 = torch.nn.MaxPool2d(kernel_size=k_erode, stride=1, padding=int((k_erode-1)/2)) 
    max_pool2 = torch.nn.MaxPool2d(kernel_size=k_dliate, stride=1, padding=int((k_dliate-1)/2))

    img_erode = -max_pool1(-a_tensor) # 腐蚀操作:取滑窗区域内最小值
    img_open = max_pool2(img_erode) # 膨胀操作:取滑窗区域内最大值
    return img_open

torch.nn.MaxPool2d 的原理如下,当 stride=3 时,每次移动3步,取该滑动窗口处最大的值。stride=1就表示,经过torch.nn.MaxPool2d 后的图的尺寸没有改变。

图片.png

模型集成

模型二:nnU-Net

过程

医学图像的语义分割任务,核心不在于模型本身,而在于构建一个适配于当前数据集的训练流程,nnunet说明白就是使用不做任何改进的unet模型,寻找最适合这一类医学图像的数据处理策略、训练参数、训练策略以及后处理策略。

分为三个部分来说一下nnunet的构成:包括 数据预处理训练策略和推理策略后处理

A. 数据预处理:数据集指纹、数据预处理、数据增广、数据增强、patch采样。

B. 训练策略和验证策略:loss函数--使用的loss函数为dice loss和交叉熵loss的均值;集成--进行k折交叉验证,选择最优模型,然后对模型结果进行集成。

C. 后处理:连通区域分析。根据验证集信息来判断是否采用后处理。例如:医学影像中常常只有1个主体目标,比如一个人只有1个心脏左心室。在这个先验知识的指导下,后处理会尝试仅保留五折交叉验证后选择的2个模型的重叠的最大连通域,再进行测试。如果测试效果好,就保留此后处理;反之则不保留。

数据预处理、训练策略、推理策略:

  • 数据集指纹:进行数据集属性的统计。如:图像尺寸、图像数量、类别数量、各类像素占比、各类别占比。

    • 例如:某个数据集共500张图,每张图都是512x512的灰度图,总共有3个类,每类共80、490、270个实例,各类前景像素占据全图的5%、24%、17%。这些数值就构成了数据集指纹。
  • 管道指纹:蓝图参数(Unet网络结构、损失函数、数据增广、数据增强、优化器学习率)、推理参数(patch 采样、batch size、数据预处理)、经验参数(根据k折交叉验证计算前景dice结果,自动选择最优模型。将模型使用平均softmax概率集成。)

  1. 蓝图参数:设置训练时的参数

    • 损失函数:loss函数为dice loss和交叉熵loss的均值。

    • 优化器:Adam。

    • 学习率:计算训练集和验证集的移动平均loss,如果训练集的指数移动平均loss在30个epoch内减少不到5e-3,那么学习率衰减5倍。

    • 数据增广:随机旋转、随机缩放、镜像等操作。

    • 数据增强:变形、裁剪、噪声、对比度。

      dice loss:

      dice_loss=2Nc=1Mi=1NPciycii=1NPci+i=1Nycidice\_loss=-\frac{2}{N}\sum^M _{c=1}\frac{\sum^N _{i=1}P^i_c·y^i_c}{\sum^N _{i=1}P^i_c+\sum^N _{i=1}y^i_c}

      交叉熵loss:

      ce_loss=1Ni=1Nc=1MycilogPcice\_loss=-\frac{1}{N}\sum^N _{i=1}\sum^M _{c=1} y^i_clogP^i_c

      其中,NN 是像素总数,MM 是类别数,ycy_c 是one-hot标签 0/1,PcP_c 为该像素为c类的概率的概率。

  2. 推理参数:设置推理时的参数

    • patch 采样:大图像切割成小的、重叠的图像块(也称为 patch),然后将这些小图像块送入神经网络进行训练。为了增加网络的稳定性,patch采样会根据前景背景的像素数目,设定采样权重,保证一个batch中的样本有超过1/3的像素是前景类的像素。
    • 数据预处理:将数据进行标准化。使用Z-score进行标准化,即将每张图减去自身的均值然后除以标准差。
    • TTA:推理时进行数据增强。
  3. 经验参数:如何进行模型选择。

    进行k折交叉验证,选择最优模型,然后对模型结果进行集成。

后处理:

  • 连通区域分析。根据验证集信息来判断是否采用后处理。例如:医学影像中常常只有1个主体目标,比如一个人只有1个心脏左心室。在这个先验知识的指导下,后处理会尝试仅保留五折交叉验证后选择的2个模型的重叠的最大连通域,再进行测试。如果测试效果好,就保留此后处理;反之则不保留。