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<vp_nodes::vp_file_src_node>("file_src_0", 0, "./test_video/19.mp4", 0.6);
24 auto mask_rcnn_detector = std::make_shared<vp_nodes::vp_mask_rcnn_detector_node>("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<vp_nodes::vp_sort_track_node>("sort_track_0");
26 auto osd_v3_0 = std::make_shared<vp_nodes::vp_osd_node_v3>("osd_v3_0", "../third_party/paddle_ocr/font/NotoSansCJKsc-Medium.otf");
27 auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("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<vp_nodes::vp_file_src_node>("file_src_0", 0, "./test_video/21.mp4");
24 auto enet_seg = std::make_shared<vp_nodes::vp_enet_seg_node>("enet_seg", "models/enet-cityscapes/enet-model.net");
25 auto seg_osd_0 = std::make_shared<vp_nodes::vp_seg_osd_node>("seg_osd_0", "models/enet-cityscapes/enet-classes.txt", "models/enet-cityscapes/enet-colors.txt");
26 auto screen_des_mask = std::make_shared<vp_nodes::vp_screen_des_node>("screen_des_mask", 0, true, vp_objects::vp_size(400, 225));
27 auto screen_des_original = std::make_shared<vp_nodes::vp_screen_des_node>("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<vp_nodes::vp_file_src_node>("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<vp_nodes::vp_yolo_detector_node>("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<vp_nodes::vp_classifier_node>("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<vp_nodes::vp_classifier_node>("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<vp_nodes::vp_osd_node>("osd_0");
37 auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("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<vp_nodes::vp_image_src_node>("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<vp_nodes::vp_image_src_node>("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<vp_nodes::vp_yolo_detector_node>("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<vp_nodes::vp_osd_node>("osd");
28 auto split = std::make_shared<vp_nodes::vp_split_node>("split_by_channel", true); // split by channel index (important!)
29 auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("screen_des_0", 0);
30 auto screen_des_1 = std::make_shared<vp_nodes::vp_screen_des_node>("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<vp_nodes::vp_file_src_node>("file_src_0", 0, "./test_video/10.mp4", 0.6);
25 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");
26 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");
27 auto osd_0 = std::make_shared<vp_nodes::vp_face_osd_node_v2>("osd_0");
28 auto screen_des_0 = std::make_shared<vp_nodes::vp_screen_des_node>("screen_des_0", 0);
29
30 /* save to file, `%d` is placeholder for filename index */
31 //auto image_des_0 = std::make_shared<vp_nodes::vp_image_des_node>("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<vp_nodes::vp_image_des_node>("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
上面代码运行效果如下:

更多更新扫码加入微信群,及时获取通知。
VideoPipe可视化视频结构化框架更新总结(2023-3-30)的更多相关文章
- VideoPipe可视化视频结构化框架更新总结(2022-12-9)
项目地址:https://github.com/sherlockchou86/video_pipe_c 往期文章:https://www.cnblogs.com/xiaozhi_5638/p/1685 ...
- VideoPipe可视化视频结构化框架开源了!
完成多路视频并行接入.解码.多级推理.结构化数据分析.上报.编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gst ...
- VideoPipe可视化视频结构化框架新增功能详解(2022-11-4)
VideoPipe从国庆节上线源代码到现在经历过了一个月时间,期间吸引了若干小伙伴的参与,现将本阶段新增内容总结如下,有兴趣的朋友可以加微信拉群交流. 项目地址:https://github.com/ ...
- VP视频结构化框架
完成多路视频并行接入.解码.多级推理.结构化数据分析.上报.编码推流等过程,插件式/pipe式编程风格,功能上类似英伟达的deepstream和华为的mxvision,但底层核心不依赖复杂难懂的gst ...
- 视频结构化 AI 推理流程
「视频结构化」是一种 AI 落地的工程化实现,目的是把 AI 模型推理流程能够一般化.它输入视频,输出结构化数据,将结果给到业务系统去形成某些行业的解决方案. 换个角度,如果你想用摄像头来实现某些智能 ...
- [AI开发]基于DeepStream的视频结构化解决方案
视频结构化的定义 利用深度学习技术实时分析视频中有价值的内容,并输出结构化数据.相比数据库中每条结构化数据记录,视频.图片.音频等属于非结构化数据,计算机程序不能直接识别非结构化数据,因此需要先将这些 ...
- [AI开发]视频结构化类应用的局限性
算法不是通用的,基于深度学习的应用系统不但做不到通用,即使对于同一类业务场景,还需要为每个场景做定制.特殊处理,这样才能有可能到达实用标准.这种局限性在计算机视觉领域的应用中表现得尤其突出,本文介绍基 ...
- [AI开发]零代码分析视频结构化类应用结构设计
视频结构化类应用涉及到的技术栈比较多,而且每种技术入门门槛都较高,比如视频接入存储.编解码.深度学习推理.rtmp流媒体等等.每个环节的水都非常深,单独拿出来可以写好几篇文章,如果没有个几年经验基本很 ...
- Spark如何与深度学习框架协作,处理非结构化数据
随着大数据和AI业务的不断融合,大数据分析和处理过程中,通过深度学习技术对非结构化数据(如图片.音频.文本)进行大数据处理的业务场景越来越多.本文会介绍Spark如何与深度学习框架进行协同工作,在大数 ...
- seaborn线性关系数据可视化:时间线图|热图|结构化图表可视化
一.线性关系数据可视化lmplot( ) 表示对所统计的数据做散点图,并拟合一个一元线性回归关系. lmplot(x, y, data, hue=None, col=None, row=None, p ...
随机推荐
- UGUI让自动布局下的子物体不接受布局(LayoutGroup)影响
在子物体上添加Layout Element组件 看到这个组件上有个Ignore Layout,这个就是忽视布局,把它勾上就可以忽视父级对它的布局了. 转自:https://zhuanlan.zhihu ...
- python中列表,字典,字符串常用操作
1. 列表操作 分类 关键字 / 函数 / 方法 说明 增加 列表.append(值) 在末尾追加值 列表.insert(索引, 值) 在指定位置插入值, 超过索引会追加值 列表.extend ...
- C 语言 数制
C 语言 数制 数制也称计数制,是指用一组固定的符号和统一的规则来表示数值的方法.计算机处理的信息必须转换成二进制形式数据后才能进行存储和传输.计算机中,经常使用的进制有二进制.八进制.十进制.十六进 ...
- 2003031126-石升福-Python数据分析-五一假期作业
项目 内容 班级链接 20级数据班(本) 作业链接 五一假期作业 博客名称 2003031126-石升福-Python数据分析-五一假期作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码的自 ...
- 十大经典排序之计数排序(C++实现)
计数排序 核心思想:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中. 作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数. 思路: 找出待排序的数组中最大和 ...
- Web_ServletContext主要方法
ServletContext:联系上下文,一个项目通用一个context,作用域:整个项目 用法:Servlet里面直接应用,tomcat帮我们自动创建. 获取ServletContext:getSe ...
- 关于 TabControl 获取 被鼠标右键的 TabPage 而编写的函数...
关于 TabControl 获取 被鼠标右键的 TabPage 而编写的函数... 功能: 1.不需考虑 SizeMode 情况 2.可以获取通过鼠标右键点击的 Tab 3.且顺便返回鼠标左键点的 T ...
- centos下vi 命令用法
vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和一小部分指令.由于对Unix及Linux系统的任何版本,vi编辑器是完全相 ...
- 7&的2022年终总结
7&的2022年终总结 文章目录 7&的2022年终总结 1.前言 2.技术 3.生活 4.展望未来 博客搬家的需要: var code = "49d515c3-0238-4 ...
- centos7.6 挂载镜像配置本地yum源
镜像下载 http://mirrors.aliyun.com/centos-vault/7.6.1810/isos/x86_64/ 配置本地yum源 1.安装Centos后默认的Yum源如下 [roo ...