• VideoPipe可视化视频结构化框架更新总结(2023-3-30)


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

    往期文章:https://www.cnblogs.com/xiaozhi_5638/p/16969546.html

    最近有多个更新,有兴趣的扫码加群交流。

    新增实例分割相关支持

    增加了基于mask-rcnn的实例分割插件和相关sample。

    复制代码
     1 #include "VP.h"
     2 
     3 #include "../nodes/vp_file_src_node.h"
     4 #include "../nodes/infers/vp_mask_rcnn_detector_node.h"
     5 #include "../nodes/track/vp_sort_track_node.h"
     6 #include "../nodes/osd/vp_osd_node_v3.h"
     7 #include "../nodes/vp_screen_des_node.h"
     8 
     9 #include "../utils/analysis_board/vp_analysis_board.h"
    10 
    11 /*
    12 * ## mask rcnn sample ##
    13 * image segmentation using mask rcnn.
    14 */
    15 
    16 #if mask_rcnn_sample
    17 
    18 int main() {
    19     VP_SET_LOG_LEVEL(vp_utils::vp_log_level::INFO);
    20     VP_LOGGER_INIT();
    21 
    22     // create nodes
    23     auto file_src_0 = std::make_shared("file_src_0", 0, "./test_video/19.mp4", 0.6);
    24     auto mask_rcnn_detector = std::make_shared("mask_rcnn_detector", "./models/mask_rcnn/frozen_inference_graph.pb", "./models/mask_rcnn/mask_rcnn_inception_v2_coco_2018_01_28.pbtxt", "./models/coco_80classes.txt");
    25     auto track_0 = std::make_shared("sort_track_0");
    26     auto osd_v3_0 = std::make_shared("osd_v3_0", "../third_party/paddle_ocr/font/NotoSansCJKsc-Medium.otf");
    27     auto screen_des_0 = std::make_shared("screen_des_0", 0);
    28 
    29     // construct pipeline
    30     mask_rcnn_detector->attach_to({file_src_0});
    31     track_0->attach_to({mask_rcnn_detector});
    32     osd_v3_0->attach_to({track_0});
    33     screen_des_0->attach_to({osd_v3_0});
    34 
    35     file_src_0->start();
    36 
    37     // for debug purpose
    38     vp_utils::vp_analysis_board board({file_src_0});
    39     board.display();
    40 }
    41 
    42 
    43 #endif
    复制代码

    上面代码效果图如下:

     

     

    新增语义分割相关支持

    新增了基于ENet网络的语义分割插件和sample。

    复制代码
     1 #include "VP.h"
     2 
     3 #include "../nodes/vp_file_src_node.h"
     4 #include "../nodes/infers/vp_enet_seg_node.h"
     5 #include "../nodes/osd/vp_seg_osd_node.h"
     6 #include "../nodes/vp_screen_des_node.h"
     7 
     8 #include "../utils/analysis_board/vp_analysis_board.h"
     9 
    10 /*
    11 * ## enet seg sample ##
    12 * semantic segmentation based on ENet.
    13 * 1 input, 2 outputs including orignal frame and mask frame.
    14 */
    15 
    16 #if enet_seg_sample
    17 
    18 int main() {
    19     VP_SET_LOG_LEVEL(vp_utils::vp_log_level::INFO);
    20     VP_LOGGER_INIT();
    21 
    22     // create nodes
    23     auto file_src_0 = std::make_shared("file_src_0", 0, "./test_video/21.mp4");
    24     auto enet_seg = std::make_shared("enet_seg", "models/enet-cityscapes/enet-model.net");
    25     auto seg_osd_0 = std::make_shared("seg_osd_0", "models/enet-cityscapes/enet-classes.txt", "models/enet-cityscapes/enet-colors.txt");
    26     auto screen_des_mask = std::make_shared("screen_des_mask", 0, true, vp_objects::vp_size(400, 225));
    27     auto screen_des_original = std::make_shared("screen_des_original", 0, false, vp_objects::vp_size(400, 225));
    28 
    29     // construct pipeline
    30     enet_seg->attach_to({file_src_0});
    31     seg_osd_0->attach_to({enet_seg});
    32     screen_des_mask->attach_to({seg_osd_0});
    33     screen_des_original->attach_to({seg_osd_0});
    34 
    35     file_src_0->start();
    36 
    37     // for debug purpose
    38     vp_utils::vp_analysis_board board({file_src_0});
    39     board.display();
    40 }
    41 
    42 #endif
    复制代码

    上面代码效果图如下:

     

    新增多级推理插件sample

    多个检测、分类插件串联,不同分类器作用于不同的主目标:

    复制代码
     1 #include "VP.h"
     2 
     3 #include "../nodes/vp_file_src_node.h"
     4 #include "../nodes/infers/vp_yolo_detector_node.h"
     5 #include "../nodes/infers/vp_classifier_node.h"
     6 #include "../nodes/osd/vp_osd_node.h"
     7 #include "../nodes/vp_screen_des_node.h"
     8 #include "../utils/analysis_board/vp_analysis_board.h"
     9 
    10 /*
    11 * ## multi detectors and classifiers sample ##
    12 * show multi infer nodes work together.
    13 * 1 detector and 2 classifiers applied on primary class ids(1/2/3).
    14 */
    15 
    16 #if multi_detectors_and_classifiers_sample
    17 
    18 int main() {
    19     VP_SET_LOG_LEVEL(vp_utils::vp_log_level::INFO);
    20     VP_LOGGER_INIT();
    21 
    22     // create nodes
    23     auto file_src_0 = std::make_shared("file_src_0", 0, "test_video/20.mp4", 0.6);
    24     /* primary detector */
    25     // labels for detector model
    26     // 0 - person
    27     // 1 - car
    28     // 2 - bus
    29     // 3 - truck
    30     // 4 - 2wheel
    31     auto primary_detector = std::make_shared("primary_detector", "models/det_cls/yolov3-tiny-2022-0721_best.weights", "models/det_cls/yolov3-tiny-2022-0721.cfg", "models/det_cls/yolov3_tiny_5classes.txt", 416, 416, 1);
    32     /* secondary classifier 1, applied to car(1)/bus(2)/truck(3) only */
    33     auto _1st_classifier = std::make_shared("1st_classifier", "models/det_cls/vehicle/resnet18-batch=N-type_view_0322_nhwc.onnx", "", "models/det_cls/vehicle/vehicle_types.txt", 224, 224, 1, std::vector<int>{1, 2, 3}, 10, false, 1, cv::Scalar(), cv::Scalar(), true, true);
    34     /* secondary classifier 2, applied to car(1)/bus(2)/truck(3) only */
    35     auto _2nd_classifier = std::make_shared("2nd_classifier", "models/det_cls/vehicle/resnet18-batch=N-color_view_0322_nhwc.onnx", "", "models/det_cls/vehicle/vehicle_colors.txt", 224, 224, 1, std::vector<int>{1, 2, 3}, 10, false, 1, cv::Scalar(), cv::Scalar(), true, true);
    36     auto osd_0 = std::make_shared("osd_0");
    37     auto screen_des_0 = std::make_shared("screen_des_o", 0);
    38 
    39     // construct pipeline
    40     primary_detector->attach_to({file_src_0});
    41     _1st_classifier->attach_to({primary_detector});
    42     _2nd_classifier->attach_to({_1st_classifier});
    43     osd_0->attach_to({_2nd_classifier});
    44     screen_des_0->attach_to({osd_0});
    45 
    46     // start
    47     file_src_0->start();
    48 
    49     // for debug purpose
    50     vp_utils::vp_analysis_board board({file_src_0});
    51     board.display();
    52 }
    53 
    54 #endif
    复制代码

    上面代码运行效果如下:

     

    新增图片源输入插件

    支持以图片方式输入(文件或UDP),频率可调、各个通道互相独立。

    复制代码
     1 #include "VP.h"
     2 
     3 #include "../nodes/vp_image_src_node.h"
     4 #include "../nodes/infers/vp_yolo_detector_node.h"
     5 #include "../nodes/osd/vp_osd_node.h"
     6 #include "../nodes/vp_split_node.h"
     7 #include "../nodes/vp_screen_des_node.h"
     8 
     9 #include "../utils/analysis_board/vp_analysis_board.h"
    10 
    11 /*
    12 * ## image_src_sample ##
    13 * show how vp_image_src_node works, read image from local file or receive image from remote via udp.
    14 */
    15 
    16 #if image_src_sample
    17 
    18 int main() {
    19     VP_SET_LOG_LEVEL(vp_utils::vp_log_level::INFO);
    20     VP_LOGGER_INIT();
    21 
    22     // create nodes
    23     auto image_src_0 = std::make_shared("image_file_src_0", 0, "./images/test_%d.jpg", 1, 0.4); // read 1 image EVERY 1 second from local files, such as test_0.jpg,test_1.jpg
    24     /* sending command for test: `gst-launch-1.0 filesrc location=16.mp4 ! qtdemux ! avdec_h264 ! videoconvert ! videoscale ! video/x-raw,width=416,height=416 ! videorate ! video/x-raw,framerate=1/1 ! jpegenc ! rtpjpegpay ! udpsink host=ip port=6000` */
    25     auto image_src_1 = std::make_shared("image_udp_src_1", 1, "6000", 3);                       // receive 1 image EVERY 3 seconds from remote via udp , such as 127.0.0.1:6000
    26     auto yolo_detector = std::make_shared("yolo_detector", "models/det_cls/yolov3-tiny-2022-0721_best.weights", "models/det_cls/yolov3-tiny-2022-0721.cfg", "models/det_cls/yolov3_tiny_5classes.txt");
    27     auto osd = std::make_shared("osd");
    28     auto split = std::make_shared("split_by_channel", true);    // split by channel index (important!)
    29     auto screen_des_0 = std::make_shared("screen_des_0", 0);
    30     auto screen_des_1 = std::make_shared("screen_des_1", 1);
    31     
    32     // construct pipeline
    33     yolo_detector->attach_to({image_src_0, image_src_1});
    34     osd->attach_to({yolo_detector});
    35     split->attach_to({osd});
    36     screen_des_0->attach_to({split});
    37     screen_des_1->attach_to({split});
    38 
    39     image_src_0->start();  // start read from local file
    40     image_src_1->start();  // start receive from remote via udp
    41 
    42     // for debug purpose
    43     vp_utils::vp_analysis_board board({image_src_0, image_src_1});
    44     board.display();
    45 }
    46 
    47 #endif
    复制代码

    上面代码运行效果如下:

     

    新增图片结果输出插件

    支持以图片格式输出结果(文件或UDP),频率可调、各通道互相独立。

    复制代码
     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_image_des_node.h"
     9 
    10 #include "../utils/analysis_board/vp_analysis_board.h"
    11 
    12 /*
    13 * ## image_des_sample ##
    14 * show how vp_image_des_node works, save image to local file or push image to remote via udp.
    15 */
    16 
    17 #if image_des_sample
    18 
    19 int main() {
    20     VP_SET_LOG_LEVEL(vp_utils::vp_log_level::INFO);
    21     VP_LOGGER_INIT();
    22 
    23     // create nodes
    24     auto file_src_0 = std::make_shared("file_src_0", 0, "./test_video/10.mp4", 0.6);
    25     auto yunet_face_detector_0 = std::make_shared("yunet_face_detector_0", "./models/face/face_detection_yunet_2022mar.onnx");
    26     auto sface_face_encoder_0 = std::make_shared("sface_face_encoder_0", "./models/face/face_recognition_sface_2021dec.onnx");
    27     auto osd_0 = std::make_shared("osd_0");
    28     auto screen_des_0 = std::make_shared("screen_des_0", 0);
    29     
    30     /* save to file, `%d` is placeholder for filename index */
    31     //auto image_des_0 = std::make_shared("image_file_des_0", 0, "./images/%d.jpg", 3);
    32     
    33     /* push via udp,  receiving command for test: `gst-launch-1.0 udpsrc port=6000 ! application/x-rtp,encoding-name=jpeg ! rtpjpegdepay ! jpegparse ! jpegdec ! queue ! videoconvert ! autovideosink` */
    34     auto image_des_0 = std::make_shared("image_udp_des_0", 0, "192.168.77.248:6000", 3, vp_objects::vp_size(400, 200));
    35 
    36     // construct pipeline
    37     yunet_face_detector_0->attach_to({file_src_0});
    38     sface_face_encoder_0->attach_to({yunet_face_detector_0});
    39     osd_0->attach_to({sface_face_encoder_0});
    40     screen_des_0->attach_to({osd_0});
    41     image_des_0->attach_to({osd_0});
    42 
    43     file_src_0->start();
    44 
    45     // for debug purpose
    46     vp_utils::vp_analysis_board board({file_src_0});
    47     board.display();
    48 }
    49 
    50 #endif
    复制代码

    上面代码运行效果如下:

     

    更多更新扫码加入微信群,及时获取通知。

  • 相关阅读:
    SlicePlane的Heading角度与Math.atan2(y,x)的对应转换关系
    SpringBoot开发之SpringJDBC
    Acwing 907. 区间覆盖
    【ARIMA时序预测】基于ARIMA实现时间序列数据预测附matlab代码
    虾皮市场中店铺定位是什么,如何做好产品线布局?这些东西你有了解吗?
    C++11之显式转换操作符-explicit
    【C++】引用之带你“消除”C语言版数据结构教材的一些困惑(虽然是C++的内容,但是强烈建议正在学习数据结构的同学点进来看看)
    Vue条件渲染
    C++Atomic与内存序
    Java集合+泛型:练习
  • 原文地址:https://www.cnblogs.com/xiaozhi_5638/p/17272537.html