返回列表

2nd place solution

558. Vesuvius Challenge - Ink Detection | vesuvius-challenge-ink-detection

开始: 2023-03-15 结束: 2023-06-14 医学影像分析 数据算法赛

RTX23090 第二名解决方案

tattaka 和 mipypf 部分

摘要

  • 2.5D 和 3D 骨干网络及无需上采样的解码器
    • 1/32 分辨率对本任务已足够
    • 通过集中资源于编码器,可训练更多网络层
  • 强正则化

数据预处理

  • 使用 Group K-fold 进行验证,但因 ink_id=2 数据量较大,将其分为3部分
  • 输入分辨率:2.5D 模型为 256x256,3D 模型为 192x192
    • 为加速数据加载,将数据切割并存储为 32x32 的 npy 文件(推理时为 64x64)
  • 使用双线性插值将标签下采样至 1/32 分辨率
  • 对每个样本的输入图像进行归一化处理:
    mean = img.mean(dim=(1, 2, 3), keepdim=True)
    std = img.std(dim=(1, 2, 3), keepdim=True) + 1e-6
    img = (img - mean) / std

模型

  • images(batch_size x channel x group x height x width) -> 2D CNN 骨干网络 -> 逐点卷积2D 颈部 -> 3D CNN(类似 ResBlockCSN, 3或6个块) -> 平均+最大池化(z轴) -> 逐点卷积2D
    • 2D CNN 骨干网络:
      • resnetrs50
      • convnext_tiny
      • swinv2_tiny
      • resnext50
    • 使用的 channel/group 组合为 5x7 和 3x9(即使用65层中间的35层或27层)
    • 参考 @tereka模型架构
  • images(batch_size x 1 x layers x height x width) -> 3D CNN 骨干网络 -> 最大池化(z轴) -> 逐点卷积2D
    • 3D CNN 骨干网络:
      • resnet50-irCSN(层数: 32)
      • resnet152-irCSN(层数: 24)
  • 损失函数:bce + 全局 fbeta 损失(在批次中计算 fbeta 分数)

训练

  • 混合精度训练(amp)
  • EMA(衰减率=0.99)
  • 标签平滑(平滑系数=0.1)
  • drop_path_rate=0.2
  • cutmix + mixup + manifold mixup
  • 强数据增强:
    • cutout(修改为匹配输出分辨率 1/32)
    • 通道混洗(分割后组内混洗)
    • 以 0.5 概率在 z 方向随机平移 ±2 个体素
    • 其他变换:
      albu.Compose(
                  [
                      albu.Flip(p=0.5),
                      albu.RandomRotate90(p=0.9),
                      albu.ShiftScaleRotate(
                          shift_limit=0.0625,
                          scale_limit=0.2,
                          rotate_limit=15,
                          p=0.9,
                      ),
                      albu.OneOf(
                          [
                              albu.ElasticTransform(p=0.3),
                              albu.GaussianBlur(p=0.3),
                              albu.GaussNoise(p=0.3),
                              albu.OpticalDistortion(p=0.3),
                              albu.GridDistortion(p=0.1),
                              albu.PiecewiseAffine(p=0.3),
                          ],
                          p=0.9,
                      ),
                      albu.RandomBrightnessContrast(
                          brightness_limit=0.3, contrast_limit=0.3, p=0.3
                      ),
                      ToTensorV2(),
                  ]
              )

推理

  • fp16 推理
  • 步长=32
  • 使用 val_ink_id=(1, 2a) 上学习的权重
  • 测试时增强(TTA):
    • 水平/垂直翻转
    • 每次步长切换 TTA
  • @philippsinger 提出的 百分位数阈值
    • 始终预测相同数量的正样本,因此独立于模型性能,取决于 GT 的正负样本比例
    • 在除掩码外区域的所有像素上计算
    • 使用 0.9 和 0.93
    • 我们原以为 0.90 在私有榜表现更好,但最终 0.93 表现更佳!

yukke42 部分

摘要

  • 3D 编码器和 2D/1D 编码器
    • 1/2 或 1/4 分辨率预测
    • 非常简单的解码器

数据预处理

  • 将第2个片段垂直分割成两个图像:4折

模型

  • 3D CNN 编码器和 2D 编码器
    • 编码器基于 @samfc10 的 Notebook:Vesuvius Challenge - 3D ResNet Training
      • 移除第一个 CNN 后的最大池化
      • 在降低 D 维之前使用注意力机制
      • 使用 resnet18 和 resnet34
    • 解码器:
      • 单个 2D CNN 层
      • 使用最近邻插值上采样
    • 输出分辨率下采样至 1/2,然后使用双线性插值上采样
  • 3D transformer 编码器和线性解码器
    • 编码器:使用 PyTorch 官方实现的 MViTv2-s 及预训练模型
      • 修改前向函数以获取每个尺度的输出
      • 为可复现性将 MaxPool3d 替换为 MaxPool2d
    • 解码器:单个线性层和 patch expanding 用于上采样低分辨率 3D 图像
    • 输出分辨率下采样至 1/2 或 1/4,然后使用双线性插值上采样

训练

推理

  • fp16 推理
  • stride=75
    • 比 stride=112 更好
  • 忽略输出预测的边缘
    • 仅使用预测的红色区域(如下图所示)
      预测区域示意图

代码与推理笔记本

同比赛其他方案