返回列表

1st place solution [segmentation with partly U-NET and ensembling part]

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

开始: 2024-11-06 结束: 2025-02-05 医学影像分析 数据算法赛
第一名解决方案 [部分 U-NET 分割与集成部分]

第一名解决方案 [部分 U-NET 分割与集成部分]

作者: Dieter (christofhenkel)

collaborator: Eugene Khvedchenya (bloodaxe)

发布日期: 2025 年 2 月 6 日

竞赛: czii-cryo-et-object-identification

感谢 Kaggle 及所有参与举办这场激动人心比赛的人。这是一次很棒的学习经历,很有趣看到我们的计算机视觉经验有多少也可以应用于 3D 成像。感谢 @bloodaxe 带来的伟大团队体验。

摘要 (TLDR)

该解决方案是分割模型(带有 ResNet & B3 编码器的 3D Unets)和来自 MONAI 的目标检测模型(SegResNet 和 DynUnet 骨干网络)的集成。我们还使用 MONAI 进行数据增强,并通过 jit 或 TensorRT 导出模型,这带来了 200% 的速度提升,使我们能够拥有稍大一点的集成模型。我们没有使用任何外部或模拟数据!

本文涵盖了基于分割的方法和集成。关于目标检测部分,请参阅 @bloodaxe 的撰写:第一名解决方案 [目标检测部分]

交叉验证

对于分割方法,使用了 7 折交叉验证, Simply 按实验拆分。使用所有 7 折的 f4-score 平均值与排行榜 (LB) 有良好的相关性。在模型训练期间,我在每个 epoch 结束时通过简单的网格搜索在验证实验上优化了单个类别的阈值。在所有 7 折训练完成后,我们可以通过获取折外 (OOF) 预测来重新校准阈值。并将某一折的阈值拟合到其他 6 折的预测上。然后我们平均 resulting f4 曲线并取最佳阈值。

数据预处理/增强

3D 图像通过标准归一化进行处理,即对于每个 630x630x184 的图像,我们在将图像分割成 patches 之前,减去均值并除以标准差。
由于模型是从头训练的,增强对于防止过拟合至关重要。
我们使用了 RandomCrop、各轴 Flip 和 rotation,这些都可在 MONAI 中找到。此外,我使用了自己实现的 MixUp,这对于延长训练时间和防止过拟合非常有效。

模型

建模过程在这次比赛中相当曲折。我从简单的 UNET 开始,使用 3D 高斯球作为分割目标。为了多样性,我还尝试了 MONAI 的目标检测示例,并意识到它开箱即用效果很好。但是在分析不同的输出特征图并试图隔离其相对于基于高斯热力图的分割的性能增益时,我意识到了优势所在,并相应地调整了我的分割模型。我了解到:

  • 倒数第二个特征图比最后一个具有更高的准确率,起初这令人惊讶。
  • 边界框回归的增益可以忽略不计,因为相同类型的粒子大多具有相同的大小。

因此,只需在倒数第二个特征图输出上进行像素级损失就足够了。即使用部分UNET。当通过低类别权重抑制背景时,不需要高斯热力图,只需使用单个像素作为目标。在较低级别输出上使用相同的方法(= 深度监督)是可能的,但不会提供太多增益。分割模型的输入是 96x96x96 图像 patches,损失是在 48x48x48 输出上计算的。

模型结构图

总的来说,我们观察到相对较小的模型效果真的很好,损失函数的设计是最重要的方面。我们使用了 MONAI 的 FlexibleUnet,骨干网络为 resnet34 和 efficientnet-b3。该架构的六个 checkpoint 可以在 2 小时内完成,并在 LB 上获得第 7 名。

训练过程

我们使用了 7 个类别(包括背景)和加权交叉熵作为损失。值得注意的是,保留β-淀粉酶 (beta-amylase) 作为一个类别虽然不计分,但非常有帮助,因为模型学会了区分β-半乳糖苷酶 (beta-galactosidase) 和它。为了account for 少量正像素,正像素权重为 256,背景权重为 1。模型使用峰值学习率为 0.001 的余弦学习率调度、混合精度和 32 个样本的有效 batch size 进行训练。训练基于随机裁剪,对于验证,单个实验图像被分成 patches 并存储在 RAM 中。

集成

集成非常有挑战性,因为我们的两种方法非常多样化。虽然理论上分割模型的预测可以在运行目标检测后处理之前与目标检测模型的特征图输出进行集成,但在实践中,由于架构和损失函数的差异,这些特征图具有非常不同的分布。

集成分布图

我们渴望找到一种优雅的方法来解决这个缩放问题,因为我们看到了潜在集成的可能性。我们最佳提交的缩放工作如下。为了结合预测 A 与预测 B,对于每个类别,对 A 和 B 的所有像素值进行排序,并用相同排名的 A 的对应值替换 B 的值。代码如下:

代码截图

这导致两个预测具有相同的分布,因此我们可以在执行目标检测任务之前简单地混合特征图。

结果图

无效的方法

  • 使用补充数据(外部或模拟)
  • 其他增强方法
  • 其他损失函数 (Tversky, Dice)

感谢阅读。

同比赛其他方案