639. CZII - CryoET Object Identification | czii-cryo-et-object-identification
感谢 Kaggle 和主办方举办这次有趣的比赛。
我喜欢这次比赛的一点是,主办方提供了基线代码(尤其是数据处理部分),这对于像我这样对该领域没有知识的人非常有帮助。
我参加这次比赛的另一个原因是我想基于 accelerate 库编写训练代码(我之前使用纯 PyTorch)。
既然我排名靠前,我认为我的训练代码没有严重的 bug。
在开始这次比赛之前,我以为这是一个目标检测 (OD) 任务,而不是分割任务,直到 @hengck23 发布了他优秀的 notebook。
我的解决方案基于 3D U-Net,并使用 cc3d 进行后处理。对所有 7 种粒子使用交叉熵损失 (Cross Entropy loss)。
我的最佳解决方案是骨干网络为 ResNet101 的 4 折 (7 折交叉验证) 平均集成。
我想提到的一点是,我的最佳解决方案在公共排行榜 (Public LB) 和私有排行榜 (Private LB) 上的得分相同 (0.783)。
我使用了来自 segmentation_models_pytorch_3d 的代码。
最佳解决方案是 U-Net + ResNet101。
我也尝试了不同架构和不同骨干网络,但 U-Net + ResNet101 在公共排行榜上表现最好。
我没有深入挖掘代码,因此主要使用了这些模型的默认参数。
我使用了 EMA (指数移动平均),因为它比 SWA (随机权重平均) 更容易处理,虽然我记得有说法称 SWA 比 EMA 更好。
我训练模型时输入尺寸为 (64, 128, 128),但推理时使用 (64, 256, 256),这在公共排行榜上带来了 0.001 的提升。
考虑到评估分数的计算方式,我在训练期间使用了原始半径的一半,根据我的实验这也是最好的设置。
考虑到我们拥有的数据稀缺,很明显数据增强将对这次比赛有很大帮助。
我使用了以下方法:
使用了 2 种 TTA,输出与原始输出进行平均: