返回列表

28th Place Solution with inference code

433. HuBMAP - Hacking the Kidney | hubmap-kidney-segmentation

开始: 2020-11-16 结束: 2021-05-10 医学影像分析 数据算法赛
第28名方案及推理代码

第28名方案及推理代码

作者:datasaurus | 排名:第28名

祝贺所有的获胜者,也感谢主办方举办了如此成功的比赛,希望这能在未来造福医疗专业人员的工作。对于那些因榜单震动而感到遗憾的朋友们,我相信你们很快就会在另一个排行榜的顶端再次相见 :)

交叉验证(CV)策略

我很早就意识到 d488c759a 这个样本导致公共排行榜与CV不一致,所以我通常忽略公共LB,只是宽松地将其视为第6个折。为了防止训练期间图像之间的泄漏,我的其他5个折简单地设置如下:

folds = [
    ["aaa6a05cc", "26dc41664", "b9a3865fc"],
    ["2f6ecfcdf", "c68fe75ea", "e79de561c"],
    ["1e2425f28", "b2dc8411c", "afa5e8098"],
    ["0486052bb", "cb2d976f4", "54f2eec69"],
    ["4ef6695ce", "8242609fa", "095bf7a1f"],
]

虽然我在训练期间确实跟踪了每个图块的Dice系数,但我通过计算全分辨率袋外预测的Dice系数来确定最终的CV分数(正如提交notebook中所做的那样)。

预处理

我使用的图块大小为2048,在输入模型之前被调整为1024。重叠度为32(尽管我认为这没有太大区别)。

我还利用JSON文件创建了一个定义掩膜边缘的多边形(因为在这个任务中,正确处理边缘很重要)。这允许我将其视为一个双通道分割问题,尽管我在预测时只使用其中一个通道。

数据增强

trfm = A.Compose(
    [
        A.Resize(img_size_model, img_size_model),
        A.Flip(),
        A.RandomRotate90(),
        A.ColorJitter(p=1),
        A.OneOf(
            [
                A.ElasticTransform(),
                A.GridDistortion(),
                A.Blur(blur_limit=(3, 5)),
            ],
            p=0.5,
        ),
        A.ShiftScaleRotate(),
        A.Normalize(),
        ToTensorV2(),
    ]
)

模型

使用ResNet34d和ResNet50d作为骨干网络的UNet。就是这样!更深的架构似乎没有带来太多收益。

  • 损失函数 = 0.9 Focal Loss + 0.1 Lovasz
  • MixUp,alpha=0.25
  • 没有使用CutMix。当我观察使用CutOut增强时的预测结果,肾小球与非肾小球区域之间的切割边界会导致一些掩膜溢出,这让我对使用CutMix感到不安。CV变化也在噪声范围内。
  • 随机权重平均
  • AdamW(lr=0.0001)

提交/后处理

对于预测,我使用了256的重叠度。这意味着在某些图像的角落,你可能会得到4个需要相应加权的预测。我通过创建一个权重矩阵并将完整预测除以此矩阵来做到这一点。Notebook中的RAM太小,无法在内存中同时保存预测数组和权重数组,所以我在GPU上进行了此操作。掩膜阈值为0.5。对于TTA(测试时增强),我只使用了翻转变换。

骨干网络 CV Public Private
ResNet34D 0.94037 0.917 0.947
ResNet50D 0.93859 0.916 0.946

0.7:0.3 加权 = 0.947

我确实有一些使用提供的测试图像进行伪标记的模型,分数达到了0.948,但CV没有那么好,所以考虑到在这次比赛中信任CV的重要性,我没有选择那些模型。