darknet_ros(Yolo-v3-tiny & Yolo-v4)

이용욱·2022년 6월 7일
1

Camera

목록 보기
2/4
post-thumbnail

이 포스팅은 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

Ⅰ Yolo v3-tiny

설치 방법

$ 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

1) CMakeLists.txt 수정

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'를 추가해 줬다.

2) 추가 수정

① yolov3-tiny 파일 다운

빌드에 성공했다면, 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를 사용하도록 몇 가지 파일을 수정해야 한다.

② yolov3-tiny.yaml 파일 생성

~/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로 수정해준다.

③ ros.yaml 파일 수정

~/workspace/src/darknet_ros/darknet_ros/config/ 위치에서 ros.yaml 파일을 수정을 위해 ros.yaml 파일에서 camera_reading 부분의 topic을 자신의 카메라 환경에 맞게 바꿔준다. 필자는 로지텍 웹캠 이미지 토픽이 /usb_cam/image_raw여서 이렇게 수정했다.

④ darknet_ros.launch 파일 수정

~/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

Ⅱ Yolo v4

설치 방법

$ 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

1) 추가 수정

① ros.yaml 파일 수정

~/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.launch 파일 수정

~/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

Rviz에서 디스플레이 하기

문제

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에서 볼 수 있을 것이다


참고 : https://blog.naver.com/tinz6461/222401935758

profile
자율주행에 관심이 있으며, Lidar SLAM을 공부하고 있습니다. [개인 홈페이지 : https://woogiee.wixsite.com/youngwooklee]

0개의 댓글