【x3pai 多路视频推理】多路视频流推理代码改怎么修改

1、如果需要一个进程线程的处理多个实例,这块该如何处理呢?

2、现在写的两个实例订阅的topic是不同的。

3、模型是跑的yolov5 slim的,模型大小8.62M,目前为止是创建了两个实例就会出现这个问题,单独构建一个实例则不会有问题。刚刚尝试了如下操作,出现如下问题:

可以做两个测试:

1、使用tros中示例测试。dnn_node_example或者dnn_node_sample的main中,直接创建两个推理node实例测试。

2、你的程序中创建完两个推理node实例后,使用

while(rclcpp::ok()) {

sleep(1);

}

把推理程序hung住,验证下只加载模型是否有问题。

刚刚尝试了一下直接跑视频发布hobot_image_publisher 、hobot_codec、websocket node,发现如果视频是tros例子里的MP4的格式视频两路运行就会报错,如果是h264格式(6.54M)的就不会报错。把自己的MP4视频转成h264的格式(44M),还是报错

目前尝试了单进程二路视频流推理,当使用720P小分辨率时可以跑通流程,但是infer time模型推理阶段相比较单进程单路视频差了十几倍,如下图所示(图一为单进程单路视频, 图二为单进程双路视频),请问对此是什么原因可能导致的呢,有什么办法能解决这个问题呢,目前用的模型大小为8.62M

使用hrut_somstatus命令查下两种方式下的bpu使用率。

单进程单路视频:

单进程双路视频:

1、多路之后推理耗时增加是正常的,你的模型增加的确实比较多,不确定是不是模型问题。

2、我也验证了下单进程两路推理,推理耗时波动更大,但是没有达到倍数,结果符合预期。你这边可以按照我的方法复现下我的结果。

单进程单路结果:

单进程两路推理结果:

修改patch(没法上传附近,直接贴出来了):

repo: Sign in · GitLab

基于tag:tros_1.1.4

From 79f89bf52d84f368f08bb0ea9e15458c4728e65d Mon Sep 17 00:00:00 2001From: "kao.zhu" <kao.zhu@horizon.ai>Date: Thu, 2 Mar 2023 10:35:09 +0800Subject: [PATCH] support multi-channle prediction--- dnn_node_example/include/dnn_example_node.h | 1 + dnn_node_example/src/dnn_example_node.cpp   | 3 ++- dnn_node_example/src/example.cpp            | 9 ++++++++- 3 files changed, 11 insertions(+), 2 deletions(-)diff --git a/dnn_node_example/include/dnn_example_node.h b/dnn_node_example/include/dnn_example_node.hindex dfe61bd..73a90a9 100644--- a/dnn_node_example/include/dnn_example_node.h+++ b/dnn_node_example/include/dnn_example_node.h@@ -90,6 +90,7 @@ class DnnExampleNode : public DnnNode {   int PostProcess(const std::shared_ptr<DnnNodeOutput> &outputs) override;   private:+  std::string node_name_;   // 解析配置文件,包好模型文件路径、解析方法等信息   int LoadConfig();   // 用于解析的配置文件,以及解析后的数据diff --git a/dnn_node_example/src/dnn_example_node.cpp b/dnn_node_example/src/dnn_example_node.cppindex b5026a9..69f6711 100644--- a/dnn_node_example/src/dnn_example_node.cpp+++ b/dnn_node_example/src/dnn_example_node.cpp@@ -99,6 +99,7 @@ int ResizeNV12Img(const char *in_img_data, DnnExampleNode::DnnExampleNode(const std::string &node_name,                                const NodeOptions &options)     : DnnNode(node_name, options) {+  node_name_ = node_name;   // 更新配置   this->declare_parameter<int>("feed_type", feed_type_);   this->declare_parameter<std::string>("image", image_);@@ -545,7 +546,7 @@ int DnnExampleNode::PostProcess(      // 如果当前帧有更新统计信息,输出统计信息     if (node_output->rt_stat->fps_updated) {-      RCLCPP_WARN(rclcpp::get_logger("example"),+      RCLCPP_WARN(rclcpp::get_logger(node_name_),                   "Sub img fps: %.2f, Smart fps: %.2f, infer time ms: %d, "                   "post process time ms: %d",                   node_output->rt_stat->input_fps,diff --git a/dnn_node_example/src/example.cpp b/dnn_node_example/src/example.cppindex 46782e3..652b38e 100644--- a/dnn_node_example/src/example.cpp+++ b/dnn_node_example/src/example.cpp@@ -21,8 +21,15 @@ int main(int argc, char** argv) {   rclcpp::init(argc, argv);   RCLCPP_WARN(rclcpp::get_logger("example"), "This is dnn node example!");+  // rclcpp::spin(std::make_shared<DnnExampleNode>("body_det"); -  rclcpp::spin(std::make_shared<DnnExampleNode>("body_det"));+  auto node1 = std::make_shared<DnnExampleNode>("det1");+  auto node2 = std::make_shared<DnnExampleNode>("det2");+  auto options = rclcpp::ExecutorOptions();+  auto exes = std::make_shared<rclcpp::executors::MultiThreadedExecutor>();+  exes->add_node(node1);+  exes->add_node(node2);+  exes->spin();    rclcpp::shutdown();   return 0;-- 2.25.1

启动命令:ros2 launch dnn_node_example hobot_dnn_node_example.launch.py config_file:=config/yolov5workconfig.json image_width:=480 image_height:=272

说明:MIPI摄像头以30fps输出图像数据,dnn_node_example创建两个node,使用yolov5模型推理,相当于单进程两路推理。

另外,如果你只是跑yolo这种检测模型,推理不依赖序列,没必要多路推理,直接单进程单路推理就可以了,通过img msg中的frame_id字段(其他字段也可以)区分哪一路。

我这里尝试了dnn_node_example,这边的耗时也是很高:

你这边推理和后处理耗时都要高很多。

是使用我发的启动命令,使用mipi cam作为输入是吧。

另外锁定CPU频率对比看下:`echo performance > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor`

把线程数变为4,时间下降了很多,但是fps还是达不到单进程单路视频的:

BPU使用率已经快满了,基本上就这个帧率了。

主要yolo模型无法发挥出BPU的最佳性能,对于多路推理,如果对帧率有要求,推荐使用fcos模型,基本上能达到4路30fps推理输出。

好的,这个我再看看

替换了efficient net 网络,模型参数变小了,bpu占用也不高,但是fps还是提不上去,这是什么情况?

这属于模型性能调优,在做模型转换的时候有相关说明。

也可以在板端使用hrt_model_exec命令实测模型性能,例如测fcos模型:hrt_model_exec perf --model_file /app/model/basic/fcos_512x512_nv12.bin

这有问题么,目前efficient 用的图一模型,之前的yolo是图2

他两个bpu,单进程单路的时候两个bpu同时跑,加起来超过30fps,现在单进程双路,每个bpu跑一路,所以17左右,是这样么?