第4名解决方案:CSN 是 3D 任务所需的一切
第4名解决方案:CSN 是 3D 任务所需的一切
作者:Selim Seferbekov (Kaggle Grandmaster)
我着手这项挑战赛的时间非常晚,在截止日期前10天才提交了第一次结果,因此无法进行大量的实验。我使用了 GI tract segmentation challenge(胃肠道分割挑战赛)和 NASA 彗星检测挑战赛中的代码库和技巧。
太长不看版 (TLDR)
采用两阶段方法:3D 分割 + 针对每个椎体裁剪区域的 3D 分类。
主要技巧
许多尝试使用 3D 网络进行分类失败的案例都与过拟合有关。这对于纯 3D 卷积来说很常见,通常我们并不需要它们,我们可以轻松使用那些在视频/动作分类数据集上达到最先进性能的架构。
所以选项如下:
- 膨胀一些最先进的 2D 网络,比如 EfficientNets,但从第 2 或第 3 个 block 开始使用 3D。这虽然有效,但仍然倾向于过拟合,而且在这种情况下 ImageNet 预训练并不是最好的选择。
- 使用带有 LSTM/ConvLSTM/Transformer 头部的 2D 网络。这行得通并且允许使用很多架构,主要问题在于 3D 特性仅在最后阶段才被考虑到。
- 使用在 ig65m/kinetics 数据集上预训练的网络。这对我来说效果最好。
从 Papers With Code 可以清楚地看出,2022 年视频分类的最佳卷积架构仍然是 ir-CSN-152。尽管 Transformers 在 Kinetics 数据集上取得了更高的分数,但它们在像 RSNA 这样的小型数据集上表现不如 CSN;如果需要快速且准确的 3D 分割和/或分类,CSN 是小型数据集的最佳选择。
我使用了 mmaction2 的 CSN 实现。
分割 (Segmentation)
- 类 UNet 的多类分割器
- 编码器:ir-CSN-50
- 解码器:带有 nn 上采样的标准 unet 解码器,但使用了 (2+1)d convolutions
- 解码器中的纯 3D 卷积会导致 amp 训练中出现 NaN
训练:
- 沿 z 轴 2x 子采样(仅切片 ::2)
- 2x 线性下采样图像
- 内存映射以减少 IO/CPU 开销
- AdamW + weight decay,余弦学习率退火
- 损失函数:focal-jaccard 优化损失,用于更快的多类 jaccard 计算
- 2D 数据增强,Albumentations 库中的 ReplayCompose,轻量级几何增强 + 水平翻转
分类 (Classification)
- 4 折 ir(ip)-CSN-152,带有全局最大池化
- 多标签 8 类,如果椎体可见部分少于 30%,则将该椎体的标签设为 0 并重新计算总标签,否则保持原样
训练
- 3 通道输入(图像,图像,整数编码的分割掩码)
- 沿 z 轴 2x 子采样(仅切片 ::2)
- 使用每个椎体周围的 40 个切片(原始数据中为 80 个)
- 裁剪区域调整为 256x256
- BCE 损失
- 目标指标作为验证标准
- AdamW + weight decay,余弦学习率退火
- 数据增强:2D 增强,Albumentations 库中的 replay compose,翻转,旋转,几何变换。相比分割流程,这里需要做更多的增强