我们相信:世界是美好的,你是我也是。 来玩一下解压小游戏吧!

yolo是实时目标检测领域的代表性算法系列。它的重点是:大模型,也就是那个yoloXXX.pt的文件。从几年前的yolov8到现在的yolo11,库文件ultralytics是通用的。所以,ultralytics目前主版本号是8,但加载的已经是版本号为11的大模型文件了。从市面上的反应来看,大家似乎对这个yolo11并不认同,依然习惯性认同yolov8

苏南大叔:YOLO11教程,摄像头流媒体实时目标检测,保存为图片 - 流媒体实时物品检测
YOLO11教程,摄像头流媒体实时目标检测,保存为图片(图3-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。测试环境:win10python@3.12.9ultralytics@8.3.111yolo@11。本文将以摄像头为来源,利用yolo11模型,进行实时目标检测,并通过一个完整的示例代码来展示目标检测的效果。本文代码的正确运行,需要测试机提供一个摄像头硬件作为视频来源。

yolo

在上一篇文字里面,苏南大叔对yolo的发展历史,做了简要的回顾。可以参考:

苏南大叔:YOLO11教程,摄像头流媒体实时目标检测,保存为图片 - yolo11-docs
YOLO11教程,摄像头流媒体实时目标检测,保存为图片(图3-2)

更多官方内容,参考:

依赖

需要先安装必要的文件依赖:

pip install ultralytics
pip install opencv-python

代码中引入YOLO,用于模型加载和推理。

from ultralytics import YOLO
import cv2
import time
from pathlib import Path

模型加载

默认加载yolo11n.pt这个最新的图片推理模型:

def load_model(model_path='yolo11n.pt'):
    try:
        model = YOLO(model_path)
        return model
    except Exception as e:
        print("尝试加载默认模型 yolo11n.pt")
        return YOLO('yolo11n.pt')

此函数实现了:

  • 模型加载的错误处理
  • 加载失败时自动切换到默认模型
  • 返回加载好的YOLO模型

这个yolo11n.pt文件,不用提前下载。本地存在则使用,不存在就会自动下载,很智能。实际下载地址:

准备工作

# 配置参数
conf_threshold = 0.25    # 置信度阈值
camera_id = 0            # 摄像头ID

save_dir = 'detections'  # 保存图片的文件夹名称
save_path = Path(save_dir)
save_path.mkdir(parents=True, exist_ok=True)

关键参数说明:

  • conf_threshold: 检测置信度阈值,低于此值的检测结果将被过滤。
  • camera_id: 摄像头设备号,通常内置摄像头为 0。(如果多个摄像头的话,就会出现其它id值了)
  • save_dir: 检测结果保存目录

实时检测循环

try:
    model = load_model()
    cap = cv2.VideoCapture(camera_id)
    if not cap.isOpened():
        raise Exception("无法打开摄像头")
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        results = model(frame, conf=conf_threshold)

这部分实现了:

  • 摄像头初始化和错误处理
  • 实时视频帧获取
  • YOLO 模型检测

结果可视化

for result in results:
    boxes = result.boxes
    for box in boxes:
        # 获取检测框信息
        x1, y1, x2, y2 = map(int, box.xyxy[0])
        conf = float(box.conf[0])
        cls = int(box.cls[0])
        class_name = model.names[cls]
        # 绘制检测框
        cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2)

可视化处理包括:

  • 获取检测框坐标和类别信息
  • 绘制边界框
  • 添加类别标签和置信度

标签位置优化

# 根据边界框位置决定标签位置
if y1 < label_h + 10:  # 如果边界框太靠近顶部
    # 在底部显示标签
    label_y = min(y2 + label_h + 10, frame.shape[0] - 10)
else:
    # 在顶部显示标签
    label_y = max(y1 - 10, 10)

标签位置处理逻辑:

  • 根据边界框位置自适应调整标签显示位置
  • 确保标签不会超出图像边界
  • 优化标签可读性

键盘事件

q 键退出程序,按 s 键保存当前检测结果。

key = cv2.waitKey(1) & 0xFF
if key == ord('q'):  # 按q退出
    break
elif key == ord('s'):  # 按s保存当前帧
    timestamp = time.strftime("%Y%m%d_%H%M%S")
    save_file = save_path / f'detection_{timestamp}.jpg'
    cv2.imwrite(str(save_file), frame)
    print(f"图片已保存至: {save_file}")

保存功能实现:

  • 使用时间戳生成唯一文件名
  • 自动创建保存目录
  • 提供保存成功提示

完整代码

识别的结果中,旁边都有个置信度。所以,也不能苛求识别的准确率是100%。如下图所示:

苏南大叔:YOLO11教程,摄像头流媒体实时目标检测,保存为图片 - 识别结果
YOLO11教程,摄像头流媒体实时目标检测,保存为图片(图3-3)

在上图所示的这个检测结果里面,

  • person的置信度是0.88
  • donut的置信度是0.31(也就是说它也不十分确定这是个甜甜圈)。

完整代码如下:

newsn.net:这里是【评论】可见内容

结语

通过这个示例,苏南大叔实现了一个完整的实时目标检测应用。举一反三一下,如果这是一个监控场景的话,就可以循环results,如果出现了person,则自动保存图片。

更多苏南大叔的yolo文章,可以点击:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   ai    yolo