darknet-kr

:kr: 다크넷(darknet): C로 작성한 신경망 공개소스

View on GitHub

:kr: 다크넷(darknet): 윈도우와 리눅스판 욜로-v2(yolo-v2) 

출처:

| 다크넷 | 설치 | 욜로 | 이미지넷분류 | 악몽 | 재사용신경망 | 다크고 | 꼬맹이망 | 분류기벼림 | 사용방법 |
| — | — | — | — | — | — | — | — | — | — |



다크넷(darknet): 윈도우와 리눅스를 위한 욜로-v3(yolo-v3)과 욜로-v2(yolo-v2)

(개체 검출을 위한 신경망) - 텐서코어를 리눅스윈도우에서 사용할 수 있다.

이 글은 https://github.com/AlexeyAB/darknet 에 작성된 욜로-사용방법만 번역한 것이다.
자신이 사용할 원본은 https://github.com/AlexeyAB/darknet 주소에서 갈라치길 바란다.


나는 한번만 본다(YOLO): 통합된, 실시간 개체검출(판 2와 3)


  1. 사용 방법
  2. 리눅스에서 컴파일하는 방법
  3. 윈도우에서 컴파일하는 방법
  4. 벼림하는 방법(물리 시각개체분류 자료, Pascal VOC)
  5. 벼림하는 방법(사용자가 정한 개체를 검출하기 위하여)
  6. 언제 벼림을 중지해야 하는가
  7. 물리 시각개체분류(Pascal VOC)로 mAP를 계산하는 방법
  8. 개체검출을 개선하는 방법
  9. 개체의 경계상자를 표시하고 설명파일을 생성하는 방법
  10. 욜로9000(Yolo9000) 사용
  11. DLL로 욜로를 사용하는 방법

| <p align="center"></p> | 처리속도 https://arxiv.org/abs/1612.08242 |
| — | — |
| <p align="center"></p> | 처리속도 https://arxiv.org/abs/1612.08242 |


나는 한번만 본다(YOLO): 통합된, 실시간 개체검출(판 2)

윈도우와 리눅스판 욜로 혼합-작업대(cross-platform), 개체검출을 위한.
도우미:
https://github.com/pjreddie/darknet/graphs/contributors

이 저장소는 리눅스판에서 갈라졌다: https://github.com/pjreddie/darknet

자세한 내용: :kr:여기는 국문, 여기는 영문

* 이 저장소가 지원하는 것:

* 요구사항

* 미리-수련된 모형

그곳에 구성(cfg)파일 각각에 대한 가중값(weights)파일이 있다(작은크기 -> 빠른 속도와 낮은 정밀도 순으로):

이것(가중값파일)은 컴파일된 근처에 넣어라: darknet.exe

구성(cfg)파일을 얻을수 있는 경로: darknet/cfg/

* 결과 본보기:

“모든것이 놀랍다!”
Everything Is AWESOME

다른것: https://www.youtube.com/channel/UC7ev3hNVkx4DzZ3LO19oebg


1. 사용 방법

* build\darknet\x64\에서 .cmd파일로 사용방법 본보기
* 명령줄로 사용하는 방법

리눅스상에서 darknet.exe대신에 ./darknet을 사용한다, 이것 처럼: ./darknet detector test ./cfg/coco.data ./cfg/yolo.cfg ./yolo.weights

* 모든 안드로이드 스마트폰을 가지고 네트워크 동영상-카메라 mjpeg-뭉치(stream) 사용을 위하여
  1. 안드로이드폰 mjpeg-뭉치(stream) 소프트웨어 내려받기: IP 웹캠 / 스카트 웹캠
  1. 와이파이(WiFi, 와이파이-라우터를 통해) 또는 유에스비(USB)를 통해 컴퓨터에 자신의 스마트폰을 연결한다

  2. 자신의 웹캠으로 스마트 웹캠을 시작한다

  3. 아래의 주소를 대체한다, 스마트폰 응용프로그램(Smart WebCam)에 보이는 주소로, 그리고 실행한다:

2. 리눅스에서 컴파일하는 방법

다크넷 디렉토리에서 직접 make를 한다. make 전에, Makefile에서 옵션같은 것을 설정할수 있다: 연결

리눅스에서 다크넷을 실행하려면 이글의 본보기를 사용하라, darknet.exe대신에 단지 ./darknet를 사용한다, 예를들어 이 명령을 사용한다: ./darknet detector test ./cfg/coco.data ./cfg/yolo.cfg ./yolo.weights

3. 윈도우에서 컴파일하는 방법

  MSVS : MicroSoft Visual Studio, 마이크로소프트 비주얼스튜디오
  CUDA : Compute Unified Device Architecture, 연산이 통합된 장치구조
  OpenCV : Open source Computer Vision, 영상계산(컴퓨터영상처리) 자원 공개
  1. 만약 MSVS 2015, CUDA 9.1, 와 OpenCV 3.0 을 가지고 있다면(포함 경로: C:\opencv_3.0\opencv\build\include 그리고 C:\opencv_3.0\opencv\build\x64\vc14\lib), 그러면 마이크로소프트 비주얼스튜디오를 시작한다, build\darknet\darknet.sln를 연다, x64Release설정한다 그리고 빌드 -> darknet 빌드를 실행한다.
    또한, cuDNN 7.0 을 가지고 있다면 윈도우 시스템변수 cudnnCUDNN 의 경로를 추가한다: 참조그림
    알림: 만약 OpenCV를 설치한다면, OpenCV 3.4.0 또는 이전버전을 사용하라. 이것은 C 응용프로그램의 OpenCV 3.4.1에서 버그다(500번을 보라).

1-1) C:\opencv_3.0\opencv\build\x64\vc14\bin에 있는 opencv_world320.dllopencv_ffmpeg320_64.dll(또는 opencv_world340.dllopencv_ffmpeg340_64.dll) 파일을 찾는다 그리고 darknet.exe이 포함된 근처에 넣는다.

1-2) C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.1안에 bininclude폴더가 있는지 확인한다. 그렇지 않으면, CUDA가 설치된 경로에서 이 폴더로 복사를 한다.

1-3) 만약 CUDNN 없이 빌드를 원한다면: \darknet.sln을 열고 -> 프로젝트 -> 속성 -> C/C++ -> 전처리기 -> 전처리기 정의에서, CUDNN을 제거한다.

  1. 다른 버전의 CUDA(9.1 아님) 를 가졌다면 문서편집기를 사용하여 build\darknet\darknet.vcxproj를 연다, “CUDA 9.1”이 포함된 2곳을 찾는다 그리고 자신의 버전으로 변경한다, 그런다음 단계1을 수행한다.

  2. 만약 GPU가 없다 면, 하지만 MSVS 2015 와 OpenCV 3.0 (포함경로: C:\opencv_3.0\opencv\build\includeC:\opencv_3.0\opencv\build\x64\vc14\lib)가 있다, 그러면 마이크로소프트 비주얼스튜디오를 시작하고, build\darknet\darknet_no_gpu.sln를 열고, x64Release 로 설정한다, 그리고 빌드 -> darknet_no_gpu 빌드 를 한다.

  3. 만약 OpenCV 3.0 대신에 OpenCV 2.4.13 을 가지고 있다 그러면 \darknet.sln을 열고나서 경로를 변경해야 한다

4-1) 프로젝트 -> 속성 -> C/C++ -> 일반 -> 추가 포함 디렉토리에 추가: C:\opencv_2.4.13\opencv\build\include
4-2) 프로젝트 -> 속성 -> 링커 -> 일반 -> 추가 라이브러리 디렉토리에 추가: C:\opencv_2.4.13\opencv\build\x64\vc14\lib

  1. 만약 가속하기 위해 CUDNN을 포함하여 빌드를 한다 그러면:

알림: CUDA는 반드시 마이크로소프트 비주얼스튜디오 2015가 설치된 후에 설치해야 한다.

3-1. 윈도우에서 컴파일하는 방법(맞춤)

또한, 자신의 darknet.slndarknet.vcxproj를 생성할수 있다, 이 본보기는 CUDA 9.1과 OpenCV 3.0에 대한 본보기다.

그런다음 생성된 자신의 프로젝트에 추가한다:

4. 벼림하는 방법(물리 시각개체분류 자료, Pascal VOC)

  1. http://pjreddie.com/media/files/darknet19_448.conv.23 에서 나선단에 대한 미리-벼림된 가중값(76 MB)을 내려받는다: 그리고 build\darknet\x64에 넣는다.

  2. Pascal VOC 자료를 내료받고 build\darknet\x64\data\voc 폴더에 묶음을 푼다 이것은 build\darknet\x64\data\voc\VOCdevkit\폴더가 생성된다:

2-1) build\darknet\x64\data\voc폴더에 voc_label.py파일을 내려받는다: http://pjreddie.com/media/files/voc_label.py

  1. 윈도우를 위한 파이썬을 내려받고 설치한다: https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe

  2. 명령을 실행한다: python build\darknet\x64\data\voc\voc_label.py(이것은 2007_test.txt, 2007_train.txt, 2007_val.txt, 2012_train.txt, 2012_val.txt 파일을 생성하기위한 것이다)

  3. 명령을 실행한다: type 2007_train.txt 2007_val.txt 2012_*.txt > train.txt(이것은 위에서 생성한 파일을 하나의 2007_train.txt 파일로 합치는 것이다)

  4. yolo-voc.2.0.cfg 파일(의 3행, 4행을)에서 batch=64subdivisions=8로 설정한다: 연결(2행)

  5. train_voc.cmd를 사용하여 벼림을 시작한다 아니면 명령행을 사용한다:
    darknet.exe detector train data/voc.data yolo-voc.2.0.cfg darknet19_448.conv.23
    ( 알림: 손실-창을 해제하기 위해서는 -dont_show표기를 사용한다. 만약 CPU 벼림은 darknet.exe대신에 darknet_no_gpu.exe을 사용한다. )

만약 필요한 경우 build\darknet\x64\data\voc.data 파일에서 경로를 변경한다.

벼림에 대한 추가정보는 연결로… : :kr:국문, 영문

알림: 만약 벼림하는 동안 avg(손실, 오차) 영역에 대하여 nan값을 봤다 - 그러면 벼림이 잘못된 것이다, 하지만 만약 nan이 다른 행에 있다 - 그러면 벼림이 잘 되는 것이다.

4-2. 다중-GPU를 가지고 벼림하는 방법
  1. 먼저 약 1000번 반복에 대해 하나의 GPU로 벼림한다:
    darknet.exe detector train data/voc.data yolo-voc.2.0.cfg darknet19_448.conv.23

  2. 그런다음 중지한다 그리고 약간 벼림된 모형 /backup/yolo-voc_1000.weights을 사용하여 다중GPU를 가지고 벼림을 한다(4개의 GPU 까지):
    darknet.exe detector train data/voc.data yolo-voc.2.0.cfg /backup/yolo-voc_1000.weights -gpus 0,1,2,3

적은 자료집합의 경우는 때대로 학습률을 줄이는 것이 더 좋다, 4 GPU 집합에 대하여 learning_rate = 0.00025(즉, learning_rate = 0.001/GPU수). 이 경우 또한 자신의 구성파일(.cfg 파일)에서 burn_in =max_batches =의 4x 배로 늘린다. 즉, 1000 대신에 burn_in = 4000을 사용한다.

https://groups.google.com/d/msg/darknet/NbJqonJBTSY/Te5PfIpuCAAJ

5. 벼림하는 방법(사용자가 정한 개체를 검출하기 위하여)

  1. yolo-voc.2.0.cfg와 같은 내용으로 yolo-obj.cfg파일을 생성한다(또는 yolo-voc.2.0.cfgyolo-obj.cfg로 복사) 그리고:
  1. build\darknet\x64\data\폴더에 obj.names파일을 생성한다, 개체 이름을 가진 - 다른 행에 각각

  2. build\darknet\x64\data\폴더에 obj.data파일을 생성한다, (여기에서 classes = 개체 개수)를 담고있는

     classes= 2
     train  = data/train.txt
     valid  = data/test.txt
     names = data/obj.names
     backup = backup/
    
  3. build\darknet\x64\data\obj\폴더에 자신의 개체 이미지파일(.jpg)을 넣는다

  4. 자신의 자료집합인 이미지에 개체 각각의 딱지(label)를 지정해야 한다. 개체의 경계상자 표식과 설명파일을 생성하기 위해 시각 GUI 소프트웨어 를 사용하라: https://github.com/AlexeyAB/Yolo_mark

    이것은 .jpg 이미지파일 각각에 대해 .txt 파일을 생성한다 - 동일 폴더에 동일한 이름으로, 하지만 .txt확장자, 그리고 파일로 쓴다: 이미지상의 개체 번호와 개체 좌표, 다른 행에 개체 각각에 대해:
    <object-class> <x> <y> <width> <height>

    여기에서:
    * <object-class> - (classes-1)을 개체번호 정수 0부터 * <x_center> <y_center> <width> <height> - 이미지의 너비와 높이에 관련된 실수값, 이것은 0.0 ~ 1.0 이다 * 예를들어: <x> = <absolute_x> / <image_width> 또는 <height> = <absolute_height> / <image_height> * 주의: <x_center> <y_center> - 이것은 사각형의 중심이다 (상-좌 모서리가 아니다)

    예를들어 img1.jpg에 대해 담고있는 img1.txt가 생성된다:

     1 0.716797 0.395833 0.216406 0.147222
     0 0.687109 0.379167 0.255469 0.158333
     1 0.420312 0.395833 0.140625 0.166667
    
  5. build\darknet\x64\data\폴더에 train.txt파일을 생성한다, 자신의 이미지 파일이름을 가진, 다른행에 각각의 파일이름, darknet.exe에 상대경로를 가진, 담고있는 예를 들면:

  data/obj/img1.jpg
  data/obj/img2.jpg
  data/obj/img3.jpg
  1. 나선단에 대해 미리-벼림된 가중값(76 MB)을 내려받는다. 그리고 build\darknet\x64폴더에 넣는다.

  2. 명령행을 사용하여 벼림을 시작한다:
    darknet.exe detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23

    리눅스에서 벼림하기위해 사용하는 명령: ./darknet detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23 (darknet.exe대신에 ./darknet사용)

8-1) 벼림을 위해 4세대마다 계산한 평균정밀도평균(mAP: mean Average Precisions)을 가짐(obj.data파일에 valid=valid.txt또는 train.txt을 설정) 그리고 실행: darknet.exe detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23 -map

  1. 벼림이 완료된 후에 - build\darknet\x64\backup\경로에서 yolo-obj_final.weights결과를 얻는다
5-2. 꼬맹이-욜로(tiny-yolo) 벼림하는 방법(자기맞춤 개체 검출을 위해)

위에 설명한것 처럼 욜로모형 전체에 대해 모두 동일 단계로 수행한다. 이것을 제외한 부문을 가지고:

다른 모형을 기반으로 욜로를 벼림하기 위해( DenseNet201-Yolo 또는 ResNet50-Yolo ), 이 파일에 표시된대로 미리-벼림된 가중값을 내려받아 얻을수 있다: https://github.com/AlexeyAB/darknet/blob/master/build/darknet/x64/partial.cmd
만약 다른 모형을 기반으로 하지 않은 자기맞춤 모형을 만든다, 그러면 미리-벼림됨 가중값 없이 벼림할수 있다, 이때 뿌린 초기 가중값이 사용된다.

6. 언제 벼림을 중지해야 하는가

각 분류(개체)에 대해 보통 2,000번 반복이면 충분하다, 하지만 전체(자료집합 전체)로 적어도 4,000번 반복한다. 하지만 더 정밀한 정의를 위해 벼림을 중단 해야만 할때, 다음 설명을 사용하라:

  1. 벼림하는 동안, 다양한 오류지수를 볼 것이다, 그리고 0.060730 avg 가 더이상 줄지 않을때 멈춰야 한다:

Region Avg IOU: 0.798363, Class: 0.893232, Obj: 0.700808, No Obj: 0.004567, Avg Recall: 1.000000, count: 8 Region Avg IOU: 0.800677, Class: 0.892181, Obj: 0.701590, No Obj: 0.004574, Avg Recall: 1.000000, count: 8

9002: 0.211667, 0.060730 avg, 0.001000 rate, 3.868000 seconds, 576128 images Loaded: 0.000000 seconds

많은 반복에서 평균손실 0.xxxxxx avg 이 더이상 줄지않는 것을 봤을때 그때 벼림을 중지해야만 한다.

  1. 일단 벼림이 멈추면, darknet\build\darknet\x64\backup에서 .weights파일의 마지막 일부를 가져와야 한다, 그리고 그중에 최적을 선택한다:

예를들어, 9,000번 반복후에 벼림을 중지했다, 하지만 최적의 결과는 이전 가중값중에서 하나를 가질수 있다(7000, 8000, 9000). 이것은 심한(과도)적합으로 인해 발생될수 있다. 과도적합(Overfitting) 의 경우 벼림-자료집합에서 이미지로 개체검출을 할때, 모든 다른 이미지로 개체검출을 할수 없다. 반드시 이른 중지지점, Early Stopping Point 에서 가중값을 가져와야 한다:

과도적합
이른 중지지점(Early Stopping Point)에서 가중값을 가져오기 위해!

2-1) 먼저, 자신의 obj.data파일안에 검증 자료집합 valid = valid.txt에 경로를 반드시 지정해야 한다(valid.txt형식을 train.txt처럼), 그리고 만약 검증이미지가 없다면, 그냥 data\train.txtdata\valid.txt로 복사한다.

2-2) 만약 벼림이 9,000번 반복후에 중지되었다면, 이전가중값 일부를 검증하기 위해 이 명령을 사용한다:

( 만약 다른 깃허브 저장소를 사용한다, 그러면 darknet.exe detector map… 대신에 darknet.exe detector recall… 을 사용한다 )

그리고 각 가중값(7000, 8000, 9000)에 대해 마지막 출력행을 비교한다:

가장높은 mAP(평균정밀도 평균, mean Average Precision) 또는 교차겹침결합(IoU, Intersect over Union) 을 가진 가중값 파일을 선택한다

예를들어, 더큰 IoUyolo-obj_8000.weights가중값이다 - 그러면 검출을 위해 이 가중값을 사용한다.

아니면 그냥 -map 표기를 하고 벼림한다:
darknet.exe detector train data/obj.data yolo-obj.cfg darknet19_448.conv.23 -map

  주의:
    -map 는 평균정밀도평균 mAP를 의미하는 map 임을 기억하라.
    형식, 양식등을 의미하는 지도(map) 의미가 아님.

그러면 손실-챠트 창에서 mAP-챠트(적색)를 볼수있다. 평균정밀도 평균(mAP)는 valid=valid.txt파일을 사용하여 4세대(Epoch) 마다 계산된다 이것은 obj.data파일에 지정된 것이다(1세대(Epoch) = train.txt의 이미지수 / batch 반복)

손실_챠트-mAP_챠트

맞춤 개체검출 본보기: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

평균정밀도 평균(mAP)은 PascalVOC 경쟁(대회)에서 기본 정밀도 측정법 이다, 이것은 MS COCO 경쟁(대회)에서 AP50 측정법과 동일하다. 위키의 관점에서, 정밀도(Precision)와 기억(재현, Recall) 지표는 PascalVOC 경쟁(대회)과는 약간 다른 의미를 가진다, 하지만 교차겹침결합(IoU: Intersect over Union)은 항상 동일한 의미다.

정밀도_기억_교차겹침결합

7. 물리 시각개체분류(Pascal VOC)로 mAP를 계산하는 방법

  1. PascalVOC-2007-test 로 평균정밀도평균(mAP: mean Average Precision)을 계산하기 위해:

( 이 글은 YOLOv2 416×416에 대해 mAP = 76.8% 값을 명시했다, 4 페이지 표-3: https://arxiv.org/pdf/1612.08242v1.pdf. 우리는 낮은값을 가진다 - 아마도 실제로 검출된 코드와 약간 다른 소스코드로 벼림된 모형이기 때문일 것이다 )

7-2 맞춤 개체검출

맞춤 개체검출의 본보기: darknet.exe detector test data/obj.data yolo-obj.cfg yolo-obj_8000.weights

<p align="center"></p>
<p align="center"></p>

8. 개체검출을 개선하는 방법

  1. 벼림 전:
  1. 벼림 후 - 검출을 위해:

9. 개체의 경계상자를 표시하고 설명파일을 생성하는 방법

여기에서 Yolo v2 와 v3를 위한 개체의 경계상자 표시와 설명파일을 생성하기 위해 GUI-스프트웨어를 가진 저장소를 찾을수 있다: https://github.com/AlexeyAB/Yolo_mark

본보기 : 개체 2 분류(air, bird)를 위해 train.txt, obj.names, obj.data, yolo-obj.cfg, air1-6.txt, bird1-4.txt 그리고 Yolo v2 와 v3으로 이 이미지-집합을 벼림하는 방법은 train_obj.cmd

10. 욜로9000(Yolo9000) 사용

9,000개 개체를 동시에 검출과 분류를 한다: darknet.exe detector test cfg/combine9k.data cfg/yolo9000.cfg yolo9000.weights data/dog.jpg

11. DLL로 욜로를 사용하는 방법

  1. 욜로를 C++ DLL 파일 yolo_cpp_dll.dll로 컴파일하기 위해 - MSVS 2015에서 build\darknet\yolo_cpp_dll.sln파일을 열고, x64Release 로 설정한다, 그리고 실행한다: 빌드 -> yolo_cpp_dll 빌드
  1. 욜로를 자신의 C++ 콘솔응용프로그램에서 DLL 파일로 사용하기 위해 - MSVS 2015에서 build\darknet\yolo_console_dll.sln파일을 열고, x64Release 로 설정한다, 그리고 실행한다: 빌드 -> yolo_console_dll 빌드

yolo_cpp_dll.dll-API: 연결(42행)

class Detector
{
public:
	Detector(std::string cfg_filename, std::string weight_filename, int gpu_id = 0);
	~Detector();

	std::vector<bbox_t> detect(std::string image_filename, float thresh = 0.2, bool use_mean = false);
	std::vector<bbox_t> detect(image_t img, float thresh = 0.2, bool use_mean = false);
	static image_t load_image(std::string image_filename);
	static void free_image(image_t m);

#ifdef OPENCV
	std::vector<bbox_t> detect(cv::Mat mat, float thresh = 0.2, bool use_mean = false);
#endif
};