返回列表

41st place solution

596. SenNet + HOA - Hacking the Human Vasculature in 3D | blood-vessel-segmentation

开始: 2023-11-07 结束: 2024-02-06 医学影像分析 数据算法赛
第41名解决方案 - 血管分割竞赛

第41名解决方案

作者: Jow 和 Muku(团队成员)
竞赛: 血管分割
排名: 第41名

首先,我们要感谢Kaggle和组织者举办了这场卓越的比赛。通过参加这次竞赛,我们对医学影像识别的挑战和方法有了更深入的理解。

引言

我们团队提交了解决方案的多个版本:

  • 我提交了一个se_resnext101_32x4d和Vision Transformer(mit_b2)的集成模型,在公开排行榜上获得了0.834的分数。私有排行榜分数为0.586
  • @ryosukesaito提交了EfficientNet和SE-ResNeXt的集成模型,在公开排行榜上获得了0.857的分数。私有排行榜分数为0.519
  • @ryosukesaito提交的高公开排行榜分数可能是我们能够提交我较为雄心勃勃的notebook的一个促成因素,这最终使我们赢得了银牌。

我的(@jooott)解决方案

概述

关键点

我在稳定训练过程方面遇到了很大困难。

  • 为了解决这个问题,我使用了梯度累积批次(Accumulate Grad Batches)来有效地将批次大小增加到128,从而稳定了训练。
  • 分数显著提高的主要因素是应用了更强的数据增强。数据增强策略受到了Vesuvius挑战赛 - 墨水检测第一名解决方案的启发。
  • 我认为将训练图像从512px放大到1024px也对分数提升有所贡献。

train_transform = A.Compose(
            [
                A.RandomScale(
                    scale_limit=(1.0, 1.20),
                    interpolation=cv2.INTER_CUBIC,
                    p=0.1,
                ),
                A.RandomResizedCrop(
                    image_size,
                    image_size,
                    scale=(0.8, 1.0),
                    p=1
                ),
                A.RandomBrightnessContrast(p=0.75),
                A.ShiftScaleRotate(p=0.75),
                A.OneOf([
                        A.GaussNoise(var_limit=[10, 50]),
                        A.GaussianBlur(),
                        A.MotionBlur(),
                        ], p=0.4),
                A.CoarseDropout(
                    max_holes=1, max_width=int(image_size * 0.1),
                    max_height=int(image_size * 0.1),
                    mask_fill_value=0, p=0.5),
                A.CLAHE(p=0.2),
                A.GridDistortion(num_steps=5, distort_limit=0.3, p=0.05),
                ToTensorV2(transpose_mask=True),
            ]
        )

Muku(@ryosukesaito)的解决方案

关键点

  • 在我的架构中,预测血管区域之前会先执行肾脏区域的检测/分割。

    • 检测有助于推理加速(特别是在yz/zx方向),因为可以跳过未检测到肾脏的帧中的血管分割,并能通过裁剪减小图像尺寸。
    • 分割掩码用于减少肾脏外部的假阳性(FP)。
    • 对于这两种标注,我使用了LangSAM (luca-medeiros/lang-segment-anything: SAM with text prompt)。这使得我能够通过少量手动调整来准备标注数据。
    • 我使用YOLOv8n进行检测,使用EfficientNet-B0进行分割。
  • 各种预处理/后处理轻微但稳定地提高了LB/PB分数。

    • 在yz/zx轴图像中,边缘的血管可能被切断。由于该区域的推理准确性较差,我通过在推理前使用镜像填充伪闭合血管来提高推理准确性。

    • 对结果进行二值化后,血管预测区域可能会出现如下所示的缺陷。因此,我添加了形态学闭合和fillPoly处理作为后处理步骤。这些在CV/LB/PB中略微提高了分数。

  • 在我的实验中,提高泛化能力的想法(强增强、伪标签等)未能作为最终提交,因为它们导致CV/LB下降...然而,我后悔不应该过于关注不稳定的CV/LB,因为这个比赛的样本量不够大。

同比赛其他方案