2. 基于相机图像的YOLO目标检测与2D框输出

任务目标

本案例实现基于相机图像的YOLO目标检测:加载预训练YOLOv8模型,对输入图像执行推理,输出每个目标的2D边界框坐标、类别标签与置信度,并将检测结果可视化保存。

环境依赖

  • Python 3.8+
  • ultralytics(YOLOv8官方库)
  • OpenCV(图像读写与绘制)

安装命令:pip install ultralytics opencv-python

关键完整代码

import cv2
from ultralytics import YOLO

# 1. 加载预训练模型(首次运行自动下载权重)
model = YOLO("yolov8n.pt")

# 2. 读取输入图像
image_path = "input.jpg"  # 替换为实际图像路径
image = cv2.imread(image_path)
assert image is not None, f"无法读取图像: {image_path}"

# 3. 执行推理
results = model(image, conf=0.5)  # conf: 置信度阈值

# 4. 提取检测结果并绘制2D框
for result in results:
    boxes = result.boxes  # 检测框对象
    for box in boxes:
        # 边界框坐标(像素)
        x1, y1, x2, y2 = map(int, box.xyxy[0].tolist())
        # 类别ID与标签
        cls_id = int(box.cls[0])
        label = model.names[cls_id]
        # 置信度
        conf = float(box.conf[0])

        # 绘制边界框与标签
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
        text = f"{label} {conf:.2f}"
        cv2.putText(image, text, (x1, y1 - 5),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1)

# 5. 保存结果
output_path = "output.jpg"
cv2.imwrite(output_path, image)
print(f"检测完成,结果已保存至: {output_path}")
print(f"检测到目标数: {len(results[0].boxes)}")

运行方式

  1. 将待检测图像命名为input.jpg并放置于脚本同目录(或修改代码中的路径);
  2. 执行脚本:python yolo_detect.py;
  3. 首次运行会自动下载yolov8n.pt权重(约6MB),需保持网络连接。

验证方法

  • 通过条件:程序正常退出,控制台输出检测到的目标数量;
  • 打开output.jpg,确认图像中车辆、行人等目标被绿色框标出,框上方显示类别名称与置信度(如person 0.87);
  • 若图像中目标未被检测或框位置明显错误,可降低conf阈值(如改为0.25)后重试。

预期输出示例

对于一张包含2辆车和1个行人的典型街景图像,控制台输出:

检测完成,结果已保存至: output.jpg
检测到目标数: 3

输出图像中对应位置出现3个绿色边界框,分别标注car 0.92、car 0.88、person 0.79等标签(具体置信度随输入图像变化)。

常见问题

  • 模型下载失败:手动下载yolov8n.pt放入脚本目录,代码会自动加载本地权重;
  • 检测结果为空:图像中目标过小或遮挡严重时可能漏检,降低conf至0.25或换用yolov8s.pt(精度更高但速度稍慢);
  • GPU不可用:默认自动使用CPU推理,无需额外配置。