如何将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尺度下的实际像素坐标:
- 中心坐标解码
center_x = (sigmoid(tx) + grid_x) * downsample_ratiocenter_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
- 宽高解码
width = exp(tw) * anchor_widthheight = exp(th) * anchor_height
其中:
exp()函数保证宽高取值为正anchor_width/anchor_height是当前预测框对应锚框的宽高,COCO预训练权重的锚框固定为:- 13x13层对应锚框:
[116,90], [156,198], [373,326] - 26x26层对应锚框:
[30,61], [62,45], [59,119]
- 13x13层对应锚框:
操作步骤
- 先把2535个预测框按顺序拆分归属:前507个(13133)属于13x13特征层,后2028个(26263)属于26x26特征层
- 对每个预测框的
tx/ty执行sigmoid激活,再结合所属网格坐标、下采样倍率计算实际中心坐标 - 匹配对应锚框尺寸,结合
tw/th计算实际宽高 - 计算完成后所有坐标都会落在0~416的有效图像范围内,后续再按目标置信度阈值、NMS过滤冗余框即可
内容的提问来源于stack exchange,提问作者Jonathan_S
相关产品推荐
相关产品推荐

