欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

nVidia TX2上基于ros进行yolo多版本的物体识别

程序员文章站 2022-07-14 22:17:00
...

在TX2板载进行darknet源码编译还是较为方便,但是要结合ros 分布式系统进行操作,就需要在ros本身的框架内先进性catkin make 然后发布相关识别信息,供内部判断和使用。

1 、编译准备

首先切换到工作空间src中

cd catkin_workspace/src

具体名称根据自己的命名修改。
这里给出两份git链接先:
git clone https://github.com/leggedrobotics/darknet_ros
或者 git clone https://github.com/I-am-Unique/catkin_darknet
第一个是官方给出的ros版本的yolo多版本可切换(可直接根据git指导步骤进行下一步,跳过本人以下内容介绍),第二个是我找到的个人整理过的可直接使用的代码,均可以使用。

切到darknet文件夹中cd catkin_workspace/src/darknet
发现空空如也,需要去官方下载

https://github.com/pjreddie/darknet.git

#从github上下载darknet安装包

这里,建议不用git clone 直接去网页download ,然后unzip成文件夹ctrl+v到darknet里。
接下来修改makefile参数:
如果使用GPU进行编译,则文件头部的设置,使GPU,CUDNN,OPENCV都为1,其次注意修改arch为62

#Arch 就是GPU的架构版本 ARCH= -gencode arch=compute_20,code=[sm_20,sm_21] # Fermi 架构 常见 gtx480 gtx580
-gencode arch=compute_30,code=sm_30 # Kepler 架构 常见 gtx680
-gencode arch=compute_35,code=sm_35 # Kepler 架构 常见 gtx780
-gencode arch=compute_50,code=[sm_50,compute_50] # Maxwell 架构 常见 gtx750Ti gtx8 到9 系列 M
-gencode arch=compute_52,code=[sm_52,compute_52]# Maxwell 架构 常见 gtx8 到9 系列
-gencode arch=compute_61,code=[sm_61,compute_61]# Pascal 架构 常见 gtx 10系列
-gencode arch=compute_70,code=[sm_70,compute_70]# Volta 架构 这个不常见,用作超算或者数据中心的,新出了一款2999刀的volta卡 Tesla V100,值得入手.
#高版本code不能在低版本的卡上跑,架构不同的其特性也有差距,所以尽量查一下你的显卡是在那个计算能力上的

这是gpu使用型号规则,TX2的GPU是Pascal架构,计算能力为6.2
找到makefile里的03,添加下面代码到后面

  -gencode arch=compute_62,code=[sm_62,compute_62]

2 编译源码

添加权重文件到darknet

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

然后开始编译

cd catkin_workspace

catkin_make -DCMAKE_BUILD_TYPE=Release

会有漫长的等待。。。。
顺利的话,再添加声明路径如下。否则,先根据报错解决问题。。。。

echo "source ~/catkin_workspace/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

此时,需要需改摄像头发布的话题,进入/darknet_ros/config/ 查看ros.yaml如下,修改topic为自己的摄像头话题。

subscribers:
camera reading:
topic: camera/rgb/image-raw

然后,/darknet_ros/yolo_network_config/中存放了cfg和weights文件,与之名称对应的,/darknet_ros/config/存放了不同的yaml,会调用相同名称的cfg和weights,这便于我们调用不同版本的yolo网络。
在/darknet_ros/launch/darknet_ros.launch中修改下面参数就可以调用不同的yaml进行检测,例如,下面采用YOLOV2-tiny网络和权重

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

3测试

roscore
roslaunch usb_cam usb_camera.launch
roslaunch darknet_ros darknet_ros.launch

三个命令行调用三个主题,分别打开ros,打开摄像头和打开yolo,这样就可以测试效果了。
当然,也可以使用自己训练的网络进行识别,具体步骤可以参考git官网给出的指导。

在catkin_darknet/src/darknet_ros/darknet_ros/config/目录下,ros.yaml文件定义了该工程订阅的topic以及它检测完成以后将结果发布出去的topic,见下图:
nVidia TX2上基于ros进行yolo多版本的物体识别
     可以看出,这个yolo_ros节点订阅了/camera/image话题作为输入,发布三个话题作为输出,分别是:

/darknet_ros/found_object 物体类别名称。

/darknet_ros/bounding_boxes 框信息。

/darknet_ros/detection_image 检测结果图片。

4遇到的问题

1、进行第二步的catkin make时,我遇到了一个问题。
在darknet_ros/darknet_ros/include/darknet_ros/YoloObjectDetector.hpp中
nVidia TX2上基于ros进行yolo多版本的物体识别
fetal error 找不到network.h等等多个头文件,我就把这些文件复制到了
darknet_ros/image_interface.h所在的darknet_ros/文件夹下,然后编译就通过了。
2、 在编译进行到百分百时候,
nVidia TX2上基于ros进行yolo多版本的物体识别
我太难了。。百分百了都,又来个这
它是说我的节点没有事先声明,应该是我之前编译出错,链接成hpp.o文件时候出了问题,这里把include和devel等文件夹里的darknet——ros节点删除,然后重新catkin make,屏息凝气的等待,最终成功了。

链接

感谢以下大佬的资料参考
链接: TX2下使用darknet_ros包在ROS中进行YOLOv3检测.
链接: TX2下ubuntu16.04的YOLOV3环境配置,使用demo和问题解决.
链接: YOLO v3基于ROS应用记录.
链接: ROS Kinetic + Ubuntu 16.04 yolov3配置.