返回列表

3rd Place Solution

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

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

第三名解决方案

作者: tangtang (MASTER)
发布时间: 2025-02-06
竞赛排名: 第 3 名

感谢 Kaggle 和主办方举办这次有趣的比赛。
我喜欢这次比赛的一点是,主办方提供了基线代码(尤其是数据处理部分),这对于像我这样对该领域没有知识的人非常有帮助。
我参加这次比赛的另一个原因是我想基于 accelerate 库编写训练代码(我之前使用纯 PyTorch)。
既然我排名靠前,我认为我的训练代码没有严重的 bug。

总结

在开始这次比赛之前,我以为这是一个目标检测 (OD) 任务,而不是分割任务,直到 @hengck23 发布了他优秀的 notebook
我的解决方案基于 3D U-Net,并使用 cc3d 进行后处理。对所有 7 种粒子使用交叉熵损失 (Cross Entropy loss)。
我的最佳解决方案是骨干网络为 ResNet101 的 4 折 (7 折交叉验证) 平均集成。
我想提到的一点是,我的最佳解决方案在公共排行榜 (Public LB) 和私有排行榜 (Private LB) 上的得分相同 (0.783)。

模型

我使用了来自 segmentation_models_pytorch_3d 的代码。
最佳解决方案是 U-Net + ResNet101。
我也尝试了不同架构和不同骨干网络,但 U-Net + ResNet101 在公共排行榜上表现最好。
我没有深入挖掘代码,因此主要使用了这些模型的默认参数。

训练

我使用了 EMA (指数移动平均),因为它比 SWA (随机权重平均) 更容易处理,虽然我记得有说法称 SWA 比 EMA 更好。
我训练模型时输入尺寸为 (64, 128, 128),但推理时使用 (64, 256, 256),这在公共排行榜上带来了 0.001 的提升。
考虑到评估分数的计算方式,我在训练期间使用了原始半径的一半,根据我的实验这也是最好的设置。

数据增强

考虑到我们拥有的数据稀缺,很明显数据增强将对这次比赛有很大帮助。
我使用了以下方法:

  • x, y, z 轴翻转
  • 交换 x 和 y 轴
  • 不同算法:"denoised", "wbp", "ctfdeconvolved", "isonetcorrected"
  • 简单的复制粘贴
  • mixup

测试时增强 (TTA)

使用了 2 种 TTA,输出与原始输出进行平均:

  • x, y, z 轴翻转
  • x, y 轴旋转 90 度

集成

  • 4 折 (7 折交叉验证) 平均集成

失败的尝试

  • 尝试在主办方提供的外部数据上进行预训练
  • 将 U-Net 与不同的骨干网络集成,如 ResNet34 和 ResNet10
同比赛其他方案