nVidia TX2上基于ros进行yolo多版本的物体识别
在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,见下图:
可以看出,这个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中
fetal error 找不到network.h等等多个头文件,我就把这些文件复制到了
darknet_ros/image_interface.h所在的darknet_ros/文件夹下,然后编译就通过了。
2、 在编译进行到百分百时候,
我太难了。。百分百了都,又来个这
它是说我的节点没有事先声明,应该是我之前编译出错,链接成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配置.