本文主要记录在NX(Ubuntu18.04+ROS Melodic)上使用darknet的过程,供有需要的朋友进行参考。如行文不当或内容有误,欢迎指出。
git clone https://github.com/leggedrobotics/darknet_ros
可以进入网站下载。下载后进行解压。
因为darknet_ros调用了darknet的源码,但下载后这个文件夹是空的,需要自行下载darknet的源码。并将其内容复制darknet文件夹中。
这里主要用到两种版本:
https://github.com/pjreddie/darknet
https://github.com/AlexeyAB/darknet
pjreddie/darkenet 支持yolov3和yolov2 ,AlexeyAB/darknet 是在其基础上进行修改进而支持yolov4。
两个版本依赖的opencv版本不同,由于本人opencv版本是opencv4.1.1,所用使用前者
进入dakrnet_ros/dakrnet,编译取决于Makefile文件。最简单的办法就是不做任何增行编译。
cd darkent_ros/darknet
make
参考文章:darknet_ros加速–使用GPU和CUDA
根据该文对Makefile进行修改,本系统装了opencv4,所以将45、46行中改为opencv4,对于其他版本根据实际进行修改。修改后如下(1~47):
GPU=1
CUDNN=1
OPENCV=1
OPENMP=0
DEBUG=0
ARCH= -gencode arch=compute_30,code=sm_30 \
-gencode arch=compute_35,code=sm_35 \
-gencode arch=compute_50,code=[sm_50,compute_50] \
-gencode arch=compute_72,code=[sm_52,compute_72]
# -gencode arch=compute_20,code=[sm_20,sm_21] \ This one is deprecated?
ARCH= -gencode arch=compute_72,code=compute_72
# This is what I use, uncomment if you know your arch and want to specify
# ARCH= -gencode arch=compute_52,code=compute_52
VPATH=./src/:./examples
SLIB=libdarknet.so
ALIB=libdarknet.a
EXEC=darknet
OBJDIR=./obj/
CC=gcc
CPP=g++
NVCC=/usr/local/cuda-10.2/bin/nvcc
AR=ar
ARFLAGS=rcs
OPTS=-Ofast
LDFLAGS= -lm -pthread
COMMON= -Iinclude/ -Isrc/
CFLAGS=-Wall -Wno-unused-result -Wno-unknown-pragmas -Wfatal-errors -fPIC
ifeq ($(OPENMP), 1)
CFLAGS+= -fopenmp
endif
ifeq ($(DEBUG), 1)
OPTS=-O0 -g
endif
CFLAGS+=$(OPTS)
ifeq ($(OPENCV), 1)
COMMON+= -DOPENCV
CFLAGS+= -DOPENCV
LDFLAGS+= `pkg-config --libs opencv4` -lstdc++
COMMON+= `pkg-config --cflags opencv4`
endif
参考官网 darknet
mkird darknet_ws
cd darknet_ws
mkird src
建立一个darknet_ws文件夹,把darknet_ros放在src目录下,进行编译
catkin_make -DCMAKE_BUILD_TYPE=Release
sudo vim .bashrc
添加 source ~/darknet_ws/devel/setup.bash
cd darknet_ws/src/darknet_ros/darknet_ros/launch
打开 darknet_ros.launch:
<?xml version="1.0" encoding="utf-8"?>
<launch>
<!-- Console launch prefix -->
<arg name="launch_prefix" default=""/>
<arg name="image" default="/camera/rgb/image_raw" />
<!-- Config and weights folder. -->
<arg name="yolo_weights_path" default="$(find darknet_ros)/yolo_network_config/weights"/>
<arg name="yolo_config_path" default="$(find darknet_ros)/yolo_network_config/cfg"/>
<!-- ROS and network parameter files -->
<arg name="ros_param_file" default="$(find darknet_ros)/config/ros.yaml"/>
<arg name="network_param_file" default="$(find darknet_ros)/config/yolov2-tiny.yaml"/>
1.“image"参数用于订阅相机,修改为"usb_cam/image_raw”
arg name ="image" default="usb_cam/image_raw"
2."yolo_weights_path"和"yolo_config_path"是确定 yolo 的weight和cfg的路径,不用更改。不过记得将自己的权重和cfg放置到相应的文件夹。
3."network_param_file"默认是yolov2-tiny.yaml,在config文件夹下,可以复制一份改为自己的模型名称。
yolo_model:
config_file:
name: new.cfg #用于训练的cfg
weight_file:
name: new.weights #训练出来的weights
threshold: #用于ROS识别的阈值
value: 0.3
detection_classes:
names:
- target class
roslaunch darknet_ros darknet_ros.launch
roslaunch usb_cam usb_cam-test.launch