1. 背景介绍
为了促进计算机辅助设计技术的发展,举办了半监督牙齿分割挑战赛。
2. 数据集
初赛:
训练集 2000张牙齿图像(RGB通道图像),2000张Mask(1通道图像)。
测试集 500张牙齿图像,没有对应的Mask。
复赛:
训练集 4000张牙齿图像,2000张有Mask,2000张无Mask。
测试集 1000张牙齿图像,没有对应的Mask。
3. 评价指标
- Dice系数
- IoU
- 二维豪斯多夫距离
得分主要依据上述三个评分指标:
4. 项目难点和解决方法
5. 实现方法和思路
模型一:Unet + FCN-Head + ASPP-Head
使用了MMSegmentation框架构建模型。
模型结构
辅助解码头通过低层次特征(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 后的图的尺寸没有改变。
模型集成
模型二: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概率集成。)
-
蓝图参数:设置训练时的参数
-
损失函数:loss函数为dice loss和交叉熵loss的均值。
-
优化器:Adam。
-
学习率:计算训练集和验证集的移动平均loss,如果训练集的指数移动平均loss在30个epoch内减少不到5e-3,那么学习率衰减5倍。
-
数据增广:随机旋转、随机缩放、镜像等操作。
-
数据增强:变形、裁剪、噪声、对比度。
dice loss:
交叉熵loss:
其中, 是像素总数, 是类别数, 是one-hot标签 0/1, 为该像素为c类的概率的概率。
-
-
推理参数:设置推理时的参数
- patch 采样:大图像切割成小的、重叠的图像块(也称为 patch),然后将这些小图像块送入神经网络进行训练。为了增加网络的稳定性,patch采样会根据前景背景的像素数目,设定采样权重,保证一个batch中的样本有超过1/3的像素是前景类的像素。
- 数据预处理:将数据进行标准化。使用Z-score进行标准化,即将每张图减去自身的均值然后除以标准差。
- TTA:推理时进行数据增强。
-
经验参数:如何进行模型选择。
进行k折交叉验证,选择最优模型,然后对模型结果进行集成。
后处理:
- 连通区域分析。根据验证集信息来判断是否采用后处理。例如:医学影像中常常只有1个主体目标,比如一个人只有1个心脏左心室。在这个先验知识的指导下,后处理会尝试仅保留五折交叉验证后选择的2个模型的重叠的最大连通域,再进行测试。如果测试效果好,就保留此后处理;反之则不保留。