YOLO26 计算机视觉 - YOLO26图片与视频推理 & 摄像头与实时检测

大家好,我是 Java1234 小锋老师。最近正在更新《一天学会 YOLO26 计算机视觉 机器视觉 视频教程》系列专辑,感谢大家的支持与关注。

本课程将系统讲解 YOLO26 的完整知识体系,涵盖 YOLO26 简介、HelloWorld 项目实现、模型架构解析、图片与视频推理、摄像头实时检测、数据集与标注、训练自己的 YOLO26 模型、多任务(分割 / 姿态 / 分类 / OBB)以及模型导出等内容。

视频教程+课件+源码打包下载 :

链接:https://pan.baidu.com/s/1_NzaNr0Wln6kv1rdiQnUTg

提取码:0000

具体位置:进入【第三十一期】技术目录即可找到。

YOLO26 计算机视觉 - YOLO26图片与视频推理 & 摄像头与实时检测

YOLO26图片与视频推理

predict 常用参数

参数 含义 入门建议
source 图片/文件夹/视频/摄像头 先单图
conf 置信度阈值 0.25~0.5
iou NMS IoU(传统头更相关) 默认即可
imgsz 推理边长 640
device 0 / cpu / 0,1 有卡用 0
save / show 保存 / 弹窗 调试用
end2end 是否端到端头 默认 True

我们来一些具体示例:

python 复制代码
# -*- coding: utf-8 -*-
"""
图片 / 视频 / 批量推理精讲
演示 conf 对比、结果解析、端到端开关、文件夹批量推理。
"""

from pathlib import Path
import sys

from ultralytics import YOLO

sys.path.append(str(Path(__file__).resolve().parents[1]))
from utils.common import print_detections, ensure_dir


def predict_one_image(model: YOLO, image: str, conf: float, tag: str) -> None:
    """对单张图推理并打印结果。"""
    out_dir = ensure_dir(Path(__file__).parent / "runs")  # 保存路径
    results = model.predict(
        source=image,  # 图片路径
        conf=conf,  # 置信度 只保留 置信度 > conf 的检测框,低于阈值的会被丢弃 默认0.25
        imgsz=640,  # 图像大小 默认640
        save=True,  # 保存结果
        project=str(out_dir),  # 保存路径
        name=f"conf_{tag}",  # 保存名称
        exist_ok=True,  # 是否覆盖保存
    )
    print(f"\n=== conf={conf} ({tag}) ===")
    print_detections(results[0], model.names)


def predict_video(model: YOLO, video: str) -> None:
    """对视频文件推理。"""
    out_dir = ensure_dir(Path(__file__).parent / "runs")  # 保存路径
    model.predict(
        source=video,  # 视频路径
        conf=0.45,  # 置信度 只保留 置信度 > conf 的检测框,低于阈值的会被丢弃 默认0.25
        imgsz=640,  # 图像大小 默认640
        save=True,  # 保存结果
        project=str(out_dir),  # 保存路径
        name="video",  # 保存名称
        exist_ok=True,  # 是否覆盖保存
    )
    print(f"视频推理完成,结果目录: {out_dir / 'video'}")  # 打印保存路径


def predict_folder(model: YOLO, folder: str) -> None:
    """对文件夹内所有图片批量推理。"""
    out_dir = ensure_dir(Path(__file__).parent / "runs")  # 保存路径
    results = model.predict(
        source=folder,  # 文件夹路径
        conf=0.5,  # 置信度 只保留 置信度 > conf 的检测框,低于阈值的会被丢弃 默认0.25
        save=True,  # 保存结果
        project=str(out_dir),  # 保存路径
        name="batch",  # 保存名称
        exist_ok=True,  # 是否覆盖保存
    )
    print(f"\n批量推理完成,共 {len(results)} 张")  # 打印批量推理完成


def compare_end2end(model: YOLO, image: str) -> None:
    """
    对比端到端头(默认,无需 NMS)与传统 one-to-many 头。
    入门默认使用 end2end=True 即可。
    """
    print("\n=== 默认端到端 (end2end=True) ===")
    r1 = model.predict(image, conf=0.5, end2end=True, verbose=False)  # verbose 控制是否在终端打印推理过程的日志信息。
    print_detections(r1[0], model.names)

    print("\n=== 传统头 (end2end=False, 需 NMS) ===")
    r2 = model.predict(image, conf=0.5, end2end=False, verbose=False)
    print_detections(r2[0], model.names)


def main() -> None:
    model = YOLO("yolo26n.pt")
    image = "bus.jpg"  # 改成你的图片

    # 1) 不同置信度对比
    predict_one_image(model, image, conf=0.25, tag="025")
    predict_one_image(model, image, conf=0.60, tag="060")

    # 2) 端到端 vs 传统头
    # compare_end2end(model, image)

    # 3) 视频推理(准备好 video.mp4 后取消注释)
    # predict_video(model, "video.mp4")

    # 4) 文件夹批量(准备好 images/ 后取消注释)
    # predict_folder(model, "images")


if __name__ == "__main__":
    main()

首先是不同置信度对比,置信度 > conf 的检测框,低于阈值的会被丢弃 默认0.25

运行输出,低于0.6的直接丢弃。

接下来是 端到端 vs 传统头

目前图片简单,运行结果还是差不多的。

在看一个视频识别,逐帧检测。

最后是文件里批量检测:

YOLO26摄像头与实时检测

predict方法把source设置成0,就可以把数据源设置成摄像头;

我们通过两个实例来讲解下摄像头与实时检测。

第一个实例:直接用Ultralytics predict(最简单)

第二个实例:OpenCV 读帧 + 模型推理,方便叠加业务逻辑(ROI、计数等)。

实例代码:

python 复制代码
# -*- coding: utf-8 -*-
"""
摄像头实时检测
source=0 为默认摄像头;也可换成 RTSP 地址或本地视频。
"""

from pathlib import Path
import sys

import cv2
from ultralytics import YOLO

sys.path.append(str(Path(__file__).resolve().parents[1]))
from utils.common import FpsCounter  # noqa: E402


def run_predict_api(source: int | str = 0) -> None:
    """
    方式一:直接用 Ultralytics predict(最简单)。
    show=True 会弹出可视化窗口。
    """
    model = YOLO("yolo26n.pt")  # 加载模型
    results = model.predict(
        source=source,  # 视频源
        conf=0.45,  # 置信度
        imgsz=640,  # 图像大小
        show=True,  # 显示窗口
        stream=True,  # 流式,适合实时
    )  # 预测结果
    for _ in results:  # 必须消费生成器,摄像头才会真正打开
        pass


def run_opencv_loop(source: int | str = 0) -> None:
    """
    方式二:OpenCV 读帧 + 模型推理,方便叠加业务逻辑(ROI、计数等)。
    按 q 退出。
    """
    model = YOLO("yolo26n.pt")  # 加载模型
    cap = cv2.VideoCapture(source)  # 打开视频源
    if not cap.isOpened():  # 如果视频源无法打开,则抛出异常
        raise RuntimeError(f"无法打开视频源: {source}")

    fps = FpsCounter()  # 创建FPS计数器
    print("按键 q 退出窗口")

    while True:  # 循环读取视频帧
        ok, frame = cap.read()  # 读取视频帧
        if not ok:  # 如果视频帧无法读取,则退出循环
            break  # 退出循环

        results = model.predict(frame, conf=0.45, imgsz=640, verbose=False)  # 预测结果
        plotted = results[0].plot()  # 画框后的 BGR 图

        cur_fps = fps.tick()  # 计算FPS 并更新FPS计数器
        cv2.putText(  # 在图像上添加文本
            plotted,  # 图像
            f"FPS: {cur_fps:.1f}",  # 文本
            (12, 32),  # 位置
            cv2.FONT_HERSHEY_SIMPLEX,  # 字体
            1.0,  # 字体大小
            (0, 255, 0),  # 颜色
            2,  # 字体厚度
        )

        cv2.imshow("YOLO26 Webcam", plotted)  # 显示图像
        if cv2.waitKey(1) & 0xFF == ord("q"):  # 如果按下q键,则退出循环
            break  # 退出循环

    cap.release()  # 释放视频源
    cv2.destroyAllWindows()  # 关闭所有窗口


def main() -> None:
    """选择一种实时方式运行。"""
    # 本地摄像头
    source: int | str = 0
    # RTSP 示例:
    # source = "rtsp://user:pass@192.168.1.10:554/stream"
    # 本地视频:
    # source = "demo.mp4"

    run_predict_api(source)
    # run_opencv_loop(source)


if __name__ == "__main__":
    main()

RTSP(实时流传输协议):这是视频流的"快递单号协议",专门用来传输实时音视频数据(比如监控画面)。

当你把YOLO(目标检测算法)用于安防监控或工厂质检时,不能把摄像头插在电脑上(因为距离太远),而是让摄像头连接网络。YOLO代码拿着这个RTSP地址去"取流"。

OpenCV(Open Source Computer Vision Library,开源计算机视觉库) 。它是一个跨平台的免费开源算法库,非常优秀,功能强大,专为实时图像处理计算机视觉而设计。

1. ROI(Region of Interest,感兴趣区域)

大白话 :你不需要让YOLO分析整个摄像头画面,只盯着画面里的那一小块特定区域看。

为什么要设ROI?

  • 省算力:画面很大,但有效信息只占一小块(比如只检测门口区域),设定ROI后,传给YOLO的像素变少,推理速度会明显提升。
  • 降误报:画面边缘可能有无关的路人或者花坛,设定ROI后,YOLO只检测这个框里的目标,能过滤掉大量无效报警。

2. 计数(Count),具体在计什么?

在工业视觉和安防领域,"计数"绝不是数画面里此刻有几个人 ,而是指累计统计穿越某个"虚拟线"或停留在"特定区域"内的目标数量。分三种常见业务:

  • A. 区域驻留计数(此刻数) :统计当前ROI区域内有多少人/车。比如候车厅排队人数工位占用数。每帧检测,取当前帧的检测框中心点是否落在ROI内,实时更新数字。
  • B. 越线计数(累计数) :统计单向或双向 穿越了一条黄色虚拟警戒线的人数。比如商场客流量统计(进出人数)传送带上的工件产量
  • C. 行为计数(违规数) :统计闯入 禁区或长时间停留的次数。比如某员工进入了吊车作业的红色危险ROI区域,触发一次告警计数。

3. 核心难点:为什么"计数"不能只看单帧?

如果只是单帧数人,画面里人稍微重叠一下,YOLO漏检一个,数字就会乱跳。所以真正的计数逻辑必须结合"目标跟踪(Tracking)"

  1. 给每个检测到的人分配一个唯一的 ID(如1号人、2号人)。
  2. 记录每个ID的运动轨迹(过去5帧的坐标点)。
  3. 判断逻辑:当ID的轨迹线与预设的虚拟线(Line)发生交叉,且方向符合设定时,计数+1。

4. 组合实战逻辑(ROI + 计数 联动)

假设你是工厂产线质检,传送带从左往右走:

  1. 设定ROI:只截取传送带中间窄窄的一条竖条区域。
  2. YOLO推理:只检测ROI内的"瑕疵品"或"工件"。
  3. 越线计数:在ROI中间画一条虚拟竖线。每当一个工件的检测框中心点从左往右越过这条线,累计产量 +1;如果检测到瑕疵标签,不良品计数 +1。
相关推荐
明志数科7 小时前
具身智能产业基础设施换挡:从算力本体到数据层的技术逻辑
人工智能·机器学习
gongfeng30007 小时前
福州企业级AI自动化获客解决方案品牌梳理与适用场景分析
运维·人工智能·自动化·g-claw ai员工
陈碧甫7 小时前
因果Agent的Memory在对话中的表现
人工智能
高洁017 小时前
大模型的幻觉怎么治
人工智能·深度学习·django·transformer·tornado
m0_734571767 小时前
深入理解人工智能 主流的训练算法
人工智能
kyriewen7 小时前
我删掉了 29 个 AI Skill 里的 23 个:留下的 6 个都有同一个特点
人工智能·程序员·ai编程
weixin_446260857 小时前
编译式智能体:前沿通用编码智能体从零交互构建游戏玩家——从Flappy Bird到星际争霸2与文明
人工智能
星栈独行7 小时前
ADK-Rust 是什么?Rust 生态新一代 AI Agent 开发套件
人工智能·后端·rust
得一录7 小时前
Agent 的 RAG 遇到 PDF 怎么处理?一套可落地的工程方案
人工智能
陈碧甫8 小时前
法会体——元龙因果链理论表达的一种文体 & 时间
人工智能