天天看点

一款开源视频分析结构化框架:VideoPipe

作者:不秃头程序员
一款开源视频分析结构化框架:VideoPipe

在这个视频无处不在的信息时代,我们享受着个性化推送带来的便捷,每一次刷新都能遇到仿佛量身定制的视频内容。是否曾有一刻,你对这背后的“智慧筛选”感到好奇?究竟是什么技术支撑着系统在庞大的视频海洋中,精准捕捉到你的兴趣所在,并且仅凭几个关键词就能为你找到相匹配的视频片段?在这看似简单的浏览体验之下,实则蕴含着计算机科学对视频内容的深度分析与理解。

计算机如何看懂海量视频的呢?

视频本质上是一系列连续的图像帧,按照一定的帧率播放,从而形成连续的动态效果。计算机分析视频的基本原理,具体而言,可分为三个核心步骤:

「1. 解码:视频到图像帧的转换」

视频首先被解码,这一过程将连续播放的动态画面分解成一帧帧静态图像。

「2. 分析/推理:AI算法的魔法」

解码后的图像帧随后进入分析阶段,这里便是AI技术大显身手之处。利用深度学习、机器学习等先进算法,计算机不仅能够识别图像中的物体、人脸、文字等基本元素,还能进一步理解场景语境、检测动作行为、甚至分析情绪与意图。从而为视频内容的标签化、摘要生成及主题提取等提供了可能。

「3. 编码」

将经过特定处理(如增加标注、过滤、特效等)的图像帧重新组合成视频。

一款开源视频分析结构化框架:VideoPipe

尽管这看起来就寥寥几步,但其中涉及许多技术细节和复杂的算法。比如,如何将训练好的AI图像算法模型,快速部署落地到实际应⽤场景中呢?对于没有接触过计算机视觉(Computer Vision,后简称 CV)的程序员,或是纯搞算法的算法工程师,要实现+落地AI视频分析相关功能可能会有点难度。然而,随着视频在日常生活中的普及和应用越来越广泛,处理和分析视频类数据的需求也在逐渐增加。

一款开源视频分析结构化框架:VideoPipe

今天,笔者将为大家介绍一款开源视频分析结构化框架:VideoPipe,旨在让开发视频分析应用像使用Django写Web一样方便。

https://github.com/sherlockchou86/VideoPipe

VideoPipe是一个用于视频分析和结构化的框架,采用C++编写,依赖少,易于集成。它采用管道设计形式,其中每个节点相互独立并可自行搭配,可用来构建不同类型的视频分析应用,适用于视频结构化、图片搜索、人脸识别、交通/安防领域的行为分析(如交通事件检测)等场景。

一款开源视频分析结构化框架:VideoPipe

VideoPipe介绍

VideoPipe类似于英伟达的DeepStream和华为的mxVision框架,但它更易于使用、更具备可移植性。它完全由原生 C++ 编写,仅依赖于少量主流的第三方模块(如 OpenCV)。

VideoPipe采用面向插件的编码风格,可以根据不同的需求按需搭配,我们可以使用独立的插件(即框架中的Node类型),来构建不同类型的视频分析应用。你只需准备好模型并了解如何解析其输出即可,推理可以基于不同的后端实现,如 OpenCV::DNN(默认)、TensorRT、PaddleInference、ONNXRuntime 等,任何你喜欢的都可以。VideoPipe工作示意图如下所示。

一款开源视频分析结构化框架:VideoPipe

由此可以看出它提供了以下功能:

  • 流读取/推送:支持多种视频流协议,如udp、rtsp、rtmp等实时传输协议。
  • 视频解码/编码:集成OpenCV与GStreamer库,提供高性能的视频与图像编解码能力,支持硬件加速,确保视频处理的实时性和流畅度。
  • 基于深度学习的算法推理:内置支持多种深度学习模型,涵盖目标检测、图像分类、特征提取等,为视频内容的智能分析提供强大算力支持。
  • 目标跟踪:集成IOU(Intersection over Union)、SORT(Simple Online and Realtime Tracking)等先进追踪算法,实现对移动物体的稳定、准确追踪。
  • 行为分析(BA):基于目标跟踪技术,进一步分析特定行为,如交通违规(越线、违章停车)、人群流动分析等,为交通管理、安防监控提供决策依据。
  • 数据代理:将分析得到的结构化数据(如JSON、XML或自定义格式)高效地转发至指定目的地,便于后续的数据存储、分析或展示。
  • 录制与截图:根据需求,自动录制特定时间段的视频或捕获关键帧截图。
  • 屏幕显示(OSD):将模型输出结果叠加到视频帧上显示(On-Screen Display),如框选出检测到的目标、标注行为分析结果,提升用户交互体验和系统透明度。

快速上手

VideoPipe不挑硬件。无论是高端配备有专业加速卡的服务器,还是仅依靠CPU的普通计算机,VideoPipe都能顺畅运行。同时,VideoPipe项目内包含了多个详细示例代码,如下代码展示了如何使用VideoPipe框架快速搭建一个人脸识别应用。

/*
* 名称:1-1-N sample
* 完整代码位于:samples/1-1-N_sample.cpp
* 功能说明:1个视频输入,1个视频分析任务(人脸检测和识别),2个输出(屏幕输出/RTMP推流输出)
* 注意:模型和视频文件需要自行准备
*/

int main() {
    // 日志配置
    VP_SET_LOG_INCLUDE_CODE_LOCATION(false);
    VP_SET_LOG_INCLUDE_THREAD_ID(false);
    VP_LOGGER_INIT();

    // 1、创建节点
    // 创建视频源节点
    // 从本地视频文件(./test_video/10.mp4)读取视频流
    auto file_src_0 = std::make_shared<vp_nodes::vp_file_src_node>("file_src_0", 0, "./test_video/10.mp4", 0.6);
    // 2、模型推理 Node
    // 一级推理:人脸检测,使用预先训练好的模型face_detection_yunet_2022mar.onnx
    auto yunet_face_detector_0 = std::make_shared<vp_nodes::vp_yunet_face_detector_node>("yunet_face_detector_0", "./models/face/face_detection_yunet_2022mar.onnx");
    // 二级推理:人脸识别,利用模型face_recognition_sface_2021dec.onnx提取人脸特征
    auto sface_face_encoder_0 = std::make_shared<vp_nodes::vp_sface_feature_encoder_node>("sface_face_encoder_0", "./models/face/face_recognition_sface_2021dec.onnx");
    // 3、OSD Node
    // 将人脸识别的结果绘制到视频帧上
    auto osd_0 = std::make_shared<vp_nodes::vp_face_osd_node_v2>("osd_0");
    // 在本地屏幕显示处理后的视频
    auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("screen_des_0", 0);
    // 通过RTMP协议推流到指定服务器(rtmp://192.168.77.60/live/10000)
    auto rtmp_des_0 = std::make_shared<vp_nodes::vp_rtmp_des_node>("rtmp_des_0", 0, "rtmp://192.168.77.60/live/10000");

    // 构建管道,将各个节点按处理顺序连接起来,形成了一个数据处理流水线
    // 视频数据从源节点开始,经过人脸检测、人脸识别,最后到OSD节点处理,并同时输出到屏幕和RTMP流
    yunet_face_detector_0->attach_to({file_src_0});
    sface_face_encoder_0->attach_to({yunet_face_detector_0});
    osd_0->attach_to({sface_face_encoder_0});

    // 管道自动拆分,通过屏幕/推流输出结果
    screen_des_0->attach_to({osd_0});
    rtmp_des_0->attach_to({osd_0});

    // 启动管道
    file_src_0->start();

    // 可视化管道
    vp_utils::vp_analysis_board board({file_src_0});
    board.display();
}           

由以上代码,可以发现VideoPipe框架将视频分析/处理的步骤,抽象成了一个管道(pipe),每一步的处理都是管道中的一个节点(Node),处理流程如下:

  1. 视频读取(Node):从文件或网络流中读取视频数据,并进行初步的解码处理,为后续的分析做好准备。
  2. 模型推理(Node):将深度学习模型的推理过程封装起来,使得人脸识别等高级功能的集成变得直接而高效。
  3. OSD(Node):将分析结果可视化,即将识别到的人脸信息以图形方式叠加到视频帧上。
  4. 构建管道:将各个节点按照处理逻辑顺序连接起来,形成一个完整的处理链路。
  5. 启动与监控:通过启动管道的源头节点(如视频读取节点),整个处理流程得以启动。同时,提供可视化功能,开发者可以直观监控管道的运行状态。
一款开源视频分析结构化框架:VideoPipe

代码运⾏后,会出现如上图所示的3个画⾯。它们分别是管道运⾏状态图(状态⾃动刷新)、屏幕显⽰结果(GUI)、播放器显⽰结果(RTMP),至此就算上手 VideoPipe 了!

继续阅读