ros1实现yolov5的部署和使用

ros1实现yolov5的部署和使用

1. 准备工作

确保计算机上已经安装了ROS 1 和相应的依赖项。

1.1 安装ros

如果还没有安装ROS,请参考官方文档进行安装:

ROS Kinetic (对于Ubuntu 16.04)

https://wiki.ros.org/kinetic/Installation/Ubuntu?spm=5176.28103460.0.0.297c572cwMh7Z8

ROS Melodic (对于Ubuntu 18.04)

https://wiki.ros.org/melodic/Installation/Ubuntu?spm=5176.28103460.0.0.297c572cwMh7Z8

ROS Noetic (对于Ubuntu 20.04)

https://wiki.ros.org/noetic/Installation/Ubuntu?spm=5176.28103460.0.0.297c572cwMh7Z8

1.2 安装其他依赖项

确保安装了以下依赖项:
Python 2 或 Python 3
cv_bridge: 用于转换OpenCV图像和ROS消息
image_transport: 提供图像传输
rospy: ROS Python API
message_generation: 用于编译ROS消息和服务
message_runtime: 运行时解析ROS消息和服务
catkin: ROS包管理工具

sudo apt-get install ros-<rosdistro>-python-rosdep ros-<rosdistro>-cv-bridge-dev ros-<rosdistro>-image-transport-dev ros-<rosdistro>-rospy ros-<rosdistro>-message-generation ros-<rosdistro>-message-runtime catkin
<rosdistro>是自己的ros版本

安装过程中需要联网且建议是稳定的网络。

2. 创建ROS包

创建一个新的ROS包来包含YOLOv5相关的代码和配置。

2.1 初始化工作空间

新建工作空间并初始化

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
source devel/setup.bash

考虑到使用的便捷性,source devel/setup.bash也可以添加到主目录下.bashrc文件中,即

source ~/your_cankin_ws_path/devel/setup.bash

2.2 创建ROS包

cd ~/catkin_ws/src
catkin_create_pkg yolov5_ros rospy message_runtime cv_bridge image_transport
cd ..
catkin_make

3. 集成YOLOv5到主环境

下载YOLOv5代码并集成到ROS包中。

3.1 下载YOLOv5

git clone https://github.com/ultralytics/yolov5.git
cd yolov5
pip install -r requirements.txt

3.2 移动YOLOv5到ROS包

将YOLOv5源码移动到ROS包内,并进行适当的结构调整。

mv yolov5 ~/catkin_ws/src/yolov5_ros/
cd ~/catkin_ws/src/yolov5_ros

3.3 修改YOLOv5代码

修改YOLOv5的代码以便与ROS集成,主要涉及创建一个ROS节点,订阅图像主题,并发布检测结果。
创建一个Python脚本来启动YOLOv5节点,在ROS包中创建一个scripts文件夹,并在其中创建一个名为yolov5_node.py的Python脚本。

#!/usr/bin/env python3
#encoding=utf-8
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
import numpy as np
import torch

class YoloV5Node:
    def __init__(self):
        # Initialize the node
        rospy.init_node('yolov5_node')
        self.bridge = CvBridge()
        
        # Load the model
        self.model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
        
        # Subscribe to the image topic
        self.image_sub = rospy.Subscriber("/camera/image_raw", Image, self.image_callback)
    
    def image_callback(self, data):
        try:
            # Convert ROS image message to OpenCV image
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)
        
        # Perform object detection
        results = self.model(cv_image)
        
        # Process the results and publish them
        self.publish_results(results)
    
    def publish_results(self, results):
        # Convert results to ROS format and publish
        pass

if __name__ == '__main__':
    try:
        node = YoloV5Node()
        rospy.spin()
    except rospy.ROSInterruptException:
        pass

4. 发布检测结果

主要是如何发布YOLOv5的检测结果,常见的做法是使用自定义的消息类型来发布检测框的位置和类别。即在ROS包中创建一个msg文件夹,并定义一个消息类型来存储检测结果,更新package.xml和CMakeLists.txt文件以包含新的消息类型,修改yolov5_node.py中的publish_results方法以发布检测结果。

4.1 创建自定义消息类型

4.1.1 创建msg文件夹

在ROS包yolov5_ros中创建一个名为msg的文件夹。

4.1.2 定义消息类型

在msg文件夹中创建一个名为Detection.msg的文件,定义一个消息类型来存储检测结果。这个消息类型将包含检测框的位置和类别信息。

# Detection.msg
uint32 id
string class_name
float32 confidence
float32 x_min
float32 y_min
float32 x_max
float32 y_max

4.2 更新package.xml文件

打开yolov5_ros包中的package.xml文件,并在<build_depend>和<exec_depend>标签中添加对message_generation的依赖。

<package>
  <name>yolov5_ros</name>
  <version>0.0.1</version>
  <description>The yolov5_ros package</description>
  
  <maintainer email="your.email@example.com">Your Name</maintainer>
  <license>BSD</license>
  
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>rospy</build_depend>
  <build_depend>message_generation</build_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>message_runtime</exec_depend>
  
  <export>
    <build_type>catkin</build_type>
  </export>
</package>

4.3 更新CMakeLists.txt文件

打开yolov5_ros包中的CMakeLists.txt文件,并添加以下内容来编译消息类型。

cmake_minimum_required(VERSION 2.8.3)
project(yolov5_ros)

#Generate messages in the 'msg' folder

generate_messages(DEPENDENCIES std_msgs)

find_package(catkin REQUIRED COMPONENTS
  rospy
  std_msgs
  message_generation
)

catkin_package(
  INCLUDE_DIRS include
  LIBRARIES yolov5_ros
  CATKIN_DEPENDS rospy std_msgs message_runtime
  DEPENDS system_lib
)

include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(yolov5_node src/yolov5_node.cpp)
target_link_libraries(yolov5_node ${catkin_LIBRARIES})

4.4 修改yolov5_node.py中的publish_results方法

现在您需要修改yolov5_node.py中的publish_results方法,以便将检测结果发布到ROS话题上。

4.4.1 更新yolov5_node.py

在yolov5_node.py中导入Detection消息类型,并创建一个Detection类型的发布者。

#!/usr/bin/env python3
#encoding=utf-8
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import cv2
import numpy as np
import torch
from yolov5_ros.msg import Detection  # Import the custom message type

class YoloV5Node:
    def __init__(self):
        # Initialize the node
        rospy.init_node('yolov5_node')
        self.bridge = CvBridge()
        
        # Load the model
        self.model = torch.hub.load('ultralytics/yolov5', 'yolov5s')
        
        # Subscribe to the image topic
        self.image_sub = rospy.Subscriber("/camera/image_raw", Image, self.image_callback)
        
        # Create a publisher for the detection results
        self.detection_pub = rospy.Publisher('/detections', Detection, queue_size=10)
    
    def image_callback(self, data):
        try:
            # Convert ROS image message to OpenCV image
            cv_image = self.bridge.imgmsg_to_cv2(data, "bgr8")
        except CvBridgeError as e:
            print(e)
        
        # Perform object detection
        results = self.model(cv_image)
        
        # Process the results and publish them
        self.publish_results(results)
    
    def publish_results(self, results):
        # Convert results to ROS format and publish
        detections = []
        for *xyxy, conf, cls in results.xyxy[0]:
            # Extract detection details
            x_min, y_min, x_max, y_max = xyxy
            class_name = results.names[int(cls)]
            
            # Create a Detection message
            detection = Detection()
            detection.id = len(detections) + 1
            detection.class_name = class_name
            detection.confidence = float(conf)
            detection.x_min = float(x_min)
            detection.y_min = float(y_min)
            detection.x_max = float(x_max)
            detection.y_max = float(y_max)
            
            # Append the detection to the list
            detections.append(detection)
        
        # Publish the detections
        for detection in detections:
            self.detection_pub.publish(detection)

if __name__ == '__main__':
    try:
        node = YoloV5Node()
        rospy.spin()
    except rospy.ROSInterruptException:
        pass

4.5 编译ROS包

返回到ROS工作空间的根目录,并重新编译ROS包以确保所有更改生效。

cd ~/catkin_ws
catkin_make

4.6 运行YOLOv5节点

确保有图像流输入,并启动YOLOv5节点。

roslaunch yolov5_ros yolov5_node.launch

4.7 验证结果

验证YOLOv5是否正确检测到了目标,并检查检测结果的准确性。您可以通过订阅/detections话题来查看检测结果。

5. 编译和测试

编译ROS包并测试YOLOv5节点。

5.1 编译ROS包

cd ~/catkin_ws
catkin_make

5.2 运行YOLOv5节点

确保有图像流输入,并启动YOLOv5节点。

roslaunch yolov5_ros yolov5_node.launch

6. 调整配置

调整YOLOv5的参数来优化检测性能,可以通过修改yolov5_node.py中的模型加载部分来更改模型版本,调整YOLOv5的配置参数,如置信度阈值等,这里大家可以依据自己实际情况去调整。

7. 验证结果

验证YOLOv5是否正确检测到了目标,并检查检测结果的准确性。

  • 13
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值