跳到主要内容

RiVision — 边缘智能视频分析平台

1. 项目概述

RiVision的定位:

  • 基于 SpaceMIT K3 RISC-V 芯片, 面向视频流的分布式 AI推理底座。
  • 实现 YOLO等目标检测,VLM视频大模型等图像理解等提供分布式,并行化,高性能处理等推理服务。
  • 自然语言交互,文字搜索,图片搜索等
  • 视频的内容摘要,内容分析等

应用场景

  • 面向C端:作为家庭AI算力基础底座,通过多模态和大模型,实现图像/视频/数据的内容分析和摘要
  • 面向B端:创建基于大模型的内容摘要和视频分析,并高性能+分布式并行计算,实现智能搜索,场景闭环等

核心能力

  • 支持自然语言搜索和以图搜图
  • 支持model-zoo-vision
  • YOLO 实时目标检测(人、车、物体等),ByteTrack 多目标跟踪
  • VLM 视觉语言模型场景描述
  • 多节点推理负载均衡与健康管理
  • Web UI 实时监控、分析回放、节点管理
  • GB28181 / ONVIF / RTSP 多协议摄像头接入与管理

2. 系统架构

RiVision 系统架构


3. 模块详细描述

3.1 rivision_cli — 编排中心

系统的核心调度器,负责视频流管理、AI 推理编排和数据存储。

关键子模块:

  • go2rtc 嵌入式流中继 — 内嵌 go2rtc 进程,RTSP → fMP4/WebRTC 协议转换,支持 MSE 低延迟播放
  • YOLO 扇出检测管线 — 3 层架构:Capture(抓帧)→ WorkerPool(并发推理)→ ByteTrack(多目标跟踪)
  • VLM 触发控制 — 3 种模式:定时触发(interval)、YOLO 阈值触发(yolo-threshold)、手动触发(manual)
  • 语义搜索引擎 — SQLite + brute-force 余弦相似度,混合评分:文本 0.6 + 图像 0.4 + 关键词 0.3
  • Provider 链 — EmbedProvider → RemoteProvider → HashProvider(FNV-1a 降级)

技术栈: Go, Gin, go2rtc, SQLite (WAL), Vue 3 (go2rtc-vue)

3.2 rivision_gateway — 推理网关

多节点推理任务的统一入口,负责负载均衡和结果聚合。

关键能力:

  • 节点管理 — Token 注册,10s 心跳,30s 健康检查,网络分区检测
  • VLM 智能调度 — 多维评分:健康度 40% + 负载 30% + 延迟 15% + 成功率 15%,原子 SelectAndAcquire
  • YOLO 轮询分发 — RoundRobin 策略,按节点能力均匀分配
  • 实时推送 — WebSocket Manager,VLM 结果实时广播
  • 历史缓存 — 内存环形缓冲区(500 条),支持分页查询

技术栈: Go, Gin, WebSocket, JWT

3.3 rivision_owl — NVR 视频管理

网络视频录像机模块,负责摄像头协议接入和媒体流管理。

关键能力:

  • GB28181 SIP 协议栈 — 纯 Go 实现,支持 REGISTER/INVITE/BYE/MESSAGE/NOTIFY,设备注册与保活
  • ONVIF 发现 — WS-Discovery 组播发现,GetProfiles/GetStreamUri 自动获取流地址
  • ZLMediaKit 嵌入 — 内嵌 C++ 流媒体服务器,支持 RTSP/RTMP/HLS/WebRTC,9 个 Webhook 回调
  • 六边形架构 — Protocoler 接口抽象,GB28181/ONVIF/RTSP/RTMP 四种适配器可插拔
  • GB28181 模拟器 — 用于开发测试,模拟摄像头 SIP 注册和推流

技术栈: Go, Gin, ZLMediaKit (C++), SIP/SDP, ONVIF, Vue 3 (gb28181-web)

3.4 rivision_node — 边缘计算节点

部署在边缘设备上的推理执行单元。

子组件:

组件语言功能
node-agentGo进程管理(/proc + systemctl)、心跳上报、健康监控
yolo-serverC++ONNX Runtime 推理、WorkerPool/Pipeline 双模式、ByteTrack 跟踪
llama-serverC++llama.cpp 封装、MiniCPM-V / Qwen3VL 视觉语言模型

NPU 加速: RISC-V K3 通过 SpaceMIT ONNX Runtime EP 调用 A100 NPU;ARM64 通过 CUDA EP

3.5 rivision_embed — 向量嵌入服务

提供文本和图像的向量化能力,支撑语义搜索。

API 接口:

方法路径功能
GET/health健康检查
GET/v1/models模型信息
POST/v1/embeddings/text文本向量化
POST/v1/embeddings/image图像向量化(Base64/URL)

模型: Chinese-CLIP ViT-B/16,512 维向量,字符级分词器(最大 52 tokens)

技术栈: Go, CGo, ONNX Runtime, SpaceMIT NPU EP

3.6 go2rtc-vue — Web 前端

基于 Vue 3 + Vite 的单页应用,嵌入 rivision_cli 二进制分发。

页面: 监控(Monitor)、仪表盘(Dashboard)、节点管理(Nodes)、任务(Tasks)、分析回放(Analysis)、设置(Settings)、登录(Login)

4 路 WebSocket: Gateway VLM 推送、YOLO 多路复用、VLM 结果流、MSE 视频流


4. 数据流

4.1 视频接入流

视频接入流

4.2 YOLO 检测流

YOLO 检测流

4.3 VLM 场景理解流

VLM 场景理解流

4.4 语义搜索流

语义搜索流


5. 端口矩阵

服务默认端口协议说明
rivision_cli8080HTTP/WSWeb UI + API
rivision_cli (go2rtc)1984HTTP流中继 API
rivision_cli (go2rtc)8554RTSPRTSP 服务
rivision_gateway8090HTTP/WS推理网关
rivision_owl15123HTTPNVR 管理 API
rivision_owl (SIP)15060UDP/TCPGB28181 SIP 信令
rivision_owl (ZLM)8220HTTPZLMediaKit API(ZLM_HTTP_PORT)
rivision_embed18081HTTP向量嵌入 API
rivision_node (agent)9090HTTP节点管理(AGENT_PORT)
yolo-server9081HTTPYOLO 推理(YOLO_PORT)
llama-server9080HTTPVLM 推理(LLAMA_PORT)

6. 技术栈

层级技术
语言Go 1.25+, C++ 17, Vue 3, TypeScript
Web 框架Gin (Go), Vite (前端)
流媒体go2rtc, ZLMediaKit, FFmpeg
AI 推理ONNX Runtime, llama.cpp, ByteTrack
模型YOLOv8/v11, MiniCPM-V, Qwen3VL, Chinese-CLIP ViT-B/16
存储SQLite (WAL mode)
协议GB28181 (SIP/SDP), ONVIF (WS-Discovery), RTSP, RTMP, WebRTC
NPUSpaceMIT A100 EP (RISC-V), CUDA (ARM64 Jetson)
构建Make, CMake, Go cross-compile, SpaceMIT 交叉工具链

7. 项目结构

prj_dir/
├── build/
│ └── Makefile # 统一构建入口
├── scripts/ # 构建/部署脚本
├── tools/ # 交叉编译工具链
│ └── spacemit-toolchain-linux-glibc-x86_64-v1.2.2/
├── src/
│ ├── rivision_cli/ # 编排中心
│ │ ├── go2rtc-vue/ # Web 前端 (Vue 3)
│ │ ├── internal/ # 核心业务逻辑
│ │ │ ├── semantic/ # 语义搜索引擎
│ │ │ ├── yolo/ # YOLO 扇出管线
│ │ │ ├── vlm/ # VLM 触发控制
│ │ │ ├── embed/ # 嵌入式二进制
│ │ │ └── webserver/ # HTTP/WS 服务
│ │ ├── configs/ # 配置模板
│ │ └── Makefile
│ ├── rivision_gateway/
│ │ └── inference-gateway-go/
│ │ ├── cmd/ # 入口
│ │ ├── internal/ # 节点管理、调度、WebSocket
│ │ └── Makefile
│ ├── rivision_owl/
│ │ ├── owl/ # NVR 核心
│ │ │ └── pkg/gbs/ # GB28181 SIP 协议栈
│ │ ├── gb28181-sim/ # GB28181 模拟器
│ │ ├── onvif-sim/ # ONVIF 模拟器
│ │ ├── gb28181-web/ # NVR Web UI
│ │ ├── ZLMediaKit/ # 流媒体服务器 (C++)
│ │ └── Makefile
│ ├── rivision_node/
│ │ ├── node-agent/ # 节点管理 (Go)
│ │ ├── yolo-server/ # YOLO 推理 (C++)
│ │ ├── benchmark/ # 性能测试工具
│ │ └── Makefile
│ └── rivision_embed/
│ ├── cmd/server/ # 嵌入服务入口
│ ├── models/embed/ # ONNX 模型文件
│ ├── third_party/ # ONNX Runtime 库
│ └── Makefile
└── dist/ # 构建产物输出

8. 构建与部署

8.1 统一构建

cd build/

# RISC-V K3 全量发布
make release-riscv64

# 单组件构建
make cli-riscv64
make gateway-riscv64
make embed-riscv64
make owl-riscv64
make node

8.2 构建产物

make release-riscv64 输出 dist/ 目录:

dist/
├── rivision-cli/ # CLI + Web UI + go2rtc + 模型
├── rivision_gateway/ # 推理网关二进制
├── rivision-embed/ # 嵌入服务 + ONNX 模型 + 运行时库
├── rivision_owl/ # NVR + ZLMediaKit + 配置
└── rivision_node/ # node-agent + yolo-server + llama-server

8.3 部署拓扑

部署拓扑


9. 运行截图

rivision_cli Web UI

rivision_cli 运行截图


10. 配置示例

rivision_cli (rivision.yaml)

node:
id: "node-master-01"
role: master # master / yolo / compute
name: "主控节点"

server:
host: "0.0.0.0"
port: 8080

cameras:
- name: "前门"
source: "rtsp://admin:password@192.168.1.100:554/stream1"
yolo:
enabled: true
model: "yolov8n.onnx"
confidence: 0.5
target_fps: 5
vlm:
trigger: "yolo" # interval / yolo / manual
prompt: "描述画面中的场景和人物活动"

rivision_owl (config.toml)

[Server.HTTP]
Port = 15123

[Sip]
Port = 15060
ID = "34020000002000000001"
Password = ""

[Media]
HTTPPort = 8220
RTPPortRange = "20000-20100"

[Data.Database]
Dsn = "./configs/data.db"

11. API 接口调用

本节面向应用开发者,说明如何通过 HTTP / WebSocket 接口集成 RiVision 各组件。所有 JSON 接口均以 UTF-8 编码,错误响应统一为 {"error": "<msg>"}(rivision_owl 部分接口为 {"code": <int>, "msg": "<msg>"})。

11.1 服务总览

服务默认 Base URL协议主要职责
rivision_clihttp://<host>:8080HTTP/WSWeb UI + 编排(摄像头 / VLM / YOLO / OWL 透传)
rivision_gatewayhttp://<host>:8090HTTP/WS推理网关(节点注册 / 调度 / Token)
rivision_embedhttp://<host>:18081HTTP文本 / 图像向量化(OpenAI 兼容)
rivision_owlhttp://<host>:15123HTTPNVR / GB28181 接入与录像
rivision_node(node-agent)http://<host>:9090HTTP节点健康与进程控制

11.2 rivision_cli(编排中心 :8080)

11.2.1 摄像头管理 /api/cameras

方法路径说明
GET/api/cameras列出全部摄像头
GET/api/cameras/status全量状态(在线 / FPS / 码率)
GET/api/cameras/:id单个摄像头详情
POST/api/cameras添加摄像头(请求体见 §10 配置示例)
PUT/api/cameras/:id更新摄像头配置
DELETE/api/cameras/:id移除摄像头
GET/api/cameras/:id/stream获取播放 URL(fMP4 / RTSP / HLS)
POST/api/cameras/:id/snapshot抓拍一帧 JPEG
POST/api/cameras/:id/capture触发离线帧采集

11.2.2 VLM 触发与结果 /api/vlm

方法路径说明
GET/api/vlm/config获取 VLM 触发配置
PUT/api/vlm/config更新触发配置(interval / yolo / manual)
POST/api/vlm/trigger/:camera_id手动触发一次 VLM 分析
GET/api/vlm/results分页查询历史结果(实现中,参数预留 limit / offset / camera_id
GET/api/vlm/results/:id获取单条结果
DELETE/api/vlm/results/:id删除结果
GET/api/vlm/statsVLM 调用统计
GET/api/vlm/statusVLM 触发器运行状态

11.2.3 VLM 语义搜索 /api/vlm/search

文本/图像语义检索独立路由组,请求体均为 JSON(区别于 /api/vlm/results 的列表查询)。

方法路径说明
POST/api/vlm/search文本搜索,请求体 {"query":"<text>", "camera_id":"<id>", "limit":<N>}
POST/api/vlm/search/image以图搜图,请求体含 caption / tags / image_embedding / image_base64 / task_id 等可选字段
POST/api/vlm/search/hybrid混合搜索(文本 + 图像向量加权),请求体含 HybridSearchInput 字段集 + 可选 image_base64
GET/api/vlm/search/stats索引总数与 Provider 状态
GET/api/vlm/search/provider/statusEmbed Provider 状态(EmbedProvider / RemoteProvider / HashProvider 链)
POST/api/vlm/search/reindex从网关历史导入并更新本地 SQLite 语义索引
POST/api/vlm/search/backfill回填缺失的图像 / 文本 Embedding

11.2.4 YOLO 控制 /api/yolo

方法路径说明
GET/api/yolo/status已启用 YOLO 的摄像头列表与同步参数
POST/api/yolo/enable/:camera_id启用指定摄像头的 YOLO 检测
POST/api/yolo/disable/:camera_id禁用
GET/api/yolo/check/:camera_id检查指定摄像头是否启用
POST/api/yolo/disable-all一键禁用全部
GET/api/yolo/pipeline-stats推理管线统计(Capture / WorkerPool / ByteTrack)
POST/api/yolo/settings设置同步帧率 / JPEG 质量 / VLM 间隔

11.2.5 OWL / NVR 透传 /api/owl

方法路径说明
POST/api/owl/loginNVR 鉴权(透传到 rivision_owl)
GET/api/owl/server/infoNVR 服务信息
GET/api/owl/devices设备列表(page / page_size
GET/api/owl/devices/:id设备详情
GET/api/owl/devices/:id/channels设备下通道列表
GET/api/owl/channels全部通道(可选 device_id 过滤)
GET/api/owl/streamsgo2rtc 兼容流地址表
POST/api/owl/channels/:id/play启动通道拉流
POST/api/owl/channels/:id/stop停止拉流
POST/api/owl/channels/:id/snapshot通道抓拍(返回 JPEG)
POST/api/owl/channels/:id/ai/enable通道启用 AI 分析
POST/api/owl/channels/:id/ai/disable通道禁用 AI 分析
POST/api/owl/ptz/control云台控制(channel_id / command / speed

11.2.6 系统与 WebSocket

方法路径说明
GET/health顶层健康检查
GET/api/system/status系统运行状态
GET / PUT/api/system/config全局配置
GET/api/system/logs日志查询
POST/api/system/restart重启服务
GET/api/system/events事件查询(轮询)
GET (WS)/ws/vlmVLM 结果实时推送(全量)
GET (WS)/ws/vlm/:camera_id单摄像头 VLM 推送
GET (WS)/ws/yoloYOLO 多路复用 WebSocket
GET (WS)/ws/yolo/:camera_idYOLO 单路
GET (WS)/ws/inference推理结果流
GET (WS)/ws/events系统事件流

11.3 rivision_gateway(推理网关 :8090)

所有 REST 接口前缀 /api/v1/

11.3.1 推理 /api/v1/inference

方法路径说明
POST/api/v1/inference/analyze图像 VLM 分析(image_base64 + prompt
POST/api/v1/inference/chat多轮对话
GET/api/v1/inference/history历史推理记录(分页)

11.3.2 节点管理 /api/v1/nodes

方法路径说明
GET/api/v1/nodes已注册节点列表
GET/api/v1/nodes/snapshot快照(含健康 / 负载)
GET/api/v1/nodes/:id单节点详情
POST/api/v1/nodes/register节点注册(需携带 Token)
POST / PUT/api/v1/nodes/:id/heartbeat节点心跳上报
DELETE/api/v1/nodes/:id注销节点
POST/api/v1/nodes/:id/enable启用
POST/api/v1/nodes/:id/disable禁用
POST/api/v1/nodes/:id/check手动健康检查
POST/api/v1/nodes/:id/start远程启动 llama-server
POST/api/v1/nodes/:id/stop停止
POST/api/v1/nodes/:id/restart重启
POST/api/v1/nodes/:id/kill强制终止
GET/api/v1/nodes/:id/process-statusllama 进程状态

11.3.3 健康 / 统计 / 指标

方法路径说明
GET/api/v1/health健康检查
GET/api/v1/health/detailed详细健康(各子模块)
POST/api/v1/health/check触发主动健康检查
GET/api/v1/stats总览
GET/api/v1/stats/overview全局指标
GET/api/v1/stats/nodes各节点统计
GET/api/v1/stats/performance性能指标
GET/api/v1/stats/tasks任务统计
GET/api/v1/stats/tasks/running运行中任务
GET/api/v1/stats/tasks/pending排队任务
GET/api/v1/metrics/realtime实时指标
GET/api/v1/metrics/timeseries时间序列
GET/api/v1/metrics/prometheusPrometheus 拉取端点

11.3.4 Token 管理 /api/v1/admin/node-tokens

方法路径说明
POST/api/v1/admin/node-tokens/generate生成节点注册 Token
GET/api/v1/admin/node-tokens/listToken 列表
DELETE/api/v1/admin/node-tokens/:token撤销指定 Token
DELETE/api/v1/admin/node-tokens/revoke-by-node/:nodeID按节点 ID 撤销
GET/api/v1/admin/node-tokens/stats注册统计
GET / POST/api/v1/admin/node-tokens/blacklist黑名单管理
POST/api/v1/admin/node-tokens/cleanup清理过期 Token

11.3.5 YOLO 与异步任务

方法路径说明
POST/api/v1/yolo/detectYOLO 单帧检测(网关 RoundRobin 分发)
GET/api/v1/yolo/statusYOLO 集群状态
GET/api/v1/yolo/healthYOLO 集群健康
POST/api/v1/async-tasks/submit提交异步任务
GET/api/v1/async-tasks/status/:task_id查询任务状态
GET/api/v1/async-tasks/result/:task_id获取结果
POST/api/v1/async-tasks/ack/:task_id确认结果
POST/api/v1/async-tasks/batch/submit批量提交
POST/api/v1/async-tasks/batch/status批量查询
GET/api/v1/async-tasks/main/:main_task_id/progress主任务进度

11.3.6 WebSocket 与配置

方法路径说明
GET (WS)/api/v1/ws/realtime网关实时事件
GET (WS)/api/v1/ws/liveVLM 结果直播流
GET/api/v1/ws/statusWebSocket 连接状态
GET/api/v1/config网关配置(只读)

11.4 rivision_embed(向量嵌入 :18081)

方法路径说明
GET/health健康检查(含模型加载状态)
GET/v1/models模型信息(dim / owner)
POST/v1/embeddings/text文本向量化,请求体 {"input": "<text>"}
POST/v1/embeddings/image图像向量化,请求体 {"input": "<base64 | url>"}

返回向量维度 512(Chinese-CLIP ViT-B/16)。

11.5 rivision_owl(NVR :15123)

方法路径说明
GET/health健康 + 构建版本
GET/app/version/check检查升级
POST/app/upgradeOTA 升级(需 JWT)
POST/user/login用户登录(返回 JWT)
GET/user/login/key登录公钥
GET/recordings录像列表(分页)
GET/recordings/timeline时间轴
GET/recordings/monthly月度统计
GET/recordings/:id单条录像
GET/recordings/:id/download录像下载(支持 HTTP Range)
GET/recordings/channels/:cid/index.m3u8通道 HLS 播放列表
ANY/proxy/sms/*path媒体服务反向代理

GB28181 / SMS / 事件等接口另行独立说明,详见源码 src/rivision_owl/owl/internal/web/api/

11.6 rivision_node node-agent(:9090)

方法路径说明
GET/节点基本信息
GET/api/v1/health健康(liveness + readiness)
GET/api/v1/ready就绪
GET/api/v1/live存活
GET/api/v1/status节点状态(CPU / 内存 / GPU)
POST/api/v1/process/start启动进程(name=yolo-server | llama-server
POST/api/v1/process/stop停止
POST/api/v1/process/restart重启
POST/api/v1/process/kill强制终止
POST/api/v1/process/kill-all终止全部受管进程
GET/api/v1/process/status单进程状态
GET/api/v1/process/list进程列表
POST/api/v1/yolo/detect节点本地单帧 YOLO 检测
GET/api/v1/yolo/healthYOLO 子进程健康
GET/api/v1/yolo/statusYOLO 子进程状态

11.7 调用示例

示例假设各服务运行在本机,可按实际部署替换 <host> 与端口。

11.7.1 文本嵌入与语义搜索

# 1. 文本向量化(验证 rivision_embed)
curl -s http://localhost:18081/v1/embeddings/text \
-H 'Content-Type: application/json' \
-d '{"input":"红色轿车驶过路口"}' | jq '.data[0].dim'
# 输出: 512

# 2. 通过 rivision_cli 进行语义搜索(POST /api/vlm/search,混合评分排序)
curl -s -X POST http://localhost:8080/api/vlm/search \
-H 'Content-Type: application/json' \
-d '{"query":"红色轿车","limit":10}' | jq '.items'

11.7.2 触发一次 VLM 场景分析

# 对 camera_id=cam-front 触发一次 VLM 分析
curl -s -X POST 'http://localhost:8080/api/vlm/trigger/cam-front' \
-H 'Content-Type: application/json' \
-d '{"prompt":"描述画面中的人物活动","model":"qwen3vl"}' | jq

# 实时订阅 VLM 结果(任选 websocat / wscat 等工具)
websocat ws://localhost:8080/ws/vlm

11.7.3 添加摄像头并启用 YOLO

# 1. 添加 RTSP 摄像头
curl -s -X POST http://localhost:8080/api/cameras \
-H 'Content-Type: application/json' \
-d '{
"id": "cam-front",
"name": "前门",
"source": "rtsp://admin:pw@192.168.1.100:554/stream1"
}'

# 2. 启用 YOLO 检测
curl -s -X POST http://localhost:8080/api/yolo/enable/cam-front

# 3. 查看推理管线统计
curl -s http://localhost:8080/api/yolo/pipeline-stats | jq

11.7.4 网关节点注册流程

# 1. 管理员生成节点 Token
TOKEN=$(curl -s -X POST http://localhost:8090/api/v1/admin/node-tokens/generate \
-H 'Content-Type: application/json' \
-d '{"node_id":"node-edge-01","role":"yolo"}' | jq -r .token)

# 2. 节点端使用 Token 注册
curl -s -X POST http://localhost:8090/api/v1/nodes/register \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"node_id":"node-edge-01","address":"192.168.1.50:9090","capabilities":["yolo"]}'

# 3. 节点心跳(默认 10s 一次)
curl -s -X POST http://localhost:8090/api/v1/nodes/node-edge-01/heartbeat \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"load":0.42,"healthy":true}'

11.8 错误与认证

  • HTTP 状态码:200 成功;400 请求参数错误;401 未鉴权;403 鉴权失败 / 已加入黑名单;404 资源不存在;5xx 服务异常。
  • rivision_gateway 使用 Bearer Token 鉴权:Token 由 /api/v1/admin/node-tokens/generate 生成并发放给边缘节点;节点 register / heartbeat 必须在 Authorization 头中携带 Bearer <token>
  • rivision_owl 使用 JWT:通过 /user/login 获取,写操作(升级、修改)需在 Authorization 头携带 Bearer <jwt>
  • rivision_cli 默认开放 LAN 访问;生产部署建议在反向代理层(Nginx / Caddy)叠加鉴权与限流。