OpenVINO person-detection-asl-0001模型输出坐标错误,无法正常绘制cv2矩形
解决person-detection-asl-0001检测框坐标异常问题
问题根源
person-detection-asl-0001的输出坐标是基于模型固定输入尺寸(384×672,高×宽)的绝对像素值,并非归一化数值。你看到的29012、127753这类超出图像范围的坐标,是因为直接把模型输入尺寸下的坐标套用到了原始图像(960×1280)上,没有做正确的尺寸映射。
修正后处理逻辑
需要把模型输出的坐标先转换为归一化值,再映射到原始图像的尺寸上,步骤如下:
- 取出模型固定输入尺寸:高度384,宽度672
- 将模型输出的xmin、xmax除以输入宽度,得到横向归一化坐标
- 将模型输出的ymin、ymax除以输入高度,得到纵向归一化坐标
- 用归一化后的坐标分别乘以原始图像的宽度(1280)和高度(960),得到适配原始图像的绝对坐标
- 最后做边界截断,确保坐标不超出图像范围
修正代码示例
替换你的postprocess函数为以下代码:
def postprocess(outputs, original_img_shape): # 模型固定输入尺寸 input_h, input_w = 384, 672 orig_h, orig_w = original_img_shape[:2] valid_detections = [] # 提取检测结果(模型输出格式为[1,1,N,7],对应[image_id, label, conf, xmin, ymin, xmax, ymax]) detections = outputs[0][0] for det in detections: _, label, conf, xmin, ymin, xmax, ymax = det # 过滤低置信度结果,阈值可按需调整 if conf < 0.5: continue # 转换为归一化坐标 norm_xmin = xmin / input_w norm_ymin = ymin / input_h norm_xmax = xmax / input_w norm_ymax = ymax / input_h # 映射到原始图像尺寸 final_xmin = int(norm_xmin * orig_w) final_ymin = int(norm_ymin * orig_h) final_xmax = int(norm_xmax * orig_w) final_ymax = int(norm_ymax * orig_h) # 确保坐标在图像范围内 final_xmin = max(0, final_xmin) final_ymin = max(0, final_ymin) final_xmax = min(orig_w - 1, final_xmax) final_ymax = min(orig_h - 1, final_ymax) valid_detections.append((label, conf, final_xmin, final_ymin, final_xmax, final_ymax)) return valid_detections
额外验证项
- 确认预处理阶段是否将原始图像正确缩放到384×672后输入模型,这是坐标映射准确的前提
- 运行后检查输出的坐标值,应在0到1280(横向)、0到960(纵向)范围内
内容的提问来源于stack exchange,提问作者bbartling
相关产品推荐
相关产品推荐

