YOLOV5 -anchors(从开天辟地开始分析)

该文章已生成可运行项目,

1. anchors是什么?

        在YOLOv5目标检测模型中,anchors(锚框) 是预定义的一组边界框参考尺寸,用于引导模型学习目标物体的位置和尺度。说白了就是框。这个框它可以分为两种,第一种是预先设置的框,第二种是预测的框。

2. 预先设置的框

        通过聚类算法(如k-means)在训练集上预先计算得到的固定尺寸框,代表数据集中常见目标的尺寸比例。比如yolov5在COCO数据集上聚合形成9个框 [weight, height]。

小目标锚框(P3/8):如[10,13],用于检测 COCO 中的小物体(如手机、杯子)。

中等目标锚框(P4/16):如[30,61],覆盖 COCO 中的中等尺寸物体(如狗、椅子)。

大目标锚框(P5/32):如[373,326],适配 COCO 中的大型物体(如飞机、火车)。

# YOLOv5s模型anchors配置
anchors:
  - [ 10,13, 16,30, 33,23 ]   # P3/8 尺度 (小目标)
  - [ 30,61, 62,45, 59,119 ]  # P4/16尺度 (中目标)
  - [ 116,90, 156,198, 373,326 ] # P5/32尺度 (大目标)
 

        如果我们将图片划分为80×80的小图片 (用来检测小目标),我们会将[10,13], [16,30], [33,23]这三个框的中心位置与每个小图片中心位置对齐(也就是每个小图片的中心点我都会放三个框)。中目标与大目标同理。然后配合模型得到的一些参数,从而得到预测的框,具体步骤如下:

步骤一:计算网格中心点坐标

        对于输入图像(假设 640×640),每个网格的大小为 8×8 像素(640÷80=8)。网格(i,j)的中心点坐标为:

center_x = (j + 0.5) × 8 # j是列索引
center_y = (i + 0.5) × 8 # i是行索引
 

步骤二: 放置锚框

        以网格中心点为中心,放置 3 个锚框,宽高分别为[10,13], [16,30], [33,23]。例如,网格(10,20)的中心点为(164,84),则 3 个锚框为:

锚框 1:中心(164,84),宽 10,高 13
锚框 2:中心(164,84),宽 16,高 30
锚框 3:中心(164,84),宽 33,高 23

步骤三:模型参数与预测框的生成

        模型会为每个锚框预测 4 个参数(偏移量)和 1 个置信度:

        4 个偏移量:(tx, ty, tw, th)
        (tx, ty):中心点的偏移量(相对于网格)
        (tw, th):宽高的缩放因子
        1 个置信度:conf(表示该锚框包含目标的概率)

3.预测的框

        预测的框是模型通过学习后输出的、用于定位目标的矩形框,是最终用于标注目标位置的结果。它并非凭空生成,而是以预设锚框为基础,通过模型预测的 “修正参数” 调整得到。

        我们通过模型得到的参数(4个偏移量和1个置信度)通过修改预先设置的框来得到预测框,如何操作?往下看。

预测框的计算公式。
#预测中心点坐标
pred_x = (torch.sigmoid(tx) * 2 - 0.5 + j) * stride
pred_y = (torch.sigmoid(ty) * 2 - 0.5 + i) * stride
#预测框宽高的坐标
pred_w = anchor_w * (torch.sigmoid(tw) * 2)**2
pred_h = anchor_h * (torch.sigmoid(th) * 2)**2
 

 

这样我们找到预测框的中心点和宽高,那么找到目标物体就不是什么难事了。

4.补充

问题1:对于预先设置的框是比如说小物体三个框都要参与训练还是先筛选一个框再进行训练?

        在目标检测(如 YOLO 系列)中,预设锚框(Anchor Boxes)在训练时会全部参与,但会通过 “匹配机制” 筛选出与真实框(Ground Truth)最匹配的锚框负责预测,其他锚框则作为背景或次要样本处理。具体来说,不是提前筛选掉某个锚框,而是让所有锚框参与训练,但只让 “最合适” 的锚框承担主要损失(定位、分类等),其余锚框的损失计算会被弱化或调整。

具体分析:

1.核心逻辑:锚框与真实框的 “匹配机制”

        训练时,对于每张图像中的每个真实框(比如一个小物体),算法会从所有预设锚框(包括该网格的 3 个小目标锚框)中,自动匹配出 1 个(或少数几个)“最适合” 的锚框,让它负责学习这个真实框的特征(位置、类别等)。其他锚框如果与真实框匹配度低,则被视为 “背景”,只参与置信度损失(判断 “无目标”)的计算。

2.匹配机制的具体规则(以 YOLOv5 为例)

YOLOv5 中,锚框与真实框的匹配主要基于以下两个条件:

IoU(交并比)阈值匹配
计算每个锚框与真实框的 IoU,当 IoU 超过某个阈值(通常 0.25~0.5)时,认为该锚框与真实框相关;其中IoU 最大的锚框会被指定为 “主要负责锚框”。
中心位置匹配
真实框的中心点落在哪个网格内,就优先从该网格的 3 个锚框中选择匹配的锚框(比如小物体的真实框中心落在 80×80 网格的某个格子里,就优先从该格子的 3 个小目标锚框中匹配)。

3.为什么不提前筛选锚框?

保证多样性:不同小物体的形状可能差异较大(比如细长的小物体更适合[10,13],稍宽的小物体可能更适合[33,23]),保留所有锚框可以覆盖更多形状的目标。
动态适配:训练中真实框的形状是多样的,提前筛选会丢失潜在的匹配可能(比如某个小物体可能更适合[33,23]而非[10,13])。
损失平衡:所有锚框参与训练,但通过匹配机制让 “合适的锚框承担主要损失”,既能保证学习效率,又能避免漏检(如果提前筛掉某个锚框,可能刚好错过最适合的匹配)。

 

本文章已经生成可运行项目
### YOLOv5-cls 训练教程和配置方法 #### 加载YOLOv5-cls模型 为了加载预训练的YOLOv5-cls模型并准备用于自定义数据集的训练,可以使用`ultralytics`库中的`YOLO`类。这一步骤确保了模型能够被正确初始化。 ```python from ultralytics import YOLO model = YOLO('yolov5s-cls.pt') ``` 此处使用的'yolov5s-cls.pt'是一个假设路径,实际应用中应替换为具体的预训练权重文件位置[^2]。 #### 配置训练参数 对于YOLOv5-cls来说,调整一些关键参数有助于更好地适应特定的数据集: - `nc`: 类别数目的设置可以根据具体需求来更改。 - `depth_multiple` 和 `width_multiple`: 这两个参数用来控制网络的深度和宽度,从而影响计算量和精度之间的平衡。 - `anchors`: 锚框通常不需要手动设定,除非有特殊的应用场景需要更精确的对象尺寸分布表示。 这些参数可以在配置文件(`yaml`)里指定,例如: ```yaml train: ./data/images/train/ val: ./data/images/val/ nc: 10 # 假设有十个不同的类别 names: ['class_1', 'class_2', ..., 'class_10'] depth_multiple: 0.33 width_multiple: 0.50 ``` 此段描述基于对YOLO系列模型的理解及其常见实践方式[^4]。 #### 开始训练过程 一旦完成了上述准备工作之后,就可以调用`.train()`函数启动训练进程,并传递必要的参数给它,比如批次大小(batch size),轮次(epochs)等。 ```python results = model.train(data='path/to/data.yaml', epochs=100, batch_size=16, imgsz=640) ``` 这里假定已经有一个名为`data.yaml`的数据配置文件位于指定目录下,其中包含了关于训练集、验证集的信息以及其他可能需要用到的超参设置。 #### 测试与评估 完成训练后,可以通过预测接口测试新图片上的表现情况,同时保存结果以便后续分析。 ```python predictions = model.predict('./test_images/', save=True, imgsz=(640,640)) ``` 这段代码会读取测试图像并将推理得到的结果存储起来,方便查看分类效果如何。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值