VideoPipe可视化视频结构化框架开源了!

news/2025/3/14 2:07:42/

 

完成多路视频并行接入、解码、多级推理、结构化数据分析、上报、编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gstreamer框架(少部分地方需要),框架主干部分主要使用原生C++ STL实现,目标是平台高可移植性。框架可用于:视频结构化、以图搜图、目标行为分析等应用领域。

 源码地址:GitHub - sherlockchou86/video_pipe_c: a plugin-oriented framework for video structured.a plugin-oriented framework for video structured. Contribute to sherlockchou86/video_pipe_c development by creating an account on GitHub.https://github.com/sherlockchou86/video_pipe_c

主要功能

  • 视频接入,支持file/rtsp/udp/rtmp等主流视频流协议;
  • 多级推理,自带检测/分类/特征提取等推理插件。默认使用opencv.dnn实现,可基于其他类似tensorrt、甚至原生的pytorch/tensorflow扩展新的推理插件;
  • 目标跟踪,自带基于iou的跟踪插件,可基于其他算法扩展新的跟踪插件;
  • 行为分析,自带若干行为分析插件,比如目标跨线、拥堵/目标聚集判断;
  • 图像叠加,结构化数据和视频融合显示;
  • 消息推送,自带基于kafka的消息推送插件,可基于其他消息中间件扩展新的插件;
  • 录像/截图,自带截图/录像插件;
  • 编码输出,支持file/screen/rtmp/rtsp等主流方式输出编码结果;

主要特点

  • 可视化调试,自带pipe可视化功能,可在界面实时显示pipe的运行状态,如pipe中各个环节的fps/缓存队列大小,以及计算pipe起/止插件之间的时间延时,帮助程序员快速定位性能瓶颈位置;
  • 插件与插件之间默认采用“smart pointer”传递数据,数据从头到尾,只需创建一次,不存在拷贝操作。当然,可根据需要设置“深拷贝”方式在插件之间传递数据;
  • pipe中各通道视频的fps、分辨率、编码方式、来源均可不同,并且可单独暂停某一通道;
  • pipe中可传递的数据只有两种,一种frame_meta数据、一种control_meta数据,结构清晰明了;
  • 插件组合方式自由,在满足客观逻辑的前提下,可合并、可拆分,根据需要设计不同的pipe结构。同时自带pipe结构检查功能,识别出不合规的pipe结构;
  • pipe支持各种hook,外部通过hook可以实时获取pipe的运行情况(第1点就是基于该特性实现);
  • 支持一个Pipe处理多路视频(多路共用一个推理模型,Pipe分支涉及到merge和split操作),批处理提速;也支持一个Pipe只处理一路视频(各路使用自己的推理模型,Pipe呈直线状、多个Pipe并存),基于不同视频做不同的推理任务;
  • 基于指定基类,所有自带插件全部可自定义重新实现;
  • 框架主干代码完全基于原生C++ STL实现,跨平台编译部署简单。

目前进度

开发环境:vs code/ubuntu 18.04/C++17/opencv 4.6/ffmpeg 3.4.8/gstreamer 1.20。之前使用wsl1/2+ubuntu22.04,但是wsl坑太多,后放弃。

  • 2022/9/30:完成基于tensorrt的检测插件(一级推理和二级推理),非默认的opencv::dnn。源码上线
  • 2022/9/15:完成基于paddle的ocr文字识别相关插件,基于paddle推理库(非默认的opencv::dnn)
  • 2022/9/1:完成基于yunet/sface的人脸检测、识别以及显示相关插件开发,实现多pipe并行运行的机制,多个pipe可加载不同模型、基于不同视频完成不同的推理任务。(单个pipe接入多路视频、共用相同的模型之前已实现)
  • 2022/8/15:完成openpose肢体检测器相关插件开发,完成图像二级分类插件开发。
  • 2022/8/5:完成infer相关基类、yolo检测器派生类的实现,走通整个一级推理流程,rtmp/screen 2种输出。
  • 2022/7/22:已完成主干框架开发,预估占总体进度的1/3。等基本完成后开源,有兴趣的朋友可以关注。

如何使用

#include "VP.h"#include "../nodes/vp_file_src_node.h"
#include "../nodes/infers/vp_trt_vehicle_detector.h"
#include "../nodes/infers/vp_trt_vehicle_plate_detector.h"
#include "../nodes/osd/vp_osd_node_v2.h"
#include "../nodes/vp_screen_des_node.h"
#include "../nodes/vp_rtmp_des_node.h"
#include "../utils/analysis_board/vp_analysis_board.h"#if MAIN
int main() {// create nodesauto file_src_0 = std::make_shared<vp_nodes::vp_file_src_node>("file_src_0", 0, "./test_video/13.mp4");auto trt_vehicle_detector = std::make_shared<vp_nodes::vp_trt_vehicle_detector>("vehicle_detector", "./vehicle.trt");auto trt_vehicle_plate_detector = std::make_shared<vp_nodes::vp_trt_vehicle_plate_detector>("vehicle_plate_detector", "./det.trt", "./rec.trt");auto osd_0 = std::make_shared<vp_nodes::vp_osd_node_v2>("osd_0", "./font/NotoSansCJKsc-Medium.otf");auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("screen_des_0", 0, true, vp_objects::vp_size{640, 360});auto rtmp_des_0 = std::make_shared<vp_nodes::vp_rtmp_des_node>("rtmp_des_0", 0, "rtmp://192.168.77.105/live/10000", vp_objects::vp_size{1280, 720});// construct pipelinetrt_vehicle_detector->attach_to({file_src_0});trt_vehicle_plate_detector->attach_to({trt_vehicle_detector});osd_0->attach_to({trt_vehicle_plate_detector});// split into 2 sub branches automaticallyscreen_des_0->attach_to({osd_0});rtmp_des_0->attach_to({osd_0});// start pipelinefile_src_0->start();// visualize pipeline for debugvp_utils::vp_analysis_board board({file_src_0});board.display();
}
#endif

上面代码可以生成3个画面:

  • pipeline运行图(window显示)
  • 屏幕显示结果(window显示)
  • rtmp显示结果(video player播放)

 项目还在持续完善中,感兴趣的朋友可以关注!


http://www.ppmy.cn/news/478585.html

相关文章

Android进阶性能调优;不可思议的OOM

一、引子 对于每 《Android学习笔记总结最新移动架构视频大厂安卓面试真题项目实战源码讲义》无偿开源 徽信搜索公众号【编程进阶路】 一个移动开发者&#xff0c;内存是都需要小心使用的资源&#xff0c;而线上出现的 OOM&#xff08;OutOfMemoryError&#xff09;都会让开发…

不可思议的OOM

转载自&#xff1a;http://www.jianshu.com/p/e574f0ffdb42 摘要:  本文发现了一类OOM&#xff08;OutOfMemoryError&#xff09;&#xff0c;这类OOM的特点是崩溃时java堆内存和设备物理内存都充足&#xff0c;探索并解释了这类OOM抛出的原因。 关键字:  OutOfMemoryError &…

TensorRT加速方法介绍(python pytorch模型)

TensorRT的安装可见我的上一篇博客 Ubuntu配置TensorRT及验证_jiugeshao的专栏-CSDN博客博主的一些基本环境配置可见之前博客非虚拟机环境下Ubuntu配置_jiugeshao的专栏-CSDN博客第一步: 准备安装AnacondaAnaconda3-5.2.0-Linux-x86_64.shhttps://repo.anaconda.com/archive/A…

Gamma:强大的AI制作PPT神器,用完再也回不去了!

看过许多 AI 制作 PPT 软件&#xff0c;最终还是被 Gamma 惊艳到。 Gamma 是一款基于人工智能技术的 PPT 制作工具&#xff0c;可以帮助用户轻松制作高质量的 PPT 演示文稿。 痛点解决 相比传统制作 PPT 方式&#xff0c;Gamma 可以解决哪些如下 7 个痛点&#xff1a; 一句话…

由于ModuleNotFoundError: No module named ‘tensorrt’安装TensorRT-python发现报错

ModuleNotFoundError: No module named ‘tensorrt’https://forums.developer.nvidia.com/t/modulenotfounderror-no-module-named-tensorrt/161565 TensorRT报错的一百种姿势 | 【TensorRT 报错统计】-云社区-华为云 (huaweicloud.com)https://bbs.huaweicloud.com/blogs/33…

超微服务器安装操作系统,超微服务器bios设置

超微服务器bios设置 内容精选 换一换 应用组件是组成应用的某个业务特性实现,以代码或者软件包为载体,可独立部署运行。在ServiceStage上创建应用后,可以在应用中添加组件,目前支持的组件类型有微服务、Web、通用。同一个应用下,最多可支持创建1000个应用组件。您可以通过…

视觉算法的工业部署及落地方面的技术知识,怎么学?

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 本文整理自知乎问答&#xff0c;仅用于学术分享&#xff0c;著作权归作者所有。如有侵权&#xff0c;请联系后台作删文处理。 方法一 作者&#xff5c;BBuf https://www.zhihu.com/question/428800593/answer…

Jetson Nano(4)—框架学习(4.1)

1、主流深度学习框架扫盲 万事具备&#xff0c;硬件和系统环境基本已经具备&#xff0c;目前的深度学习框架有下面的的&#xff0c;这里特别提一下国产的深度学习框架&#xff1a;华为 MindSpore、旷视 MegEngine、清华 Jittor&#xff08;毕竟我是爱国的&#xff09;&#xf…