424. RANZCR CLiP - Catheter and Line Position Challenge | ranzcr-clip-catheter-line-classification
恭喜获胜者。很荣幸能与众多杰出的头脑同台竞技。
首先,我将总结我的公开分数历史。
伪标签->训练 称为 伪训练*): 0.972这是我使用的模型架构。
现在我将详细介绍我面临的3个主要问题及其解决方案。
我们得到了大于 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)
我们得到了部分图像的额外导管位置标注,因此很自然地要找到一种利用这些信息的方法。我首先想到的是分割模型,因此从一开始,我就将标注处理成分割掩码并使用了 UNet 架构。
起初,我尝试使用多任务学习,但没能成功。我怀疑当模型同时存在分割损失时,很难从中提取出分类损失。
后来,我尝试了预训练方法,结果奏效了。我仅使用分割损失预训练 UNet,然后使用预训练的 UNet 编码器进行分类训练。你需要增加分割 BCE 损失的正样本权重 才能使其正常工作。
此外,我尝试将掩码预测拼接到图像输入上,但这没能提高 CV 分数。
有很多外部数据集,例如 讨论帖 中列出的那些,我们可以用于比赛。但问题是,它们没有标签。所以问题变成了如何利用无标签数据。我尝试了两种方法:预训练和伪训练。
最近,有很多关于自监督学习的研究利用大量无标签数据,特别是计算机视觉中的对比学习。我用 SWAV 和 SIMSIAM 进行了实验。我在这些对比预训练方法上花了2周时间,但不幸的是,它没有提高分数。
另一方面,伪训练奏效了。我用有标签数据集训练了 5