Ultralytics YOLO26 Analytics 实战指南:四种图表实时可视化检测与追踪数据
本文基于 Ultralytics 官方指南 analytics.md,讲解如何使用 Analytics 解决方案将 YOLO26 的目标检测与追踪结果转化为折线图(line)、柱状图(bar)、饼图(pie)与面积图(area)四种实时图表,并逐帧呈现视频中物体数量的变化。读完本文,你将掌握 Analytics 的 CLI 与 Python 完整用法、全部关键参数的取值与默认值,并理解其底层的追踪调用链、图表更新机制(每 30 帧刷新一次、最多保留 45 个数据点)以及结果对象 SolutionResults 的结构。
为什么要把检测数据可视化
Analytics 的核心价值在于:把逐帧的检测/追踪结果变成可随时间演化的图表,让你直观观察物体数量如何随视频帧变化。官方指南给出了四种图表类型及其适用场景:
- 折线图(line graph):最适合追踪短周期和长周期内的变化,也适合在同一时间段内对比多个群体的变化趋势。
- 柱状图(bar plot):适合比较不同类别之间的数量,展示"类别—数值"之间的对应关系。
- 饼图(pie chart):有效展示各类别占总量的比例,直观呈现"部分与整体"的关系。
- 面积图(area plot):在折线图基础上填充区域,让各类别物体数量随时间的变化更易于一次性读出。
四种图表共用同一套 Python 与 CLI 示例,只需通过 analytics_type 一个参数在 "line"、"bar"、"pie"、"area" 之间切换。
生成分析图表
将视频输入 Analytics 解决方案并选择图表类型即可。该方案会对每一帧执行检测与追踪,并渲染一张 1280×720 的图表(由默认 figsize=(12.8, 7.2) 换算而来),可直接写入输出视频。
CLI 用法
yolo solutions analytics show=True
# 指定输入视频
yolo solutions analytics source="path/to/video.mp4"
# 生成饼图
yolo solutions analytics analytics_type="pie" show=True
# 生成柱状图
yolo solutions analytics analytics_type="bar" show=True
# 生成面积图
yolo solutions analytics analytics_type="area" show=True
Python 用法
import cv2
from ultralytics import solutions
cap = cv2.VideoCapture("path/to/video.mp4")
assert cap.isOpened(), "Error reading video file"
# 视频写入器
w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
out = cv2.VideoWriter(
"analytics_output.avi",
cv2.VideoWriter_fourcc(*"MJPG"),
fps,
(1280, 720), # 输出分辨率固定为 1280x720,与图表 figsize 对应
)
# 初始化 Analytics 对象
analytics = solutions.Analytics(
show=True, # 显示输出窗口
analytics_type="line", # 图表类型,可选 "line"、"bar"、"pie"、"area"
model="yolo26n.pt", # YOLO26 模型文件路径
# classes=[0, 2], # 仅对指定类别做统计
)
# 逐帧处理视频
frame_count = 0
while cap.isOpened():
success, im0 = cap.read()
if success:
frame_count += 1
results = analytics(im0, frame_count) # 每帧调用一次以更新图表
# print(results) # 可访问输出结果
out.write(results.plot_im) # 将图表图像写入输出视频
else:
break
cap.release()
out.release()
cv2.destroyAllWindows() # 关闭所有打开的窗口
Analytics 参数说明
Analytics 接受以下参数(默认值与描述摘自仓库文档宏 solutions-args.md、solutions-track-args.md 与 visualization-args.md):
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
model |
str |
None |
Ultralytics YOLO 模型文件路径。为 None 时,源码会回退到 yolo26n.pt |
analytics_type |
str |
'line' |
图表类型:line、bar、area 或 pie |
line_width |
int |
2 |
解算器绘制方框、关键点与计数时使用的线宽,同时影响图表中曲线与标记点大小 |
verbose |
bool |
True |
启用解算器逐帧日志(输入尺寸、类别计数与处理速度);追踪调用本身始终静默 |
Analytics 同时支持 track 模式中的常用追踪参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
tracker |
str |
'botsort.yaml' |
追踪算法。内置选项:botsort.yaml、bytetrack.yaml、ocsort.yaml、deepocsort.yaml、fasttrack.yaml、tracktrack.yaml |
conf |
float |
0.25 |
检测置信度阈值;调低可追踪更多物体,但可能引入误检 |
iou |
float |
0.7 |
用于过滤重叠检测的 IoU 阈值 |
classes |
list |
None |
按类别索引过滤结果,例如 classes=[0, 2, 3] 只追踪指定类别 |
device |
str |
None |
推理设备,如 cpu、cuda:0 或 0 |
此外还支持可视化参数:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
show |
bool |
False |
为 True 时在窗口中显示带标注的图像/视频,适合开发调试时即时反馈 |
源码级实现解析
数据从哪来:内置追踪调用链
Analytics 继承自 BaseSolution,其数据获取完全依赖底层的 YOLO 追踪能力。在 extract_tracks 方法 中,每一帧都会调用:
self.tracks = self.model.track(
source=im0, persist=True, classes=self.classes, verbose=False, **self.track_add_args
)[0]
其中 track_add_args 由 BaseSolution 构造函数 从配置中收集 iou、conf、device、max_det、quantize、tracker、imgsz 等字段,随后从追踪结果中解包出 boxes(框坐标)、clss(类别索引)、track_ids(追踪 ID)与 confs(置信度)。这意味着 Analytics 统计的"计数"实际是带稳定 ID 的追踪计数,而非单纯的检测结果,四类图表都能实时反映活动物体数量。
图表构建与更新节奏
Analytics 构造函数 根据 analytics_type 决定 Matplotlib 的初始化方式:
line与area:创建Figure+FigureCanvasAgg画布,折线图额外预建一条 Line2D 对象;bar与pie:通过plt.subplots建图,饼图额外调用ax.axis("equal")保证圆形不被拉伸;- 所有图表共享标题
Ultralytics Solutions、字号 25,并设置固定颜色循环["#DD00BA", "#042AFF", "#FF4447", "#7D24FF", "#BD00FF"]。
图表的刷新节奏由 process 方法 控制,从源码结构看有两个关键设计:
- 每 30 帧才真正重绘一次。
update_every默认为 30(analytics.py 第 74 行),只有当frame_number % update_every == 0或尚未绘制过第一张图时才调用update_graph;非刷新帧直接复用缓存last_plot_im,从而显著降低 Matplotlib 重绘开销。 - line 图采用"区间累加"语义。每一帧把当帧检测数量累加进
total_counts,到刷新点时把该累计值作为一个新的数据点追加,随后清零;折线图因此展示的是每 30 帧窗口内的累计计数。 - bar / pie / area 采用"当帧计数"语义。刷新时通过
Counter(self.names[int(cls)] for cls in self.clss)统计当前帧各类别数量,再传给update_graph重绘。
在 update_graph 方法 中,折线图追加新点后会裁剪到 max_points=45 个数据点以内,使图表始终是一个滚动的滑动窗口;面积图对每个类别执行 fill_between(透明度 0.55)叠加曲线与圆形标记;柱状图会在每根柱顶标注具体数量,并用 color_mapping 字典保证同一类别跨帧颜色一致;饼图则以 90 度起始角绘制,并在图例中以 类别 (百分比%) 的形式标注占比。渲染完成后通过 canvas.draw() 将 RGBA 缓冲区转成 BGR 图像返回,同时按需经 display_output 弹窗显示。
输出结果结构
process 的返回值是 SolutionResults,包含三个字段,可在逐帧循环中直接取用:
plot_im:渲染好的图表图像(BGR 格式),即示例中写入输出视频的results.plot_im;total_tracks:当前帧被追踪到的物体总数;classwise_count:各类别计数字典(键为类别名),line 图更新前可为空。
图表尺寸从哪里来
默认图表尺寸 1280×720 并非随意设定:SolutionConfig 中 figsize 默认为 (12.8, 7.2)(英寸),按 100 dpi 渲染正好得到 1280×720 像素,这也是 Python 示例中 VideoWriter 输出分辨率被固定为 (1280, 720) 的原因。
常见问题(FAQ)
如何用 YOLO26 Analytics 创建折线图?
- 加载 YOLO26 模型并打开视频文件;
- 以
analytics_type="line"初始化Analytics类; - 遍历视频帧,每帧调用一次该对象,用物体计数等数据更新折线图;
- 将
results.plot_im写入输出视频以保存图表。
上文的 Python 示例即是完整的折线图起点——analytics_type 的默认值就是 "line"。
用 YOLO26 做柱状图有什么优势?
- 实时数据可视化:检测结果直接汇入柱状图,随视频动态更新;
- 易于使用:API 简单,几行代码即可实现;
- 可定制:标题、标签、颜色均可按需调整;
- 高效:在视频处理过程中实时更新图表,适合大数据量场景。
只需把示例中的 analytics_type 改为 "bar",帧循环其余代码完全一致。
为什么选择 YOLO26 做饼图可视化?
- 与目标检测/追踪直接集成,检测完成即可得到占比分布;
- API 友好,最少代码即可完成搭建;
- 颜色、标签等均可定制(饼图图例自带百分比);
- 支持视频分析场景下的实时更新。
把 analytics_type 设为 "pie" 即可生成饼图。
YOLO26 能否追踪物体并动态更新可视化?
可以。追踪能力内建在 Analytics 方案中:它实时追踪多个物体,并基于追踪数据每帧更新图表,因此折线图、柱状图、饼图、面积图反映的都是"活"的计数。关于底层追踪机制,参见 Tracking 文档。
小结
在数据分析中,选对图表类型是有效传达数据故事的关键。折线图、柱状图与饼图是最基础的可视化手段,而 Ultralytics YOLO26 的 Analytics 解决方案提供了一条从"视频 → 检测追踪 → 实时图表"的极简路径:CLI 一条命令即可启动,Python 一个参数即可在四种图表间切换,并可通过 tracker、conf、classes 等参数精确控制统计对象与追踪算法。配合源码级的 update_every(30 帧刷新)与 max_points(45 点滑动窗口)设计,该方案在保持实时性的同时控制了渲染开销,适合直接落地到视频计数、人流统计、品类占比等实际监控分析场景。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00