返回列表

3rd place solution

558. Vesuvius Challenge - Ink Detection | vesuvius-challenge-ink-detection

开始: 2023-03-15 结束: 2023-06-14 医学影像分析 数据算法赛
第三名解决方案

第三名解决方案

作者: ClicheYu Fujiang

发布时间: 2023-06-16

首先,我们要感谢主办方为我们提供了参与复活古代图书馆的绝佳机会,这真的太棒了!同时也祝贺所有获奖者!

总结

我们最终选择的解决方案是一个15个UNet的集成模型,仅使用ir-CSN作为3D编码器,并通过简单的平均池化桥接到2D解码器。这个想法参考了@samfc10的笔记本:Vesuvius Challenge - 3D ResNet训练。我们的训练和推理流程参考了@tanakar的优秀可扩展分享:2.5D分割基线。下面让我详细说明。

数据集

折叠划分

最初我们只使用原始的3个碎片进行本地验证,但在第一个集成模型中,折叠2的得分最差,导致整体表现很差。我们认为这可能是由于折叠2的训练样本较少所致。

我们参考了@junxhuang评论@tattaka讨论,将碎片2拆分为3个碎片。

有趣的是,我们最好的公共分数0.77来自在折叠2上训练的单个ir-CSN-r50 UNet模型,使用4次旋转TTA,本地得分为0.66,不使用TTA时为0.73。在我们所有的实验中,折叠2在公共排行榜上的得分始终高于其他折叠。

切片选择

我们曾长时间研究多少个切片能带来更高的分数。我们参考@tanakar的基线,尝试了`8*i`个切片(i取值1, 2, 3, 4, 6)。24、32和48个切片在公共排行榜和CV上均表现稳健。在看到@pavelgonchar讨论后,我们决定在大多数实验中使用24个切片。

补丁大小

我们几乎花了2/3的时间在224x224裁剪大小的模型调优上,因为尺寸越小,我们获得的训练样本越多。224//2的裁剪步长总共提供了13272个样本,这对于训练r50类型的UNet已经足够。在224x224裁剪大小和224//2裁剪步长上训练的最稳健的单个r50模型是折叠5,在公共排行榜上得分为0.74(使用4次旋转TTA),CV得分也是0.74。

在最后两周,阅读了许多优秀的获胜方案后(例如@hesene第三名解决方案),我们决定使用更高分辨率并采用多尺寸裁剪推理作为最终提交。因为大裁剪尺寸能让模型看到完整字符这一点很容易理解。但问题是,裁剪的补丁越大,样本就越少。当使用864x864大小的补丁和864//6的步长时,我们的r152 UNet在2个epoch内就很容易过拟合。因此我们做了权衡,在500-700尺寸的补丁上进行实验,这些尺寸对我们很有效。最佳单一大分辨率模型是576x576补丁大小的r152 UNet(折叠5),本地得分为0.77。

模型

架构

我们的分割模型仅使用UNet。

骨干网络

在大多数实验中,我们选择ir-CSN-r50作为UNet的编码器。在阅读了@selimsef第四名解决方案@nvnnghia第一名解决方案后,我们坚持使用openmmlab的优秀实现和预训练权重。

解码器

这是我们首次参加分割竞赛。一开始我们花了很多时间构建更好的解码器,但阅读了一些解决方案后发现,解码器的通道数是最不重要的部分。实验表明,轻量级解码器已足够好,因此我们所有UNet的解码器通道都从256开始。我们的解码器代码使用了selimsef的xview3解决方案,并做了一些修改。

骨干-数据对齐

最初我们给模型提供1通道的体素。我们需要像@samfc10那样将第一个卷积层的预训练权重求和以得到1通道。

但在阅读了@pelegshilo评论@hengck23的优秀主题后,我们认为可以充分利用第一个卷积层的预训练权重,让模型选择最佳的z位置。我们简单地将时间维度的3个重叠体素在通道维度上连接。

在我们的实验中,输入体素大小为(28,224,224),重叠起始索引为[0,2,4],提供3个体素,使不同折叠的CV提升了0.01到0.03。

训练设置

数据相关

  • 我们使用2.5D分割基线提供的增强方法,并根据不同实验调整概率。
  • 我们参考@hengck23主题,将ShiftScaleRotate的rotate_limit设置为180。
  • 使用mixup和cutmix在不同折叠上以不同的混合概率提升了CV。使用cutmix时,我们禁用了cutout。
  • 参考@yoyobar分享,对归一化像素进行分割是有效的。
  • 我们使用干净输入,即过滤掉所有零输入。

模型相关

  • 我们使用adamw优化器和onecycle调度器。
  • 在实验中,我们使用BCE和hard dice,并采用不同的加权平均。
  • 我们使用EMA,有时能提升CV。
  • 在大分辨率补丁训练时使用DDP训练和验证。
  • 在大分辨率补丁训练时使用梯度累积。我们所有实验的批量大小均为16。

推理

  • 与训练相比,我们使用更小的裁剪步长进行推理。
  • 多尺寸裁剪推理集成帮助我们在这个压缩任务中生存下来。
  • 我们不选择每个模型预测的阈值,统一使用0.5。

我们的最终解决方案是一个224-384-576-15-UNet集成模型,不使用TTA,公共得分为0.76。在此设置中,我们使用28-24切片选择(即切片文件ID范围18到46),并将其复制到3个体素中,起始索引为[0,2,4]。对于576尺寸模型,我们升级到r152,其余为r50。这使我们获得了私有排行榜的第三名。

我们发现,当添加一些大分辨率模型时,旋转TTA的提升不大。

但我们有6种不同的集成设置私有分数高于0.682。最佳方案私有得分为0.687873,公共得分为0.749338。在此方案中,我们增加了5个r152 UNet,训练输入尺寸为640,使用36-32切片和起始索引[0,2,4]。我们没有选择它是因为公共排行榜得分较低,且训练损失与验证损失之间存在过拟合表现。

以下是其中两种方案:

集成模型 输入尺寸 切片数量 裁剪步长 公共分数 私有分数
r50,r50,r152 224,384,576 28-24,28-24,28-24 224//8,384//6,576//8 0.763384 0.681137
r50,r50,r152,r152 224,384,576,640 28-24,28-24,28-24, 36-32 224//2,384//3,576//4,640//5 0.749338 0.687873
r152 576 28-24 576//12 0.720028 0.683273

尝试但未成功的方法

  • 2D模型
  • 纯3D模型
  • 使用2D去噪器的堆叠UNet
  • 训练3D去噪器
  • 添加分类分支以增强监督
  • 在编码器和解码器之间添加最大池化和卷积层

致谢

我们要感谢所有提到的Kagglers。从你们的分享中我们学到了很多,还有很多需要学习的地方。

我们还要感谢Kaggle社区,这里的每个人都可以自由分享自己的见解,这对个人成长非常有帮助。

再次感谢主办方举办如此精彩的比赛!我们看到了许多优秀团队出色的解决方案。

我的队友@yufujiang是第一次参加Kaggle比赛,他也是我的大学室友,非常感谢他。这是我第三次参加Kaggle比赛,终于获得了我的第一枚奖牌!

同比赛其他方案