「视频结构化」是一种 AI 落地的工程化实现,目标是把 AI 模型推理流程可能一般化。它输出视频,输入结构化数据,将后果给到业务零碎去造成某些行业的解决方案。
换个角度,如果你想用摄像头来实现某些智能化监控、预警等,那么「视频结构化」可能就是你要用到的技术计划。
不过,也不肯定须要本人去实现,因为各个芯片厂商可能都提供了相似的流程框架:
- 寒武纪 CNStream
- NVIDIA DeepStream
以上集体没用过,简略看了下,都受限于只能用厂商自家的芯片。集体教训来说,个别硬件还是须要多家可选的,本人实现一套「视频结构化」还是有必要的。
本文将介绍「视频结构化」的实现思路、技术架构,以及衍生的一些工作。
实现思路
有一个 AI 模型与一段视频,如何进行推理呢?
- 视频流:OpenCV 关上视频流,获取图像帧
- 前解决:图像 Resize 成模型输出的 Shape
- 模型推理:AI 框架进行模型推理,失去输入
-
后处理:将输入解决成冀望的信息
- 例如,指标检测:解析框的地位和类别,再 NMS 筛选
以上是最根底的推理流程,实现得不错👏
简略工作,这样满足要求就行。但理论工作,可能:
-
输出
- 工作接管
-
视频流
- 相机选型
- 视频起源: 录制视频、RTSP 实时流
- 帧率控制: 个别 5 fps,缩小计算
- 多路并发: 多路视频,并行剖析
- 硬件解码
-
推理
-
前解决
- 输出调整: 缩放、转置
- Batch 合并
- 硬件加速
-
模型推理
- 硬件选型: Nvidia、华为昇腾、或其余
- 模型解决: 裁剪、转换、量化
- 模型编排: 多任务多模型,有先后关系
-
后处理
- 输入解析: 推理后果,变为结构化数据
- 硬件加速
-
-
输入
- 后果推送
-
其余
- 视频存储,License
- 链路追踪,耗时剖析
以上流程个别称为「视频结构化」:输出多路视频,进行实时剖析,最初输入结构化数据,给到业务零碎。
该流程,这里把它分为了输出、推理、输入,都是一个个工作节点,整体采纳 Pipeline 形式来编排 AI 推理工作。输入输出时,个别会用 RPC 或音讯队列来与业务零碎通信。
整体架构
「视频结构化」整体架构,如下:
管道节点
管道 Pipeline 这块是次要局部,其实现都是一个个节点:
-
IN
- 工作接管;视频流解码;帧率控制
-
推理
- 推理引擎做模型推理,后果进结构化数据;依编排往后持续
-
追踪
- 追踪依赖推理出的特色;业务不须要,就不编排
-
OUT
- 后果推送;要预览播放的话,进行视频流编码
节点就是个生产消费者,用个阻塞队列很快就能实现。节点间组成一个树,也就是工作编排的后果。节点会有输入输出差别,要约定分明或分几个类型。
节点流程:音讯队列有工作,取出执行,后果进结构化数据,最初发给下一节点的音讯队列。
节点的线程数、队列下限,都可做配置。根据耗时剖析,能够优化调整。
GStreamer 的 pipeline + plugin 的技术架构值得学习。集体没深刻理解,所以不好具体评估,倒见过在输出做插件化解码。NVIDIA DeepStream 间接就基于 GStreamer 开发的。
构造数据
结构化数据,在整个 Pipeline 里是一直追加欠缺的过程,最初输入时个别 JSON 化推送。
它的内容约定,是最次要的。会有:
- 根底信息: task, frame 等信息
- 推理后果: 会以工作分类进行标签
它会用作节点的输出,例如获取人脸特色,依赖前一指标检测节点的人脸 boxes 信息。
根底模块
-
全局配置
- 通用配置、节点配置与编排;可视化编排,理论就是编辑它
- 个别 JSON 格局,结构化数据最初也 JSON 化
-
过程保活
- Supervisor 不错,能够把终端日志配置进文件
-
音讯通信
- 与内部零碎,用 RPC 或 Redis,也可能推送 Kafka
- 外部用本人的音讯队列
-
内存共享
- 用在图像帧,免得拷贝,帧 ID 标识
- 显存也预申请,队列调配,缩小 Host & Device 拷贝
技术选型
「视频结构化」用 C++ 实现,次要以下几点:
- FFmpeg 编解码(CPU)
- OpenCV 前后解决(CPU)
-
芯片生态库,硬件加速:编解码与前后解决
- 如 Nvidia: video codec, npp, nvjpeg; 昇腾 dvpp 等
-
根底库,抉择支流的就好,如:
- Log:gabime/spdlog, google/glog
- JSON: nlohmann/json
- RPC: grpc/grpc, apache/incubator-brpc
更具体的技术栈,可见该分享:https://zhuanlan.zhihu.com/p/…,思维导图很具体。
「视频结构化」实现有些要看本人的衡量:
-
一个我的项目怎么反对多个硬件?
-
编译主动辨别环境,编译不同代码,最终会产生多套部署
- 须要形象推理、前后解决等硬件相干性能
- 也能够思考插件实现,治理好插件配置
-
-
视频流要不要用流媒体框架?
- 简略点间接 FFmpeg,不引入 GStreamer
-
图像与后果怎么优化同步?
- 只是图像显示,存储提供链接进后果(留神 IO 瓶颈)
-
自身视频显示,间接绘制后果进图像,编码进流
- 或预览端本人实现,流数据包携带后果
衍生工作
「视频结构化」会有一些衍生的工作:库、工具或零碎。
首先,模型个别自定义格局,一是爱护,二是不便本人应用。所以,会把原模型及其配置封装进自定义格局,还会表明推理形式、前后解决抉择等。
这里会有如下两个局部:
- 模型转换工具链: 不同硬件模型转换后,再封装进本人格局
- 模型推理引擎: 模型解封装,再依配置进行推理,出后果
模型可能还要裁剪、量化,也是工作的一部分。
其次,工作状况、JSON 配置、日志等,成熟一点,还会提供治理后盾方便使用。
此外,还可能有:
-
License: 生成、校验相干工具,及治理记录
- 除了有效期,还能够思考限度路数、工作等
- 实时监控: 硬件状态监控、预警
结语
「视频结构化」只是 AI 落地的一部分,理论做计划一是对接算法模型、二是对接业务零碎,还可能要去适配新的摄像头或硬件平台。
也就是会有两种反对列表:硬件列表、模型列表。这就是积攒的成绩了。
「视频结构化」会部署成核心服务器,或边缘计算。不过,只是简略工作,当初可能智能摄像头就够了,都带边缘计算辨认人脸什么的。
GoCoding 集体实际的教训分享,可关注公众号!