视频结构化类应用涉及到的技术栈比较多,而且每种技术入门门槛都较高,比如视频接入存储、编解码、深度学习推理、rtmp流媒体等等。每个环节的水都非常深,单独拿出来可以写好几篇文章,如果没有个几年经验基本很难搞定。本篇文章简单介绍视频结构化类应用涉及到的技术栈,以及这类应用常见结构,因为是实时视频分析,因此这类应用基本都是管道(pipeline)设计模式。本篇文章算是科普入门介绍文章,不涉及详细技术细节,适合这方面的新手。
所谓视频结构化,就是利用深度学习技术对视频进行逐帧分析,解析出视频帧中感兴趣的目标、并且进一步推理出每个目标感兴趣的属性,最后将这些目标、属性保存成结构化数据(能与每帧关联起来)。如果是实时类应用,要求实时看到分析结果,那么整个过程要求能做到实时性,比如单路视频分析保证FPS能达到原视频的FPS(常见是25)。当然,还有另外一类结构化类应用并不要求做到实时性,比如分析监控录像,将视频录像文件进行结构化处理,结果存于数据库,用于后期快速检索,这类应用不用做到实时分析,打个比方,每秒处理25帧和处理5帧对于这类应用影响不大,只是处理完一个录像文件总耗时不同。本篇文章主要介绍实时(Real-Time)视频结构化。
上图中实时将结构化数据叠加在视频画面中,图中红色多边形为人工配置检测区域(ROI),ROI之外的目标可以忽略。
视频结构化常见Pipeline
视频从接入,到模型推理,再到结果分析、界面呈现,是一个“流式”处理过程,我们可以称为pipeline,对于实时视频结构化类应用,要求整个pipeline各个环节均能满足性能要求,做到实时处理,某个环节达不到实时性,那么整个pipeline就有问题。下面是我整理出来的视频结构化处理pipeline,这个设计基本可以满足要求,有些pipeline可能不长这样,但是大同小异。
如上图所示,数据从左往右移动。涉及到的技术有视频接入、解码、目标检测(一次推理)、目标跟踪、属性分类(二次推理)、数据分析(目标轨迹分析、目标行为分析、数据存储)、图像叠加、编码、rtmp推流。下面详细说一下每个环节涉及到的技术内容。
视频接入
在处理视频之前,需要先将视频接入到系统。常见的接入方式有2种,一种就是直接从摄像机(摄像头)直接接入,常见IP摄像机都支持RTSP/28181国标/设备SDK方式接入;第二种就是从视频管理平台接入,所谓管理平台,其实就是管理所有的摄像机视频数据,摄像机先接入平台,其他系统如果需要视频数据,需要通过SDK/协议再从平台接入,这种方式的好处是平台已经适配了所有前端摄像机,其他系统找平台接入视频时逻辑更简单。
解码
视频接入到系统之后,紧接着需要做的是解码,因为后面深度学习推理的输入是RGB格式的图片。常见解码库可以采用ffmpeg,ffmpeg入门简单,但是如果想做好、适配实际现场各种情况却需要很多经验。解码环节的输入输出如下图所示:
上图左边输入视频流二进制数据,经过解码后,输出单张RGB图片序列。
目标检测(一级推理)
解码之后得到每帧RGB格式的图片,将图片依次输入目标检测模型,GPU加速推理后得到每帧中感兴趣的目标。这个环节是一次推理,主要作用是从单帧图像中锁定感兴趣的目标(目标类型、目标可信度、目标位置)。常见目标检测算法有yolo系列、ssd、rcnn系列。目标检测环节的输入输出如下图所示:
上图左边输入RGB图片序列(可以按batch输入,batch size可以为1),经过目标检测环节后,输出每帧中检测到的目标(类型, 可行度, 目标位置)。
目标跟踪