안녕하세요. 오늘은 Computer Vision 분야의 Object detection 분야에서 널리 쓰이는 YOLO(You olny look once)에 대해서 튜토리얼을 진행합니다.
대충 감이 오시죠? 어떤 이미지을 넣으면 어떤 사물이 있는지 어디에 있는지 알 수 있습니다.
YOLO는 이러한 다양한 프로젝트에 활용되는 CNN 기반의 대표적인 알고리즘 중 하나입니다.
최적화가 굉장히 잘되어 있어서 GPU를 사용하면 실시간 object detection도 가능합니다.
현재 최신버전으로 yolo v3가 나왔습니다.
이를 활용하면 특정 물체를 찾고자하는 다양한 프로그램을 제작할 수 있습니다. (CCTV 감시 시스템, 이미지 검색 시스템 등등)
1. YOLO란 무엇인가?
먼저 Computer Vision에서 Object detection이란 사진에 있는 물체를 찾아내는 알고리즘을 말합니다.![]() |
Yolo Object detection example |
대충 감이 오시죠? 어떤 이미지을 넣으면 어떤 사물이 있는지 어디에 있는지 알 수 있습니다.
YOLO는 이러한 다양한 프로젝트에 활용되는 CNN 기반의 대표적인 알고리즘 중 하나입니다.
최적화가 굉장히 잘되어 있어서 GPU를 사용하면 실시간 object detection도 가능합니다.
현재 최신버전으로 yolo v3가 나왔습니다.
이를 활용하면 특정 물체를 찾고자하는 다양한 프로그램을 제작할 수 있습니다. (CCTV 감시 시스템, 이미지 검색 시스템 등등)
2. 윈도우 버전 YOLO v3 설치하기
윈도우 버전 YOLO를 설치하기 전에 먼저 설치되어야 할 프로그램- Visual studio
- NVIDIA CUDA (cuda-toolkit-archive)
- NVIDIA cuDNN(cudnn-archive)
- OpenCV 2.4 이상(참고 [OpenCV 강의] 2. OpenCV 설치하기)
제가 사용한 버전은 아래와 같습니다.
- Visual studio 2015
- CUDA 9.0
- cuDNN 7.3.1
- OpenCV 4.0.1
CUDA와 cuDNN은 서로 호환이 되는 버전으로 잘 보고 설치해주세요.
예를 들어 CUDA 9.0을 설치하셨으면 cuDNN은 뒤에 (for CUDA 9.0) 이런 형태로 붙어 있는걸 설치해야함
(CPU 버전은 CUDA와 cuDNN 설치가 필요x)
A. Darknet 프로젝트 다운로드
YOLO 알고리즘 소스코드가 들어있는 프로젝트를 Darknet이라고 부르는데요. 이를 받아줍니다.
Clone or download(초록색 버튼) -> Download ZIP |
B. MSVS 버전, CUDA Path를 자신의 환경에 맞게 설정
Visual studio 2015, CUDA 10.0을 설치하신분은 darknet.sln을 바로 실행시켜봅니다. 안되면 아래 경로 설정 참고.
darknet-master\darknet-master\build\darknet 에 들어가 보시면 darknet.vcxproj 파일을 메모장 프로그램으로 여시면 수정하실 수 있습니다.
개인적으로 코딩 스타일로 바꿔주는 메모장 프로그램인 notepad++ 추천드립니다.(notepad++ 공식사이트)
ToolsVersion="14.0" 라고 쓰인 부분을 찾아서 본인의 VS toolset 버전을 입력합니다.
제 Toolset 버전은 v140이네요. 14.0을 의미합니다. |
CUDA 10.0이라고 쓰인 부분을 찾아서 본인의 버전을 입력합니다.
그 후 darknet.sln를 실행시켜보고 loading 이 정상적으로 되면 다음 단계로 넘어갑니다.
만약 이부분을 바꿔도 프로젝트가 로딩되지 않으면 해당 설정파일 있는 경로로 바꿔주셔야됩니다.(CUDA 설치 이후에 비주얼 스튜디오를 설치한 경우)
저의 경우는 CUDA 9.0 이후에 비주얼을 설치하여 해당 설정파일이 복사되지 않아서 수동으로
$(VCTargetsPath)\BuildCustomizations\CUDA 10.0.props
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\visual_studio_integration\MSBuildExtensions\CUDA 9.0.props
------------------------------------------------------------------------------------------------
$(VCTargetsPath)\BuildCustomizations\CUDA 10.0.targets
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\extras\visual_studio_integration\MSBuildExtensions\CUDA 9.0.targets
이것을 CUDA toolkit 경로로 바꿔줘야됩니다. 그러면 정상적으로 로딩됨을 확인할 수 있습니다.
C. OpenCV, cuDNN, GPU architecture 설정
(a) 프로젝트 property -> C/C++ -> general -> additional include directories의 include 경로중 opencv, cuDNN, CUDA 경로가 본인이 설치한 경로로 맞게 설정
예시(참고만 하세요)
1 $(OPENCV_DIR)\include;
2 C:\opencv_3.0\opencv\build\include;
3 ..\..\include;
4 ..\..\3rdparty\stb\include;
5 ..\..\3rdparty\pthreads\include;
6 %(AdditionalIncludeDirectories);
7 $(CudaToolkitIncludeDir);
8 $(CUDNN)\include;
9 $(cudnn)\include
V
D:\opencv\build\include;(1,2을 대체 opencv 경로의 include 폴더)
..\..\include;
..\..\3rdparty\stb\include;
..\..\3rdparty\pthreads\include;
%(AdditionalIncludeDirectories);(3, 4, 5, 6은 공통 경로이므로 수정 x)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\include;(7 대체 CUDA toolkit include 경로, 매크로 설정이 되어있으면 안바꿔도됨)
D:\cudnn\include(8, 9 대체 cuDNN 경로의 include 폴더)
똑같이 치지 마시고 본인 설치 경로를 입력해야됩니다.
위의 opencv 경로와 환경변수 세팅이 안되어 있었기 때문에 일일히 수동으로 바꿔주었습니다.
(b) 프로젝트 설정 페이지 -> CUDA C/C++ -> device -> code generation에서 본인의 architecture에 맞는 값 입력
예시(참고만 하세요)
compute_30,sm_30;compute_75,sm_75
V
compute_61,sm_61
제 GPU는 GTX 1070이었기 때문에 61로 적었고 본인의 GPU에 맞는 값을 입력합니다.
(c) 프로젝트 설정 페이지 -> Linker -> general -> Additional Library Directories 를 본인이 설치한 폴더의 라이브러리 폴더로 변경
예시(참고만 하세요. x64 release로 돌렸을때 기준입니다)
1 C:\opencv_2.4.9\opencv\build\x86\vc14\lib;
2 C:\opencv_2.4.9\opencv\build\x86\vc12\lib;
3 $(CUDA_PATH)lib\$(PlatformName);
4 $(cudnn)\lib\x64;
5 ..\..\3rdparty\pthreads\lib;
6 %(AdditionalLibraryDirectories)
D:\opencv\build\x64\vc14\lib;(1,2 대체)
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\lib\$(PlatformName);
(3 대체)
D:\cudnn\lib\x64; (4 대체)
..\..\3rdparty\pthreads\lib; (5는 바꿀필요 없음)
%(AdditionalLibraryDirectories)
D. OpenCV, CUDA 관련 dll 파일 복사
darknet.exe가 생성되는 경로에 dll파일을 미리 복사해서 넣어야합니다.
저같은 경우에는 x64 Release 였기 때문에
darknet-master\darknet-master\build\darknet\x64 에
opencv_world401.dll
opencv_ffmpeg401_64.dll
cusolver64_90.dll
curand64_90.dll
cudart64_90.dll
cublas64_90.dll
를 복사해서 넣었습니다. 물론 opencv뒤에 붙은 숫자 401은 본인 버전에 맞는 숫자겠죠?
저는 4.0.1 이라서 401인겁니다. cuda 또한 제가 9.0버전을 썼기 때문에 90이 붙은거구요.
ps. 모든건 본인 버전에 맞춰서 생각해야되요.
왜 안되냐 하기전에 100% 같은 컴퓨터 환경이 없기때문에 이 부분은 감안해야됩니다.
(앞으로도 쭉 감안하고 보셔야됩니다. open source란게 원래 모든 환경에서 돌아가게 뚝딱하고 만든 상용 소프트웨어는 아니거든요)
드디어 경로 설정 및 로컬 GPU 설정으로 변경을 완료하였습니다.. 이제 한번 돌려볼까요?
2. 윈도우 버전 YOLO v3 테스트 실행
간단하게 detector에 dog.jpg를 넣고 결과를 확인해볼 수 있습니다.
그전에 논문에서 사용된 Yolo의 파라미터들을 불러올 수 있는데요. 이걸 그대로 사용해서 object detection을 해보겠습니다.
우선 미리 훈련된 weight 값을 받아와야합니다.
yolov3-openimages.cfg
(247 MB COCO Yolo v3) - requires 4 GB GPU-RAM: https://pjreddie.com/media/files/yolov3-openimages.weightsyolov3-spp.cfg
(240 MB COCO Yolo v3) - requires 4 GB GPU-RAM: https://pjreddie.com/media/files/yolov3-spp.weightsyolov3.cfg
(236 MB COCO Yolo v3) - requires 4 GB GPU-RAM: https://pjreddie.com/media/files/yolov3.weightsyolov3-tiny.cfg
(34 MB COCO Yolo v3 tiny) - requires 1 GB GPU-RAM: https://pjreddie.com/media/files/yolov3-tiny.weightsyolov2.cfg
(194 MB COCO Yolo v2) - requires 4 GB GPU-RAM: https://pjreddie.com/media/files/yolov2.weightsyolo-voc.cfg
(194 MB VOC Yolo v2) - requires 4 GB GPU-RAM: http://pjreddie.com/media/files/yolo-voc.weightsyolov2-tiny.cfg
(43 MB COCO Yolo v2) - requires 1 GB GPU-RAM: https://pjreddie.com/media/files/yolov2-tiny.weightsyolov2-tiny-voc.cfg
(60 MB VOC Yolo v2) - requires 1 GB GPU-RAM: http://pjreddie.com/media/files/yolov2-tiny-voc.weightsyolo9000.cfg
(186 MB Yolo9000-model) - requires 4 GB GPU-RAM: http://pjreddie.com/media/files/yolo9000.weights
여기서 본인이 원하는 weights 파일을 받습니다. GPU 환경이나 맞는 weights값을 받아서 darknet.exe가 생기는 경로에 넣어줍니다.
전 darknet-master\darknet-master\build\darknet\x64 에 넣었습니다.
제가 테스트 해볼 세팅은 아래 두개 파일로 세팅하였습니다.
yolov3.cfg , yolov3.weights
실행파일 입력으로
detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights ./data/dog.jpg
함수
이렇게 넣어주었습니다.
실행 결과 |
768 x 576 해상도의 이미지를 25.7 ms에 처리했네요.
i7 - 7700, GTX 1070로 38.9 FPS로 처리가 가능하네요.
tiny 버전으로 돌려보면 더 빠르겠죠.
이를 활용해서 프로젝트를 하실 분들은 darknet.c에 main함수를 참고해서 파싱하는 부분 뜯어보시면 YOLO core 함수가 있습니다. 이를 수정해서 트레이닝, 테스트를 해보실 수 있습니다.
이렇게 길고 긴 YOLO 알고리즘 튜토리얼을 마칩니다.