首页
/ Ultralytics YOLO26 Analytics 实战指南:四种图表实时可视化检测与追踪数据

Ultralytics YOLO26 Analytics 实战指南:四种图表实时可视化检测与追踪数据

2026-09-06 12:06:36作者:姚月梅Lane

本文基于 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.mdsolutions-track-args.mdvisualization-args.md):

参数 类型 默认值 说明
model str None Ultralytics YOLO 模型文件路径。为 None 时,源码会回退到 yolo26n.pt
analytics_type str 'line' 图表类型:linebarareapie
line_width int 2 解算器绘制方框、关键点与计数时使用的线宽,同时影响图表中曲线与标记点大小
verbose bool True 启用解算器逐帧日志(输入尺寸、类别计数与处理速度);追踪调用本身始终静默

Analytics 同时支持 track 模式中的常用追踪参数:

参数 类型 默认值 说明
tracker str 'botsort.yaml' 追踪算法。内置选项:botsort.yamlbytetrack.yamlocsort.yamldeepocsort.yamlfasttrack.yamltracktrack.yaml
conf float 0.25 检测置信度阈值;调低可追踪更多物体,但可能引入误检
iou float 0.7 用于过滤重叠检测的 IoU 阈值
classes list None 按类别索引过滤结果,例如 classes=[0, 2, 3] 只追踪指定类别
device str None 推理设备,如 cpucuda:00

此外还支持可视化参数:

参数 类型 默认值 说明
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_argsBaseSolution 构造函数 从配置中收集 iouconfdevicemax_detquantizetrackerimgsz 等字段,随后从追踪结果中解包出 boxes(框坐标)、clss(类别索引)、track_ids(追踪 ID)与 confs(置信度)。这意味着 Analytics 统计的"计数"实际是带稳定 ID 的追踪计数,而非单纯的检测结果,四类图表都能实时反映活动物体数量。

图表构建与更新节奏

Analytics 构造函数 根据 analytics_type 决定 Matplotlib 的初始化方式:

  • linearea:创建 Figure + FigureCanvasAgg 画布,折线图额外预建一条 Line2D 对象;
  • barpie:通过 plt.subplots 建图,饼图额外调用 ax.axis("equal") 保证圆形不被拉伸;
  • 所有图表共享标题 Ultralytics Solutions、字号 25,并设置固定颜色循环 ["#DD00BA", "#042AFF", "#FF4447", "#7D24FF", "#BD00FF"]

图表的刷新节奏由 process 方法 控制,从源码结构看有两个关键设计:

  1. 每 30 帧才真正重绘一次update_every 默认为 30(analytics.py 第 74 行),只有当 frame_number % update_every == 0 或尚未绘制过第一张图时才调用 update_graph;非刷新帧直接复用缓存 last_plot_im,从而显著降低 Matplotlib 重绘开销。
  2. line 图采用"区间累加"语义。每一帧把当帧检测数量累加进 total_counts,到刷新点时把该累计值作为一个新的数据点追加,随后清零;折线图因此展示的是每 30 帧窗口内的累计计数。
  3. 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 并非随意设定:SolutionConfigfigsize 默认为 (12.8, 7.2)(英寸),按 100 dpi 渲染正好得到 1280×720 像素,这也是 Python 示例中 VideoWriter 输出分辨率被固定为 (1280, 720) 的原因。

常见问题(FAQ)

如何用 YOLO26 Analytics 创建折线图?

  1. 加载 YOLO26 模型并打开视频文件;
  2. analytics_type="line" 初始化 Analytics 类;
  3. 遍历视频帧,每帧调用一次该对象,用物体计数等数据更新折线图;
  4. results.plot_im 写入输出视频以保存图表。

上文的 Python 示例即是完整的折线图起点——analytics_type 的默认值就是 "line"

用 YOLO26 做柱状图有什么优势?

  1. 实时数据可视化:检测结果直接汇入柱状图,随视频动态更新;
  2. 易于使用:API 简单,几行代码即可实现;
  3. 可定制:标题、标签、颜色均可按需调整;
  4. 高效:在视频处理过程中实时更新图表,适合大数据量场景。

只需把示例中的 analytics_type 改为 "bar",帧循环其余代码完全一致。

为什么选择 YOLO26 做饼图可视化?

  1. 与目标检测/追踪直接集成,检测完成即可得到占比分布;
  2. API 友好,最少代码即可完成搭建;
  3. 颜色、标签等均可定制(饼图图例自带百分比);
  4. 支持视频分析场景下的实时更新。

analytics_type 设为 "pie" 即可生成饼图。

YOLO26 能否追踪物体并动态更新可视化?

可以。追踪能力内建在 Analytics 方案中:它实时追踪多个物体,并基于追踪数据每帧更新图表,因此折线图、柱状图、饼图、面积图反映的都是"活"的计数。关于底层追踪机制,参见 Tracking 文档。

小结

在数据分析中,选对图表类型是有效传达数据故事的关键。折线图、柱状图与饼图是最基础的可视化手段,而 Ultralytics YOLO26 的 Analytics 解决方案提供了一条从"视频 → 检测追踪 → 实时图表"的极简路径:CLI 一条命令即可启动,Python 一个参数即可在四种图表间切换,并可通过 trackerconfclasses 等参数精确控制统计对象与追踪算法。配合源码级的 update_every(30 帧刷新)与 max_points(45 点滑动窗口)设计,该方案在保持实时性的同时控制了渲染开销,适合直接落地到视频计数、人流统计、品类占比等实际监控分析场景。

登录后查看全文
热门项目推荐
相关项目推荐