返回列表

16th place solution

575. RSNA 2023 Abdominal Trauma Detection | rsna-2023-abdominal-trauma-detection

开始: 2023-07-26 结束: 2023-10-15 医学影像分析 数据算法赛
第16名解决方案 - RSNA 2023腹部创伤检测竞赛

第16名解决方案

竞赛排名: 第16名

作者: Ivan Panshin (Kaggle Grandmaster)

发布时间: 2023年10月16日

总训练时间: 约80小时 (RTX A6000 Ada)

感谢主办方举办如此精彩的比赛。遗憾的是,去年由于硬件设备不足,我未能参加类似比赛。但今年情况不同,我对最终取得的成果感到非常满意。

问题描述

本次竞赛要求预测不同腹部器官的损伤严重程度。可用数据包括大型CT图像(DICOM格式)和部分补充的器官分割标注(NIFTI格式)。

在机器学习领域,这本质上是一个3D分割/分类问题,面临数据/标注不足以及严苛的评估指标挑战。

解决方案概览

  • U-Net Bi-Conv-LSTM 用于器官分割(肾脏、肝脏、脾脏、肠道),以及基于他人提供的边界框单独训练的外渗模型(非常感谢!)
  • Resnet 3D CSN 用于3D图像块分类,分为两个阶段:(肾脏、肝脏、脾脏) 和 (肠道)

3D语义分割

器官识别的语义分割部分相对直接(与后续的分类任务相比),可通过U-Net Bi-Conv-LSTM模型实现,该模型采用Effnet_v2_b0作为骨干网络,并使用CE-Dice-Focal复合损失函数。

为了提高效率,我们在96x256x256尺寸的图像块上训练语义分割模型,并使用同样尺寸但带48x256x256重叠区域的图像块预测完整图像(后续为节省时间和存储空间,移除了重叠区域)。

为了缓解过拟合(这个问题不太严重,尤其与分类任务相比),我们加入了几何增强技术,包括:ShiftScaleRotate、RandomBrightnessContrast、翻转、GridDistortion和ElasticTransform。

总体而言,约10%的体积用于肾脏、肝脏和脾脏,约20%用于肠道。

每张图像的平均Dice分数约为0.96

训练时间12小时

3D分类

基于分割掩码提取的图像块,我们训练两个模型:一个用于肾脏、肝脏和脾脏,另一个用于肠道。

来自mmaction的CSN模型被证明非常快速且准确。为了处理时间维度,我们尝试了多种方法,最终采用基础的插值方法(3D resize)将图像块转换为96x256x256分辨率

为了对抗严重的过拟合(即使使用CSN模型,过拟合仍然严重),我们采用了强化的几何增强,包括ShiftScaleRotate、RandomBrightnessContrast以及4种不同类型的模糊处理。

所有fold的平均竞赛损失值为:肾脏、肝脏和脾脏为0.401,肠道为0.156

训练时间:肾脏、肝脏和脾脏每个fold约4小时,肠道每个fold约8-10小时

外渗的3D分类

为了预测外渗情况,我们采用了分割模型。其核心思想很简单:如果语义分割模型预测出任何区域,则表明存在外渗,应在概率中体现。

为实现从语义分割到分类的转换,我们采用以下技巧:

  • 将3D掩码展平为1D
  • 对概率值排序
  • 取前top_n个概率值
  • 计算这些值的平均值,作为阳性外渗的概率

伪代码实现:

cls_pred = np.mean(np.sort(np.ravel(sigmoid(mask)))[::-1][:top_n])

所有fold的平均对数损失值为:外渗为0.543,任意损伤为0.501

训练时间:每个fold约4小时

验证策略

采用StratifiedGroupKFold(基于分类标签分层,按患者分组)进行4折交叉验证。

所有fold和所有组(肾脏、肝脏、脾脏、肠道、外渗、任意损伤)的平均对数损失值(即竞赛评估指标)为0.400

额外技巧

  • 无后处理
  • 对最终检查点使用SWA(随机权重平均)
  • 训练过程中使用EMA(指数移动平均)
  • 在分类中使用时间偏移进一步对抗过拟合
  • 梯度检查点技术以支持更大批次(对分类任务至关重要)
  • 使用numpy的memmap(uint8)加速数据读取和图像块提取
  • 两个最终提交方案:一个最小化竞赛损失,一个最大化AUC

未生效的方案

  • 采样器(Samplers)
  • 更重的模型(2+1D或Uniformer)

总结

在竞赛的最后两天,我们将肾脏、肝脏和脾脏模型的损失值从0.4优化到约0.38,整体损失从0.4降至0.39,但由于提交过程中的错误导致这些模型未能生效。优化方法很简单——增加批次大小。通常我们使用14的批次大小,但借助A100显卡可提升至24。

使用单张RTX A6000 Ada显卡,总训练时间(包括所有阶段的4个fold)约为80小时

使用单张Tesla P100显卡,总提交时间约为8-9小时

我们认为该方案仍有很大提升空间。然而,我们在竞赛结束前两天才提交第一个非示例或非静态预测的有效方案,这也影响了最终结果。

P.S. 未能实现0.39的模型确实令人遗憾 :)

同比赛其他方案