UltraConsole:一个工业级 YOLO 推理可视化控制台,从前端到后端的完整实践
项目地址:github.com/WangQvQ/ultraconsole
技术栈:React 19 + TypeScript 6 + Vite 8 + Zustand 5 | Python 3.10 + FastAPI + Ultralytics YOLOv8
一、这个项目解决了什么问题?
在工业质检、安防监控、算法调优等场景下,使用 YOLO 模型做目标检测是常规操作。但传统的做法往往是:写脚本 → 跑推理 → 看日志 → 改参数 → 重新跑。整个过程缺乏一个直观的、可交互的可视化界面,尤其在实时视频流场景下,调试效率很低。
UltraConsole 就是为了解决这个问题而生的------它是一个 Web 端的推理控制台,让你可以在浏览器中直接加载模型、选择输入源、实时查看推理结果、调整参数、监控系统资源,并将告警推送到钉钉/企微/飞书等外部系统。
一句话总结:把 YOLO 推理从命令行脚本搬进浏览器,做成一个开箱即用的可视化工作台。
二、项目预览

整个界面采用三栏布局(可拖拽调整宽度):
- 左侧:模型控制面板(Model Hub / Engine / NMS / Class Filter / Tracking)
- 中央:推理视图区(Image / Video / Webcam / RTSP / Wall 五种输入模式)
- 右侧:监控面板(系统资源 / Webhook / Counters / Events / Alert / Logs)
顶部状态栏显示连接状态、当前模型信息,以及中/EN 语言切换按钮。
三、核心功能详解
3.1 五种输入源,覆盖主流场景
| 模式 | 说明 | 适用场景 |
|---|---|---|
| Image | 上传或拖拽图片,阈值变化自动重跑 | 算法调参、效果验证 |
| Video | 本地视频抽帧推理,可设目标 FPS | 离线分析、Demo 演示 |
| Webcam | 浏览器摄像头实时推理,WebSocket 推帧 | 现场调试、快速验证 |
| RTSP | 后端拉 RTSP 流,编码为 JPEG 后 WebSocket 推送 | 安防监控、产线摄像头 |
| Wall | 1×1 ~ 3×3 多路 RTSP 网格同屏 | 多路监控墙、集中监控 |
其中 Image 和 Video 模式支持拖拽上传 ,极大降低了操作门槛。Wall 模式通过单条 WebSocket 多路复用 streamId,实现了多路 RTSP 流的高效同屏展示。
3.2 丰富的 OSD 叠加能力
推理结果不仅仅是画个矩形框。UltraConsole 支持:
- Bounding Box + 标签(类别 + 置信度 + trackId)
- 实例分割 Mask(半透明多边形覆盖)
- COCO-17 姿态估计 Keypoints(带骨架连线)
- Tracking Trails(目标轨迹尾迹,按 trackId 哈希生成稳定颜色)
- Spatial Heatmap(基于轨迹聚合的空间热力图)
所有这些渲染都在 HTML Canvas 上完成,完全不经过 React 的渲染周期,保证了高频推理场景下的流畅体验。
3.3 ROI 与计数事件
在安防和工业场景中,经常需要:
- 画 ROI(感兴趣区域):支持多边形和矩形两种模式,可设置"仅显示 ROI 内目标"
- 画计数线:统计目标穿越某条线的 in/out 次数
- 画计数区:统计目标进出某个区域的 enter/leave 事件
这些操作都可以在画面上直接拖拽完成,结果实时体现在右侧的 Counters 和 Events 面板中。
3.4 告警与 Webhook
当某个类别的目标连续 N 帧出现在画面中时,系统会触发告警:
- 界面反馈:红色呼吸边框 + 可选蜂鸣声
- 外部推送:通过 Webhook 将告警推送到外部系统
Webhook 支持五种格式:钉钉、企微、飞书、Slack、通用 JSON 。每条告警按 (kind, ref) 维度进行冷却去重(默认 30 秒),避免告警风暴。
配置持久化到 backend/.webhook.json,重启不丢失。
3.5 系统监控
右侧面板的 System Stats 卡片实时展示:
- CPU / 内存使用率
- 多 GPU利用率 / 显存 / 温度 / 功耗(通过 NVML)
- 推理延迟 P50 / P95 / P99 + 60 帧 sparkline 迷你图
数据每 1.5 秒轮询更新,让你对系统运行状态一目了然。
3.6 配置一键导入导出
这是工业场景的刚需------你需要在不同机器之间复现相同的推理配置。
UltraConsole 支持将全部应用状态导出为一个 JSON 文件,包括:
- 推理参数(conf / iou / classFilter / track)
- 引擎设置(CPU / CUDA)
- OSD 显示偏好
- ROI 区域、计数线 / 计数区
- 告警规则
- Webhook 配置
在另一台机器上拖拽这个 JSON 文件到配置面板即可一键生效,整个过程不到 3 秒。
四、技术架构
4.1 整体分层
表现层 React 19 + Canvas OSD + Zustand Store
↕ REST / WebSocket
业务层 FastAPI REST + /ws/infer + /ws/stream
↕
推理层 Ultralytics YOLO (predict/track) + OpenCV RTSP
↕
数据层 Model Repo + Log Store + Webhook Config + Artifacts
4.2 后端架构
后端基于 FastAPI,提供了两类通信方式:
REST 接口:模型选择、引擎切换、参数更新、图片推理、系统监控、Webhook 管理、日志导出等。所有接口都有 Pydantic Schema 校验。
两路 WebSocket:
| 通道 | 方向 | 用途 |
|---|---|---|
/ws/infer |
客户端 → 服务端(推帧) | Webcam 实时推理 |
/ws/stream |
服务端 → 客户端(推帧+结果) | RTSP 多路流 |
推理调用全部通过 asyncio.to_thread 放到线程池执行,不会阻塞 FastAPI 的事件循环。多路 RTSP 流和 REST 请求可以完全并行,互不干扰。
YOLO 的 predict / track 调用通过 threading.Lock 串行化,解决了 Ultralytics 库非线程安全的问题。
4.3 前端架构
前端是一个 React 19 + TypeScript 单页应用,用 Vite 8 构建。
状态管理 选择了轻量的 Zustand------整个应用状态(模型信息、参数、预测结果、日志、事件、告警、ROI、连接状态、系统统计)集中在一个全局 Store 中。相比 Redux,Zustand 的 API 更简洁,没有 boilerplate,对这种数据流密集的场景非常合适。
Canvas OSD 是性能关键设计 。所有高频图形更新(框、Mask、关键点、轨迹、热力图)都在 HTML Canvas 上绘制,通过一个 ResizeObserver 监听尺寸变化,与 React 的渲染周期完全解耦。这意味着每秒几十帧的推理结果更新不会触发 React 的 reconciliation,保持了 UI 的流畅性。
WebSocket 重连机制实现了指数退避(1s → 15s 封顶)+ ping/pong 心跳保活。断线重连后,RTSP 流会自动续播,用户无需手动干预。
4.4 线程与帧率优化
在实时视频场景下,有两个核心优化:
1. 丢帧保实时:Webcam 和 RTSP 的推理链路采用"只处理最新帧"的策略。如果推理还没完成但新帧已经到达,旧帧会被直接丢弃而非排队等待。这确保了 UI 始终显示最新的推理结果,而不会因为帧堆积导致越来越大的延迟。
2. 背压控制 :WebSocket 发送前检查 bufferedAmount,如果缓冲区已满则跳过当前帧,避免网络拥塞时的内存膨胀。
4.5 可选依赖的优雅降级
psutil、pynvml、httpx 这三个依赖都是可选的,用 try/except 包裹导入:
python
try:
import pynvml
...
except ImportError:
pynvml = None
如果安装失败,系统核心功能不受影响------GPU 监控显示"NVML 不可用",Webhook 派发返回失败状态,但推理链路完全正常。这种设计降低了部署门槛,用户不需要为了跑通 demo 而折腾一堆 CUDA 相关依赖。
五、亮点细节
5.1 Neo-Skeuomorphism 暗黑主题
UI 采用了一套自定义的 **Neo-Skeuomorphism(新拟态)**暗黑主题,基于 CSS 自定义属性实现,没有引入任何 UI 组件库。所有按钮、卡片、面板都是手写的,风格统一,适合长时间盯盘使用。
5.2 轻量 i18n
没有使用 react-i18next 等第三方库,而是自己实现了一个极简的国际化方案:
- Zustand Locale Store(
zh/en,持久化到localStorage) - JSON 词典文件(
locales/zh.json/locales/en.json) t(key)函数 +useT()React Hook,支持插值{``{variable}}
整个 i18n 系统不到 50 行代码,足够轻量,也足够好用。
5.3 BadCase 一键导出
在算法调优过程中,经常遇到某个样本推理效果不好的情况。UltraConsole 提供了 BadCase 一键导出功能:点击按钮即可打包下载一个 zip 文件,包含:
frame.jpg:当前帧截图config.json:推理参数配置pred.json:推理结果数据
这个 zip 可以直接发给算法同事复现问题,省去了"你用的什么模型?什么参数?什么阈值?"的来回沟通成本。
5.4 安全考虑
虽然定位是本地工具,项目仍然考虑了一些安全问题:
- 模型路径白名单校验 :
_validated_model_id()函数防止路径穿越攻击,确保只能加载models/目录下的合法模型文件 - 文件后缀校验 :只允许
.pt/.onnx/.engine三种格式 - 权重文件不入仓库 :
.gitignore排除了模型文件和 webhook 配置
六、快速上手
环境准备
- Python 3.10+
- Node.js(用于 Vite)
- 将模型权重文件放到
backend/models/目录(如yolov8n.pt)
启动后端
bash
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8001
启动前端
bash
cd frontend
npm install
npm run dev
Vite 开发服务器会将 /api 和 /ws 请求代理到 http://127.0.0.1:8001,打开浏览器即可使用。
使用"魔改版"Ultralytics
如果你对 Ultralytics 源码做了定制修改,可以通过以下方式切换:
bash
pip uninstall ultralytics
pip install -e /path/to/your/ultralytics
修改源码后只需重启 uvicorn 即可生效,无需重新安装。
七、适用场景与未来规划
适用场景
- 工业质检:生产线摄像头接入,实时检测缺陷
- 安防监控:多路摄像头同屏监控,越线/进区告警
- 算法调优:快速切换模型和参数,对比推理效果
- Demo 演示:拖拽即用,零代码上手
路线图(部分已完成)
- ✅ 多路监控墙、ByteTrack + 事件、分割/姿态、GPU/CPU 监控、延迟分位、Webhook、WebSocket 重连、拖拽上传、配置导入导出、中英双语 i18n、空间热力图
- ⏳ 模型 A/B 对比、Docker Compose 一键部署、SQLite 持久化、Bearer Token 鉴权、截图导出、插件系统
八、总结
UltraConsole 试图回答一个问题:能不能用一个 Web 应用,替代掉那些零散的推理脚本和粗糙的可视化工具?
它不是一个学术项目,而是一个面向实际工作场景的工具------从模型加载到推理可视化,从参数调优到告警推送,从单路调试到多路监控,全流程覆盖。
如果你正在做 YOLO 相关的算法开发或工业部署,不妨试试这个项目。Star、Issue、PR 都欢迎。
项目地址 :github.com/WangQvQ/ultraconsole
License:MIT