bx, by, bw, 和 bh 通常表示的是相对于输入图像的边界框坐标,而不是特征图的坐标。这些值是通过将模型预测的相对偏移和缩放因子转换为实际尺寸得到的。让我们详细解释一下这个过程:

模型输出与实际坐标的转换

1. 模型输出与实际坐标的转换

YOLOv5:
  • 对每个网格单元,YOLOv5模型预测相对坐标(tx, ty, tw, th),这些值是相对于网格单元的位置以及预定义的锚点框的。
  • 输出通常是对目标边界框中心点和大小的相对偏移,必须根据网格的具体位置(grid_x, grid_y)以及锚点框的尺寸(pw,
    ph)来进行转换。
YOLOv8:
  • 与YOLOv5不同,YOLOv8直接预测边界框的绝对坐标。bx和by不再是相对偏移,而是通过加权后的中心点位置(由dx,
    dy控制)来直接计算。
  • 对于边界框的大小,YOLOv8不需要依赖锚点框尺寸,而是直接预测目标的绝对宽度和高度(dw, dh)。

2.特征图与输入图像的关系:

YOLOv5:
  • 特征图的分辨率是输入图像的一个低分辨率版本,假设输入图像尺寸为640x640,特征图的尺寸通常是80x80、40x40或其他更小尺寸(具体取决于网络架构和步长)。
  • **步长(stride)**定义了特征图中的一个像素在输入图像中对应多少像素,通常是输入尺寸与特征图尺寸的比例。例如,stride=8意味着每个特征图像素对应8个输入图像像素。
YOLOv8:
  • 处理方法类似,但是步长的应用变得更加直接,因为YOLOv8直接在绝对坐标空间内进行预测,特征图尺寸和步长关系与YOLOv5相似。

3.计算实际坐标:

  • 模型预测的偏移量和缩放因子需要转换为输入图像中的实际坐标。
  • bx 和 by 表示目标中心点的实际位置。
  • bw 和 bh 表示目标边界框的实际宽度和高度。

示例:从特征图到输入图像的转换

假设我们有以下参数:

  • 输入图像大小:640×640
  • 特征图大小:80×80
  • 步长(stride):640/80=8
  • 某个网格单元索引:grid_x = 3, grid_y = 4
  • 模型预测的偏移量:tx = 0.7, ty = 0.3
  • 锚点框尺寸(仅用于YOLOv5):pw = 10, ph = 13
    YOLOv5 计算
// 计算中心点偏移
float bx = sigmoid(tx) + grid_x;
float by = sigmoid(ty) + grid_y;

// 计算宽度和高度的缩放因子
float bw = pw * exp(tw); // 假设 tw = 1.2
float bh = ph * exp(th); // 假设 th = 0.8

// 将特征图上的坐标转换为输入图像上的坐标
bx *= stride;
by *= stride;
bw *= stride;
bh *= stride;

YOLOv8 计算

// 计算中心点偏移
float bx = (grid_x + sigmoid(dx)) * stride; // 假设 dx = 0.7
float by = (grid_y + sigmoid(dy)) * stride; // 假设 dy = 0.3

// 直接预测绝对宽度和高度
float bw = dw * input_image_width; // 假设 dw = 0.1
float bh = dh * input_image_height; // 假设 dh = 0.2

关键区别总结:

在这里插入图片描述

主要区别:

  • YOLOv5:需要使用锚点框(pw, ph)来计算 宽度 和 高度,并且 中心点位置 是通过相对网格坐标加上偏移量计算得到的。
  • YOLOv8:虽然 中心点计算 的过程与 YOLOv5 类似,使用 sigmoid(dx) 和 sigmoid(dy) 处理偏移量,但
    宽高预测 不再依赖于锚点框,直接预测目标的 绝对宽度 和 绝对高度,这使得 YOLOv8 的计算过程更为简化。

更多推荐