感知笔记4:YOLO 3D 物体定位

news2024/11/15 13:25:51

如何在 ROS 中使用 YOLO

  • 如何在 2D 中检测人和大象
  • 如何在 3D 中检测人和大象

有许多可用的深度学习库。您可能听说过:Keras、TensorFlow 和 Darknet。

在这里我们将使用 Darknet,因为它实现了 YOLOv3,这是一个对象检测模型。它非常快,尤其是在支持 CUDA 的系统中使用它时。它旨在进行实时检测,这对于机器人技术来说非常重要。

3.4   2D YOLO 检测

我们将首先使用适用于 ROS 的 YOLO 版本创建我们自己的启动:

roscd my_object_recognition_pkg
touch launch/yolo_v2_tiny.launch
 yolo_v2_tiny.launch 
<?xml version="1.0" encoding="utf-8"?>

<launch>
  
  <!-- Use YOLOv3 -->
  <arg name="network_param_file"         default="$(find darknet_ros)/config/yolov2-tiny.yaml"/>
  <!-- 设置输入 RGB ROS 相机主题。这是最重要的参数,也是您需要更改的唯一参数。-->
  <arg name="image" default="/camera/rgb/image_raw" />


  <!-- Include main launch file -->
  <include file="$(find darknet_ros)/launch/darknet_ros.launch">
    <arg name="network_param_file"    value="$(arg network_param_file)"/>
    <arg name="image" value="$(arg image)" />
  </include>

</launch>

YOLO 有不同的版本:v2、v3 和 v4。每个版本都适用于不同的 OpenCV 库,理论上每个新版本都运行得更好。

在本单元中,我们将使用 v2 Tiny(更快的版本),因为它对系统的影响较小且性能更快。

如果您想要原始源代码,请查看以下 Git:

YOLO Darknet ROS

Darknet ROS

Original Source Git

启动并查看输出:

 

# Set variables only for this course, locally you wont need it
QT_X11_NO_MITSHM=1
echo $QT_X11_NO_MITSHM
# Start yolo V2-tiny
roslaunch my_object_recognition_pkg yolo_v2_tiny.launch

注意:首次启动可能会导致 GTK 错误。不要惊慌。重新启动它应该可以正常工作。

移动 PR2 机器人,看看它如何检测不同的物体。

roslaunch pr2_tc_teleop keyboard_teleop.launch

3.5 使用 YOLO 进行 3D 物体检测和定位

这个由 Francisco Martin 创建的 Darknet_ROS_3D 结合使用 darknet_ros 和点云数据将检测结果与 3D 空间进行匹配,从而大致确定检测到的物体在 3D 空间中的位置。

这对于抓取、自主导航和许多其他应用至关重要。

roscd my_object_recognition_pkg
touch config/darknet_3d.yaml
touch launch/darknet_ros_3d.launch
darknet_ros_3d.launch
<launch>

  <!-- Config camera image topic  -->
  <arg name="camera_rgb_topic" default="/camera/rgb/image_raw" />

  <!-- Console launch prefix -->
  <arg name="launch_prefix" default=""/>

  <!-- Config and weights folder. -->
  <arg name="yolo_weights_path"          default="$(find darknet_ros)/yolo_network_config/weights"/>
  <arg name="yolo_config_path"           default="$(find darknet_ros)/yolo_network_config/cfg"/>

  <!-- ROS and network parameter files -->
  <arg name="ros_param_file"             default="$(find darknet_ros)/config/ros.yaml"/>
  <arg name="network_param_file"         default="$(find darknet_ros)/config/yolov2-tiny.yaml"/>

  <!-- Load parameters -->
  <rosparam command="load" ns="darknet_ros" file="$(arg network_param_file)"/>
  <rosparam command="load" file="$(find darknet_ros)/config/ros.yaml"/>
  <param name="darknet_ros/subscribers/camera_reading/topic" type="string" value="$(arg camera_rgb_topic)" />

  <!-- Start darknet and ros wrapper -->
  <node pkg="darknet_ros" type="darknet_ros" name="darknet_ros" output="screen" launch-prefix="$(arg launch_prefix)">

    <param name="weights_path"          value="$(arg yolo_weights_path)" />
    <param name="config_path"           value="$(arg yolo_config_path)" />
  </node>

  <!-- Start darknet ros 3d -->
  <node pkg="darknet_ros_3d" type="darknet3d_node" name="darknet_3d" output="screen">
    <rosparam command="load" file="$(find my_object_recognition_pkg)/config/darknet_3d.yaml" />
  </node>
</launch>
darknet_3d.yaml
darknet_ros_topic: /darknet_ros/bounding_boxes
output_bbx3d_topic: /darknet_ros_3d/bounding_boxes
point_cloud_topic: /camera/depth_registered/points
working_frame: camera_rgb_optical_frame
mininum_detection_thereshold: 0.3
minimum_probability: 0.3
interested_classes: ["person", "elephant", "horse", "bottle", "toothbrush", "traffic light", "spoon", "scissors"]

 

<arg name="camera_rgb_topic" default="/camera/rgb/image_raw" />

我们需要设置输入 RGB 原始相机。

<arg name="network_param_file"         default="$(find darknet_ros)/config/yolov2-tiny.yaml"/>

在这里,我们将再次设置 v2 Tiny。它速度很快,特别是如果你想在 RViz 中查看点云(这将对系统负载产生显着影响)。这是最好的选择。 

<rosparam command="load" file="$(find my_object_recognition_pkg)/config/darknet_3d.yaml" />

 加载 darknet_3d 的参数。设置以下内容:

  • point_cloud_topic:这是您的机器人发布点云数据的 ROS 主题。这用于匹配 2D 中的 RGB 检测和 3D 中的点云数据以生成 3D 中的边界框。
  • minimum_probability 和 mininum_detection_thereshold:我们设置我们认为有效的检测并生成边界框。
  • interested_classes:这些是您要搜索的对象。由于系统负载影响,值越低越好。这里我们设置了人和大象。

但是我们如何知道 YOLO v2 Tiny 可以检测到哪个对象?检查下面的文件:

roscd darknet_ros/config
cat yolov2-tiny.yaml

 开始启动并查看输出:

# Set variables only for this course, locally you wont need it
QT_X11_NO_MITSHM=1
echo $QT_X11_NO_MITSHM
# Start yolo V3
roslaunch my_object_recognition_pkg darknet_ros_3d.launch

 现在您可以打开 RViz,添加 RobotModel、PointCloud2 和 MarkerArray(用于可视化检测)。您也可以从 Perception Course Solutions Git 中加载它,位于 /perception_unit3_solutions/my_object_recognition_pkg/rviz/y

练习 3.5.1

  • 创建一个名为 yolo_3d_data_extraction.py 的 Python 脚本,该脚本提取由 darknet_ros_3d.launch 生成的标记数据并仅过滤您想要的对象。在本例中为大象。
  • 它必须能够存储同一类型的多个对象(尝试使用人)。
  • 提取数据的主题是 /darknet_ros_3d/bounding_boxes。
  • 您必须根据最大值和最小值计算边界框的中心。

请记住在 Python 脚本中使 Python 脚本可执行,以便 ROS 可以执行它:

roscd my_object_recognition_pkg
touch scripts/yolo_3d_data_extraction.py
chmod +x yolo_3d_data_extraction.py
 my_object_recognition_pkg/scripts/yolo_3d_data_extraction.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
from gb_visual_detection_3d_msgs.msg import BoundingBoxes3d

class Yolo3DFilter:

   def __init__(self, object_name_to_search, accepted_probability=0.2):

      self._rate = rospy.Rate(5)

      self._object_name_to_search = object_name_to_search
      self._accepted_probability = accepted_probability
      self.objects_dict = {}
      self.yolo_3d_topic = "/darknet_ros_3d/bounding_boxes"
      self._check_yolo_3d_ready()
      rospy.Subscriber(self.yolo_3d_topic, BoundingBoxes3d, self.yolo_3d_clb)
     
      rospy.loginfo('Ready to detect with Yolo!')

   def _check_yolo_3d_ready(self):
      yolo_3d_data = None
      while yolo_3d_data is None and not rospy.is_shutdown():
         try:
               yolo_3d_data = rospy.wait_for_message(self.yolo_3d_topic, BoundingBoxes3d, timeout=1.0)
               rospy.logdebug("Current "+self.yolo_3d_topic+" READY=>" + str(yolo_3d_data))

         except:
               rospy.logerr("Current "+self.yolo_3d_topic+" not ready yet, retrying.")

   def update_object_name_to_search(self,new_name):
      self._object_name_to_search = new_name

   def calculate_center(self,box_data):

      x_center = (box_data.xmin + box_data.xmin) / 2.0
      y_center = (box_data.ymin + box_data.ymin) / 2.0
      z_center = (box_data.zmin + box_data.zmin) / 2.0

      return [x_center, y_center, z_center]

   def yolo_3d_clb(self, msg):

      # We clean the dict
      self.objects_dict = {}
      detect_object_index = 0

      detection_boxes_array = msg.bounding_boxes
      
      for box in detection_boxes_array:
         object_name = box.Class
         detection_probability = box.probability
         if object_name == self._object_name_to_search:
            if detection_probability >= self._accepted_probability:
               center_array = self.calculate_center(box)  
               unique_object_name = object_name+str(detect_object_index)             
               self.objects_dict[unique_object_name] = center_array
               
               detect_object_index += 1
            else:
               rospy.logdebug("Probability too low=="+str(detection_probability)+"<"+str(self._accepted_probability))
         else:
            rospy.logdebug("Object name doenst match="+str(object_name)+","+str(self._object_name_to_search))


   def get_objects_dict_detected(self):
      return self.objects_dict

   def run(self):


      while not rospy.is_shutdown():
         searched_for_objects_detected = self.get_objects_dict_detected()
         rospy.loginfo(str(searched_for_objects_detected))
         self._rate.sleep()



if __name__ == '__main__':
   rospy.init_node('searhc_for_object_node', log_level=rospy.INFO)
   yolo_obj = Yolo3DFilter(object_name_to_search="person")

   try:
      yolo_obj.run()
   except KeyboardInterrupt:
      rospy.loginfo('Shutting down')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2150603.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jdk版本更换以及遇到的问题略谈(以jdk1.8和jdk11为例)

目录 在我看来 遇到的问题 原因以及解决方法 方法一&#xff1a;禁止误改误删 方法二&#xff1a;bat文件驱动运行 方法三&#xff1a;cmd命令 方法四&#xff1a;修改注册表&#xff08;不推荐&#xff09; 最近在进行漏洞复现&#xff08;shiro550&#xff09;的时候&…

无人机如何突破高海拔高寒飞行环境?

无人机在突破高海拔高寒飞行环境方面&#xff0c;需要解决一系列技术难题和挑战。以下是一些主要的技术手段和策略&#xff1a; 1. 无人机平台设计与优化 增强机体结构&#xff1a;采用轻质高强度的材料&#xff0c;如碳纤维、复合材料等&#xff0c;减轻机身重量&#xff0c…

决策树算法中篇

手动计算实现决策树分类 数据整合 X[真实用户] y X 计算未划分信息熵 s X[真实用户] p s.value_counts()/s.size (p * np.log2(1/p)).sum() 按照日志密度进行划分 x X[日志密度].unique() x.sort() # 如何划分呢&#xff0c;分成两部分 for i in range(len(x) - 1):sp…

【目标检测论文必备】通俗易懂地讲解用绿色、蓝色、红色框可视化描述YOLO模型权重对于单个图片的训练效果(TP、FP、FN)

可视化步骤 一、生成自定义权重对图片的预测类别坐标信息二、创建需要预测的文件夹三、可视化运行 一、生成自定义权重对图片的预测类别坐标信息 新建脚本文件/path/to/your/ultralytics/savetxt.py放入对应参数运行会得到一个个独立的/path/to/your/runs/detect/output/outpu…

移动技术开发:简单计算器界面

1 实验名称 简单计算器界面 2实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:and…

2024年港澳台华侨生联考分数线继续更新来啦

导读 在最近的一系列分享中&#xff0c;我们和大家一同分享了2024年港澳台华侨生联考的分数线。今天我们继续和大家一起分享一些2024年港澳台联考的高校录取分数线吧&#xff01; 首都师范大学 首都师范大学和首都医科大学作为被低估的两所高校&#xff0c;这两年的分数线也是…

web基础—dvwa靶场(十)XSS

XSS(DOM) 跨站点脚本&#xff08;XSS&#xff09;攻击是一种注入攻击&#xff0c;恶意脚本会被注入到可信的网站中。当攻击者使用 web 应用程序将恶意代码&#xff08;通常以浏览器端脚本的形式&#xff09;发送给其他最终用户时&#xff0c;就会发生 XSS 攻击。允许这些攻击成…

Linux ubuntu debian系统安装UFW防火墙图形化工具GUFW

GUFW是UFW的图形化前端&#xff0c;可以通过以下命令安装&#xff1a; sudo apt install gufw安装成功后&#xff0c;可以通过应用程序菜单启动GUFW&#xff0c;在图形界面中&#xff0c;可以方便地添加、修改和删除规则&#xff0c;查看状态和日志。

【数据结构取经之路】图解红黑树

目录 前言 红黑树的概念 红黑树的性质 红黑树结点的定义 左右旋动图 红黑树的插入分析 红黑树的插入代码 红黑树与AVL-tree比较 红黑树的应用场景 前言 AVL-tree之外&#xff0c;另一个颇具历史且被广泛使用的平衡二叉搜索树是红黑树(RB-tree)&#xff0c;这名字听起来…

码头童话,“丈量”行业数智化转型

作者 | 曾响铃 文 | 响铃说 一箱车厘子从地球正对的另一边远渡重洋来到中国&#xff0c;而一旦到达&#xff0c;5个小时内它就能变成北京、天津、河北、河南等区域老百姓果盘里的美味。 这一幕&#xff0c;来自央视联合华为制作发布的《新智中国说-谈智一会间》第一期“码头…

PHP邮件发送教程:如何用PHP发送电子邮件?

php邮件怎么实现发送电子邮件&#xff1f;php怎么给邮箱发邮件&#xff1f; PHP作为一种广泛使用的服务器端脚本语言&#xff0c;提供了多种方法来实现电子邮件的发送。AokSend将详细介绍如何使用PHP邮件功能来发送电子邮件&#xff0c;帮助开发者轻松实现这一重要功能。 PHP…

30道常见的软件测试面试题(含答案+文档)

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、什么项目适合做自动化测试&#xff1f; 关键字&#xff1a;不变的、重复的、规范的 1&#xff09;任务测试明确&#xff0c;需求不会频繁变动 2&#xff09;项…

vulnhub靶场 DC-3

地址: https://download.vulnhub.com/dc/DC-3-2.zip 开启NAT模式 namp只扫到了一个端口 打开网页有一个登录的页面 目录扫描一下,可以找到一个 后台登录界面 看一下指纹信息 joomla cms 网上搜一下可以发现存在一个JoomScan工具 在kali上面安装一下 apt install joomscan …

4. 密码协议

4. 密码协议 (1) 协议的基本概念 协议是一种在两个或多个参与者之间进行通信的规范,它定义了参与者之间的交互方式、消息格式和通信过程。协议的目的是确保通信的可靠性和安全性,防止信息被篡改、伪造或泄露。 (2) 密码协议分类及基本密码协议 密码协议是用于加密和解密数…

【Python报错已解决】ModuleNotFoundError: No module named ‘tensorflow‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

浅谈“流量回放”

一、流量回放定义 “流量回放”通常指的是将之前记录的网络请求和响应数据重新发送到系统中&#xff0c;以模拟真实用户的操作。这种技术主要用于测试和调试目的&#xff0c;帮助开发人员和测试人员更好地理解系统在特定条件下的行为。 二、流量回放的技术原理&#xff1a; 数…

前端动画库大比拼:为何选择Velocity.js

前端动画库大比拼&#xff1a;为何选择Velocity.js 前言 在现代网页设计中&#xff0c;动画效果是提升用户体验的重要手段。 Velocity.js: 一个与 jQuery 动画 API 兼容的动画引擎&#xff0c;以其卓越的性能和丰富的功能&#xff0c;成为了开发者的好工具。 本文将详细介绍…

大数据Flink(一百二十二):阿里云Flink MySQL连接器介绍

文章目录 阿里云Flink MySQL连接器介绍 一、特色功能 二、​​​​​​​语法结构 三、​​​​​​​​​​​​​​WITH参数 阿里云Flink MySQL连接器介绍 阿里云提供了MySQL连接器&#xff0c;其作为源表时&#xff0c;扮演的就是flink cdc的角色。 一、特色功能 MySQ…

【Qt笔记】QToolBox控件详解

目录 引言 一、QToolBox的基本功能 1.1 分页布局 1.2 可点击标签 1.3 图标支持 1.4 信号与槽 二、 QToolBox的属性设置 2.1 设置指定索引位置可用性 2.2 设置指定索引位置图标 2.3 设置标题 2.4 设置提示信息 2.5 获取信息 三、QToolBox的常用API 3.1 构造函数…

前端vue-单选按钮的实现

要把name“sex”和value"男" 和 要把name“sex”和value"女"写上&#xff0c;然后在各自的标签内部写上v-model绑定属性。data中定义v-model的绑定值&#xff0c;后面的值是默认选中的男或者女性。