返回列表

2nd Place Solution

639. CZII - CryoET Object Identification | czii-cryo-et-object-identification

开始: 2024-11-06 结束: 2025-02-05 医学影像分析 数据算法赛
第二名解决方案

第二名解决方案

作者: AnnieGo (sjtuwangshuo), LuoZiqian
发布时间: 2025-02-06
竞赛排名: 第 2 名

致谢

我们 sincerely 感谢 Kaggle 和竞赛组织者提供这次宝贵的机会。我们也向 @hengck23 和 @fnands 表示感激,感谢他们的重大贡献。fnands 的 notebookhengck23 的讨论 为我们的方法提供了坚实的基础。最后,我感谢我的队友 @luoziqian 的出色合作。

总结

我们的方法基于多个轻量级分割模型的集成,参数量范围从 873K 到 14.2M。分割后,我们使用 CC3D 计算粒子质心,并根据体素计数统计过滤小簇。

整体流程

整体流程如下图所示:

整体流程图

模型架构

我们最初使用 MONAI UNet 基线模型进行实验。在整个试验过程中,我们观察到参数量大的模型容易过拟合,并且表现往往不如轻量级模型。因此,我们选择了轻量级架构,如 UNet3D、VoxResNet、VoxHRNet、SegResNet、DynUNet 和 DenseVNet。

然而,在尝试 VoxResNet、VoxHRNet 和 DenseVNet 时,我们遇到了稳定性问题,包括性能波动和收敛困难。经过进一步分析,我们发现 MONAI UNet 使用了 InstanceNorm3dPReLU。通过相应地修改归一化和激活层,我们实现了更稳定的模型性能。

MONAI UNet 的模型架构如下所示:

MONAI UNet 架构

下图比较了 5 次实验中带有 InstanceNorm3d 和 PReLU 的 MONAI UNet 与带有 BatchNorm3d 和 ReLU 的训练性能,表明使用 InstanceNorm3d 和 PReLU 可以带来更稳定的训练。

训练稳定性比较

对于最终集成,我们根据公共排行榜得分选择了以下模型:

  • UNet3D
  • VoxResNet
  • VoxHRNet
  • SegResNet
  • DenseVNet
  • UNet2E3D

训练策略

我们的训练配置旨在确保稳定性和最佳性能。我们发现分割掩膜半径损失函数数据增强策略在获得可靠结果方面起着至关重要的作用。

分割掩膜:

我们为每个粒子应用了具有自定义半径的 ground truth 掩膜。

粒子类型 默认半径 Luoziqian 的半径 Lion 的半径
载铁蛋白 (apo-ferritin) 60 60 x 0.5 80 x 0.4
β-半乳糖苷酶 (beta-galactosidase) 90 90 x 0.5 90 x 0.4
核糖体 (ribosome) 150 150 x 0.5 150 x 0.4
甲状腺球蛋白 (thyroglobulin) 130 130 x 0.5 120 x 0.4
病毒样颗粒 (virus-like-particle) 135 135 x 0.5 150 x 0.4

训练设置:

Lion 的模型:

  • patch size [128, 256, 256][128, 384, 384]
  • 200 epochs
  • 7 类
  • 优化器:AdamW,学习率 0.001(无学习率调度器)
  • Batch size: 24
  • Drop path rate: 0.10.3
  • 基于 F-beta 指标进行模型选择,保存前 5 个最佳模型
  • 损失函数:
    • Tversky Loss
    • 交叉熵损失 (Cross-Entropy Loss),权重为 [1.0, 1.0, 0.0, 2.0, 1.0, 2.0, 1.0]

Luoziqian 的模型:

  • patch size [128, 200, 200][128, 256, 256]
  • 100300 epochs
  • 6 类
  • 早停 (Early stopping),patience=20
  • Batch size: 12
  • 基于评估损失进行模型选择。保存最后 100 个模型并验证其 F-beta 分数
  • 损失函数:
    • Dice Loss
    • Tversky Loss
    • 交叉熵损失 (Cross-Entropy Loss),缩放至 0.05 或 0.1

数据增强:

Lion 的模型:

  • RandCropByLabelClassesd, ratios [1, 1, 1, 1, 2, 1, 2] 用于平衡采样
  • RandRotate90d
  • RandFlipd
  • RandAffined
  • RandGaussianNoised

Luoziqian 的模型:

  • RandCropByLabelClassesd
  • RandRotate90d
  • RandFlipd
  • RandShiftIntensityd

模型性能与 7 次 TTA 总结(部分选择)

编号 模型 开发者 架构 参数量 验证 ID 归一化 激活函数 公共榜 私有榜
1 epoch122-step2952-valid_loss0.3625-val_metric0.8367.ckpt Lion UNet3D 1.1M TS_86_3 InstanceNorm3d PReLU 0.77379 0.76582
2 epoch148-step3576-valid_loss1.1154-val_metric0.7722.ckpt Lion UNet3D 1.1M TS_6_4 InstanceNorm3d PReLU 0.77021 0.76725
3 epoch153-step3696-valid_loss0.3021-val_metric0.8900.ckpt Lion UNet3D 1.6M TS_69_2 InstanceNorm3d PReLU 0.77205 0.76676
4 epoch194-step4680-valid_loss1.0213-val_metric0.8788.ckpt Lion UNet3D 1.1M TS_69_2 InstanceNorm3d PReLU 0.77390 0.76737
5 epoch138-step3336-valid_loss0.3690-val_metric0.8476.ckpt Lion UNet3D 1.1M TS_73_6 InstanceNorm3d PReLU 0.76543 0.76025
6 epoch152-step3672-valid_loss0.4333-val_metric0.7929.ckpt Lion DenseVNet 873K TS_6_6 InstanceNorm3d PReLU 0.76528 0.75417
7 epoch195-step4704-valid_loss0.4258-val_metric0.7914.ckpt Lion VoxResNet 7.0M TS_6_6 InstanceNorm3d PReLU 0.77457 0.76593
8 epoch188-step4536-valid_loss0.4231-val_metric0.8659.ckpt Lion VoxHRNet 1.4M TS_73_6 InstanceNorm3d PReLU 0.76738 0.75995
9 epoch198-step4776-valid_loss0.3471-val_metric0.8730.ckpt Lion VoxHRNet 1.4M TS_73_6 InstanceNorm3d PReLU 0.76135 0.75848
10 epoch133-val_loss0.52-val_metric0.56-step3216.ckpt Luoziqian UNet3D 1.1M TS_6_4 BatchNorm3d PReLU 0.76844 0.76320
11 epoch314-val_loss0.54-val_metric0.54-step7560.ckpt Luoziqian SegResNet 1.2M TS_6_4 GroupNorm ReLU 0.75521 0.74647
12 epoch114-val_loss0.55-val_metric0.53-Step2760.ckpt Luoziqian UNet2E3D 14.2M TS_6_4 BatchNorm3d ReLU 0.73758 0.72966

集成策略(部分选择)

我们选择公共排行榜得分最好的模型进行最终提交。

模型 集成策略 置信度阈值 公共榜 私有榜 选中
[1, 2, 3, 4, 7, 8, 12] 平均 (Average) 0.23 0.79094 0.78641
[1, 2, 3, 4, 7, 8, 12] 平均 (Average) 0.18 0.79213 0.78630
[1, 2, 3, 4, 7, 8, 12] 平均 (Average) 0.15 0.79307 0.78457
[1, 2, 3, 4, 7, 8, 12] 加权 (weighted) 0.15 0.79247 0.78417
[1, 2, 3, 4, 6, 12] 平均 (Average) 0.15 0.78701 0.78389
[1, 2, 3, 4, 5, 6, 7] 平均 (Average) 0.15 0.79104 0.78277
[1, 2, 3, 4, 7, 9, 12] 平均 (Average) 0.15 0.79391 0.78283
[1, 2, 3, 4, 6, 7, 9, 10, 11, 12] 平均 (Average) 0.15 0.79355 0.78381

后处理(簇移除)

我们使用 CC3D 将分割结果转换为粒子簇,并应用以下策略进行簇选择:

  • 基于阈值的聚类(所有类别的阈值设置为 0.15 以提高召回率)
  • 簇大小过滤

未产生改进的方法:

  • 合成数据
  • 第二阶段分类
  • 重型模型(基于 Transformer 的模型)

参考文献

Gubins, Ilja, et al. "SHREC 2020: Classification in cryo-electron tomograms." Computers & Graphics 91 (2020): 279-289.

同比赛其他方案