返回列表

11th place solution

508. HuBMAP + HPA - Hacking the Human Body | hubmap-organ-segmentation

开始: 2022-06-22 结束: 2022-09-22 医学影像分析 数据算法赛
第11名解决方案

第11名解决方案

作者:D.Imanishi (Grandmaster)
比赛排名:第11名

感谢主办方,并祝贺所有的获奖者!

概述

在这次比赛中,由于基于HPA标记数据的交叉验证(CV)对于提高私有排行榜分数并不可靠,我尽可能多地进行了提交,仅通过Hubmap数据的排行榜分数来确认实验的有效性。最终,以下三点是我解决方案的关键:

  • 使用GTEx数据
  • 尽可能多的模型集成与TTA(测试时增强)(12个模型 x 20次TTA)
  • 后处理

模型

总共使用了12个模型进行集成。

  • EfficientNet B4/B5/B6/B7 - Unet
  • EfficientNetV2 S/M/L - Unet
  • ConvNeXt T/S/B - DeeplabV3+
  • Swin B/L - Unet

训练

  • 数据被调整为x0.25比例(对于GTEx数据,在重新缩放到0.4 um像素大小后),并随机裁剪为512x512大小
  • 训练120个epoch
  • 损失函数:BCE loss + Dice loss
  • 优化器:Adam
  • 学习率策略:带预热 的余弦衰减
  • 使用了比平时比赛更强的数据增强
  • 使用ImageNet预训练骨干网络
  • 在Kaggle内核的TPU或Colab Pro上训练
  • 所有模型均使用TensorFlow训练
  • 所有数据均用于训练(未使用kFold交叉验证)

外部数据

我从GTEx Portal下载了外部数据,并为它们制作了伪标签。由于GTEx的.svs图像分辨率太高,在制作伪标签之前将它们裁剪成图块。如果伪标签的掩码区域太小或没有掩码,则排除该图块。伪标签经过人工检查,如果明显错误则进行修改或移除。这些数据通过与原始标记数据混合用于训练。最终,来自40个样本的共650个图块被用于训练。这使我的Hubmap排行榜分数提高了约0.02。

TTA(测试时增强)

虽然我最多可以使用8种组合模式,但由于9小时的运行时间限制,我将其减少到四种。比例是根据x0.25的训练比例选择的。

  • 5种比例 x 4种模式 = 每个模型20次TTA
  • 5种比例:0.19, 0.21, 0.23, 0.25, 0.28
  • 4种模式:原始, 左右翻转, 上下翻转, 旋转90度

后处理

虽然没有明确的证据,但特别是对于“脾脏”和“肺”,掩码的边界比较模糊,所以我尝试放大或缩小掩码并在排行榜分数上确认效果。结果,缩小脾脏和肺的预测掩码提高了我的排行榜分数。我没有在最终提交之一中包含后处理,因为我认为存在过拟合公共数据的可能性。然而,如果包含后处理,最终的私有排行榜分数会更好。后处理通过以下代码实现。

SHRINK = {'spleen': 10, 'lung': 10}

def post_proc(preds, organ):
    # preds: 二值化后的预测掩码
    
    if organ in SHRINK.keys():
        contours, _ = cv2.findContours(preds, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        preds = preds.astype(np.int8)
        preds_cont = np.zeros_like(preds)
        preds_cont = cv2.drawContours(preds_cont, contours, -1, 1, SHRINK[organ]*2)
        preds = (preds - preds_cont).clip(0, 1).astype(np.uint8)
    return preds
同比赛其他方案