653. BYU - Locating Bacterial Flagellar Motors 2025 | byu-locating-bacterial-flagellar-motors-2025
首先,我要感谢 @andrewjdarley 和 @fautei 提供的优秀 Notebook,它们非常有用,同时也感谢 @yyyy0201 分享的宝贵见解和想法。
我很高兴在我投入时间的第一个竞赛中进入了前 50 名。
我的解决方案涉及集成 6 个 2.5D YOLO 模型并结合 DBSCAN 算法。我将从四个部分进行描述:标注、预处理、训练和后处理。
由于我只能使用 Kaggle 的计算资源,训练多个模型并定期计算我的 pipeline 的 CV 分数相当困难。
我使用了包含一个或多个马达的断层扫描图像(tomograms)。我还通过在我的训练集上运行推理 pipeline,随后进行视觉检查,修正了一些错误标注的数据。我没有使用来自不含马达的断层扫描图像的随机切片,因为它们大多是无效的噪声。然而,使用模型难以处理的硬负样本(hard negative slices)本可以提高结果。
来自 @brendanartley 的外部数据被调整为了低分辨率,我没有技术资源加载原始断层扫描图像并应用所需的预处理。因此,没有使用外部数据,尽管它本可以提高结果,因为 YOLO 在大量训练图像上表现更好。
我使用了沿 Z 轴包含马达中心的切片下方和上方的 3-4 个切片。边界框的大小为 24x24 和 30x30。
我将数据随机 split 为 80% 用于训练,20% 用于验证。在审查了两组中的切片后,我注意到断层扫描图像分布良好,这得益于一个幸运的随机种子。这有助于获得具有良好泛化能力的强单一模型。我还对验证集应用了一些增强,包括高斯模糊、中值模糊、平均模糊、CLAHE 和随机亮度对比度。
预处理仅包含第 2 和第 98 百分位数的归一化。在推理期间,切片使用 letterbox 方法调整为 1024×1024。
我决定参加这个竞赛是为了 exclusively 专注于 2.5D 模型。在推理期间,给 YOLO 模型的输入是 RGB 切片,其中 Z-2 切片在 R 通道,Z+2 切片在 B 通道。在训练期间,Z-1 和 Z+1 切片用于 R 和 B 通道。使用下方和上方各 2 个切片时 LB 分数更好。
我的最终 pipeline 集成了 6 个 YOLO 模型:8s, 9s, 10m, 2x 11s, 11m。
训练参数:
- epochs: 50
- batch: 8 - 16
- imgsz: 960
- dropout: 0.1
- lr0: 0.0001 - 0.0005
- lrf: 0.1
- weight_decay: 0.0005 - 0.001
- scale: 0.4
- mixup: 0.1 - 0.2
- copy_paste: 0.0
- mosaic: 1
我还修改了默认的 YOLO 增强。它们与我应用于验证集的增强相同。
我注意到高分辨率的断层扫描图像不包含任何马达,但正如我在预处理部分所说,我没有使用硬负样本。我的模型是在分辨率大约在 920 到 1000 之间的断层扫描图像上训练的。
我最好的单一模型(8s, 11s)得分均为 0.83+(仍然可以改进)。
对于每个模型,置信度阈值设置为 0.35,并保留前 10 个检测结果。
我在推理期间使用了 TTA(水平翻转、垂直翻转),但我没有使用 NMS 或 WBF 合并 TTA 检测结果。我决定使用 DBSCAN 集成检测结果。我归一化了检测结果的 3D 坐标。选择 eps 参数比较简单,我将其设置为 0.02。选择 min_samples 参数更具挑战性。基于我在公共 LB 上的结果,为了避免在私有 LB 上遗漏真阳性,我将其设置为 22。
我注意到沿 X 或 Y 轴拉长的簇更有可能是假阳性,而有效的检测结果通常沿 Z 轴拉长,但我没有跟进这个想法。
在推理期间,3 个模型在偶数切片上运行,3 个模型在奇数切片上运行。
这是一个有趣的挑战,得益于域偏移(domain shift),我学到了很多。
感谢阅读,
Victor