이 포스팅은 ROS에서 darknet을 간단하게 사용 가능하도록 지원하는 오픈소스 darknet_ros를 통하여 Yolo를 사용하는 방법을 설명한다. 특히 yolov3-tiny와 yolov4의 weight를 ROS로 구동하도록 하겠다.
darknet_ros의 Github 주소는 다음과 같다.
Yolo-v3 : https://github.com/leggedrobotics/darknet_ros
Yolo-v4 : https://github.com/Tossy0423/yolov4-for-darknet_ros
pc 환경 : ROS1 Melodic, Ubuntu 18.04
CPU : Intel® Core™ i9-10900 CPU
GPU : NVIDIA GeForce GTX 1660 Ti
Camera : Logitech Stream webcam
우선 ROS에서 카메라를 구동하도록 인터페이스를 설치해야 한다.
다음 링크를 참고하여 설치하길 바란다.
https://velog.io/@qaszx1004/Using-USB-CameraWebcam-in-Ubuntu
$ cd {your_ws}/src
$ git clone --recursive https://github.com/leggedrobotics/darknet_ros.git
$ cd ..
$ catkin_make -DCMAKE_BUILD_TYPE=Release
# 빌드가 완료되었다면
$ rospack profile
$ echo "source ~/본인 워크스페이스/devel/setup.bash" >> ~/.bashrc
사전에 CUDA를 설치하지 않고 위 패키지를 Build할 경우, CMakeLists.txt 파일에 의해 CPU를 사용하여 연산하는 방식으로 빌드된다. 만약 GPU를 사용하여 연산하려면 CUDA, Cudnn을 설치한 후 다시 빌드해야 한다.
CUDA, Cudnn 설치는 여기를 참고.
자신의 GPU와 호환되는 CUDA 버전은 아래 링크의 표에서 확인할 수 있다.
https://en.wikipedia.org/wiki/CUDA#Supported_GPUs
CMakeLists.txt에서는 Compute capability를 확인한다.
만약 GPU를 사용하여 Darknet을 구동하기를 원한다면 CUDA Wiki내의 표를 확인하여 자신의 Compute capability에 맞게 위와 비슷한 라인을 기입해야 한다.
예를 들어, CUDA Wiki 내 표의 Compute capability (version) 항목이 만약 6.2라면 -gencode arch=compute_62,code=sm_62를 기입하여 다시 빌드한다.
필자의 경우, GTX 1660 TI로, '-gencode arch=compute_75,code=sm_75'를 추가해 줬다.
빌드에 성공했다면, yolov3-tiny와 관련된 파일을 다운받아야 한다.
(1) yolov3-tiny.cfg 다운 : raw.githubusercontent.com/AlexeyAB/darknet/master/cfg/yolov3-tiny.cfg
(2) yolov3-tiny.weight 파일 다운 : pjreddie.com/media/files/yolov3-tiny.weights
다운을 받은 후, 각 cfg, weight 파일은 ~/workspace/src/darknet_ros/darknet_ros/yolo_network_config/ 내의 cfg, weights 폴더에 각각 넣어 준다.
이제 yolov3-tiny를 사용하도록 몇 가지 파일을 수정해야 한다.
~/workspace/src/darknet_ros/darknet_ros/config/ 위치에서 yolov3-tiny.yaml 파일 생성을 위해 yolov3.yaml 파일을 복사해서 yolov3-tiny.yaml 파일로 이름을 바꾼 후에, config_file과 weight_file의 name을 yolov3-tiny.cfg와 yolov3-tiny.weights로 수정해준다.
~/workspace/src/darknet_ros/darknet_ros/config/ 위치에서 ros.yaml 파일을 수정을 위해 ros.yaml 파일에서 camera_reading 부분의 topic을 자신의 카메라 환경에 맞게 바꿔준다. 필자는 로지텍 웹캠 이미지 토픽이 /usb_cam/image_raw여서 이렇게 수정했다.
~/workspace/src/darknet_ros/darknet_ros/launch/ 위치에서 darknet_ros.launch 파일을 수정하기 위해
Line 14 : yolov2-tiny.yaml -> yolov3-tiny.yaml 으로 수정
Line 6, 24 : 카메라 이미지 토픽이 다르다면, 토픽에 맞게 설정 (ex : /usb_cam/image_raw)
# 카메라 사용 명령어 예시
$ roslaunch usb_cam usb_cam-test.launch
# darknet_ros 실행 명령어
$ roslaunch darknet_ros darknet_ros.launch
$ cd {your_ws}/src
$ git clone --recursive https://github.com/Tossy0423/yolov4-for-darknet_ros
$ cd ..
$ catkin_make -DCMAKE_BUILD_TYPE=Release
# 빌드가 완료되었다면
$ rospack profile
$ echo "source ~/본인 워크스페이스/devel/setup.bash" >> ~/.bashrc
~/darknet_ros_yolov4_ws/src/yolov4-for-darknet_ros/darknet_ros/darknet_ros/config/ 위치에서 ros.yaml 파일을 수정을 위해 ros.yaml 파일에서 camera_reading 부분의 topic을 자신의 카메라 환경에 맞게 바꿔준다. 필자는 로지텍 웹캠 이미지 토픽이 /usb_cam/image_raw여서 이렇게 수정했다.
~/darknet_ros_yolov4_ws/src/yolov4-for-darknet_ros/darknet_ros/darknet_ros/launch/ 위치에서 darknet_ros.launch 파일을 수정하기 위해
Line 6, 24 : 카메라 이미지 토픽이 다르다면, 토픽에 맞게 설정 (ex : /usb_cam/image_raw)
# 카메라 사용 명령어 예시
$ roslaunch usb_cam usb_cam-test.launch
# darknet_ros 실행 명령어
$ roslaunch darknet_ros yolo_v4.launch
YOLO v4 Darknet ROS를 작동시키면 디텍션 결과가 별도 이미지 창으로 뜨는데 이를 다른 센서들의 디텍션 결과들과 함께 ROS rviz 창에서도 함께 보고 싶었다
그래서 rviz 창에서 디텍션 결과인 /darknet_ros / detection_image 토픽을 선택해 보니 아래와 같이 이미지가 깨진 상태로 디스플레이 되는 문제가 발생하였다
이를 해결해하기 위해서는 yoloObjectDetector.cpp 파일 내 if문에서 detection result buff를 ipl에 전달 가능하도록 변경해 주어 /darknet_ros /detection_image 토픽이 발행되도록 해주면 된다.
수정은 line 498에 있는 if문을
다음과 같이 변경해 주면 된다.
if (viewImage_) {
generate_image(buff_[(buffIndex_ + 1)%3], ipl_); // 추가한 부분
displayInThread(0);
} else {
generate_image(buff_[(buffIndex_ + 1)%3], ipl_);
}
수정 후 다시 빌드업을 한 뒤 런치 파일을 실행하면 정상적으로 /darknet_ros /detection_image 토픽이 발행되어 rviz에서 볼 수 있을 것이다