【ROS】Darknet_ROS YOLO V3 部署自训练模型 目标检测

发布于:2025-04-01 ⋅ 阅读:(19) ⋅ 点赞:(0)

前言

本文适用于已掌握 YOLOv3Darknet 基础知识的读者,旨在帮助大家快速在 ROS 上部署自定义 YOLOv3 模型,实现目标检测。

为了聚焦于部署流程,本文不会详细讲解原理部分。如需补充相关前置知识,请参考以下文章:

为了兼顾嵌入式平台的计算资源限制,本文以 yolov3-tiny.weights 为示例进行部署。该模型参数较少,推理速度更快,适合在资源受限的环境中运行

参考资料:

整体思路

安装—准备文件—修改配置—使用与测试

  1. 安装:首先,确保安装了 darknet_ros 的依赖项,包括 opencvboost。完成依赖项安装后,使用 git clone 下载 darknet_ros 源码并进行编译构建。
  2. 准备文件:准备自训练的 .weights 权重文件、模型的 .cfg 文件,以及对应的模型配置文件 .yaml
  3. 修改配置:修改 ros.yaml 文件,定义 darknet_ros 订阅的图像来源,并确保相应话题与摄像头图像匹配;同时修改 darknet_ros.launch 文件,传入自定义的模型配置文件,以加载自训练的模型。
  4. 使用与测试:启动 usb_cam 节点捕获摄像头图像,启动 darknet_ros 节点进行图像推理,并使用 rqt_image_view 查看推理后的检测结果图像。

安装

在安装 darknet_ros 之前,需要确保所有依赖项均已正确安装。

依赖项检查

darknet_ros 依赖 OpenCVBoost,请确保系统已安装这些库。

具体安装方法可参考以下链接: YOLO ROS: Real-Time Object Detection for ROS 或在网上查找相应的安装教程

克隆源码

在你的 ROS 工作空间 中克隆 darknet_ros 源码,并返回工作空间目录:

cd ~/lby_ws/src
git clone --recursive git@github.com:leggedrobotics/darknet_ros.git
cd ..

编译与构建

使用 Release 模式 进行编译,以最大限度地提升性能:

catkin_make -DCMAKE_BUILD_TYPE=Release

准备文件

以我的模型 xf_real 为例,以下是准备文件的详细步骤。请根据实际情况将文件名替换为你自己的模型名称。

为了在 darknet_ros 节点上实现目标识别,需要准备以下文件,并确保它们正确配置:

1. 权重文件(xf_real.weights)

存放路径 lby_ws/src/darknet_ros/darknet_ros/yolo_network_config/weights

PS:
建议使用基于 yolov3-tiny.conv.15 训练的 xf_real.weights 文件,该模型只使用前 15 层卷积层,推理速度较快。
实测结果显示,使用 YOLOv3(训练于 COCO 数据集)的帧率(FPS)为 1.4,而 yolov3-tiny.conv.15 的帧率可达到 10 帧。因此,推荐在计算资源受限的嵌入式平台上使用 YOLOv3-tiny 轻量化模型进行目标检测。

2. 配置文件(xf_real.cfg)

存放路径lby_ws/src/darknet_ros/darknet_ros/yolo_network_config/cfg

该配置文件定义了 YOLO 模型的网络结构和超参数设置。你需要做以下修改

  1. 切换至 推理模式,并注释掉训练模式相关配置
[net]
# 推理模式配置 (训练时注释掉这几行)
batch=1        # 推理时每批处理 1 张图片
subdivisions=1  # 不需要进行批次细分

# 训练模式配置 (推理时注释掉这几行)
# batch=64
# subdivisions=2
  1. 修改 [yolo] 层中的 classes,并相应调整紧邻上方的 filters 参数:

类别数应与训练时使用的数据集中的目标类别数一致。filters 的计算方式为: filters = (classes + 5) * 3

下面是一个修改过的 [yolo] 层配置的示例:

[convolutional]
size=1
stride=1
pad=1
filters=48
activation=linear

[yolo]
mask=3,4,5
anchors=10,14,  23,27,  37,58,  81,82,  135,169,  344,319
classes=11
num=6
jitter=.3
ignore_thresh=.7
truth_thresh=1
random=1

3.模型配置文件(xf_real.yaml)

将该文件放置在 lby_ws/src/darknet_ros/darknet_ros/config 目录下。

此 YAML 文件需要根据你模型的实际情况进行调整。 具体内容如下:

  • .cfg 文件 的名称
  • .weights 文件 的名称
  • 置信度阈值,低于该值的检测结果将被忽略
  • 类别索引,用于定义模型识别的目标种类

示例配置:

yolo_model:

  config_file:
    name: xf_real.cfg
  weight_file:
    name: xf_real.weights
  threshold:
    value: 0.3
  detection_classes:
    names:
      - watermelon
      - banana
      - apple
      - milk
      - red
      - green
      - pepper
      - cake
      - cola
      - potato
      - tomato

修改配置

ros.yaml

ros.yaml 文件中,进行以下修改:

  1. 修改前 5 行:
subscribers:
  camera_reading:
    topic: /usb_cam/image_raw
    queue_size: 1

尽管在 launch 文件中已经进行了话题重映射,修改这部分内容可以确保 camera_reading 正确订阅 /usb_cam/image_raw 话题,确保一致性。

  1. 修改后 5 行:
image_view:
  enable_opencv: false
  wait_key_delay: 1
  enable_console_output: true

关闭 OpenCV 支持后,darknet_ros 不会自动使用 OpenCV 来显示检测结果。这样做的好处是:

  • 减少资源占用:避免了 OpenCV 显示图像所带来的计算开销,特别是在资源受限的环境中。
  • 可视化改为按需查看:图像显示可以通过其他方式(如 rqt_image_view)来查看,只有在需要时才查看图像,避免了持续占用资源。

darknet_ros.launch

darknet_ros.launch 文件中,找到以下行:

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

将其修改为

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

这样修改后,darknet_ros 启动时将使用你自己的训练模型 xf_real.yaml 配置文件,确保加载的是你训练的模型,而不是默认的 yolov2-tiny 模型。

使用与测试

  1. 启动 USB 摄像头节点并发布图像:

    roslaunch usb_cam usb_cam-test.launch
    
  2. 启动 darknet_ros 节点进行图像识别:

    roslaunch darknet_ros darknet_ros.launch
    
  3. 使用 rqt_image_view 查看 YOLO 检测结果:

    启动 rqt_image_view

    rosrun rqt_image_view rqt_image_view
    

    rqt_image_view 窗口中,选择 /darknet_ros/detection_image 话题,以查看 YOLO 检测到的图像。

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到