返回列表

13th Place Solution - 2.5D YOLO Ensemble with DBSCAN

653. BYU - Locating Bacterial Flagellar Motors 2025 | byu-locating-bacterial-flagellar-motors-2025

开始: 2025-03-05 结束: 2025-06-04 医学影像分析 数据算法赛
第 13 名解决方案 - 基于 DBSCAN 的 2.5D YOLO 集成

第 13 名解决方案 - 基于 DBSCAN 的 2.5D YOLO 集成

作者: Victor

合作者: Omar Alassane Issaka

发布时间: 2025 年 6 月 5 日

竞赛排名: 第 13 名

首先,我要感谢 @andrewjdarley@fautei 提供的优秀 Notebook,它们非常有用,同时也感谢 @yyyy0201 分享的宝贵见解和想法。

我很高兴在我投入时间的第一个竞赛中进入了前 50 名。

我的解决方案涉及集成 6 个 2.5D YOLO 模型并结合 DBSCAN 算法。我将从四个部分进行描述:标注、预处理、训练和后处理。

由于我只能使用 Kaggle 的计算资源,训练多个模型并定期计算我的 pipeline 的 CV 分数相当困难。

数据标注 (Labeling)

我使用了包含一个或多个马达的断层扫描图像(tomograms)。我还通过在我的训练集上运行推理 pipeline,随后进行视觉检查,修正了一些错误标注的数据。我没有使用来自不含马达的断层扫描图像的随机切片,因为它们大多是无效的噪声。然而,使用模型难以处理的硬负样本(hard negative slices)本可以提高结果。

来自 @brendanartley 的外部数据被调整为了低分辨率,我没有技术资源加载原始断层扫描图像并应用所需的预处理。因此,没有使用外部数据,尽管它本可以提高结果,因为 YOLO 在大量训练图像上表现更好。

我使用了沿 Z 轴包含马达中心的切片下方和上方的 3-4 个切片。边界框的大小为 24x24 和 30x30。

我将数据随机 split 为 80% 用于训练,20% 用于验证。在审查了两组中的切片后,我注意到断层扫描图像分布良好,这得益于一个幸运的随机种子。这有助于获得具有良好泛化能力的强单一模型。我还对验证集应用了一些增强,包括高斯模糊、中值模糊、平均模糊、CLAHE 和随机亮度对比度。

预处理 (Preprocessing)

预处理仅包含第 2 和第 98 百分位数的归一化。在推理期间,切片使用 letterbox 方法调整为 1024×1024。

我决定参加这个竞赛是为了 exclusively 专注于 2.5D 模型。在推理期间,给 YOLO 模型的输入是 RGB 切片,其中 Z-2 切片在 R 通道,Z+2 切片在 B 通道。在训练期间,Z-1 和 Z+1 切片用于 R 和 B 通道。使用下方和上方各 2 个切片时 LB 分数更好。

模型训练 (Training)

我的最终 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+(仍然可以改进)。

后处理 (Postprocessing)

对于每个模型,置信度阈值设置为 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

同比赛其他方案