Yolo v4系列学习(四)Yolo v4移植ROS

2023-05-16

目录

  • 1、建立名为catkin_ws的工作空间
  • 2、下载darknet_ros包
  • 3、下载Yolo v4源码
  • 4、开始编译
  • 5、漫长的解决Bug的过程
  • 6、配置Yolo v4+ROS
  • 7、开始使用Yolo v4+ROS
  • 8、调参
  • 参考网址

1、建立名为catkin_ws的工作空间

$ mkdir -p catkin_ws/src
$ cd catkin_ws/src/
$ catkin_init_workspace
$ cd ..
$ catkin_make

2、下载darknet_ros包

$ cd src/
$ git clone https://github.com/leggedrobotics/darknet_ros

3、下载Yolo v4源码

下载好了之后,可以看到darknet_ros中有3个文件夹:darknet、darknet_ros和darknet_ros_msgs,现在将darknetAB的代码放到第一个文件夹darknet中:

$ rm -r darknet/
$ git clone https://github.com/AlexeyAB/darknet

4、开始编译

$ cd ../..
$ catkin_make

执行上述操作后,会开始下载权重(yolov2-tiny.weights、yolov3.weights和yolov2.weights)
也可以打开darknet_ros文件夹下的CMakeLists.txt文件,搜索找到execute_process,这是weights权重文件下载的指令,可以屏蔽掉(句首添加#号即可),提前将下载好的权重放到对应的位置(即darknet_ros/yolo_network_config/weights/路径下)

5、漫长的解决Bug的过程

在上一步进行编译时,会遇到很多问题,现逐一进行解决。(以下问题是每次解决一个就重新执行catkin_make进行编译)

问题1:Cannot find source file:src/cuda.c
在这里插入图片描述
原因分析: 这是由于Yolo v4的代码中将Yolo v1-v3的代码cuda.c文件改为了dark_cuda.c文件,因此需要将CMakeLists.txt文件对应位置进行修改。
解决方案:打开darknet_ros文件夹下的CMakeLists.txt文件,将{DARKNET_PATH}/src/cuda.c改为{DARKNET_PATH}/src/dark_cuda.c

问题2:Cannot find source file:src/logistic_layer.c
在这里插入图片描述
原因分析: 原因和问题1类似,Yolo v4的代码去掉了logistic_layer.c文件。
解决方案:打开CMakeLists.txt文件,屏蔽{DARKNET_PATH}/src/logistic_layer.c,在$前面加个#号;
还有一个类似的问题:Cannot find source file:src/l2norm_layer.c,也是屏蔽掉:{DARKNET_PATH}/src/l2norm_layer.c;

问题3:Cannot find source file:examples/art.c
原因分析: Yolo v4的代码中将Yolo v1-v3的源代码中examples文件夹下的代码均放到src文件夹下了。
解决方案:打开CMakeLists.txt文件,将{DARKNET_PATH}/examples/art.c修改为${DARKNET_PATH}/src/art.c;
有17个文件都这样修改,从examples改到src;

问题4:Cannot find source file:src/lsd.c
原因分析: 原因和问题2是一样的。
解决方案:打开CMakeLists.txt文件,屏蔽{DARKNET_PATH}/src/lsd.c,在$前面加个#号;
还有attention.c、regressor.c和segmenter.c,都采用屏蔽的方式;

问题5:image_interface.h:16:30: error: unknown type name ‘IplImage’
在这里插入图片描述
原因分析:IplImage的定义找不到对应的头文件,IplImage是在"opencv2/core/types_c.h"中进行定义的。
解决方案:在image_interface.h文件中添加头文件即可:

#include "opencv2/core/types_c.h"

问题6:image.c:16:23: fatal error: stb_image.h: No such file or directory
在这里插入图片描述
原因分析:找不到头文件stb_image.h的位置,该头文件在/3rdparty/stb/include/路径下。
解决方案:修改如下:

#include "../3rdparty/stb/include/stb_image.h"

出现fatal error: stb_image_write.h,解决方式一样,也是将头文件路径修改一下即可。
注意:如果没有出现这2个错误就可以跳过,不用修改。

问题7:YoloObjectDetector.hpp:62:72: error: conflicting declaration of C function ‘void show_image_cv(image, const char*, IplImage*)’
在这里插入图片描述
原因分析:show_image_cv这个函数定义冲突,由于ROS中没有使用到,可以去掉这一行。
解决方案:屏蔽这一行即可;

问题8: YoloObjectDetector.cpp:278:34: error: ‘fill_cpu’ was not declared in this scope
在这里插入图片描述
原因分析:fill_cpu这个函数的定义所在头文件没有添加。
解决方案:添加头文件:

#include "../../darknet/src/blas.h"

还有error: ‘axpy_cpu’ was not declared in this scope也是这个问题,axpy_cpu函数的声明也在blas.h中;

问题9:YoloObjectDetector.cpp:290:104: error: too few arguments to function ‘detection* get_network_boxes(network*, int, int, float, float, int*, int, int*, int)’
在这里插入图片描述
原因分析:查看network.c文件中get_network_boxes()函数定义可知,末尾缺少一个参数。
解决方案:在对应调用到get_network_boxes()函数的末尾添加一个1,如下所示:

detection *dets = get_network_boxes(net, buff_[0].w, buff_[0].h, demoThresh_, demoHier_, 0, 1, nboxes,1);

问题10: YoloObjectDetector.cpp:301:39: error: could not convert ‘((darknet_ros::YoloObjectDetector*)this)->darknet_ros::YoloObjectDetector::net_’ from ‘network*’ to ‘network’
在这里插入图片描述
原因分析:查看network.c文件中network_predict()函数定义可知,输入参数类型与定义不一致。
解决方案:将net_前面添加一个*号即可:

float* prediction = network_predict(*net_, X);

问题11:YoloObjectDetector.cpp:318:94: error: invalid conversion from ‘detection*’ to ‘int’ [-fpermissive]
在这里插入图片描述
原因分析:Yolo v4版中的画框函数draw_detections在Yolo v1-v3版本基础上有变化,这里采用与原始定义一致的draw_detections_v3即可。
解决方案:将这一行代码修改如下:

draw_detections_v3(display, dets, nboxes, demoThresh_, demoNames_, demoAlphabet_, demoClasses_, 1);

问题12:YoloObjectDetector.cpp:387:61: error: too many arguments to function ‘void show_image_cv(image, const char*)’
在这里插入图片描述
原因分析:这里查看image_opencv.cpp文件中show_image_cv的定义可知,show_image_cv的定义有所变化,少了一个参数定义。
解决方案:将这一行代码修改如下:

show_image_cv(buff_[(buffIndex_ + 1)%3], "YOLO V4");

注意:这里有个小细节,可以将窗口名称YOLO V3修改为YOLO V4,那YoloObjectDetector.cpp文件出现的7处都需要修改过来。

问题13:undefined reference to `draw_detections_cv_v3’
在这里插入图片描述
原因分析:这里是没有在CMakeLists.txt添加对应的文件。例如draw_detections_cv_v3()函数是在image_opencv.cpp文件中定义的,就需要在CMakeLists.txt中添加如下语句: ${DARKNET_PATH}/src/image_opencv.cpp
解决方案:将所有出现undefined reference to问题的部分都将对应定义的的cpp文件添加到CMakeLists.txt中即可。

问题14:在YoloObjectDetector.cpp中使用到的ipl_into_image()函数和ipl_to_image()函数并没有在Yolo v4代码中进行定义,因此需要在Yolo v4源代码中的src/image.c文件的末尾添加这两个函数的定义,即:
(1)ipl_into_image()函数的定义:

void ipl_into_image(IplImage* src, image im)
{
    unsigned char *data = (unsigned char *)src->imageData;
    int h = src->height;
    int w = src->width;
    int c = src->nChannels;
    int step = src->widthStep;
    int i, j, k;

    for(i = 0; i < h; ++i){
        for(k= 0; k < c; ++k){
            for(j = 0; j < w; ++j){
                im.data[k*w*h + i*w + j] = data[i*step + j*c + k]/255.;
            }
        }
    }
}

(2)ipl_to_image()函数的定义:

image ipl_to_image(IplImage* src)
{
    int h = src->height;
    int w = src->width;
    int c = src->nChannels;
    image out = make_image(w, h, c);
    ipl_into_image(src, out);
    return out;
}

同时记得在src/image.c中添加头文件#include “opencv2/core/types_c.h”,否则会报与问题5一样的错误。
解决了上述十几个问题后,编译应该能够通过。当然如果还有其他问题,继续解决即可。我在实验的时候遇到的问题都记录在这里了。

6、配置Yolo v4+ROS

(1)在darknetAB官网上有下载yolov4权重,下载地址如下:yolov4权重,然后将下载好的权重yolo_network_config/weights文件夹下,yolov4.weights权重大小是257.7MB;
(2)进入darknet_ros/darknet/cfg/文件夹下,将配置文件yolov4.cfg复制yolo_network_config/cfg文件夹下;
(3)进入darknet_ros/config路径下,复制yolov2.yaml文件修改为yolov4.yaml,打开yolov4.yaml,修改如下:

yolo_model:

  config_file:
    name: yolov4.cfg
  weight_file:
    name: yolov4.weights

(4)进入darknet_ros/config路径下,打开ros.yaml,将camera_reading下的topic修改为自己本地摄像头的图像发布话题,我这里是/usb_cam/image_raw,如下:

subscribers:

  camera_reading:
    topic: /usb_cam/image_raw
    queue_size: 1

(5)进入darknet_ros/launch路径下,复制yolo_v3.launch,名字修改为yolo_v4.launch,打开yolo_v4.launch,修改如下:

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

即,将调用yolov3.yaml修改为调用yolov4.yaml即可

7、开始使用Yolo v4+ROS

(1)打开一个终端,开启主节点:

$ roscore

(2)打开第2个终端,运行摄像头节点:

$ rosrun usb_cam usb_cam_node

如果没有安装usb_cam摄像头的ROS包,那么输入如下指令进行安装即可:

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

(3)打开第3个终端,运行yolov4_ros节点:

$ source devel/setup.bash 
$ roslaunch darknet_ros yolo_v4.launch

注意:在运行第3条指令可能会出现如下错误:
CUDA Error: out of memory
CUDA Error: out of memory: File exists
在这里插入图片描述
解决方案:打开yolov4.cfg文件,将batch=64分别修改为batch=1即可。
解决上述问题后,不出意外,就可以看到Yolo v4在ROS下的检测结果了!以下是我在本机上记录的实验结果:
在这里插入图片描述

8、调参

Yolo v4移植到ROS中后帧率比较低,只有20fps左右,这个帧率和yolov4.cfg中的width和height设置有关系,原始的是608,修改为416就达到40多fps,也可以改为320,能够达到60多fps,精度影响不大。
此外可以通过nvidia-smi查看GPU占用情况。

参考网址

Yolo v4源码
darknet_ros源码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yolo v4系列学习(四)Yolo v4移植ROS 的相关文章

  • Lambda表达式

    什么是Lambda表达式 Lambda 表达式是 Java8 新增的重要特性 xff0c Lambda 使 Java 具有了函数式编程的思想 xff0c 它的实质也是由编译器根据表达式推断最终生成原始语法的字节码方式 函数式编程思想是 强调
  • MPU6050多次发送数据,但第一次读取的数据为0

    实际现象并不是第一次数据为0 xff0c 一直读取数据 xff0c 中间也会出现数据为0的现象 xff0c 原因是 xff1a 跟采样频率有关 xff0c 如果采样频率为50Hz xff0c 那么读取数据间隔时间必须大于20ms xff0c
  • gazebo多机仿真时出现的问题解决方法

    多机仿真过程中出现的飞机不动的情况是 xff1a 下面几个步骤要严格执行 xff1a cd PX4 span class token operator span Autopilot git submodule update span cla
  • Linux c多线程与c++多线程的基础写法

    最近工作需要 xff0c 对多线程做了一点了解 xff0c 现在将多线程的创建 xff0c 函数传参做个小结 一 linux c多线程 1 头文件 xff1a include lt pthread h gt 2 创建线程 xff1a pth
  • 姿态误差问题

    前段同学问了一个关于飞机姿态误差的问题 xff0c 将飞机姿态直接做差与px4里面先z轴对齐然后将过渡矩阵的姿态量赋值给滚转俯仰姿态误差对比 xff0c 发现直接做差后在飞机做大的机动时误差量会变大 xff0c 曲线的拟合非常不好 xff0
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • 踩坑记录

    ERROR Session line number was not unique in database History logging moved to new session 66 在生成tfrecord时 总报如下错误 找了很长时间
  • git强制覆盖本地代码

    git强制覆盖本地 xff1a git fetch all 拉取所有更新 git reset hard origin master 本地代码同步线上最新版本 会覆盖本地所有与远程仓库上同名的文件 git pull git强制覆盖本地命令 x
  • 【毕业设计】基于STM32及OpenMV的云台追踪装置

    目录 修改记录1 摘 要2 整体功能分析3 硬件选型3 1 OpenMV4 Cam H73 2 STM32F103ZET63 3 DS3120舵机3 4 LED补光板3 5 供电及稳压3 6 硬件连接 4 软件功能实现4 1 OpenMV部
  • firewall-cmd 使用总结

    firewalld的简要说明 firewalld firewall cmd firewall offline cmd它们Python脚本 xff0c 通过定义的在 usr lib firewalld下面的xml配置信息 xff0c 在启动时
  • 机架与机柜

    随着计算机网络的发展 xff0c 数据中心的服务器以及网络通信设备等IT设施 xff0c 正逐步向着网络化 机架化的方向发展 机架是用于综合布线 xff0c 安装配线架和理线架 xff0c 实现对电缆和光缆布线系统的管理 在网络机柜中不具备
  • cmake和makefile区别和cmake指定编译器(cmake -G)

    一 cmake和makefile区别 要说明区别 xff0c 我们先要区分下面三类工具 xff1a 1 项目构建生成工具 首先cmake是项目构建生成工具 xff0c cmake的代码可以与平台系统和编译器无关 类似cmake的工具还有au
  • Gazebo使用过程中的问题

    1 运行命令gazebo没有反应 在虚拟机安装好gazebo后 xff0c 使用ALT 43 F2打开命令行运行命令gazebo没有反应 首先尝试内存不够的情况 xff0c 给虚拟机加到了4g内存 没有用 xff0c 运行gazebo还是没
  • 一张图理解板卡硬件调试流程

    最近在调试从焊板厂打样回来的板卡 xff0c 简单总结了下板卡的硬件测试流程 xff0c 如下图 xff1a 写在后面的话 xff1a 我之所以选择做技术这一行 xff0c 是觉得做技术的人简单 直接 xff0c 当你面对一个技术问题 xf
  • 关于Linux进程你所需要知道的一切都在这里!!

    文章目录 进程简单了解进程查看进程进程ID父进程ID父进程与子进程 程序与进程程序进程程序变成进程总结 进程状态进程状态转换启动新进程system fork exce系列函数 终止进程等待进程wait waitpid 进程 说明 xff1a
  • MQTT协议简介及协议原理

    文章目录 MQTT协议MQTT协议简介MQTT通信模型MQTT客户端的功能 xff1a MQTT客户服务器功能 xff1a 消息主题与服务质量MQTT控制报文固定报头可变报头CONNECT报文CONNACK报文 有效载荷 MQTT协议 MQ
  • 你不得不看的图文并茂的MQTT协议通信过程!!!

    文章目录 MQTT连接服务器MQTT订阅主题MQTT发布消息服务质量等级 QoSQoS0的PUBLISH控制报文QoS1的PUBLISH控制报文QoS2的PUBLISH控制报文 取消订阅断开连接 MQTT连接服务器 客户端到服务器的网络连接
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient简介与使用

    文章目录 mqttclient简介与使用优势 xff1a 在线代码生成工具占用资源大小整体框架支持的平台版本问题版权和许可linux平台下测试使用安装cmake xff1a 测试程序编译 amp 运行编译成动态库libmqttclient
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient代码生产工具介绍

    文章目录 mqttclient代码生产工具介绍连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成代码 mqttclient代码生产工具介绍 mqttclient代码生产工具主要是用于配置MQTT的参数 xff0c 并且生成相应的代

随机推荐

  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient配置及裁剪工具

    文章目录 mqttclient配置及裁剪工具salof相关的配置使用mqttclient裁剪配置工具 mqttclient配置及裁剪工具 MQTT TOPIC LEN MAX 配置客户端支持最大的主题名长度 xff0c 主题是支持通配符的
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient设计与实现方式

    文章目录 mqttclient设计与实现方式设计思想API接口MQTT客户端的核心结构mqttclient实现申请一个mqtt客户端释放已申请的mqtt客户端设置MQTT客户端的信息连接服务器订阅报文取消订阅发布报文内部线程核心的处理函数发
  • mqtt连接百度天工物接入平台

    文章目录 mqtt连接到百度天工物接入百度天工物接入简介使用百度天工物接入创建项目创建策略创建身份创建用户测试连接 MQTT软件测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行测试代码使
  • mqttclient连接到OneNET云平台

    文章目录 mqttclient连接到OneNET云平台使用OneNET测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行代码使用到的API mqttclient连接到OneNET云平台 有
  • 2022年最新《谷粒学院开发教程》:1 - 构建工程篇

    资料资料资料地址代码地址 后台管理系统目录前台展示系统目录1 构建工程篇7 渲染前台篇2 前后交互篇8 前台登录篇3 文件上传篇9 前台课程篇4 课程管理篇10 前台支付篇5 章节管理篇11 统计分析篇6 微服务治理12 项目完结篇 目录
  • MQTT移植到stm32开发板——使用RT-Thread操作系统

    文章目录 mqttclientENV介绍env工具下载安装通过env移植MQTT客户端打开 env 控制台打开env并更新软件包列表移植MQTT客户端 编写自己的代码 xff1a 连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成
  • MQTT移植到stm32开发板——使用TencentOS tiny操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th
  • MQTT移植到stm32开发板——使用FreeRTOS操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th
  • 深入了解C++多态的原理及实现方式

    文章目录 前言关于多态函数承载方式虚函数方式 前言 需要深入了解C C 43 43 语言的基础之上再看此文章 关于多态 具有多种形态 xff0c 调用同一个方法会随上下文不同而产生不同的结果 xff0c 多态有静态多态与动态多态两种 函数承
  • select、poll、epoll的原理与区别

    文章目录 前言同步I O异步I O阻塞I O非阻塞I O多路复用I Oselectselect整个处理过程如下select函数原型 xff1a select的缺点 pollepollepoll的原理epoll的操作模式epoll的函数epo
  • MQTT连接到阿里云物联

    连接到阿里云物联 既然懂得专门连接百度天工物接入 xff0c 那么连接阿里云物联其实也是一样的 xff0c 因为都是基于MQTT协议进行通信的 xff0c 首先打开阿里云物联 xff1a https iot console aliyun c
  • Ubuntu20 安装微信

    1 安装deepin wine span class token function git span clone span class token string 34 https gitee com wszqkzqk deepin wine
  • 如果让你设计哈希表.....

    先确定选题 xff0c 待写
  • STM32进阶之串口环形缓冲区实现

    如需转载请说明出处 xff1a STM32进阶之串口环形缓冲区实现 队列的概念 在此之前 xff0c 我们来回顾一下队列的基本概念 xff1a 队列 Queue xff1a 是一种先进先出 First In First Out 简称 FIF
  • 在ROS中实现基于darknet_ros的目标检测

    最近用自己的渣渣笔记本电脑跑了一下yolo目标检测在ROS中的实现 xff0c 实现了用摄像头进行目标检测的任务 以下为笔记 xff0c 防止遗忘 1 使用的环境和平台 Ubuntu 16 04 LTS 43 ROS 43 Yolo 2 实
  • 01 FreeRTOS任务实例

    FreeRTOS任务实例 一 简要说明1 官方例程下载 二 学习任务的创建1 创建一个任务2 任务中传递参数3 不同优先级的任务 三 任务的延时1 使用阻塞式延时2 精确的任务定时3 低优先级任务无延时 xff0c 高优先级延时 一 简要说
  • opencv 读取相机图像+ros发布图像

    usr bin python2 coding 61 utf 8 import cv2 import numpy as np from std msgs msg import Header from sensor msgs msg impor
  • 无人机小知识:Pitch Yaw Roll的经典解释

    无人机的一个最基本的基础知识就是对Pitch Yaw Roll三个方向的辨别 查了下网上很多资料 xff0c 都采用的下面的几张图进行说明 xff0c 我觉得很直观 xff0c 记录一下 xff0c 当做备忘录 机体坐标系 xff1a 固定
  • 编译警告:warning: Clock skew detected. Your build may be incomplete.

    在编译darknet ros程序时 xff0c 遇到如下警告 xff1a make 2 Warning File 39 darknet ros darknet ros CMakeFiles darknet ros lib dir depen
  • Yolo v4系列学习(四)Yolo v4移植ROS

    目录 1 建立名为catkin ws的工作空间2 下载darknet ros包3 下载Yolo v4源码4 开始编译5 漫长的解决Bug的过程6 配置Yolo v4 43 ROS7 开始使用Yolo v4 43 ROS8 调参参考网址 1