[Open Source] YOLO v3 윈도우 버전 설치 및 튜토리얼 한방에 정리

By New AI Engineer - 4월 13, 2019

안녕하세요. 오늘은 Computer Vision 분야의 Object detection 분야에서 널리 쓰이는 YOLO(You olny look once)에 대해서 튜토리얼을 진행합니다.




1. YOLO란 무엇인가?

먼저 Computer Vision에서 Object detection이란 사진에 있는 물체를 찾아내는 알고리즘을 말합니다.


Yolo Object detection example

대충 감이 오시죠? 어떤 이미지을 넣으면 어떤 사물이 있는지 어디에 있는지 알 수 있습니다. 

YOLO는 이러한 다양한 프로젝트에 활용되는 CNN 기반의 대표적인 알고리즘 중 하나입니다.
최적화가 굉장히 잘되어 있어서 GPU를 사용하면 실시간 object detection도 가능합니다.
현재 최신버전으로 yolo v3가 나왔습니다.

이를 활용하면 특정 물체를 찾고자하는 다양한 프로그램을 제작할 수 있습니다. (CCTV 감시 시스템, 이미지 검색 시스템 등등)



2. 윈도우 버전 YOLO v3 설치하기

윈도우 버전 YOLO를 설치하기 전에 먼저 설치되어야 할 프로그램


제가 사용한 버전은 아래와 같습니다.
  • 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이라고 부르는데요. 이를 받아줍니다.

Darknet 다운로드 링크 Darknet.zip 또는 원본 위치 github 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 값을 받아와야합니다.


여기서 본인이 원하는 weights 파일을 받습니다. GPU 환경이나 맞는 weights값을 받아서 darknet.exe가 생기는 경로에 넣어줍니다.

전 darknet-master\darknet-master\build\darknet\x64 에 넣었습니다.

제가 테스트 해볼 세팅은 아래 두개 파일로 세팅하였습니다.
 yolov3.cfgyolov3.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 알고리즘 튜토리얼을 마칩니다.

  • Share:

You Might Also Like

41 Comments

  1. 만약 이부분을 바꿔도 프로젝트가 로딩되지 않으면 해당 설정파일 있는 경로로 바꿔주셔야됩니다.(CUDA 설치 이후에 비주얼 스튜디오를 설치한 경우)
    -> 이 경우 경로를 바꿔야한다고 하셨는데 어디서 바꿔야하는 모르겠어서 댓글 남깁니다

    답글삭제
    답글
    1. 바로 아랫줄에 제가 바꾼 방법에 대해서 적혀있습니다.

      $(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 targets파일 경로로 수정해주시면됩니다.

      삭제
  2. 모든 과정을 다하고 window에서 yolo 테스트를 실행하려고 하는데 weight값은 지정된 폴더에 넣어주었는데 detector에서 dog.jpg를 넣는다는게 무슨 말인지랑 실행파일 입력을 어디서 하는지를 잘 모르겠어요

    답글삭제
    답글
    1. detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights ./data/dog.jpg

      이부분을 질문하신거라면 일단 모든과정을 다했으면 실행파일이 생성이 되었을겁니다.

      실행시키는 방법은 2가지가 있는데요.

      1. darknet.exe 파일이 생성되었을 건데요.
      해당 위치에서 cmd(명령프롬프트)창을 열고
      darknet.exe detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights ./data/dog.jpg 라고 입력하시면 dog.jpg에 대해서 yolo v3가 실행이 됩니다.

      2. 비주얼 스튜디오 상에서 해당 명령어를 넣어주는 방법이 있는데요.
      솔루션 탐색기에서 프로젝트 속성을 여시고 구성속성 -> 디버깅 탭을 열어보시면 명령 인수라는 칸이 있는데요 그 부분에 detector test ./cfg/coco.data ./cfg/yolov3.cfg ./yolov3.weights ./data/dog.jpg 를 입력하고 프로젝트를 실행시켜보시면 됩니다.

      도움이 되셨는지 모르겠네요.

      삭제
  3. 덕분에 정말 많이 도움되었습니다. 감사합니다.

    답글삭제
  4. 안녕하세요.
    혹시 darknet 솔루션파일이나 프로젝트파일이나 둘다 로드 실패가 나오는데 왜그럴까요.. ㅠㅠ
    darknet_no_gpu는 정상적으로 로드가 되나 (컴파일은 아직 안되지만) darknet은 안되네요..

    순서는 VS2013설치 -> CUDA 9.0설치 -> darknet솔루션파일 VS2013으로 열기 -> 여기서 솔루션 로드 실패가 나오네요..

    답글삭제
    답글
    1. darknet.vcxproj 파일을 메모장으로 열어서 수정해주셔야됩니다.
      두번째줄에
      Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 으로 수정해보세요

      삭제
    2. B. MSVS 버전, CUDA Path를 자신의 환경에 맞게 설정 < 부분부터 천천히 따라해보세요.

      삭제
  5. darknet이 빌드업이 되질않네요 ㅠ.ㅠ 혹시 darknet.exe 올려주실수있나요? gpu를 사용해서 프로젝트를 진행해보려고 하는데 막히네요 ㅠ

    답글삭제
  6. 엥 뭐지 이상하네 파워쉘로는 안되서 아나콘다 프롬프트로 했는데 실행되네영...
    어쨌든 나는 성공 감사~~~해영~~~ 개꿀~~~띠!

    답글삭제
  7. 작성자가 댓글을 삭제했습니다.

    답글삭제
  8. cpu 버전은 어떻게 실행해야 되나요

    답글삭제
    답글
    1. CPU 버전의 경우에는 위 내용에서 opencv, vs toolset 경로만 수정해주시면 빌드가 될겁니다.

      삭제
  9. 안녕하세요! dog.jpg, mp4, webcam 모두 다 실행이 잘 되는데요 혹시 webcam말고 다른 카메라로 인식을 할 수 있을까요? 제가 사용하고 있는 카메라가 Astra orbbec 카메라인데 혹시 알고 계시다면 어떻게 연결할 수 있는지 알려주시면 감사하겠습니다! (__)

    답글삭제
    답글
    1. 해당 카메라는 구글링해본 결과 SDK를 설치하고 라이브러리를 통해서 이미지를 받아오실수 있다고 나와있습니다. Astra orbbec sdk를 검색해보시고 샘플로 이미지를 받는 코드를 실행시키실수 있다면 해당 이미지를 detector함수에 넣어주시면 될듯합니다. 자세한 내용은 sdk 문서를 참고해주세요.

      삭제
  10. 컴파일러:visual studio 2015
    openCV: 4.0.1
    CUDA: 10.0

    에서 MAKEfile GPU, CUDNN, OPENCV 파라미터 1로 설정하고
    darknet.sln 디버그 모드와 릴리즈 모드에서 모두 빌드는 성공으로 뜨는데, 릴리즈 모드에서 빌드한 exe 파일로 영상 detection 할때 gpu가 사용이 되는 것은 확인했는데,

    디버그 모드에서 빌드한 exr 파일로 실행하면
    OpenCV isn't used
    Demo needs OpenCV for webcam images. 가 뜨면서 실행이 되지 않는 문제가 있습니다. 어떤 원인이 있는지 궁금합니다.

    답글삭제
    답글
    1. 프로젝트 속성에서 c/c++ 에서 전처리기 정의에 "OPENCV; "넣어보세요. 해제에서는 빼고
      빌드에서 waitkeyEx 에러나면 waitKey로 바꾸시고.

      삭제
  11. 도와주세요~
    안녕하세요 이틀째 삽질 하고 있습니다
    vs2017 cuda10 cudnn7 설치하고 darknet.sln 로딩 .. 빌드 시키면

    오류 MSB6003 The specified task executable "cl.exe" could not be run. 지정된 파일을 찾을 수 없습니다 darknet C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\VC\VCTargets\BuildCustomizations\CUDA 10.2.targets 432

    이런 오류가 납니다 무엇이 잘못되었는지 도저히 모르겠습니다
    도와주세요~

    답글삭제
  12. 심각도 코드 설명 프로젝트 파일 줄 비표시 오류(Suppression) 상태
    오류 MSB3721 ""C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\bin\nvcc.exe" -gencode=arch=compute_35,code=\"sm_35,compute_35\" --use-local-env -ccbin "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin" -x cu -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include" -I"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v10.0\include" -G --keep-dir Debug -maxrregcount=0 --machine 32 --compile -cudart static -g -D_MBCS -Xcompiler "/EHsc /W3 /nologo /Od /FdDebug\vc140.pdb /FS /Zi /RTC1 /MDd " -o Debug\maxpool_layer_kernels.cu.obj "C:\Users\uoome\OneDrive\바탕 화면\darknet-master\darknet-master\src\maxpool_layer_kernels.cu"" 명령이 종료되었습니다(코드: 1). darknet C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\CUDA 10.0.targets 712줄

    이런 오류가 뜨는데 어떻게 해결해야 할까요..도와주세요..

    답글삭제
    답글
    1. 해결하셨나요? 같은 오류가 뜨는군요...

      삭제
    2. 해당 명령을 cmd창 열어서 실행해보시면 구체적인 에러가 나옵니다.
      cl.exe path나 다중스레드디버그dll 설정 등이 문제일 수 있습니다.

      삭제
  13. 안녕하세요. 작성해주신 글 덕분에 잘 설치해서 사용하고있습니다. 그런데 image.c 파일의 일부 코드를 수정한 뒤
    darknet.sln 빌드를 다시 해줬을 경우 제가 집어넣은 소스코드는 실행되지않고 계속 기존의 소스코드로만 실행이 되더라구요
    이런 경우엔 어떻게 해결해야하는지 알고계시는게 있으신가요?

    답글삭제
    답글
    1. printf로 아무거나 찍어서 콘솔창을 확인해보거나 디버그 모드로 breakpoint를 찍어보고 실제 해당 블록이 실행되는지 확인해보세요.

      삭제
  14. 혹시 vs toolset버전을 확인하려면 어떻게 해야되나요

    답글삭제
    답글
    1. 비주얼 스튜디오를 열어보시고 프로젝트명 우클릭하면 밑에 보시면 속성버튼이 있습니다.

      삭제
  15. CPU버전이란 건 윈도우 버전을 말하는 건가요?

    답글삭제
    답글
    1. 욜로 알고리즘은 기본적으로 CPU에서 돌릴건지 GPU에서 돌릴껀지 정하는데 여기서 CPU는 실제 컴퓨터 내부에서 계산을 하는 CPU(intel i시리즈나 AMD RIZEN 같은 칩입니다.)를 말하는 것입니다. GPU는 그래픽 처리 장치인데요. 작은 CPU가 수천개 달려있는 카드라고 보시면 됩니다. 그래서 반복적인 연산을 할때 엄청난 효율을 나타내기 때문에 반복적 행렬연산인 딥러닝에 최적화 되어있다고 보시면 됩니다. 윈도우는 운영체제를 말하는 것이구요.

      삭제
  16. 감사합니다 덕분에 프로젝트 진행을 잘 하였습니다.
    괜찮으시다면 블로그에 포스팅을 해도 될까요?

    답글삭제
  17. 작성자가 댓글을 삭제했습니다.

    답글삭제
  18. 안녕하세요 에러가 나서 문의드립니다!
    darknet.exe 까지 생성 완료했는데요
    테스트를 위해 명령어를 치니
    CUDA status Error: file: ..\..\src\dark_cuda.c : get_gpu_compute_capability()
    CUDA Error: unknown error

    이런 에러가 나는데 구글링을 해보니 cmake 로 컴파일? 이나 Visual Studio C++을 사용한 Window 데스크톱 개발 이런 것을 설치해줘야 하나요?

    답글삭제
    답글
    1. opencv_world401.dll
      opencv_ffmpeg401_64.dll
      cusolver64_90.dll
      curand64_90.dll
      cudart64_90.dll
      cublas64_90.dll

      위 파일들을 darknet.exe 동일 경로에 복사해서 다시 실행시켜보세요

      삭제
    2. 감사합니다. 많은 도움이 되었습니다.
      질문했던 부분은 해결했는데 오류가 하나 더 나와 질문드려봅니다!
      darknet.exe detector train data/obj.data cfg/yolov3.cfg darknet53.conv.74
      명령어를 친 뒤 png 파일과 cmd 창이 학습을 시작했는데요. 몇 시간 뒤에 backup 폴더에 weights 파일이 나타나기 시작했습니다. 2개쯤 나타날 무렵
      Calloc error - possibly out of CPU RAM 이라는 오류가 나왔는데요.
      그래도 나온 가중치 파일로 test 명령을 돌렸는데도 같은 오류명이 뜹니다.
      혹시 해결방법을 알고 계신가요?
      (CPU : i7-7700HQ, RAM : 16GB, GPU : GTX 1050ti) 입니다.

      삭제
    3. 컴퓨터 메모리 할당이 안되서 생기는 문제같은데요.
      미니 배치사이즈를 줄여보시는게 어떨까요?

      삭제
  19. 안녕하세요.. 잘 보고 배우고 있습니다
    그런데 마지막에 실행을 하면 사진만 뜨고 box들은 안생기는데 어떤 이유일까요..

    답글삭제
    답글
    1. 저도 그렇네요 가중치 파일을 바꾸고 다크넷을 다시 깔아도 똑같은데 해결되었나요?

      삭제
  20. 저도 윗분과 같이 dog.jpg 이미지는 나타나는데 box는 안생겼네요. 왜 일까요?

    답글삭제
  21. 선생님 저는 cuda status error file ./src/dark_cuda.c () line 39 이러한 오류가 발생하는데 이유가 뭘까요...?

    답글삭제
  22. 안녕하세요, 빌드까지 성공하고, C/C++기반 명령어는 잘 실행됩니다.

    하지만, python darknet_video.py 명령어를 실행했을 때 다음과 같은 오류가 납니다.

    Traceback (most recent call last):
    File "C:UserspDesktopdarknet-master uilddarknetddarknet.py", line 213, in
    raise ValueError("NoDLL")
    ValueError: NoDLL

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "darknet_video.py", line 6, in
    import darknet
    File "C:UserspDesktopdarknet-master uilddarknetddarknet.py", line 222, in
    lib = CDLL(winGPUdll, RTLD_GLOBAL)
    File "C:UserspAppDataLocalProgramsPythonPython37libctypes__init__.py", line 364, in __init__
    self._handle = _dlopen(self._name, mode)
    OSError: [WinError 126] 지정된 모듈을 찾을 수 없습니다

    혹시 어떻게 해결해야 하는지 도움 주실 수 있나요??

    답글삭제