Construction IT Labs: How to Use YOLO with ZED

3 분 소요

How to Use YOLO with ZED

ZED와 딥러닝 프레임워크인 YOLO를 사용하고, ZED 공식 사이트에서 제공하는 코드를 이용하여 Object Detection을 하는 방법에 대해서 소개하고자 한다.

특히, 딥러닝 모델과의 유기적인 연계를 위하여 본 포스트에서는 C++ 대신 Python을 중심으로 설명할 것이고, ZED와의 원활한 통신을 위하여 Ubuntu 18.04에서의 설정 방법에 대해서 설명할 것이다.

이번 포스트는 이전 포스트와 마찬가지로 필자가 겪은 시행착오를 중심으로 그 방법에 대해서 서술하고자 한다.

설치

ZED YOLO는 다음 라이브러리에 의존하므로 이들을 설치해야 한다.

  • ZED SDK

  • cuDNN

  • OpenCV

  • CUDA

  • Darknet

ZED SDK

먼저 아래의 사이트에 접속하여 ZED SDK를 설치하자.

ZED SDK

(ZED SDK를 설치할 때 명시된 CUDA 버전을 확인하여 적절한 파일로 설치하자.)

CuDNN

다음으로 CuDNN을 설치하자.

다음 사이트를 이용하면 된다.

NVIDIA CuDNN

OpenCV

다음으로 OpenCV 라이브러리를 설치하자.

sudo apt-get install pkg-config libopencv-dev

CUDA

CUDA는 다음 포스트에서 Ubuntu에 NVIDIA Driver를 설치하였다면 함께 설치되므로, 생략하도록 하겠다.

Ubuntu NVIDIA Driver

Darknet

다음의 Github Repository에 방문하여 적절한 위치에 Clone하거나 Zip 파일을 다운받아 압축 해제하자.

Darknet Github Repo

파일을 다운받았다면, 터미널 상에서 해당 폴더로 진입한 후, 폴더 내에 존재하는 Makefile의 내용을 수정하자.

(필자는 Vim Editor를 사용하여 해당 파일을 편집하였다.)

그 전에 Makefile의 수정 옵션과 그에 대한 다음의 설명을 확인하자.

  • GPU=1 to build with CUDA to accelerate by using GPU (CUDA should be in /usr/local/cuda)

  • CUDNN=1 to build with cuDNN v5-v7 to accelerate training by using GPU (cuDNN should be in /usr/local/cudnn)

  • CUDNN_HALF=1 to build for Tensor Cores (on Titan V / Tesla V100 / DGX-2 and later) speedup Detection 3x, Training 2x

  • OPENCV=1 to build with OpenCV 4.x/3.x/2.4.x - allows to detect on video files and video streams from network cameras or web-cams

  • DEBUG=1 to build debug version of Yolo

  • OPENMP=1 to build with OpenMP support to accelerate Yolo by using multi-core CPU

  • LIBSO=1 to build a library darknet.so and binary runnable file uselib that uses this library. Or you can try to run so LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib test.mp4 How to use this SO-library from your own code - you can look at C++ example: https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp or use in such a way: LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights test.mp4

  • ZED_CAMERA=1 to build a library with ZED-3D-camera support (should be ZED SDK installed), then run LD_LIBRARY_PATH=./:$LD_LIBRARY_PATH ./uselib data/coco.names cfg/yolov4.cfg yolov4.weights zed_camera

  • You also need to specify for which graphics card the code is generated. This is done by setting ARCH=. If you use a never version than CUDA 11 you further need to edit line 20 from Makefile and remove -gencode arch=compute_30,code=sm_30 \ as Kepler GPU support was dropped in CUDA 11. You can also drop the general ARCH= and just uncomment ARCH= for your graphics card.

필자는 기존 파일에서 다음의 옵션을 변경하였다. (LIBSO는 반드시 필요하므로(본 과정을 하는 이유이다.) 꼭 1로 변경하자.)

  • GPU = 1

  • CUDNN = 1

  • OPENCV = 1

  • LIBSO = 1

  • ZED_CAMERA = 1

또한, 필자가 시행착오를 거친 부분은 단순 옵션 변경 뿐만 아니라, 각 옵션에 대한 설치된 파일이 존재하는 경로도 지정을 해주어야 한다는 것이다.

Makefile을 조금 내려보면, 77줄에서 nvcc로 되어 있는 부분을 nvcc가 설치된 경로로 변경해주자.

즉, 대개 다음의 경로에 nvcc가 존재하는데,

/usr/local/cuda-xx/bin/nvcc

만약 nvcc의 위치를 찾지 못하겠다면 터미널 상에 다음의 명령어를 이용하여 nvcc의 위치를 확인하자.

which nvcc

다음의 내용을

NVCC=nvcc

다음으로 변경하자.

NVCC=/usr/local/cuda-xx/bin/nvcc

또한, 117번째 줄의 내용을

COMMON+= -DGPU -I/usr/local/cuda/include/

다음과 같이 변경하자.

COMMON+= -DGPU -I/usr/local/cudaXX/include/ # 여기서 XX는 Cuda의 버전명이다.

여기까지 Makefile의 내용을 변경하였다면, 터미널 상에서 make를 입력하자.

별다른 오류가 도출되지 않았다면, 해당 폴더 내에 libdarknet.so 파일이 생성될 것이다.

Stereolabs ZED - YOLO 3D

이제 다음 Github Repo에 접속하여 Tutorial 코드를 다운받자.

ZED - YOLO 3D

파일을 다운받았다면(Clone 했다는 전제 하에) 해당 폴더 내에 존재하는 libdarknet 폴더에 위에서 생성한 libdarknet.so 파일을 넣어주고, zed_python_sample 폴더 내에 존재하는 darknet_zed.py 파일을 실행하자. (물론 이때 ZED 카메라가 USB로 연결되어 있어야 한다.)

결과

결과가 다음과 같이 도출되었다면 성공이다.

다음은 필자가 소속된 학과 랩실 내의 필자 자리에서 ZED Stereo Camera를 이용하여 Object Detection을 수행한 모습이다.

References

ZED YOLO

댓글남기기