ROS下实现darknet_ros(YOLO V3)检测

一. 代码下载
代码Github主页:https://github.com/leggedrobotics/darknet_ros
下载命令:

mkdir -p catkin_workspace/src
cd catkin_workspace/src
git clone --recursive git@github.com:leggedrobotics/darknet_ros.git
cd ../

下载时间可能比较长,请耐心等待…

二. 编译
在ROS工作空间目录下,执行命令:

catkin_make -DCMAKE_BUILD_TYPE=Release

此时会开始编译整个项目,编译完成后会检查{catkin_ws}/darknet_ros/darknet_ros/yolo_network_config/weights文件下有没有yolov2-tiny.weights和yolov3.weights两个模型文件,默认下载好的代码里面为了节省体积是不带这两个模型文件的。因此编译之后会自动开始下载模型文件,此时又是一段漫长的等待时间。
如果刚好你之前已经下载好了模型文件,那就好了,在开始编译之前就把模型文件拷贝到上述文件夹下,就不会再次下载了。

三. 运行代码
1. 图像话题发布
因为darknet_ros会直接订阅指定的图像话题名,然后对图像进行检测,绘制检测框,并发布相应的检测话题,因此首先需要找一个能够发布图像话题的ROS包,这里推荐使用ROS官方提供的usb_cam驱动包,可以直接将电脑自带摄像头或连接电脑的USB摄像头采集的图像发布为ROS图像话题。
下载摄像头驱动:

sudo apt-get install ros-kinetic-usb-cam

然后发布摄像头图像话题:

roslaunch usb_cam usb_cam-test.launch

如果顺利的话应该可以看到实际的图像显示界面。

2. 运行darknet_ros
然后执行darknet_ros进行检测,在运行检测之前需要更改一下配置文件,使得darknet_ros订阅的话题与usb_cam发布的图片话题对应。
打开darknet_ros/config/ros.yaml文件,修改:

subscribers:
  camera_reading:
    topic: /camera/rgb/image_raw
    queue_size: 1

subscribers:
  camera_reading:
    topic: /usb_cam/image_raw
    queue_size: 1

回到darknet的工作空间根目录,执行:

source devel/setup.bash
roslaunch darknet_ros darknet_ros.launch

出现对摄像头采集图像的实时检测结果。

 

可以看到检测的结果还是有很大问题的!!

我们只需要把预训练集换成YOLO v3的来检测就可以了,更换如下:找到config文件可以看到如下的训练集

 打开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/yolov3.yaml"/

如下:

 然后重新启动:

roslaunch darknet_ros darknet_ros.launch

 检测结果如下:

多来几张结果:

 

我们可以看到检测帧数很慢FPS只有:0.1,这里我们需要安装NVIDIA驱动并安装CUDA,来使用GPU加速进行检测,这样的话速度就会快很多,安装步骤会方法如下:(安装步骤在我的另外一片文章:https://blog.csdn.net/qq_42145185/article/details/105793983

 

安装完成之后只需要修改/darknet_ws/src/darknet_ros/darknet文件下的Makefile文件

修改如下:

完成修改只会只需要到工作空间下进行编译:

$ catkin_make

 重新运行结果:(可以看到识别速度已经可以达到FPS:11.4了,如果想更快可以把CUDNN安装上,再修改make文件编译之后进行测试)

后续有时间会尝试制作如何训练自己的训练集并在ROS下进行检测使用,谢谢!

更新!

yolov3训练自己的数据集

训练自己的数据集进行测试(链接:https://blog.csdn.net/qq_42145185/article/details/105816128

 

测试结果,本人只是用了18图片迭代训练了500次,测试识别结果并不是很好,框容易框的很大!!!

 

  • 47
    点赞
  • 415
    收藏
    觉得还不错? 一键收藏
  • 126
    评论
您可以在C++中订阅`darknet_ros_msgs/BoundingBoxes`消息,并从中获取YOLO的像素坐标。首先,您需要安装并配置ROS和相关的依赖项。然后,可以编写一个ROS节点来订阅该话题并处理消息。 以下是一个示例代码,演示如何在C++中订阅`darknet_ros_msgs/BoundingBoxes`话题并获取YOLO的像素坐标: ```cpp #include <ros/ros.h> #include <darknet_ros_msgs/BoundingBoxes.h> void boundingBoxesCallback(const darknet_ros_msgs::BoundingBoxes::ConstPtr& msg) { // 在这里处理接收到的消息 for (const auto& box : msg->bounding_boxes) { // 获取YOLO的像素坐标 int x = box.xmin; int y = box.ymin; int width = box.xmax - box.xmin; int height = box.ymax - box.ymin; // 打印坐标信息 ROS_INFO("YOLO像素坐标:x=%d, y=%d, width=%d, height=%d", x, y, width, height); } } int main(int argc, char** argv) { ros::init(argc, argv, "yolo_subscriber"); ros::NodeHandle nh; // 创建一个订阅者,订阅'darknet_ros_msgs/BoundingBoxes'话题 ros::Subscriber sub = nh.subscribe<darknet_ros_msgs::BoundingBoxes>("darknet_ros/bounding_boxes", 10, boundingBoxesCallback); // 循环等待回调函数 ros::spin(); return 0; } ``` 请确保将上述代码保存为ROS工作空间中的一个C++源文件,并在`CMakeLists.txt`中添加适当的编译指令。然后,构建并运行该节点,它将订阅`darknet_ros_msgs/BoundingBoxes`话题,并在接收到消息时打印YOLO的像素坐标。 请注意,这只是一个示例代码,您可能需要根据实际情况进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 126
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值