未来函数在线检测_联合darknet测试三维目标检测

主要工作是联合darknet实现三维目标检测。

重新检视github提供的代码,发现最开始研究的包object_slam并非完全是读取三维数据直接将绘制结果。在主程序main_obj中一个函数注释如下:

//NOTE offline_pred_objects and init_frame_poses are not used in online_detect_mode! truth cam pose of first frame is used.
void incremental_build_graph(Eigen::MatrixXd& offline_pred_frame_objects,                                            Eigen::MatrixXd& init_frame_poses, 
                             Eigen::MatrixXd& truth_frame_poses)
{  
    ......
}

在这个函数中,每一帧的检测循环里存在online_detect_mode决定是否进行在线检测。

// process each frame online and incrementally
for (int frame_index=0;frame_index<total_frame_number;frame_index++)
{
    ....
    // read or detect cuboid
    if (online_detect_mode)
    {
        //start detect cuboid
        cv::Mat raw_rgb_img = cv::imread(base_folder+
                                         "raw_imgs/"+frame_index_c+"_rgb_raw.jpg", 1);
        //edge detection
        cv::Mat all_lines_mat;
        line_lbd_obj.detect_filter_lines(raw_rgb_img, all_lines_mat); 
        ......
        //read cleaned yolo 2d object detection
        Eigen::MatrixXd raw_2d_objs(10,5);  // 2d rect [x1 y1 width height], and prob
        if (!read_all_number_txt(base_folder+
                                 "/filter_2d_obj_txts/"+frame_index_c+
                                 "_yolo2_0.15.txt", raw_2d_objs))
              return;
        ....
        // cube detection
        std::vector<ObjectSet> frames_cuboids;                            
        detect_cuboid_obj.detect_cuboid(raw_rgb_img,transToWolrd,                                                               raw_2d_objs,all_lines_raw, frames_cuboids);

对于在线检测,所有有用的数据为二维检测结果与第一帧变换矩阵。数据存在

$(find object_slam)/data
│   
│   truth_cam_poses.txt
└───filter_2d_obj_txts
│   │   0000_yolo2_0.15.txt
│   │   0001_yolo2_0.15.txt
│   │   0002_yolo2_0.15.txt
│   │   ...

变换矩阵可以直接写入程序,检测结果可以订阅yolo检测线程。

darknet_ros

darknet_ros是在darknet基础上添加可订阅可发布的功能。

subscribers:

  camera_reading:
    topic: /camera/image
    queue_size: 1

actions:

  camera_reading:
    name: /darknet_ros/check_for_objects

publishers:

  # Publishes the number of detected objects.   ([std_msgs::Int8])
  object_detector:
    topic: /darknet_ros/found_object
    queue_size: 1
    latch: false

  # Publishes an array of bounding boxes that gives information of the position and      size of the bounding box in pixel coordinates.  ([darknet_ros_msgs::BoundingBoxes])
  bounding_boxes:
    topic: /darknet_ros/bounding_boxes
    queue_size: 1
    latch: false

  #Publishes an image of the detection image including the bounding boxes.([sensor_msgs::Image])
  detection_image:
    topic: /darknet_ros/detection_image
    queue_size: 1
    latch: true

image_view:

  enable_opencv: true
  wait_key_delay: 1
  enable_console_output: true

测试darknet_ros

1. usb相机测试darknet_ros

在工程中加入usb_cam,将yaml文件里订阅topic改为/usb_cam/image_raw,测试结果如下

70ffd7addc83c702f463a98eb661f3f8.png

帧率只有0.5

2. 数据集三维检测结果

计划首先将数据集送给darnet_ros,将结果保存下来放到orb_slam下测试三维检测结果。

在darknet_ros包外建立新的包darknet_test,里面分别为发布节点和订阅节点。发布节点读取图片发布给darknet_ros,订阅节点订阅检测结果,将数据保存在txt文件中。

70ffd7addc83c702f463a98eb661f3f8.png

经过测试出现两个问题未解决:

  1. 由于数据集运动过快时没有检测结果,darknet_ros就不会发布结果,导致实际保存的txt文件个数少于图片个数。可以解决的办法是修改发布的消息的数据结构,添加帧的id值,以同步txt文件和图片对应关系。
  2. 检测完所有图片后,darknet_ros节点依然会不停向外发布最后一帧检测结果,因此不加干预的情况下txt文件会无限存储。但是这个问题不大,实际工程中不使用数据集,不存在图片会检测完的情况。

此外数据流还存在一个问题:有两种数据流模式:

  1. object_slam间接得到图片:效率低,需要修改darknet_ros发布代码
graph LR
id[usb_cam]--图片-->id2[darknet_ros]
id2[darknet_ros]--图片/检测结果-->id3[object_slam]
  1. object_slam直接得到图片,不好同步图片检测结果的对应关系
graph LR
id[usb_cam]--图片-->id2[darknet_ros]
id2[darknet_ros]--检测结果-->id3[object_slam]
id[usb_cam]--图片-->id3[object_slam]
相关资源:未来函数检测工具
  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页