返回列表

11th Place Solution - Utilizing High resolution, Annotations, and Unlabeled data

424. RANZCR CLiP - Catheter and Line Position Challenge | ranzcr-clip-catheter-line-classification

开始: 2020-12-14 结束: 2021-03-16 医学影像分析 数据算法赛
第11名方案 - 利用高分辨率、标注和无标签数据

第11名方案 - 利用高分辨率、标注和无标签数据

作者:YoonSoo | 比赛排名:第11名

恭喜获胜者。很荣幸能与众多杰出的头脑同台竞技。

首先,我将总结我的公开分数历史。

  1. efficientnet-b5 基线: 0.956
  2. 下采样卷积: 0.959
  3. 分割预训练: 0.963
  4. 其他优化: 0.966
  5. 5折交叉验证 (5fold): 0.970
  6. 伪训练 (*为简洁起见,我将 伪标签->训练 称为 伪训练*): 0.972
  7. 5折交叉验证 & b4, b6 集成: 0.972

这是我使用的模型架构。

Model Architecture

现在我将详细介绍我面临的3个主要问题及其解决方案。

1. 如何利用高分辨率? - 下采样卷积

我们得到了大于 2048x2048 分辨率的图像,在下采样时会丢失信息。正如许多人观察到的那样,增加分辨率可以大幅提高分数。

我想使用 2048x2048 分辨率,但这对于计算机显存来说太大了。因此,我使用了一个卷积层将图像从 2048x2048 下采样到 1024x1024,然后使用常规 CNN。GPU 显存使用量与直接输入 1024x1024 图像时几乎相同。这个想法灵感来源于 @ekydna 在 Cloud Organization 比赛 中的方法。

具体来说,我使用了以下伪代码。我将平均池化后的输入与下采样卷积后的输入进行了拼接。

def __init__():
    self.avgpool = nn.AvgPool2d(2)
    self.downconv = nn.Sequential(
        nn.Conv2d(1, 7, kernel_size=5, stride=2, padding=2, bias=False),
        nn.BatchNorm2d(7),
        nn.ReLU()
    )
def forward(x):
    x = torch.cat((self.avgpool(x), self.downconv(x)), dim=1)
    features = CNN(x)

2. 如何利用导管位置标注? - 预训练

我们得到了部分图像的额外导管位置标注,因此很自然地要找到一种利用这些信息的方法。我首先想到的是分割模型,因此从一开始,我就将标注处理成分割掩码并使用了 UNet 架构。

起初,我尝试使用多任务学习,但没能成功。我怀疑当模型同时存在分割损失时,很难从中提取出分类损失。

后来,我尝试了预训练方法,结果奏效了。我仅使用分割损失预训练 UNet,然后使用预训练的 UNet 编码器进行分类训练。你需要增加分割 BCE 损失的正样本权重 才能使其正常工作。

此外,我尝试将掩码预测拼接到图像输入上,但这没能提高 CV 分数。

3. 如何利用无标签数据? - 伪训练

有很多外部数据集,例如 讨论帖 中列出的那些,我们可以用于比赛。但问题是,它们没有标签。所以问题变成了如何利用无标签数据。我尝试了两种方法:预训练和伪训练。

最近,有很多关于自监督学习的研究利用大量无标签数据,特别是计算机视觉中的对比学习。我用 SWAV 和 SIMSIAM 进行了实验。我在这些对比预训练方法上花了2周时间,但不幸的是,它没有提高分数。

另一方面,伪训练奏效了。我用有标签数据集训练了 5

同比赛其他方案