大家好,我是 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)":
- 给每个检测到的人分配一个唯一的 ID(如1号人、2号人)。
- 记录每个ID的运动轨迹(过去5帧的坐标点)。
- 判断逻辑:当ID的轨迹线与预设的虚拟线(Line)发生交叉,且方向符合设定时,计数+1。
4. 组合实战逻辑(ROI + 计数 联动)
假设你是工厂产线质检,传送带从左往右走:
- 设定ROI:只截取传送带中间窄窄的一条竖条区域。
- YOLO推理:只检测ROI内的"瑕疵品"或"工件"。
- 越线计数:在ROI中间画一条虚拟竖线。每当一个工件的检测框中心点从左往右越过这条线,累计产量 +1;如果检测到瑕疵标签,不良品计数 +1。