本文适用于已掌握 YOLOv3 和 Darknet 基础知识的读者,旨在帮助大家快速在 ROS 上部署自定义 YOLOv3 模型,实现目标检测。
为了聚焦于部署流程,本文不会详细讲解原理部分。如需补充相关前置知识,请参考以下文章:
为了兼顾嵌入式平台的计算资源限制,本文以 yolov3-tiny.weights
为示例进行部署。该模型参数较少,推理速度更快,适合在资源受限的环境中运行。
参考资料:
安装—准备文件—修改配置—使用与测试
darknet_ros
的依赖项,包括 opencv
和 boost
。完成依赖项安装后,使用 git clone
下载 darknet_ros
源码并进行编译构建。.weights
权重文件、模型的 .cfg
文件,以及对应的模型配置文件 .yaml
。在安装 darknet_ros
之前,需要确保所有依赖项均已正确安装。
darknet_ros
依赖 OpenCV 和 Boost,请确保系统已安装这些库。
具体安装方法可参考以下链接: YOLO ROS: Real-Time Object Detection for ROS 或在网上查找相应的安装教程
在你的 ROS 工作空间 中克隆 darknet_ros
源码,并返回工作空间目录:
cd ~/lby_ws/src
git clone --recursive [email protected]:leggedrobotics/darknet_ros.git
cd ..
使用 Release 模式 进行编译,以最大限度地提升性能:
catkin_make -DCMAKE_BUILD_TYPE=Release
以我的模型 xf_real
为例,以下是准备文件的详细步骤。请根据实际情况将文件名替换为你自己的模型名称。
为了在 darknet_ros
节点上实现目标识别,需要准备以下文件,并确保它们正确配置:
存放路径: 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 轻量化模型进行目标检测。
存放路径:lby_ws/src/darknet_ros/darknet_ros/yolo_network_config/cfg
该配置文件定义了 YOLO 模型的网络结构和超参数设置。你需要做以下修改:
[net]
# 推理模式配置 (训练时注释掉这几行)
batch=1 # 推理时每批处理 1 张图片
subdivisions=1 # 不需要进行批次细分
# 训练模式配置 (推理时注释掉这几行)
# batch=64
# subdivisions=2
类别数应与训练时使用的数据集中的目标类别数一致。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
将该文件放置在 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
文件中,进行以下修改:
subscribers:
camera_reading:
topic: /usb_cam/image_raw
queue_size: 1
尽管在 launch
文件中已经进行了话题重映射,修改这部分内容可以确保 camera_reading
正确订阅 /usb_cam/image_raw
话题,确保一致性。
image_view:
enable_opencv: false
wait_key_delay: 1
enable_console_output: true
关闭 OpenCV 支持后,darknet_ros
不会自动使用 OpenCV 来显示检测结果。这样做的好处是:
rqt_image_view
)来查看,只有在需要时才查看图像,避免了持续占用资源。在 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 检测到的图像。