433. HuBMAP - Hacking the Kidney | hubmap-kidney-segmentation
祝贺所有的获胜者,也感谢主办方举办了如此成功的比赛,希望这能在未来造福医疗专业人员的工作。对于那些因榜单震动而感到遗憾的朋友们,我相信你们很快就会在另一个排行榜的顶端再次相见 :)
我很早就意识到 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。就是这样!更深的架构似乎没有带来太多收益。
对于预测,我使用了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的重要性,我没有选择那些模型。