596. SenNet + HOA - Hacking the Human Vasculature in 3D | blood-vessel-segmentation
首先我要感谢主办方举办这场精彩的比赛,我非常喜欢参与这次竞赛!我还要感谢@hengck23的宝贵且有趣的评论,我从中学到了很多!由于我的解决方案受到了6个月前凝结尾迹竞赛获胜方案的启发,我也想感谢@junkoda!
受到@junkoda获胜方案的启发,模型在4面板图像上进行训练,这些图像由连续切片的256像素大小块组成(创建512像素×512像素的图像)。因此,我能够在2D图像中保持2.5D的维度。其思想是模型会学习切片之间的关系,从而预测出更连续的分割结果。
256像素的块是使用EMPatches库制作的。这使得从每个4面板图像中拼接单独的256像素块变得更加容易。
图像基于整个肾脏的百分位数进行归一化。所有低于0.5的值都被限制为0.5,以更好地归一化背景:
lo, hi = np.percentile(kidney_volume.numpy(), (2, 98))
def preprocess_image(image, lo, hi):
image = image.to(torch.float32)
image = (image - lo) / (hi - lo)
image = torch.clamp(image, min=0.5)
return image
我使用了简单的训练数据增强:
train_transform = A.Compose([
A.RandomRotate90(p=1),
A.HorizontalFlip(p=0.5),
A.VerticalFlip(p=0.5),
A.RandomBrightness(p=1),
A.OneOf(
[
A.Blur(blur_limit=3, p=1),
A.MotionBlur(blur_limit=3, p=1),
],
p=0.9,
),
])
对我来说不起作用的是基于图像缩放的增强。
提交部分:4面板图像中的每个块分别进行旋转。然后取旋转后块的平均值。同时取各个4面板图像中所有块的平均值。这些块使用'max'设置进行合并。这是对整个肾脏体积进行xy、xz、yz旋转后执行的。
在这些4面板图像上训练的模型是使用segmentation models pytorch (SMP)的Unet maxvit_tiny_tf_512。模型在3个完整肾脏体积旋转上进行训练,块之间重叠0.4(约490,000张不同的图像)。模型先用1e-4的学习率训练了9个epoch,然后用CosineAnnealingLR调度器在接下来的6个epoch中将学习率降至1e-6。
```