返回列表

10th place solution

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

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

第 10 名解决方案

作者: Josef Slavicek (Master)
发布时间: 2025-02-08
竞赛排名: 第 10 名

我想向组织者道歉:他们为我们准备了非常完善且有趣的比赛,希望能推动 CryoET(冷冻电子断层扫描)处理领域的实质性进步。而我带给他们的仅仅是一组老式的 3DUNets 集成模型。

我也要感谢一些有益 Notebook 的作者,特别是 这个。如果没有它们,我将无法开发出任何可行的方案。

简述

我的解决方案是 9 个 3DUnet 的集成。除了其中一个之外,所有模型都先在 模拟数据 上进行了预训练,然后在比赛训练数据上进行了微调。我通过简单地平均等权重的 logits 来集成它们。然后我计算概率,对它们进行阈值处理以获得检测区域,接着应用一些后处理将区域分割成单个粒子。事实上,我所有的训练都是 Optuna 超参数搜索会话,我根据保留的本地验证集从中选择了最佳模型。

验证

我只是根据实验 ID 进行了训练/验证集划分。对于在比赛训练数据上的微调,我在 6 个体积上训练,并在剩余的一个上进行验证。对于模拟数据上的预训练,我仍然使用其中一个训练数据实验的性能作为验证。

数据处理与增强

我使用的唯一数据处理是使用 monai.transforms.NormalizeIntensityd 进行归一化。关于增强,我使用了 monai.transforms 中的 RandFlipd、RandRotated 和 RandRotate90d。在训练期间,我使用了简单的 mixup 实现,但 Optuna 选择给它一个非常小的 alpha (~0.03)。

神经网络架构

我所有的网络架构都相同:monai.networks.net.UNet,参数设置为 spatial_dims=3, channels=(48, 64, 80, 80, 128), stride_patterns=(2,2,2,1)

训练

所有的训练都是作为 Optuna 超参数搜索会话完成的,内部训练使用 PyTorch Lightning 完成。我使用了带有余弦学习率调度器的 AdamW 优化器。Optuna 确定了一些不寻常的 Adam beta 参数值(例如 beta1=0.7, beta2=0.9996)。

训练目标

对于比赛数据的微调,我要求 UNet 预测粒子类别图。作为损失函数,我使用了 Tversky 损失和多类交叉熵的加权组合。我对 Tversky 损失的输入 logits 进行了裁剪。对于模拟数据的预训练,我使用了 3 种版本的目标函数:

  1. 与微调相同。
  2. 将粒子方向向量作为另一个目标。我希望这将迫使网络理解粒子形状,但实际上网络预测方向的效果并不比随机猜测好。
  3. 我早期实现的版本 2),其中有一个 bug 使得方向完全是随机的。讽刺的是,这是我最成功的预训练,存在于我最终 9 个网络中的 4 个里。

后处理

在融合、计算概率和阈值处理后,我们得到了代表粒子的二进制图。大多数时候,孤立的正值簇确实只对应单个粒子。但有时我会看到这样的情况:

双重检测示例

所以我们需要识别并分割这种多重检测。我想有一些既定的、经过验证的解决方案可以做到这一点,但我把这当作一个重新发明轮子的好机会,最终做了以下操作(为了清晰起见,在 1D 图像上解释):

KL 散度处理流程 1D 示意图

我们有一个概率密度函数 (pdf),它是我们要模型的预测(图 A)——我们称之为 P。我们非常清楚单个粒子的 pdf(我们称之为 Q)是什么样子的(图 B),只是我们不知道它在哪里以及有多少个。但是,如果我们以最小化 KL 散度的方式将 Q 放置在 P 上,我们就能得到我们想要的结果(图 C)。只是我们必须小心,因为 KL 散度不是对称的,所以将 P 和 Q 以错误的顺序插入 KL 公式会导致不理想的结果(图 D)。但如果我们做得正确,我们就放置了第一个粒子,如果我们放置另一个,它将占据 P 的另一个节点(图 E)。我们可以继续这样做。一旦我们放置的 Q 开始重叠(图 F),我们就完成了。

这是我疯狂的 KL 机制的第一部分。为了解释其余部分,让我们切换到 2D 视图,并忘记之前图像中颜色的含义——现在它将有所不同:

几何中心处理流程 2D 示意图

我们有我们的模型预测,从中我们可以绘制二进制掩码,从中我们可以检测边界——图 A 中的红线。我们知道单个粒子 pdf 的质心——绿色和蓝色的十字。仅仅使用这些质心会给出很好的预测,但我从以下的技巧中获得了一些微小的改进。我们可以将红色边界分割成属于单个粒子的部分(图 B)。现在让我们分别处理它们。如果我们随机选择 4 个点(在真实的 3D 问题中是 4 个点,而在我们的 2D 图像中是 3 个点)并找到它们的外心(距离它们相等的唯一点),我们就得到了粒子质心的良好候选点(图 C)。所以我用这个来获得粒子中心候选点的云团,然后通过平均这个簇的某些密集核心来找到最终的质心预测(图 D)。

就是这样。抱歉,我忍不住了 :-)

这整个 KL 魔法将我的 LB 分数提高了约 0.015,并且在 P100 上运行需要 90 分钟。

同比赛其他方案