下面用简化的小尺寸图像+具体数值来一步步演示整个映射过程。
一、设定示例基础参数
为了计算方便,我把参数简化(核心逻辑和原论文一致):
- 原始图像尺寸:
宽=420像素,高=420像素(正方形,方便计算) - YOLOv1 网格划分:
S=7(和论文一致),即 7×7 网格 - 单个网格尺寸:
420/7 = 60像素(每个网格是 60×60 像素) - 选取目标网格:第
i=2行、第j=3列的网格(行列从0开始计数) - 该网格预测的单个边界框输出值:
bx=0.5, by=0.4, bw=0.6, bh=0.5
二、分步计算映射过程
步骤1:计算目标网格的左上角像素坐标
网格行列数决定了其在原图的基础位置:
- 网格左上角 x 坐标:
j × 网格宽度 = 3 × 60 = 180 像素 - 网格左上角 y 坐标:
i × 网格高度 = 2 × 60 = 120 像素
→ 这个网格覆盖原图的区域是:x(180-240)、y(120~180) 像素。
步骤2:映射边界框中心坐标到原图
YOLOv1 输出的 bx/by 是网格内的相对偏移(0~1),需先转换为网格内像素偏移,再加上网格左上角坐标:
- 中心x像素偏移(网格内):
bx × 网格宽度 = 0.5 × 60 = 30 像素 - 中心y像素偏移(网格内):
by × 网格高度 = 0.4 × 60 = 24 像素
→ 边界框中心在原图的绝对坐标:
- 中心x:
网格左上角x + 网格内x偏移 = 180 + 30 = 210 像素 - 中心y:
网格左上角y + 网格内y偏移 = 120 + 24 = 144 像素
步骤3:映射边界框宽高到原图
YOLOv1 输出的 bw/bh 是相对于整张图像的比例(0~1),直接乘以原图宽/高即可:
- 边界框宽度(原图像素):
bw × 原图宽度 = 0.6 × 420 = 252 像素 - 边界框高度(原图像素):
bh × 原图高度 = 0.5 × 420 = 210 像素
步骤4:转换为矩形框的左上角/右下角坐标(可视化用)
有了中心坐标和宽高,就能算出绘制矩形框需要的坐标:
- 左上角x1:
中心x - 宽度/2 = 210 - 252/2 = 210 - 126 = 84 像素 - 左上角y1:
中心y - 高度/2 = 144 - 210/2 = 144 - 105 = 39 像素 - 右下角x2:
中心x + 宽度/2 = 210 + 126 = 336 像素 - 右下角y2:
中心y + 高度/2 = 144 + 105 = 249 像素
三、示例结果汇总表
| 类型 | YOLOv1输出值 | 映射计算过程 | 原图像素值 |
|---|---|---|---|
| 网格内x偏移 (bx) | 0.5 | - | - |
| 网格内y偏移 (by) | 0.4 | - | - |
| 相对宽度 (bw) | 0.6 | - | - |
| 相对高度 (bh) | 0.5 | - | - |
| 边界框中心x | - | 3×60 + 0.5×60 | 210 像素 |
| 边界框中心y | - | 2×60 + 0.4×60 | 144 像素 |
| 边界框宽度 | - | 0.6×420 | 252 像素 |
| 边界框高度 | - | 0.5×420 | 210 像素 |
| 矩形框左上角 (x1,y1) | - | (210-126, 144-105) | (84, 39) |
| 矩形框右下角 (x2,y2) | - | (210+126, 144+105) | (336, 249) |
四、可视化理解
你可以想象这张420×420的原图被划成7×7的小格子:
- 第2行第3列的格子在原图的位置是:横向180-240像素,纵向120~180像素;
- 预测的边界框中心落在这个格子里:横向偏右50%(30像素)、纵向偏下40%(24像素)的位置;
- 最终画出的矩形框会从(84,39)到(336,249),覆盖原图的对应区域。
总结
- 中心坐标映射:核心是「网格位置(j/i×网格尺寸) + 网格内偏移(bx/by×网格尺寸)」,把相对网格的偏移转为原图绝对像素;
- 宽高映射:直接用「相对比例(bw/bh)× 原图宽/高」,把相对比例转为绝对像素;
- 坐标转换:中心坐标±宽高/2,即可得到可视化所需的矩形框对角坐标。
这个例子的数值是简化过的,但完全复现了YOLOv1坐标映射的核心逻辑,无论图像尺寸、网格数如何变化,计算方法都完全一致。