返回列表

1st place solution

565. HuBMAP - Hacking the Human Vasculature | hubmap-hacking-the-human-vasculature

开始: 2023-05-22 结束: 2023-07-31 医学影像分析 数据算法赛

第一名解决方案

作者:tascj(Kaggle Grandmaster)
发布日期:2023年8月4日
最后更新:2023年8月12日

感谢主办方举办这场比赛。

感谢 @nghiahoangtrung 分享的 notebook 和数据集,这帮助我在短时间内完成了提交。

我的最佳单模型训练代码已分享在 GitHub 上。(2023/08/12 更新)

推理 notebook 已公开 此处

整体策略

对于大多数实例分割模型,AP主要依赖于边界框(bbox)预测,而掩码预测的精度影响较小。此外,掩码预测可以通过其他模型(如Mask R-CNN的掩码头或任何语义分割模型)来处理。因此,在处理实例分割任务时,我通常将精力集中在优化边界框精度上。

在尝试了多个模型后,我发现RTMDet表现异常出色且训练速度快。因此,我选择RTMDet作为实验的主要模型。

EMA

我特别强调这一点,因为这是我实验中发现的最关键的技术。指数移动平均(EMA)模型不仅在验证集上表现出更高的精度,在训练集上也获得了更高的精度。在我的大多数实验中,我都使用EMA配合固定的学习率。这种方法为我进行各种实验提供了稳定的基础。

ema

数据集

我使用dataset1和dataset2训练最终提交的模型。dataset1根据'i'位置分割为训练集和验证集。基于'i'的分割比随机分割更具挑战性。随机分割的验证分数约为(0.47 bbox_mAP, 0.72 segm_mAP60),而'i'分割的分数约为(0.43 bbox_mAP, 0.68 segm_mAP60)。

建模

RTMDet-x是我的基准模型。我用所有3个类训练模型,输入尺寸为768。

添加掩码监督

在早期实验中,我比较了Faster R-CNN和Mask R-CNN,使用相同的Faster R-CNN预训练权重。后者表现出更高的bbox mAP,表明掩码标注的帮助性。

在不使用掩码监督的情况下,RTMDet-x已经比Mask R-CNN等模型实现了更高的bbox mAP。添加掩码监督进一步提升了性能。

有两种利用掩码标注的方式:

  1. 通过随机旋转间接使用掩码信息,旋转后重新计算边界框
  2. 为模型添加掩码头

两种方法效果都很好。

随机旋转 掩码头 bbox_mAP segm_mAP60
N N 0.424
Y N 0.434
N Y 0.43 0.68
Y Y 0.432 0.688

由于实例重叠极少,掩码预测比典型的实例分割场景简单得多。我在训练中添加了一个简单的掩码头来增强bbox预测。令人惊讶的是,掩码头的预测结果并不差。使用相同的边界框,segm_mAP60略高于Mask R-CNN,而segm_mAP75略低于Mask R-CNN。未使用TTA的单折模型在private LB上得分0.565+,这已足以获得金牌。

数据增强

我使用了强几何增强。

    dict(type='RandomRotateScaleCrop',
         img_scale=(768, 768),
         angle_range=(-180, 180),
         scale_range=(0.1, 2.0),
         border_value=(114, 114, 114),
         rotate_prob=0.5,
         scale_prob=1.0,
         hflip_prob=0.5,
         rot90_prob=1.0,
    ),

训练

我使用批量大小8进行训练,包含3张dataset1的图像和5张dataset2的图像。这种方法带来了轻微的性能提升。

集成

我的最终模型是一个集成模型,其中边界框预测是3个RTMDet模型、一个YOLOX-x(带掩码监督)和一个Mask R-CNN的WBF集成。所有模型都有两个不同的权重(5折中的2折)。掩码预测由Mask R-CNN的掩码头使用输入尺寸1440生成,未使用TTA。

该集成模型在private LB上得分0.589,在public LB上得分0.317。

膨胀

事实上,直到在比赛最后一天看到我的public分数,我才想起膨胀(dilation)。

在我的本地验证中,将wsi3dataset2添加到训练集提高了wsi1dataset1(所有wsi1保留)和wsi2dataset2(所有wsi2保留)的mAP。所以我选择相信wsi1dataset1和wsi2dataset2。

这主要是运气使然。如果我能早点提交,我可能会在实验中做出不同的选择。无论如何,我最后一定会保留一个不带膨胀的最终提交。

几点建议

  1. 在单次训练运行中保留多个EMA模型
  2. 使用 torch._foreach_lerp_ 计算EMA,可以节省一些时间
  3. 使用快速的COCOeval实现。由于需要在多个具有不同动量的EMA模型上进行评估,更快的评估也能节省时间
同比赛其他方案