【ROS】Darknet_ROS YOLO V3 目标检测
前言
本文适用于已掌握 YOLOv3 和 Darknet 基础知识的读者,旨在帮助大家快速在 ROS 上部署自定义 YOLOv3 模型,实现目标检测。
为了聚焦于部署流程,本文不会详细讲解原理部分。如需补充相关前置知识,请参考以下文章:
- 数据集标注(手动标注):【YOLO】X-AnyLabeling 数据集标注
- 数据集标注(AI标注):【YOLO】X-AnyLabeling 半自动标注
- 训练 Darknet 自定义模型(本机):【YOLOv3】目标检测 Darknet 训练自定义模型
- 训练 Darknet 自定义模型(服务器):【YOLOv3】Darknet AutoDL 训练自定义模型
为了兼顾嵌入式平台的计算资源限制,本文以 yolov3-tiny.weights
为示例进行部署。该模型参数较少,推理速度更快,适合在资源受限的环境中运行。
参考资料:
整体思路
安装—准备文件—修改配置—使用与测试
- 安装:首先,确保安装了
darknet_ros
的依赖项,包括opencv
和boost
。完成依赖项安装后,使用git clone
下载darknet_ros
源码并进行编译构建。 - 准备文件:准备自训练的
.weights
权重文件、模型的.cfg
文件,以及对应的模型配置文件.yaml
。 - 修改配置:修改 ros.yaml 文件,定义 darknet_ros 订阅的图像来源,并确保相应话题与摄像头图像匹配;同时修改 darknet_ros.launch 文件,传入自定义的模型配置文件,以加载自训练的模型。
- 使用与测试:启动 usb_cam 节点捕获摄像头图像,启动 darknet_ros 节点进行图像推理,并使用 rqt_image_view 查看推理后的检测结果图像。
安装
在安装 darknet_ros
之前,需要确保所有依赖项均已正确安装。
依赖项检查
darknet_ros
依赖 OpenCV 和 Boost,请确保系统已安装这些库。
具体安装方法可参考以下链接: 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 模型的网络结构和超参数设置。你需要做以下修改:
- 切换至 推理模式,并注释掉训练模式相关配置
[net]
# 推理模式配置 (训练时注释掉这几行)
batch=1 # 推理时每批处理 1 张图片
subdivisions=1 # 不需要进行批次细分
# 训练模式配置 (推理时注释掉这几行)
# batch=64
# subdivisions=2
- 修改 [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
文件中,进行以下修改:
- 修改前 5 行:
subscribers:
camera_reading:
topic: /usb_cam/image_raw
queue_size: 1
尽管在 launch
文件中已经进行了话题重映射,修改这部分内容可以确保 camera_reading
正确订阅 /usb_cam/image_raw
话题,确保一致性。
- 修改后 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
模型。
使用与测试
启动 USB 摄像头节点并发布图像:
roslaunch usb_cam usb_cam-test.launch
启动
darknet_ros
节点进行图像识别:roslaunch darknet_ros darknet_ros.launch
使用
rqt_image_view
查看 YOLO 检测结果:启动
rqt_image_view
:rosrun rqt_image_view rqt_image_view
在
rqt_image_view
窗口中,选择/darknet_ros/detection_image
话题,以查看 YOLO 检测到的图像。