YOLO 윈도우즈(windows) 버전

기계학습 2017.09.01 10:15

얼마 전 YOLO를 다운받아서 돌려보았다. 그동안 말로만 들어왔던 딥러닝 기술을 실제로 돌려본 건 처음이다.


YOLO를 돌려본 느낌은 멋지다이다. 그리고 yolo와 darknet을 만든 Joseph Redmon이란 사람도 멋있다는 생각이 든다. 사실 이 분야에 있다보니 그동안 딥러닝에 대한 것은 많이 보고 들어 왔다. 하지만, 그것을 자신이 직접 돌려 본 느낌은 또 다른 것 같다.


이 분야에 있는 사람들은 YOLO가 무엇인지는 대부분 다 알 것이다. 이 글에서는 YOLO와 딥러닝에 대한 이런 저런 생각, 그리고 YOLO를 윈도우(window)에서 빌드하고 실행시키는 방법을 소개한다.


1. YOLO (you only look once)

2. YOLO 윈도우즈(windows) 빌드

3. YOLO의 실행

4. 딥러닝에 대한 잡담



1. YOLO (you only look once)


YOLO의 원래 의미는 you only live once이다. 한번뿐인 인생 마음 가는데로 살자는 말이다. 하지만 여기서 말하는 YOLO(욜로)는 you only look once이다. 한 번만 본다... YOLO가 무엇인지 그리고 무슨 의미인지는 YOLO의 개발자 Joseph Redmon이 최근(2017년 4월) TED에서 발표한 내용에 잘 나타나 있다.



YOLO는 무공으로 치면 사파에 해당된다. 즉, 남들이 일반적으로 따르는 정통 주류의 방법론을 따르지 않고 자신의 독자적인 무공 체계를 세워 왔다. 그리고 최근 주류의 정점에 있는 CVPR 2017에서 Best Paper Honorable Mention 상을 수상하였다.


YOLO를 실행시키기 위해서는 Darknet이 필요하다. Darknet은 Joseph Redmon이 독자적으로 개발한 신경망 프레임워크(neural network framework)로서 dnn(deep neural network)들을 학습시키고 실행시킬 수 있는 틀(framework)이다. 그리고 yolo는 학습된 신경망(결과물) 중 하나이다. Darknet을 이용하면 yolo 뿐만 아니라 AlexNet, VGG-16, Resnet, Densenet 등 기존의 정통 주류의 dnn(deep neural network)들도 돌려 볼 수 있다.


일단, 나는 '다크넷'이란 용어가 맘에 든다. 내 블로그 필명과도 유사하고 정파가 아닌 사파라는 점도 마음에 든다. Darknet은 부정적인 의미(법망에서 벗어난 어둠의 인터넷 환경)도 있지만 구속되지 않음으로 인해 자유로움이 가능한 공간으로 해석될 수도 있다. 일반적으로 보기 힘든 Joseph Redmon의 독특한 이력서(resume)도 매우 인상적이다 (관심있는 분은 이력서 링크를 한번 클릭해 보시길.. ^^).


Darknet과 yolo는 그 코드가 모두 공개되어 있으며 누구라도 사용할 수 있다.



2. YOLO 윈도우즈(windows) 빌드


나는 리눅스(Linux) 환경과는 별로 친하지 않다. 그래서 번거롭지만 윈도우즈(windows)에서 돌릴 수 있는 버전을 찾아서 작업을 하였다.


YOLO 윈도우즈 버전은 구글에서 검색해 보면 어렵지 않게 찾을 수 있다.

첫 번째 사이트(AlexeyAB)에 가면 YOLO 윈도우 버전을 다운받을 수 있다. 또한 설치, 컴파일, 실행 방법까지 상세하게 설명되어 있다. 따라서 설명만 따르면 어렵지 않게 빌드 및 테스트가 가능하다.


사이트에 잘 설명되어 있긴 하지만 그래도 간단히 그 과정을 적어보면 다음과 같다.

  1. 사이트에서 소스코드를 다운받는다 (git clone 또는 zip 다운로드)
  2. NVIDIA 계열의 그래픽카드(GPU)가 컴퓨터에 있어야 한다 (그래픽 메모리 4GB 이상 권장). NVIDIA 그래픽카드가 없어도 CPU 버전으로 빌드 및 실행은 가능하다. 하지만 매우 매우 느리다.
  3. CUDA 8.0 설치: https://developer.nvidia.com/cuda-downloads (그래픽카드가 없는 경우에는 설치할 필요가 없다)
  4. 다운받은 소스에서 visual studio 프로젝트 파일(*.sIn)을 찾아서 실행시킨다. 끝.


다운받은 소스에 보면 여러 가지 설정의 Visual Studio (VS) 프로젝트 파일들이 제공된다. 나는 이 중에서 yolo_cpp_dll 버전으로 빌드 및 테스트를 했다. yolo를 dll 라이브러리로 만들어 놓으면 다른 윈도우즈 프로그램에서도 자유롭게 사용할 수 있기 때문이다.


다만, 한 가지 문제는 사이트에서 제공하는 프로젝트 파일은 Visual Studio 2015 용이기 때문에 그 이전버전의 Visual Studio(VS 2013 등)에서는 사용이 안된다는 점이다.


한 가지 해결법은 다음과 같다. (1) 먼저, *.sIn 파일을 삭제한다. (2) 이후 *.vcxproj 파일을 메모장으로 열어서 프로젝트의 버전을 자신의 VS에 맞게 수정해 준다. (3) 이후 수정된 *.vcxproj를 클릭하여 프로젝트를 연다 (프로젝트를 저장하면 *.sIn 파일이 자신의 버전에 맞게 자동 생성된다).


예를 들어, 자신이 사용하는 버전이 Visual Studio 2013라면 14.0은 12.0으로 v140은 v120으로 변경해 주면 된다.


- ToolsVersion="14.0" 을 찾아서 14.0을 자신의 Visual Studio 버전으로 변경

- v140을 찾아서 (총 4곳) 자신의 Visual Studio 버전으로 변경



3. YOLO의 실행


yolo를 실행시키기 위해서는 darknet에서 yolo의 cfg 파일과 weights 파일을 불러와야 한다. cfg 파일은 신경망의 구조(layer 개수, 입력 데이터의 차원 등)를 명시한 파일이고 weights 파일은 실제로 학습된 신경망의 weight 값들을 저장한 것이다.


yolo 사이트에서는 아래와 같이 다양한 버전의 미리 학습된 yolo 신경망(cfg & weights 파일)들을 제공한다. 이들 중 원하는 버전을 다운받은 후 darknet에 넣고 실행하면 된다. 자세한 실행법은 yolo 사이트의 설명문서 참조.



참고로, VOC 2007+2012 데이터에 대해 학습시킨 yolo는 20개의 물체 클래스에 대해 학습시킨 버전이고 COCO 데이터로 학습한 것은 80개의 물체 클래스에 대해 학습한 것이다. 따라서, 일반적인 목적으로는 위 그림에서 표기한 YOLOv2 608x608 버전을 다운받는 것이 무난하다. Tiny 버전은 용량도 작고 속도도 빠르지만 성능은 그다지 좋지 않다. 또한 최근에 공개된 yolo9000 모델(http://pjreddie.com/media/files/yolo9000.weights)도 한번 테스트해 봄직하다 (9000개의 물체 클래스에 대해 학습된 버전이며 cfg 파일은 git에서 다운받을 수 있다: https://github.com/pjreddie/darknet/blob/master/cfg/yolo9000.cfg).


YOLOv2 608x608의 실행 속도는 데스크탑에서 직접 돌려보니 GPU(GTX 1080)를 사용했을 때에는 35 fps, GPU 없이 CPU(i7-6700k)만으로 돌렸을 때에는 0.3 fps가 나왔다. 새삼 GPU의 위력을 실감할 수 있다..



4. 딥러닝에 대한 잡담


요즘 어딜 가나 딥러닝이다. 딥러닝이 나온 게 불과 몇년 전인데, 그동안 딥러닝으로 인한 변화는 엄청나다. 우리는 그 변화의 한가운데에 서 있으며 그 변화의 끝이 어디일지 두렵기까지 하다.


나는 사실 딥러닝에 대해서는 잘 모른다. 옛날 학생 때 인공신경망(artificial neural network)을 몇 번 학습시켜 본 것이 다이다. 그래도 몇 년 동안 이래 저래 줏어듣다 보니 몇 가지 기본적인 개념 정도는 이해하고 있는 수준이다.


요즘 사람들을 보면 모든 관심이 딥러닝에 모여지는 것 같다. 지식의 블랙홀 같기도 하고.. 그러한 변화를 따라가고 있는 사람들을 보면 대단하다는 생각도 들고 또 한편으로 우려도 된다.


딥러닝은 학생들이나 입문자들에게는 좋은 기회이다. 딥러닝의 뛰어난 성능은 수십년 동안 쌓아온 전통적인 지식 체계를 무색하게 하고 그들과 동일 선상에 설 수 있는 기회를 준다. 딥러닝은 그 사용법만 잘 알아도 창의성과 아이디어만 있다면 좋은 결과를 낼 수 있는 것으로 보인다. 그러다 보니 수십년 동안 전통적인 지식 체계를 쌓아 온 사람과 입문자가 같은 선 상에 설 수 있는 기회를 준다.


하지만 딥러닝은 지식의 추구 관점에서는 걸림돌이 될 수도 있다. 기본을 몰라도 결과를 낼 수 있으니 굳이 힘들게 체계적인 공부를 할 필요가 없기 때문이다. 딥러닝의 사용자 입장으로만 남을 것이면 사실 큰 문제가 없다. 하지만 소위 말하는 black-box implementer로만 남지 않으려면 그 시스템 안으로 조금은 들어가 볼 필요가 있다. 그리고 시스템에 들어가기 위해서, 나아가 시스템을 바꾸기 위해서는 항상 기본이 필요하다.


나는 그동안 딥러닝에 있어서는 아웃사이더(outsider)로만 있어 왔다. 인공신경망(artificial neural network) 자체도 별로 좋아하지 않고 (입력주고 원하는 출력을 주면 지가 알아서 뭔가를 만들어 내는데, 내가 할 수 있는 일이라곤 별로 없다. 열심히 학습 버튼 눌러주고.. 컴퓨터 좀 바꿔주고.. 나의 직관력이나 이해가 끼어들 여지가 별로 없다) 또 뭔가 새로운 것을 배워야 한다는 것도 귀찮기 때문이다.


하지만 어.. 하는 사이에 세상은 너무 빠르게 변해가고 이젠 어쩔 수 없이 딥러닝을 배워야 하는 것 같다. 개인적으로는 그것들을 잘 사용해서 데이터를 모으고 실제 문제를 푸는 것이 목적은 아니다. 그냥 그 안으로 들어가서 그 원리를 조금씩 보고자 한다.


by 다크 프로그래머

저작자 표시 비영리 변경 금지
신고
  • 아에이오우 2017.09.05 15:13 신고 ADDR 수정/삭제 답글

    약 2년 동안 열심히 만들고 보완한 보행자 검출 알고리즘 성능이,
    하루 노력해서 돌려본 YOLO에 비해 형편없다는 사실이
    참으로 슬프네요. 하지만 2년 동안 노력해서 얻은 컴퓨터비전 지식들은
    소중한 자산이 된다고 믿고 있습니다.
    항상 좋은 글 잘 보고 있습니다^^

    • BlogIcon 다크pgmr 2017.09.05 18:38 신고 수정/삭제

      네 공감합니다. 그러한 자산이 좀더 멀리 나아갈 수 있는 소중한 자산이 되리라 생각합니다. 감사합니다.

  • 다크님ㅠㅠ 2017.09.06 09:54 신고 ADDR 수정/삭제 답글

    너무 늦게 오셨습니다. ㅠㅠ 블로그 항상 잘 참고했었는데요.
    얼른 따라잡으셔서 좋은글 부탁 드립니다.

  • ctw 2017.09.06 12:54 신고 ADDR 수정/삭제 답글

    어서 오십시요.
    많은 분들이 딥러닝을 직관적으로 풀어주실 다크님 글들을 기다리고 있습니다. ^^

    Open CV 3.3(2018.08.03) 버전부터는 컴퓨터 비전이 딥러닝을 품고 있습니다. 다크님께서도 품어 주실것이라 믿습니다.
    http://opencv.org/opencv-3-3.html

    • BlogIcon 다크pgmr 2017.09.06 14:08 신고 수정/삭제

      ㅎㅎ 제가 점쟁이라도 된 것 같은데요, 그럴리는 없구요.. 조금씩 배워가는 입장에서 정리할 게 생기면 가끔 글도 올리고 하겠습니다.

  • 김공자 2017.09.15 21:02 신고 ADDR 수정/삭제 답글

    다크....에 저런 좋은 뜻이 있었군요?ㅎㅎㅎ
    딥러닝이 빛본지가 얼마 안되서 그렇지 이론같은건 꽤 오래되지 않았나요?ㅎㅎ
    글 잘읽었습니다. ^^

    • BlogIcon 다크pgmr 2017.09.18 12:03 신고 수정/삭제

      네 소수 연구자에 의해 오래전부터 연구되어 오다가 최근에(2012년 경) 몇가지 벽이 뚫리면서 빛을 본 것으로 알고 있습니다.

  • CV 2017.09.28 19:26 신고 ADDR 수정/삭제 답글

    딥러닝에 대해 이제 막 공부해보려합니다.
    YOLO에 대해 한가지 여쭤보고 싶은게 있는데요,
    혹시 yolo를 사용하여 object detection을 수행하되, detected 된 object를 rectangular box로 나타내기에 앞서 binary image형태로 object있는 부분만 표현할 수 있을까요?

    • BlogIcon 다크pgmr 2017.09.28 23:36 신고 수정/삭제

      YOLO에 대해 잘 알진 못하지만 아마도 안되는 것으로 알고 있습니다. 물체의 경계를 따는 것이 목적이라면 최근에 나온 MASK R-CNN을 찾아보시면 좋을 듯 싶습니다.

    • CV 2017.09.29 04:16 신고 수정/삭제

      감사합니다.!! 더 공부해보도록 하겠습니다.

  • 태크닉 2017.09.29 15:25 신고 ADDR 수정/삭제 답글

    안녕하세요 다크프로그래머님 리눅스 환경 뿐만 아니라 윈도우환경에서 YOLO v2를 사용해 보고있습니다. 이미지, 동영상은 정상적으로 잘 불러와서 실행되는데 노트북 내장 웹캠을 불러오려 하니 stream 에러를 뱉어내네요, 혹시 이와같은 경험이 있으셨나요?

    • BlogIcon 다크pgmr 2017.09.29 15:42 신고 수정/삭제

      전 dll로 만들어 써서 그러한 문제는 발생하지 않습니다 (입력 소스에 대한 dependency가 없기 때문). 다른 opencv 프로그램으로도(간단하게 하나 구현) 동일한 현상이 나타나는지 한번 확인해 보시면 좋을 것 같습니다.

  • ydgoo 2017.10.18 08:20 신고 ADDR 수정/삭제 답글

    글에보면 GPU 를 사용하면 35fps. 사용하지 않으면 0.3fps 로 되어 있습니다. 약 10배의 차이가 난다는것인데요 gpu 를 사용하지 않는 경우 성능을 올릴수 있는 방법들이 있는지 궁금합니다.

    • BlogIcon 다크pgmr 2017.10.18 11:30 신고 수정/삭제

      3가지 정도 방법이 있습니다. 1. tiny 버전의 yolo를 사용한다. 검출 성능은 크게 저하되지만 속도는 상승합니다. 2. 고가의 고성능 cpu를 사용한다. 3. cpu에서도 병렬처리가 되도록 yolo 코드를 수정한다 (실제 yolo 코드에 cpu 병렬처리가 들어있는지는 모릅니다. 만일 들어있지 않다면 병렬처리를 하면 속도가 향상될 것입니다).

  • ydgoo 2017.10.19 22:47 신고 ADDR 수정/삭제 답글

    실제로 저희도 tiny YOLO 는 사용을 해보았습니다만 원하는 성능이 나오지는 않더라구요. 가성비가 좋아보이는건 cpu 병렬처리일것 같아 보입니다. 혹시 yolo 말고 다른 좋은 솔루션이 있는지도 궁금하네요. 친절한 답변 감사드립니다.

    • BlogIcon 다크pgmr 2017.10.20 01:23 신고 수정/삭제

      저도 따로 아는 건 없습니다. 글에서 적었듯이 저도 deep learning 쪽은 거의 문외한이라.. 혹시 사람만 찾는 것이 목적이라면 tiny yolo를 사람에 대해서 fine tuning을 해서 성능을 높이는 방법도 있을 것 같습니다. 물론 방법은 직접 공부를 하셔야...

    • 대전학생 2017.10.30 13:04 신고 수정/삭제

      NNPACK를 검색해보시는건 어떠신지요?

      CPU나 임베디드 기기에서 뉴럴넷 가속을 위해서 나온 패키지로 알고 있습니다.

    • BlogIcon 다크pgmr 2017.11.01 13:50 신고 수정/삭제

      @대전학생 좋은 정보 감사합니다. 누군가는 이렇게 유용한 것들을 만들고 또 공유하니 참 좋은 것 같습니다.

  • ydgoo 2017.10.20 13:36 신고 ADDR 수정/삭제 답글

    네 답변 너무 감사드립니다. 저도 좀 더 찾아보도록 하겠습니다.

  • jackalee 2017.10.26 16:52 신고 ADDR 수정/삭제 답글

    안녕하세요. YOLO win7에 설치해서 해보려 하는데..
    완전 초보라. 빌드하는것도 잘 못하는데..ㅡㅡ;
    실례지만 질문 좀 드려도 될까요?? ^^;
    Github에 나온데로 따라 하는데요.
    sln파일 오픈하고 set x64하고 Release하면 된다고 적혀있던데...
    MSVS에서 어떻게 해야하나요?

    • BlogIcon 다크pgmr 2017.10.27 00:02 신고 수정/삭제

      빌드설정을 그렇게 하고 빌드를 하라는 의미인데요, vs 사용법은 설명이 힘들고 책등을 통해서 공부해야 할 것 같습니다.

  • 드디어!! 2017.11.08 20:45 신고 ADDR 수정/삭제 답글

    드디어 다크 선생님도 오시는군요!! 많은 좋은 글 기대할께요 ~ ㅋㅋ

  • 호롤롤루 2017.11.09 15:10 신고 ADDR 수정/삭제 답글

    안녕하세요 최근 우분투환경에서 yolo를 통해 object detection을 실습해보는 와중에 질문을좀 드려도 될까요ㅠㅠㅠ
    tiny yolo로 진행하고 있는데 물제 detection에 있어 조명에 영향에 성능이 떨어지는것 같습니다. 만일 opencv함수를 사용하여 영상전처리를 진행시키면서 gray scale에서 yolo를 사용할 수 있을지 의문이듭니다.
    그리고 예를들어 사람의 얼굴 하나만 detect하려고 하는데 사람의 얼굴에 대해 4~5개의 rect가 grid 되는데 1개로 구현이 가능한지 궁금합니다..ㅠㅠ

    • BlogIcon 다크pgmr 2017.11.09 16:12 신고 수정/삭제

      제가 코드를 짜거나 한 것이 아니라서 딱히 뭐라고 말씀드리기가 그렇네요.. 직접 테스트해보시면 될 것 같습니다만 제 생각에는 모두 가능할 것 같습니다.