菜单

自动锚框

相关源文件

YOLOv5 中的 AutoAnchor 系统是一种专门的机制,可自动优化锚框以提高对象检测性能。它会评估默认锚框与训练数据集的契合程度,并在必要时进行调整,以确保模型能够更好地检测各种形状和大小的对象。

目的与范围

AutoAnchor 主要有三个目的:

  1. 评估锚框与所用特定数据集的契合度
  2. 当默认锚框不理想时,使用 k-means 聚类生成优化后的锚框
  3. 通过遗传算法进一步优化锚框,以最大化检测潜力

本页重点介绍 AutoAnchor 在 YOLOv5 中的技术实现和使用。有关通用检测过程的信息,请参阅 推断,有关模型架构的详细信息,请参阅 模型架构

AutoAnchor 在 YOLOv5 中的作用

AutoAnchor 通常在训练过程的早期阶段调用,以确保模型从适合特定数据集的锚框开始训练。

来源:utils/autoanchor.py28-63

关键组件和指标

AutoAnchor 依赖几个关键指标来评估锚框性能

指标描述代码参考
最佳召回率 (BPR)锚框能够有效捕获的真实框的百分比utils/autoanchor.py40-42
阈值以上锚框数 (AAT)每个目标超过阈值比率的平均锚框数utils/autoanchor.py40-41
比率指标衡量每个锚框与真实框尺寸的匹配程度utils/autoanchor.py38-39

阈值(默认为 4.0)控制了锚框与真实框匹配的严格程度。较低的值需要更严格的匹配。

来源:utils/autoanchor.py28-42

锚框评估过程

AutoAnchor 首先评估当前锚框与数据集的契合程度

来源:utils/autoanchor.py28-50

锚框生成过程

当默认锚框不适合数据集时,AutoAnchor 会生成新的锚框

来源:utils/autoanchor.py66-175

实现细节

锚框契合度计算

锚框契合度函数评估一组锚框与数据集的契合程度

来源:utils/autoanchor.py89-99

锚框顺序检查

锚框需要按照相对于步长值的正确顺序排列

来源:utils/autoanchor.py17-24

使用 AutoAnchor

在训练流程中

AutoAnchor 在训练期间自动调用

来源:utils/autoanchor.py28-63

独立使用

您也可以独立运行锚框生成过程

来源:utils/autoanchor.py66-83

技术细节

K-means 初始化

该过程首先对真实框的归一化宽度和高度应用 k-means 聚类

  1. 根据输入图像尺寸缩放所有边界框
  2. 过滤掉极小的对象(< 2 像素)
  3. 应用 k-means 聚类以找到初始锚框形状
  4. 如果 k-means 失败,则回退到随机初始化

来源:utils/autoanchor.py124-145

遗传算法进化

遗传算法进一步优化锚框

  1. 从 k-means 生成的锚框开始
  2. 对于每一代
    • 以 0.9 的概率应用随机变异
    • 裁剪值以保持在合理范围内
    • 评估新锚框的契合度
    • 如果契合度提高,则保留新锚框
    • 持续进行,直到达到指定的代数

来源:utils/autoanchor.py160-173

实际考量

  • 阈值选择:默认阈值 4.0 对于大多数情况效果很好,但可以根据特定领域的需要进行调整。
  • 锚框数量:YOLOv5 通常每个检测层使用 3 个锚框(共 9 个),但这可以自定义。
  • 计算资源:锚框优化过程相对较快,但对于更大的数据集,计算量会增加。
  • 数据集特征:具有异常对象长宽比的数据集最能从 AutoAnchor 优化中获益。

来源:utils/autoanchor.py28-63 utils/autoanchor.py66-175

输出示例

当 AutoAnchor 运行时,它会提供关于锚框契合度的信息性输出

AutoAnchor: 2.51 anchors/target, 0.994 Best Possible Recall (BPR). Current anchors are a good fit to dataset ✅

或者,如果锚框需要改进

AutoAnchor: 0.83 anchors/target, 0.792 Best Possible Recall (BPR). Anchors are a poor fit to dataset ⚠️, attempting to improve...
AutoAnchor: Running kmeans for 9 anchors on 12934 points...
AutoAnchor: Evolving anchors with Genetic Algorithm: fitness = 0.8402
AutoAnchor: thr=0.25: 0.9945 best possible recall, 8.46 anchors past thr
AutoAnchor: Done ✅ (optional: update model *.yaml to use these anchors in the future)

来源:utils/autoanchor.py47-63 utils/autoanchor.py102-114