본문 바로가기

Deep Learning/Yolo

[2] YOLO 사용법

필자는 컴퓨터 운영체제로서 'Linux Ubuntu 18.04.1 LTS'을 사용하고 그래픽 카드는 'GeForce GTX 970'을 사용한다. 이 글은 온전히 필자의 컴퓨터를 기준을 작성했다. 


먼저, YOLO를 실행하기 위해 우선적으로 설치를 해야할 것이 몇가지 있다.

'OpenCV', 'CUDA', 'cuDNN'을 설치해야 한다. OpenCV를 설치하는 것은 필수이다.

CUDA나 cuDNN을 설치하는 것은 필수는 아니다. 그러나 GPU 환경에서 더욱 빠르게 Detection하기 때문에 3가지 설치하면 Detection하는 시간이 단축된다. 구글링을 통해 설치하기를 바란다.


1. Darknet 설치

Darknet은 Yolo를 실행하기 위한 환경이다.

~/opencv/opencv-3.2.0/build 경로에서 다음 명령어를 실행해 Darknet을 설치해주자.


$ git clone https://github.com/pjreddie/darknet

$ cd darknet

$ make


Makefile 내에서 OpenCV, CUDA, cuDNN을 사용하겠다고 선언을 해야한다. 


$ vi Makefile


위 명령어를 입력하면 Makefile을 수정할 수 있다. (vi 명렁어에 대한 공부가 필요하다. 책을 찾아보자.) 커서 부분에서 'r'을 누르고 원하는 문자를 입력하면 이전 문자가 입력한 문자로 대체된다. 수정이 끝났으면 ':wq'를 입력하고 enter를 눌러 수정을 마치자. (r은 replace를 의미한다.) 만일 OpenCV만 설치했다면 'OpenCV = 1'만 하고 나머지는 '= 0'으로 하면 된다. 



수정한 Makefile을 적용하기 위해 다음 명령어를 입력한다.


$ make

2. 가중치 파일(.weights) 다운로드

그럼 현재 위치는 ~/opencv/opencv-3.2.0/build/darknet 일 것이다. 미리 학습된 가중치 파일을 다운받자.


$ wget https://pjreddie.com/media/files/yolov3.weights

3. Detecting 실행

이제 YOLO라는 시스템을 눈으로 느껴보자.
~/opencv/opencv-3.2.0/build/darknet 경로에서 다음 명령어를 입력해보자.

$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg


그럼 터미널에서 다음과 같은 모습을 보이며 이미지 파일 하나가 팝업으로 뜬다.

개, 자전거, 자동차를 Detection한 모습을 볼 수 있다. 

data 디렉토리 안에 여러 사진들이 있으니, 다른 이미지에 대해서도 실행해보자.


$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/horses.jpg


CPU 환경에서 실행한다면 대략 6-12초 정도 걸린다. 하지만 CUDA나 cuDNN을 추가적으로 설치한 사람이라면 훨씬 빠른 속도로 Detecting을 할 수 있다. 필자가 직접 비교해 보았다.



왼쪽이 OpenCV만 설치한 후 CPU로만 실행한 결과이고, 오른쪽이 CUDA와 cuDNN을 설치하여 GPU로 실행시킨 결과이다.

각각 0.583초, 0.007초로 Detecting 속도가 약 83배 가량 차이남을 확인할 수 있다. 83시간 할 것을 1시간 만에 할 수 있다는 뜻이다. 지금으로선 둘다 빠르게 실행한다고 느끼지만, 데이터의 크기가 크거나, 개수가 클 때 그 효력을 발휘한다. 

(확실히 다르다. GPU 환경을 꼭 구축하자.)


YOLOv3가 인식할 수 있는 물체들의 종류는 data/coco.names 파일에서 확인할 수 있다. 80가지가 있다. 

4. Tiny YOLOv3 

필자는 컴퓨터 메모리의 한계로 YOLOv3는 다음과 같은 오류가 뜨며 실행되지 않는다. 'out of memory'. 메모리 용량이 부족하다는 뜻이다.


필자와 같은 사람들을 위한 가중치 파일이 있는데, 'Tiny YOLOv3'이다. 이 모델을 사용하기 위해선 별도로 다운로드가 필요하다.

$ wget http://pjreddie.com/media/files/yolov3-tiny.weights 

tiny용 config 파일과 weights 파일을 이용해 실행해보자.

$ ./darknet detect cfg/yolov3-tiny.cfg yolov3-tiny.weights data/dog.jpg




GPU 메모리는 20%밖에 사용하지 않는 것을 확인할 수 있다. 그러나 YOLOv3에 비해 인식률이 떨어진다.

5. Threshold 설정해보기

Deep-Learning을 통해 Detecting을 하는 시스템들은 어떤 물체가 그 물체라고 확신을 가지고 얘기하지 않는다. 다만, 그 물체일 확률이 얼마일 것이다를 계산하고, 시스템 내의 기준에 의해 어떤 확률 이상일 때 '아마~ 그 물체일 것이다'라고 대답한다고 보는 것이 정확하다. 

'Threshold'는 한국어로 문턱, 한계점을 의미한다. 이를 Detecting System에서는 어떤 물체를 판단하는 기준이 되는 확률을 의미한다. YOLO는 어떤 물체라고 Detecting한 확률이 25%이상일 경우 그 물체일 것이다라고 출력한다. 
우리는 Threshold를 명령어를 통해 변경할 수 있다. 다음 명령어를 통해 어떤 물체라고 판단하는 기준 확률을 1%로 변경해보자.

$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg -thresh 0.01



여러 물체들을 인식하는 모습을 볼 수 있다. 이렇게 동일한 데이터(dog.jpg)에 대한 결과 비교를 통해 Deep-Learning이 어떻게 물체를 Detecting 하는 것인지 생각해 볼 수 있다. 

6. 여러 사진들에 대한 결과

~/opencv/opencv-3.2.0/build/darknet/data 디렉토리에 여러 사진들을 저장하여 이미 존재하는 예제 외의 다른 사진들에 대한 결과를 확인해 볼 수 있다. 


Photo by Julian Christian Anderson on Unsplash


Photo by Aashish A on Unsplash


Photo by Luke Porter on Unsplash



References

YOLO Open 소스 : https://pjreddie.com/darknet/yolo/


'Deep Learning > Yolo' 카테고리의 다른 글

[3] YOLO 데이터 학습  (21) 2019.01.25
[1] YOLO를 알아보자  (0) 2019.01.22