본문 바로가기

Data Science/Object Detection

YOLO V4 를 이용한 Object Detection - (1)

Intro

회사에서 차량 블랙박스 영상안에서 객체를 인식하는 프로젝트를 맡아 진행하게 되었다. 이전에 단순한 Classification은 해본 적이 있지만 Object Detection은 처음 해보는 task였다. 가장 많이 알려진 객체 인식 모델인 YOLO를 사용하여 예제를 돌려보고 Custom 데이터셋을 만들어 커스터마이징된 모델로 객체 인식을 진행한 과정을 기록할 것이다.

 

1. YOLO V4로 이미지 내 객체 인식

2. YOLO V4로 영상 내 객체 인식

3. YOLO V4 Custom 데이터 학습


Darknet

darknet은 C, CUDA로 작성된 오픈소스 신경망 프레임워크로 YOLO, RNN, ResNet 등 다양한 DNN모델들을 돌려볼 수 있다. C로 작성되었기 때문에 속도가 빠르고 CPU, GPU를 모두 지원하도록 되어있다.

 

단순히 모델을 돌려볼때는 상관없겠지만 데이터셋을 학습시킬때는 GPU를 사용하도록 해야한다. 학습시간 차이가 정말 어마무시하게 나기 때문이다;; 처음에 뭣도 모르고 CPU로 학습시키려고 했다가 학습소요시간이 말이 안되는 수치가 나와서 당황했던 기억이 있다. 

 

DARKNET 공식사이트

 

Darknet: Open Source Neural Networks in C

Nightmare Use Darknet's black magic to conjure ghosts, ghouls, and wild badgermoles. But be warned, ye who enter here: no one is safe in the land of nightmares.

pjreddie.com


YOLO V4

객체 인식에서 유명한 딥러닝 모델로 YOLO가 있는데 올해 4월에 YOLO V4 모델이 발표되었다. (논문링크)

yolo v4를 만든 Alexey Bochkoviskiy의 깃헙에 올라와있는 darknet을 통해 yolo v4모델을 사용할 수 있다.

 

AlexeyAB 의 darknet Github

 

AlexeyAB/darknet

YOLOv4 - Neural Networks for Object Detection (Windows and Linux version of Darknet ) - AlexeyAB/darknet

github.com

 


Darknet 설치

나의 개발 환경은 Ubuntu 18.04.3 LTS 이다.

먼저 위 github에 올라와있는 darknet폴더를 통째로 로컬로 가져온다.

적당한 곳에 프로젝트 폴더를 만들고 git clone을 이용하여 프로젝트를 다운로드한다.

 

나는 같은 위치에 이미 darknet폴더가 하나 있어서 myDarknet으로 디렉토리명 지정하여 프로젝트를 가져왔다.

$ git clone github.com/AlexeyAB/darknet myDarknet

 

이제 darknet을 빌드하기 위해서 make해야하는데 그 전에 Makefile에서 옵션을 수정한 후에 make 해준다.

GPU=1

CUDNN=0

CUDNN_HALF=0

OPENCV=0

AVX=0

OPENMP=0

LIBSO=1

ZED_CAMERA=0

ZED_CAMERA_v2_8=0

 

GPU를 사용하기 위해 1로 바꿨고 LIBSO는 so파일을 생성하는 옵션이다. 현재 개발환경에 OPENCV는 설치가 안된 상태이므로 OPENCV는 바꾸지 않았고 CUDA가 설치되어 있긴 하지만 일단 CUDNN값도 0으로 두고 빌드를 하기로 했다. 

 

$ make

 

정상적으로 make가 되면 darknet과 libdarknet.so 파일이 생성된 것을 확인할 수 있다.

이제 테스트를 해보자!

 

+ make가 제대로 안될때!

make명령어를 실행했을때 darknet 또는 libdarknet.so 파일이 생성되지 않는 경우가 있었다. 원인은  CUDA 환경변수를 잡아주지 않아서 생기는 문제였다. (확실하진 않지만 환경변수를 잡아준 이후에는 정상적으로 빌드가 이루어졌다.)

 

.bashrc 또는 .bash_profile (각자 환경에 따라 다름)에서 CUDA path를 잡아주도록하자.

$ vi .bashrc

적당한 위치에 다음을 추가해주자.

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

 

추가한 다음 저장을 하고 bashrc를 다음 명령어를 통해 reload!!

$ source .bashrc

 

다시 make를 하면 정상적으로 빌드가 된다!


YOLO V4 모델 구동해보기

yolo v4 구동하기 위해 미리 학습된 모델의 가중치 파일을 다운로드 한다. 

drive.google.com/open?id=1cewMfusmPjYWbrnuJRuKhPMwRe_b9PaT

 

yolov4.weights

 

drive.google.com

weights파일을 cfg에 넣어놓고 data폴더안에 있는 예제 이미지파일 중 person.jpg 를 사용하여 객체 인식 테스트를 해보자. yolov4.cfg는 모델에 대한 config정보를 가지고 있는 파일인데 cfg폴더안에 있다.

 

$ ./darknet detect cfg/yolov4.cfg cfg/yolov4.weights data/person.jpg

 

현재 개발환경에 OPENCV가 설치되지 않았기 때문에 data augmentation이 느릴수도 있다는 메세지가 나온다. opencv를 설치하고 makefile 옵션에서 opencv값을 변경하고 빌드하면 자체적으로 augmentation과정이 일어나는 것으로 보인다. 각 레이어에 대한 정보가 나오면서 inference 하는 과정이 나오고 결과 이미지는 prediction.png로 저장이 된다. opencv가 설치되어있었으면 별도의 디스플레이에서 보여주는 것 같다. 

 

굳.

 

이어지는 포스팅에서는 동영상 내 객체 검출을 다룰 예정이다. 그 뒤에도 할 게 많다;; 한 번 했던 걸 정리하면서 다시 하려니깐 헷갈리는 부분이 있지만 차근차근 정리해야겠다.