• VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)


    VideoPipe从国庆节上线源代码到现在经历过了一个月时间,期间吸引了若干小伙伴的参与,现将本阶段新增内容总结如下,有兴趣的朋友可以加微信拉群交流。

    项目地址:https://github.com/sherlockchou86/video_pipe_c

    以往文章:https://www.cnblogs.com/xiaozhi_5638/p/16767917.html

    跟踪插件

    新增了跟踪插件,同时实现了默认的SORT目标跟踪算法,后期扩展Deep SORT算法非常方便。下面是车辆跟踪的效果(底部是pipe运行状态图):

    下面是人脸跟踪的效果:

     

    录像和截图插件

    新增了录像截图插件,同时提供了一个人工模拟录像或截图的接口供测试。当用户向管道中发送录像、截图控制指令时,录像截图插件就开始异步工作。下面是异步录像原理:

     

    日志库

    新增了一个轻量级的日志库,支持多线程异步日志写入、支持日志文件自动拆分。日志没使用第三方库,下面是日志使用方法和效果:

    复制代码
     1 // log level
     2 VP_SET_LOG_LEVEL(_log_level);
     3 // log file dir
     4 VP_SET_LOG_DIR(_log_dir);
     5 
     6 // log to console or not
     7 VP_SET_LOG_TO_CONSOLE(_log_to_console);
     8 // log to file or not
     9 VP_SET_LOG_TO_FILE(_log_to_file);
    10 // TO-DO
    11 VP_SET_LOG_TO_KAFKA(_log_to_kafka);
    12 
    13 // include log level or not
    14 VP_SET_LOG_INCLUDE_LEVEL(_include_level);
    15 // include code location or not (where the log occurs)
    16 VP_SET_LOG_INCLUDE_CODE_LOCATION(_include_code_location);
    17 // include thread id or not (std::this_thread::get_id())
    18 VP_SET_LOG_INCLUDE_THREAD_ID(_include_thread_id);
    19 
    20 // warn if log cache in memory exceed this value
    21 VP_SET_LOG_CACHE_WARN_THRES(_log_cache_warn_threshold);
    复制代码
    复制代码
     1 [2022-11-04 14:12:47.218][Info ] [file_src_0] reading frame complete, total frame==>354
     2 [2022-11-04 14:12:47.219][Info ] [file_src_0] cycle flag is true, continue!
     3 [2022-11-04 14:15:23.416][Warn ][7ffff7f81000][../nodes/vp_infer_node.cpp:39] [vehicle_detector] cv::dnn::readNet load network failed!
     4 [2022-11-04 14:15:24.227][Info ][7ffff7f81000][../nodes/vp_screen_des_node.cpp:14] [screen_des_0] [appsrc ! videoconvert ! textoverlay text=screen_des_0 halignment=left valignment=top font-desc='Sans,16' shaded-background=true ! timeoverlay halignment=right valignment=top font-desc='Sans,16' shaded-background=true ! queue ! fpsdisplaysink video-sink=ximagesink sync=false]
     5 [2022-11-04 14:15:24.227][Info ][7ffff7f81000][../utils/analysis_board/../vp_pipe_checker.h:167] 
     6 ############# pipe check summary ##############
     7  total layers: 5
     8  layer index,       node names
     9  1                    file_src_0,
    10  2                    vehicle_detector,
    11  3                    track_0,
    12  4                    osd_0,
    13  5                    screen_des_0,
    14 ############# pipe check summary ##############
    15 
    16 [2022-11-04 14:16:04.638][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:66] [file_src_0] reading frame complete, total frame==>999
    17 [2022-11-04 14:16:04.639][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:68] [file_src_0] cycle flag is true, continue!
    18 [2022-11-04 14:16:45.258][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:66] [file_src_0] reading frame complete, total frame==>1999
    19 [2022-11-04 14:16:45.259][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:68] [file_src_0] cycle flag is true, continue!
    20 [2022-11-04 14:17:25.838][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:66] [file_src_0] reading frame complete, total frame==>2999
    21 [2022-11-04 14:17:25.839][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:68] [file_src_0] cycle flag is true, continue!
    22 [2022-11-04 14:18:06.498][Info ][7fff47318700][../nodes/vp_file_src_node.cpp:66] [file_src_0] reading frame complete, total frame==>3999
    复制代码

     

    sample代码

    新增加13个sample文件,可以独立运行,涵盖pipe结构、各种插件使用举例。下面是1-1-1 sample代码和效果:

    复制代码
     1 #include "VP.h"
     2 
     3 #include "../nodes/vp_file_src_node.h"
     4 #include "../nodes/infers/vp_yunet_face_detector_node.h"
     5 #include "../nodes/infers/vp_sface_feature_encoder_node.h"
     6 #include "../nodes/osd/vp_face_osd_node_v2.h"
     7 #include "../nodes/vp_screen_des_node.h"
     8 #include "../nodes/vp_rtmp_des_node.h"
     9 
    10 #include "../utils/analysis_board/vp_analysis_board.h"
    11 
    12 /*
    13 * ## 1-1-1 sample ##
    14 * 1 video input, 1 infer task, and 1 output.
    15 */
    16 
    17 #if _1_1_1_sample
    18 
    19 int main() {
    20     VP_SET_LOG_INCLUDE_CODE_LOCATION(false);
    21     VP_SET_LOG_INCLUDE_THREAD_ID(false);
    22     VP_LOGGER_INIT();
    23 
    24     // create nodes
    25     auto file_src_0 = std::make_shared("file_src_0", 0, "./test_video/10.mp4", 0.6);
    26     auto yunet_face_detector_0 = std::make_shared("yunet_face_detector_0", "./models/face/face_detection_yunet_2022mar.onnx");
    27     auto sface_face_encoder_0 = std::make_shared("sface_face_encoder_0", "./models/face/face_recognition_sface_2021dec.onnx");
    28     auto osd_0 = std::make_shared("osd_0");
    29     auto screen_des_0 = std::make_shared("screen_des_0", 0);
    30 
    31     // construct pipeline
    32     yunet_face_detector_0->attach_to({file_src_0});
    33     sface_face_encoder_0->attach_to({yunet_face_detector_0});
    34     osd_0->attach_to({sface_face_encoder_0});
    35     screen_des_0->attach_to({osd_0});
    36 
    37     file_src_0->start();
    38 
    39     // for debug purpose
    40     vp_utils::vp_analysis_board board({file_src_0});
    41     board.display();
    42 }
    43 
    44 #endif
    复制代码

    上面代码生成的pipe如下图所示:

    感兴趣的朋友加微信交流,框架非常适合新手入门!

  • 相关阅读:
    OpenStack云计算平台实战-----创建空白虚拟机
    8. 过滤器的作用, 如何实现一个过滤器?
    引用的基础知识(定义和函数参数)
    02.01 nginx简介、选择理由、安装和使用
    基于NodeJS 的健康饮酒管理小程序设计与实现
    self Attention 位置编码的奇偶输入问题
    谷粒商城 (七) --------- SpringCloud Alibaba 基础配置
    ARP欺骗攻击实操
    requests 2.13.0 版本的 https 连接慢漏提示
    Java转义工具类StringEscapeUtils的学习笔记
  • 原文地址:https://www.cnblogs.com/xiaozhi_5638/p/16857995.html