这是一个为相机图像中的对象检测而开发的 ROS 包。 You Only Look Once (YOLO) 是最先进的实时目标检测系统。在以下 ROS 包中,您可以在 GPU 和 CPU 上使用 YOLO (V3)。卷积神经网络的预训练模型能够检测预训练的类,包括 VOC 和 COCO 的数据集,或者您也可以使用自己的检测对象创建网络。有关 YOLO、Darknet、可用训练数据和训练 YOLO 的更多信息,请参阅以下链接:YOLO:实时对象检测。
YOLO 软件包已在ROS Noetic和Ubuntu 20.04下进行了测试。注意:我们还提供在ROS Melodic、ROS Foxy和ROS2下工作的分支。
这是研究代码,预计它会经常更改,并且否认对特定目的的任何适用性。
作者:Marko Bjelonic,[email protected]
隶属关系:苏黎世联邦理工学院机器人系统实验室
基于Pascal VOC 2012 数据集,YOLO 可以检测 20 个 Pascal 对象类别:
- 人
- 鸟、猫、牛、狗、马、羊
- 飞机、自行车、船、公共汽车、汽车、摩托车、火车
- 瓶子、椅子、餐桌、盆栽、沙发、电视/显示器
基于COCO数据集,YOLO可以检测80个COCO对象类:
- 人
- 自行车、汽车、摩托车、飞机、公共汽车、火车、卡车、船
- 交通灯、消防栓、停车标志、停车计时器、长凳
- 猫、狗、马、羊、牛、象、熊、斑马、长颈鹿
- 背包, 雨伞, 手提包, 领带, 手提箱, 飞盘, 滑雪板, 滑雪板, 运动球, 风筝, 棒球棒, 棒球手套, 滑板, 冲浪板, 网球拍
- 瓶子,酒杯,杯子,叉子,刀,勺子,碗
- 香蕉、苹果、三明治、橙子、西兰花、胡萝卜、热狗、披萨、甜甜圈、蛋糕
- 椅子、沙发、盆栽、床、餐桌、厕所、电视监视器、笔记本电脑、鼠标、远程、键盘、手机、微波炉、烤箱、烤面包机、水槽、冰箱、书、时钟、花瓶、剪刀、泰迪熊、吹风机、牙刷
该软件中使用的 YOLO 方法在论文中进行了描述:You Only Look Once: Unified, Real-Time ObjectDetection。
如果您使用 YOLO V3 for ROS,请在您的出版物中添加以下引用:
M. Bjelonic “YOLO ROS:ROS 实时对象检测”,URL: https: //github.com/leggedrobotics/darknet_ros,2018。
@misc{bjelonicYolo2018,
author = {Marko Bjelonic},
title = {{YOLO ROS}: Real-Time Object Detection for {ROS}},
howpublished = {\url{https://github.com/leggedrobotics/darknet_ros}},
year = {2016--2018},
}
该软件基于机器人操作系统([ROS])构建,需要首先安装。此外,YOLO for ROS 依赖于以下软件:
为了安装 darknet_ros,请使用 SSH(请参阅如何设置 SSH 密钥)将此存储库克隆到您的 catkin 工作区中的最新版本,并使用 ROS 编译该包。
cd catkin_workspace/src
git clone --recursive [email protected]:leggedrobotics/darknet_ros.git
cd ../
为了最大限度地提高性能,请确保在发布模式下构建。您可以通过设置指定构建类型
catkin_make -DCMAKE_BUILD_TYPE=Release
或使用Catkin 命令行工具
catkin build darknet_ros -DCMAKE_BUILD_TYPE=Release
CPU 上的 Darknet 速度很快(在 Intel Core i7-6700HQ CPU @ 2.60GHz × 8 上大约 1.5 秒),但 GPU 上的速度快了 500 倍!你必须有 Nvidia GPU 并且必须安装 CUDA。 CMakeLists.txt 文件会自动检测您是否安装了 CUDA。 CUDA是Nvidia创建的并行计算平台和应用程序编程接口(API)模型。如果您的系统上没有 CUDA,构建过程将切换到 YOLO 的 CPU 版本。如果使用 CUDA 进行编译,您可能会收到以下构建错误:
nvcc fatal : Unsupported gpu architecture 'compute_61'.
这意味着您需要检查 GPU 的计算能力(版本)。您可以在此处找到 CUDA 支持的 GPU 列表:CUDA - WIKIPEDIA。只需找到您的 GPU 的计算能力并将其添加到 darknet_ros/CMakeLists.txt 中即可。只需添加类似的行即可
-O3 -gencode arch=compute_62,code=sm_62
yolo-voc.weights 和tiny-yolo-voc.weights 会自动下载到CMakeLists.txt 文件中。如果需要再次下载,请进入权重文件夹并从 COCO 数据集中下载两个预训练的权重:
cd catkin_workspace/src/darknet_ros/darknet_ros/yolo_network_config/weights/
wget http://pjreddie.com/media/files/yolov2.weights
wget http://pjreddie.com/media/files/yolov2-tiny.weights
VOC 数据集的权重可以在这里找到:
wget http://pjreddie.com/media/files/yolov2-voc.weights
wget http://pjreddie.com/media/files/yolov2-tiny-voc.weights
YOLO v3 的预训练权重可以在这里找到:
wget http://pjreddie.com/media/files/yolov3-tiny.weights
wget http://pjreddie.com/media/files/yolov3.weights
这里报告了来自不同数据集的更多预训练权重。
为了使用您自己的检测对象,您需要在目录中提供权重和 cfg 文件:
catkin_workspace/src/darknet_ros/darknet_ros/yolo_network_config/weights/
catkin_workspace/src/darknet_ros/darknet_ros/yolo_network_config/cfg/
此外,您需要为 ROS 创建配置文件,在其中定义检测对象的名称。您需要将其包含在里面:
catkin_workspace/src/darknet_ros/darknet_ros/config/
然后在启动文件中,您必须在以下行中指向新的配置文件:
<rosparam command="load" ns="darknet_ros" file="$(find darknet_ros)/config/your_config_file.yaml"/>
使用Catkin 命令行工具运行单元测试
catkin build darknet_ros --no-deps --verbose --catkin-make-args run_tests
您将看到上面的图像弹出。
为了让 YOLO ROS:ROS 实时目标检测与您的机器人一起运行,您需要调整一些参数。如果复制并调整包中需要更改的所有参数文件,这是最简单的darknet_ros。这些具体是文件夹中的参数文件config和启动文件launch。
这是主要的 YOLO ROS:ROS 节点的实时对象检测。它使用相机测量来检测帧中预先学习的对象。
您可以更改内部发布者、订阅者和操作的名称和其他参数darknet_ros/config/ros.yaml。
-
/camera_reading([传感器消息/图像])相机测量。
-
object_detector([std_msgs::Int8])发布检测到的对象的数量。
-
bounding_boxes([darknet_ros_msgs::BoundingBoxes])发布边界框数组,以像素坐标形式提供边界框的位置和大小信息。
-
detection_image([sensor_msgs::图像])发布包含边界框的检测图像的图像。
-
camera_reading([sensor_msgs::图像])发送带有图像的动作,结果是一组边界框。
您可以通过添加类似于 的新配置文件来更改与检测相关的参数darknet_ros/config/yolo.yaml。
-
image_view/enable_opencv(布尔)启用或禁用检测图像(包括边界框)的打开 cv 视图。
-
image_view/wait_key_delay(整数)打开简历窗口的等待按键延迟(以毫秒为单位)。
-
yolo_model/config_file/name(细绳)用于检测的网络cfg文件名。该代码在 内搜索该名称
darknet_ros/yolo_network_config/cfg/。 -
yolo_model/weight_file/name(细绳)用于检测的网络权重文件的名称。该代码在 内搜索该名称
darknet_ros/yolo_network_config/weights/。 -
yolo_model/threshold/value(漂浮)检测算法的阈值。它定义在 0 和 1 之间。
-
yolo_model/detection_classes/names(字符串数组)检测里面的cfg和weights文件所使用的网络名称
darknet_ros/yolo_network_config/。