视频结构化 AI 推理流程
「视频结构化」是一种 AI 落地的工程化实现,目的是把 AI 模型推理流程能够一般化。它输入视频,输出结构化数据,将结果给到业务系统去形成某些行业的解决方案。
换个角度,如果你想用摄像头来实现某些智能化监控、预警等,那么「视频结构化」可能就是你要用到的技术方案。
不过,也不一定需要自己去实现,因为各个芯片厂商可能都提供了类似的流程框架:
以上个人没用过,简单看了下,都受限于只能用厂商自家的芯片。个人经验来说,一般硬件还是需要多家可选的,自己实现一套「视频结构化」还是有必要的。
本文将介绍「视频结构化」的实现思路、技术架构,以及衍生的一些工作。
实现思路
有一个 AI 模型与一段视频,如何进行推理呢?
- 视频流:OpenCV 打开视频流,获取图像帧
- 前处理:图像 Resize 成模型输入的 Shape
- 模型推理:AI 框架进行模型推理,得到输出
- 后处理:将输出处理成期望的信息
- 例如,目标检测:解析框的位置和类别,再 NMS 筛选
以上是最基础的推理流程,完成得不错👏
简单任务,这样满足要求就行。但实际任务,可能:
- 输入
- 任务接收
- 视频流
- 相机选型
- 视频来源: 录制视频、RTSP 实时流
- 帧率控制: 一般 5 fps,减少计算
- 多路并发: 多路视频,并行分析
- 硬件解码
- 推理
- 前处理
- 输入调整: 缩放、转置
- Batch 合并
- 硬件加速
- 模型推理
- 硬件选型: Nvidia、华为昇腾、或其他
- 模型处理: 裁剪、转换、量化
- 模型编排: 多任务多模型,有先后关系
- 后处理
- 输出解析: 推理结果,变为结构化数据
- 硬件加速
- 前处理
- 输出
- 结果推送
- 其他
- 视频存储,License
- 链路追踪,耗时分析
以上流程一般称为「视频结构化」:输入多路视频,进行实时分析,最后输出结构化数据,给到业务系统。
该流程,这里把它分为了输入、推理、输出,都是一个个任务节点,整体采用 Pipeline 方式来编排 AI 推理任务。输入输出时,一般会用 RPC 或消息队列来与业务系统通信。
整体架构
「视频结构化」整体架构,如下:
管道节点
管道 Pipeline 这块是主要部分,其实现都是一个个节点:
- IN
- 任务接收;视频流解码;帧率控制
- 推理
- 推理引擎做模型推理,结果进结构化数据;依编排往后继续
- 追踪
- 追踪依赖推理出的特征;业务不需要,就不编排
- OUT
- 结果推送;要预览播放的话,进行视频流编码
节点就是个生产消费者,用个阻塞队列很快就能实现。节点间组成一个树,也就是任务编排的结果。节点会有输入输出差异,要约定清楚或分几个类型。
节点流程:消息队列有任务,取出执行,结果进结构化数据,最后发给下一节点的消息队列。
节点的线程数、队列上限,都可做配置。依据耗时分析,可以优化调整。
GStreamer 的 pipeline + plugin 的技术架构值得学习。个人没深入了解,所以不好具体评价,倒见过在输入做插件化解码。NVIDIA DeepStream 直接就基于 GStreamer 开发的。