653. BYU - Locating Bacterial Flagellar Motors 2025 | byu-locating-bacterial-flagellar-motors-2025
首先,我们要感谢竞赛主持人 @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 进行了方法构建。我们只是在此基础上添加了一些内容并创建了配置文件。
我们开发了两种主要模型配置,它们仅在“颈部”设计上有所不同:
convnextv2_base.fcmae_ft_in22k_in1k
convnextv2_base.fcmae_ft_in22k_in1k
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、精确率和召回率曲线来比较模型以估计性能。但这效果不太好。
我们的最终集成由三个主要部分组成:
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)
]
我们使用 concentration = 0.5 来选择切片,意味着我们只在一半的可用切片上进行预测以提高速度。
对于聚合预测,我们实验了具有以下参数的 HDBSCAN 聚类:
我们还添加了基于聚类大小的置信度调整,以 favor 更大的聚类。
tf_efficientnetv2_l.in21k_ft_in1k, resnext50_32x4d.fb_swsl_ig1b_ft_in1k, 和 caformer_b36.sail_in22k。它们的性能约为 0.8,都没有超过 ConvNeXt base。这可能发生在许多团队身上,但我们没有为私有排行榜选择得分最高的 Notebook。事实上,我们甚至没有选择前 5 名。
我们真正的最佳成绩: 单独使用第二个模型配置(与我们在集成中使用的不同的 epoch soup 组合)在私有排行榜上取得了 0.856 的成绩,这本应处于金牌区,表明 P2 特征实际上非常重要。