如何解码YOLOv8-n检测模型的.bin格式预测输出并提取检测结果?
解码YOLOv8-n原始.bin预测输出获取检测结果
步骤1:还原预测数组的正确维度
你读取的一维float32数组需要先还原成YOLOv8输出的张量形状,再调整维度顺序以匹配检测框的排列逻辑:
import numpy as np from ultralytics.utils import ops # 读取.bin文件 yolo_data_path = "你的预测文件路径.bin" array = np.fromfile(yolo_data_path, dtype=np.float32) # 还原为[1, 6, 10710]的形状,再转置为[1, 10710, 6](每个元素对应一个检测框的6个参数) pred = array.reshape(1, 6, 10710).transpose(0, 2, 1)
这里的6个参数顺序确实如你推测:x_center, y_center, width, height, confidence, class_id,其中x_center/y_center是框的中心相对图像的比例,width/height是框的宽高相对图像的比例。
步骤2:执行非极大值抑制(NMS)
YOLOv8的原始输出包含大量冗余框,必须通过NMS过滤掉重叠度高的低置信框,保留最优结果。直接用ultralytics官方的non_max_suppression函数即可:
# 假设输入图像尺寸为(640, 640),根据你的实际输入尺寸修改 img_shape = (640, 640) # (height, width) conf_thres = 0.25 # 置信度阈值,可按需调整 iou_thres = 0.7 # IOU阈值,可按需调整 # 执行NMS results = ops.non_max_suppression( pred, conf_thres=conf_thres, iou_thres=iou_thres, classes=None, # 仅检测猫和狗,可留空或指定[0,1] max_det=100 # 最大检测框数量 )
步骤3:解码并打印检测结果
NMS后的结果是一个列表,每个元素对应一张图像的检测框(这里仅单张),每个框的格式为[x1, y1, x2, y2, confidence, class_id],其中x1/y1是框的左上角绝对像素坐标,x2/y2是右下角绝对像素坐标:
# 类别映射,根据你训练时的类别顺序调整,示例0对应猫、1对应狗 class_names = ["猫", "狗"] # 遍历检测结果 for det in results: if len(det) == 0: print("未检测到目标") continue for *box, conf, cls in det: x1, y1, x2, y2 = map(int, box) class_name = class_names[int(cls)] print(f"检测到:{class_name} | 置信度:{conf:.2f} | 边界框:({x1}, {y1}) -> ({x2}, {y2})")
补充说明
- 若不想依赖ultralytics库,也可自行实现NMS逻辑,但官方函数已做边界裁剪、类别过滤等优化,更推荐使用。
- 图像尺寸
img_shape必须和模型推理时的输入尺寸完全一致,否则边界框坐标会出现偏差。
内容的提问来源于stack exchange,提问作者Mary H
相关产品推荐
相关产品推荐

