在成功搭建好环境后,我们正式进入YOLOv8的实战环节。本章将引导你使用Ultralytics官方提供的预训练模型,对图片、视频和实时摄像头画面进行检测。你将学习两种核心调用方式——简洁的命令行接口(CLI)和灵活的Python接口,并深入理解检测结果中各项数据的技术含义。
2.1 命令行调用:快速验证与测试
命令行接口(CLI)是与YOLOv8交互最快捷的方式,尤其适合快速测试模型效果或进行简单的批处理任务。其核心命令是yolo。
基本语法
yolo命令遵循一个简单的结构:yolo TASK MODE ARGS...
-
TASK (任务): 指定要执行的任务。对于本章,我们主要使用
detect(检测),但也可以是segment(分割)或pose(姿态估计)。如果省略,YOLOv8会尝试根据模型类型自动推断。 -
MODE (模式): 指定运行模式。我们现在使用
predict(预测),后续章节会学习train(训练)、val(验证)和export(导出)。 -
ARGS (参数): 一系列的
key=value参数对,用于配置运行细节。
核心参数
-
model: 指定要使用的模型文件路径。例如yolov8n.pt,这是一个轻量级的预训练检测模型。 -
source: 指定输入源。可以是单个图片路径、包含多张图片的文件夹、视频文件路径,或是代表摄像头的设备ID(通常为0)。 -
save=True: 保存带有检测结果的图片或视频。结果默认保存在runs/detect/predict/目录下。 -
conf: 设置置信度阈值(Confidence Threshold)。只有当模型对检测结果的置信度高于此值时,才会显示。例如conf=0.5表示只显示50%以上置信度的结果。
实战演练
确保你已在终端中激活了之前创建的conda环境 (conda activate yolov8_env)。
1. 图片检测
假设你有一张名为bus.jpg的图片。
yolo predict model=yolov8n.pt source=path/to/your/bus.jpg save=True
执行后,YOLOv8会自动下载yolov8n.pt模型(如果本地没有),完成检测,并在runs/detect/predict/目录下生成一张标注了边界框的新图片。
2. 视频检测
yolo predict model=yolov8n.pt source=path/to/your/video.mp4 save=True
3. 实时摄像头检测
将电脑摄像头对准自己,看看YOLOv8能否将你识别为“person”。按q键退出。
yolo predict model=yolov8n.pt source=0 show=True
注意:show=True会实时弹窗显示检测画面。
2.2 Python接口调用:灵活控制与集成
当需要将YOLOv8集成到更复杂的应用程序中时,Python接口提供了无与伦比的灵活性。你可以编程控制预测的每一个环节,并对结果进行精细化处理。
基本流程
-
从
ultralytics库中导入YOLO类。 -
实例化
YOLO类,并加载一个模型文件。 -
调用实例化的模型对象,传入输入源进行预测。
-
处理返回的结果对象。
代码示例
创建一个名为predict.py的Python文件,并输入以下代码:
from ultralytics import YOLO
import cv2
# 1. 加载一个预训练的YOLOv8n模型
model = YOLO('yolov8n.pt')
# 2. 定义输入源
# 可以是图片路径, 视频路径, 或者摄像头ID 0
source = 'path/to/your/bus.jpg'
# 3. 从模型进行推理
# stream=True 时为生成器模式,适合处理视频或长时间的推理任务,更节省内存
results = model(source, stream=True)
# 4. 处理结果
for r in results:
# `r.boxes` 包含检测到的边界框信息
# `r.masks` 包含分割掩码信息 (仅用于分割模型)
# `r.keypoints` 包含姿态关键点信息 (仅用于姿态估计模型)
# 将带有结果的图像帧可视化
im_array = r.plot() # r.plot() 返回一个 BGR 格式的 numpy 数组
# 使用OpenCV显示图像
cv2.imshow('YOLOv8 Inference', im_array)
# 按 'q' 键退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放窗口资源
cv2.destroyAllWindows()
2.3 结果解读:深入理解返回的数据结构
这是从初学者迈向专家的关键一步。model()调用返回的结果是一个列表,其中每个元素都是一个ultralytics.engine.results.Results对象,对应一帧图像的检测结果。让我们深入剖析这个对象。
假设r是单个Results对象(即results[0])。
核心属性
-
r.boxes: 包含边界框信息的对象。 -
r.masks: 包含实例分割掩码信息的对象(仅当使用分割模型如yolov8n-seg.pt时才有效)。 -
r.keypoints: 包含姿态估计关键点信息的对象(仅当使用姿态模型如yolov8n-pose.pt时才有效)。 -
r.plot(): 在原始图像上绘制所有检测结果,并返回一个OpenCV(BGR)格式的numpy数组。 -
r.names: 一个字典,将类别索引映射到类别名称。例如:{0: 'person', 1: 'bicycle', ...}。
r.boxes 详解
这是检测任务中最核心的部分。它是一个Boxes对象,其属性均为PyTorch张量(Tensor)。
-
r.boxes.xyxy:[N, 4]形状的张量,N是检测到的物体数量。每行包含4个值[x1, y1, x2, y2],分别代表边界框左上角和右下角的像素坐标。 -
r.boxes.xyxyn:[N, 4]形状的张量,归一化后的坐标(所有值都在0-1之间)。 -
r.boxes.xywh:[N, 4]形状的张量,每行包含[x, y, w, h],分别代表边界框中心点的x、y坐标以及框的宽度和高度。 -
r.boxes.conf:[N, 1]形状的张量,每个值代表对应边界框的置信度。 -
r.boxes.cls:[N, 1]形状的张量,每个值代表对应边界框的类别索引。
专业级结果处理代码
以下脚本展示了如何遍历检测结果,并以结构化的方式提取所有关键信息。
from ultralytics import YOLO
# 加载模型
model = YOLO('yolov8n.pt')
# 进行预测
results = model('path/to/your/bus.jpg')
# 假设我们只处理第一张图片的结果
r = results[0]
# 获取类别名称字典
class_names = r.names
# 遍历每个检测到的边界框
for box in r.boxes:
# 获取边界框坐标
x1, y1, x2, y2 = box.xyxy[0].tolist()
# 获取置信度
confidence = box.conf[0].item()
# 获取类别索引
class_id = int(box.cls[0].item())
# 获取类别名称
class_name = class_names[class_id]
print(f"检测到物体: {class_name}")
print(f" - 坐标 (x1, y1, x2, y2): ({x1:.2f}, {y1:.2f}, {x2:.2f}, {y2:.2f})")
print(f" - 置信度: {confidence:.4f}")
print("-" * 30)
学完本章,你已经掌握了YOLOv8最核心的预测功能,并能像专业开发者一样解析其返回数据。这为你后续训练自定义模型和开发复杂应用打下了坚实的基础。
1万+

被折叠的 条评论
为什么被折叠?



