返回列表

17th Place Solution - Ultralytics + Timm

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

开始: 2025-03-05 结束: 2025-06-04 医学影像分析 数据算法赛
第 17 名解决方案 - Ultralytics + Timm
竞赛: BYU 细菌鞭毛马达竞赛 (BYU Bacterial Flagellar Motors Competition)
团队: Sergio Alvarez + Paradox (@sersasj, @iamparadox)
排名: 第 17 名
发布日期: 2025 年 6 月 5 日

BYU 细菌鞭毛马达竞赛 - 第 17 名解决方案

首先,我们要感谢竞赛主持人 @andrewjdarleym, @braxtonowens 以及 Kaggle 工作人员组织本次竞赛。下面,我们介绍 Sergio Alvarez + Paradox 团队 -- @sersasj, @iamparadox 的解决方案。

背景

背景与演变

在 CZII 竞赛中取得好成绩后,我们的第一个方法(虽然当时还未组队)是尝试 U-nets。然而,效果并不理想,最好的模型在公共排行榜上仅得分 ~0.5。

接下来,我实验了 Jun Koda 的模型,该模型使用 Timm 骨干网络配合简单的分类和分割头。我在公共排行榜上取得了 0.770 的成绩,但陷入了瓶颈。

在看到讨论区和公共 Notebook 中使用 YOLO 取得高分后,我决定测试它,并使用 YOLO10X 在公共排行榜上取得了 0.792 的成绩。这让我思考:如果简单的 Timm 骨干网络 + 基本头就能达到 0.770,为什么不使用已经具备成熟数据增强、损失函数、SOTA 特征融合颈部(neck)以及优化的边界框预测头的 YOLO Ultralytics 框架呢?

Paradox 和我探索了这个方法,下面是我们的解决方案!

解决方案概述

我们的第 17 名解决方案由 3 个类 YOLO 模型组成,使用 convnextv2_base.fcmae_ft_in22k_in1k 作为骨干网络。我们从 P4、P3 和 P2 提取特征用于颈部,并在 P3(步长 / 8)处使用单个头进行预测。

模型架构

我开始实施 Timm 集成,但有个比我更聪明的人已经做到了!我们要感谢 yjwong1999,我们基于他创建的 PR 进行了方法构建。我们只是在此基础上添加了一些内容并创建了配置文件。

我们开发了两种主要模型配置,它们仅在“颈部”设计上有所不同:

模型 1:

  • 骨干网络: convnextv2_base.fcmae_ft_in22k_in1k
  • 颈部: SPPF + C2PSA → 上采样 P4 并与 P3 拼接 → 头
模型 1 架构

模型 2:

  • 骨干网络: convnextv2_base.fcmae_ft_in22k_in1k
  • 颈部: SPPF + C2PSA → 上采样 P4,在 P2 处进行 adaptive_avg_pool2d,拼接 P3 和上采样后的 P4 → 头
模型 2 架构

Paradox 在看到 @tatamikenn 关于 YOLO 特性的优秀 Notebook 后,提出了移除 P5 尺度和特征的惊人想法。这一修改使我们在公共排行榜上的得分提高了约 0.015。
架构中的 adaptive_avg_pool2d/AVG 块来自 @yyyy0201 出色的 mhaf-yolo

训练配置

我们使用 80% 包含马达且信任度 (trust) = 4 的图像进行训练。此外,还使用了 80% 的 @bartley 外部数据集,信任度 = 0。其余部分用作验证。

我们使用了以下标准训练参数:

results = model.train(
    data=str(yaml_path),
    epochs=40,
    batch=2,
    imgsz=960,
    optimizer='AdamW',
    lr0=1e-4,
    lrf=0.1,
    warmup_epochs=0,
    dropout=0.1,
    project=str(RUNS_DIR),
    exist_ok=True,
    name=f"fold{fold_idx}",
    patience=100,   
    save_period=1,
    val=True,   
    mosaic=0.5,
    close_mosaic=0,
    mixup=0.4,
    flipud=0.5,
    scale=0.25,
    degrees=45,
    seed=42,
    deterministic=True,
    label_smoothing=0.1,  # 注意:实际上没起作用
    augment=True,
    device=0,
)

验证策略挑战

验证在整个竞赛过程中都是个问题。我们难以找到验证分数与公共排行榜表现之间的相关性,因为我们的模型在交叉验证 (CV) 中得分 0.97+,但在排行榜上的表现却不同。

我们在 epoch 选择方面也面临重大挑战,这导致了 这个讨论

为了缓解 epoch 选择问题,我们使用了 Model Soup 技术来平均多个 epoch 的权重。

最终,我们使用 mAP50、mAP50-95、精确率和召回率曲线来比较模型以估计性能。但这效果不太好。

最终提交细节

集成策略

我们的最终集成由三个主要部分组成:

  1. 第一个模型配置,标准训练
  2. 第一个模型配置,更多数据增强:
    T = [
        A.Blur(p=0.1),
        A.MedianBlur(p=0.1),
        A.ToGray(p=0.1),
        A.CLAHE(p=0.1),
        A.RandomBrightnessContrast(p=0.1),
        A.RandomGamma(p=0.1),
        A.ImageCompression(quality_upper=100, quality_lower=60, p=0.1),
        A.ShiftScaleRotate(p=0.1),
        A.GaussNoise(p=0.1),
        A.GaussianBlur(p=0.1),  
        A.UnsharpMask(p=0.1)
    ]
  3. 第二个模型配置,标准训练

推理策略

我们使用 concentration = 0.5 来选择切片,意味着我们只在一半的可用切片上进行预测以提高速度。

对于聚合预测,我们实验了具有以下参数的 HDBSCAN 聚类:

  • min_samples: 1
  • Cluster size: 4
  • EPS: 50
  • YOLO 阈值:0.4

我们还添加了基于聚类大小的置信度调整,以 favor 更大的聚类。

无效尝试

  • 替代骨干网络: 我们测试了 tf_efficientnetv2_l.in21k_ft_in1k, resnext50_32x4d.fb_swsl_ig1b_ft_in1k, 和 caformer_b36.sail_in22k。它们的性能约为 0.8,都没有超过 ConvNeXt base。
  • 更大模型: ConvNeXt base 已经相当巨大。ConvNeXt large 实际上表现更差,所以我们停止探索更大的架构。
  • 不同的头: 我尝试在头中使用 ConvNeXt 块,提高了 mAP50-95 但在排行榜上没有提升。

额外最佳成绩 (Bonus PB)

这可能发生在许多团队身上,但我们没有为私有排行榜选择得分最高的 Notebook。事实上,我们甚至没有选择前 5 名。

我们真正的最佳成绩: 单独使用第二个模型配置(与我们在集成中使用的不同的 epoch soup 组合)在私有排行榜上取得了 0.856 的成绩,这本应处于金牌区,表明 P2 特征实际上非常重要。

最佳成绩截图
同比赛其他方案