You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Tiny YOLOv3原始输出转换为像素级bounding box坐标

Tiny YOLOv3 原始输出坐标异常原因及解决方法

你拿到的数值是模型输出的原始预测偏移量(logits),并非最终归一化后的像素坐标,没有经过YOLO官方定义的坐标解码流程是无法直接使用的,这就是你看到中心为负、宽高异常的核心原因。

背景说明

Tiny YOLOv3在输入尺寸为416x416时,会输出2个不同下采样倍率的特征层:

  • 下采样32倍的13x13特征层,对应大尺寸目标检测
  • 下采样16倍的26x26特征层,对应中小尺寸目标检测
    每个特征层的每个网格点预设3个锚框,总预测框数量为 13*13*3 + 26*26*3 = 2535,和你提到的输出维度第一维完全匹配。你拿到的输出前4个值分别是tx(中心x偏移)、ty(中心y偏移)、tw(宽偏移)、th(高偏移),都是未经过激活函数映射的原始值,取值范围为(-∞, +∞),直接读取自然会出现负数、数值过大的问题。

坐标解码流程

你需要按照以下公式把原始偏移量转换为416x416尺度下的实际像素坐标:

  1. 中心坐标解码
    center_x = (sigmoid(tx) + grid_x) * downsample_ratio
    center_y = (sigmoid(ty) + grid_y) * downsample_ratio
    其中:
  • sigmoid() 函数会把tx/ty映射到0~1区间,保证中心偏移量落在当前网格内部,不会出现负值
  • grid_x/grid_y 是当前预测框所属的网格在特征层上的横、纵坐标,取值范围分别为012(13x13层)、025(26x26层)
  • downsample_ratio 是当前特征层的下采样倍率,13x13层取32,26x26层取16
  1. 宽高解码
    width = exp(tw) * anchor_width
    height = exp(th) * anchor_height
    其中:
  • exp() 函数保证宽高取值为正
  • anchor_width/anchor_height 是当前预测框对应锚框的宽高,COCO预训练权重的锚框固定为:
    • 13x13层对应锚框:[116,90], [156,198], [373,326]
    • 26x26层对应锚框:[30,61], [62,45], [59,119]

操作步骤

  • 先把2535个预测框按顺序拆分归属:前507个(13133)属于13x13特征层,后2028个(26263)属于26x26特征层
  • 对每个预测框的tx/ty执行sigmoid激活,再结合所属网格坐标、下采样倍率计算实际中心坐标
  • 匹配对应锚框尺寸,结合tw/th计算实际宽高
  • 计算完成后所有坐标都会落在0~416的有效图像范围内,后续再按目标置信度阈值、NMS过滤冗余框即可

内容的提问来源于stack exchange,提问作者Jonathan_S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:15:01