视频结构化 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 开发的。
结构数据
结构化数据,在整个 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/362711954 ,思维导图很详细。
「视频结构化」实现有些要看自己的权衡:
- 一个项目怎么支持多个硬件?
- 编译自动区分环境,编译不同代码,最终会产生多套部署
- 需要抽象推理、前后处理等硬件相关功能
- 也可以考虑插件实现,管理好插件配置
- 编译自动区分环境,编译不同代码,最终会产生多套部署
- 视频流要不要用流媒体框架?
- 简单点直接 FFmpeg,不引入 GStreamer
- 图像与结果怎么优化同步?
- 只是图像显示,存储提供链接进结果(注意 IO 瓶颈)
- 本身视频显示,直接绘制结果进图像,编码进流
- 或预览端自己实现,流数据包携带结果
衍生工作
「视频结构化」会有一些衍生的工作:库、工具或系统。
首先,模型一般自定义格式,一是保护,二是方便自己使用。所以,会把原模型及其配置封装进自定义格式,还会标明推理方式、前后处理选择等。
这里会有如下两个部分:
- 模型转换工具链: 不同硬件模型转换后,再封装进自己格式
- 模型推理引擎: 模型解封装,再依配置进行推理,出结果
模型可能还要裁剪、量化,也是工作的一部分。
其次,任务情况、JSON 配置、日志等,成熟一点,还会提供管理后台方便使用。
此外,还可能有:
- License: 生成、校验相关工具,及管理记录
- 除了有效期,还可以考虑限制路数、任务等
- 实时监控: 硬件状态监控、预警
结语
「视频结构化」只是 AI 落地的一部分,实际做方案一是对接算法模型、二是对接业务系统,还可能要去适配新的摄像头或硬件平台。
也就是会有两种支持列表:硬件列表、模型列表。这就是积累的成果了。
「视频结构化」会部署成中心服务器,或边缘计算。不过,只是简单任务,现在可能智能摄像头就够了,都带边缘计算识别人脸什么的。
GoCoding 个人实践的经验分享,可关注公众号!
视频结构化 AI 推理流程的更多相关文章
- [AI开发]基于DeepStream的视频结构化解决方案
视频结构化的定义 利用深度学习技术实时分析视频中有价值的内容,并输出结构化数据.相比数据库中每条结构化数据记录,视频.图片.音频等属于非结构化数据,计算机程序不能直接识别非结构化数据,因此需要先将这些 ...
- [AI开发]零代码分析视频结构化类应用结构设计
视频结构化类应用涉及到的技术栈比较多,而且每种技术入门门槛都较高,比如视频接入存储.编解码.深度学习推理.rtmp流媒体等等.每个环节的水都非常深,单独拿出来可以写好几篇文章,如果没有个几年经验基本很 ...
- [AI开发]视频结构化类应用的局限性
算法不是通用的,基于深度学习的应用系统不但做不到通用,即使对于同一类业务场景,还需要为每个场景做定制.特殊处理,这样才能有可能到达实用标准.这种局限性在计算机视觉领域的应用中表现得尤其突出,本文介绍基 ...
- VideoPipe可视化视频结构化框架开源了!
完成多路视频并行接入.解码.多级推理.结构化数据分析.上报.编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gst ...
- VP视频结构化框架
完成多路视频并行接入.解码.多级推理.结构化数据分析.上报.编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gst ...
- VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)
VideoPipe从国庆节上线源代码到现在经历过了一个月时间,期间吸引了若干小伙伴的参与,现将本阶段新增内容总结如下,有兴趣的朋友可以加微信拉群交流. 项目地址:https://github.com/ ...
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
- 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验
移动互联网的发展给人们的社交和娱乐方式带来了很大的改变,以vlog.短视频等为代表的新兴文化样态正受到越来越多人的青睐.同时,随着AI智能.美颜修图等功能在图像视频编辑App中的应用,促使视频编辑效率 ...
- Shell 语法之结构化命令(流程控制)
许多程序在脚本命令之间需要某种逻辑流控制,允许脚本根据变量值的条件或者其他命令的结果路过一些命令或者循环执行这些命令.这些命令通常被称为结构化命令.和其他高级程序设计语言一样,shell提供了用来控制 ...
随机推荐
- 【python基础】第19回 多层,有参装饰器 递归 二分法
本章内容概要 1. 多层装饰器 2. 有参装饰器 3. 递归函数 4. 算法(二分法) 本章内容详解 1. 多层装饰器 1.1 什么是多层装饰器 多层装饰器是从下往上依次执行,需要注意的是,被装饰的函 ...
- .Net下极限生产力之efcore分表分库全自动化迁移CodeFirst
.Net下极限生产力之分表分库全自动化Migrations Code-First ## 介绍 本文ShardinfCore版本x.6.x.x+ 本期主角: - [`ShardingCore`](htt ...
- vscode的安装、切换为中文简体、集成sass
VScode设置中文 打开vscode ,按快捷键"Ctrl+Shift+P" 输入configure language,回车 选择安装其他语言 (默认是英文的) 选择简体中安装( ...
- Python 数据科学手册:读书笔记概论
为防止遗忘,在空闲时间将读书的笔记开始按照章节进行概括总结(2022.1.1): 第二章:NumPy 入门 第三章:Pandas 数据处理 第四章:Matplotlib 数据可视化 第五章:机器学习 ...
- Etcd 使用场景:通过分布式锁思路实现自动选主
分布式锁?选主? 分布式锁可以保证当有多台实例同时竞争一把锁时,只有一个人会成功,其他的都是失败.诸如共享资源修改.幂等.频控等场景都可以通过分布式锁来实现. 还有一种场景,也可以通过分布式锁来实现, ...
- 线程池ThreadPoolExector核心ctl, execute, addWorker, reject源码分析
线程池核心方法execute()解析: public void execute(Runnable command) {//#1 if (command == null) throw new NullP ...
- 面试官:你确定 Redis 是单线程的进程吗?
作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. 这次主要分享 Redis 线程模型篇的面试题. Redis 是单线程吗? Redis ...
- Running Median_via牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1002 来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 65536K, ...
- 「Python实用秘技09」更好用的函数运算缓存
本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第9期 ...
- iOS中 Tagged Pointer 技术
前言: 从64位开始,iOS引入了Tagged Pointer技术,用于优化NSNumber.NSDate.NSString等小对象的存储. Tagged Pointer主要为了解决两个问题: 内 ...