Table Of Content

Darknet(pjreddie.com/darknet/)은 tensor flow, keras와 같이 big data를 처리하기 위한 framework 중의 하나로 이해하고 있습니다.

대부분 python 기반으로 제공하는 일반적인 big data framework과 달리, 이미지 추출을 위해서 빠른 처리 시간을 제공하는 c 언어 기반의 framework입니다.

워낙 널리 사용되고 유명해서 참고할만한 페이지들이 많기는 합니다만, 다시 한번 정리해 봅니다. (Host 시스템: 우분투 18.04)

1. 소스 다운로드 하고, 컴파일 하기

$ git clone https://github.com/AlexeyAB/darknet.git
$ cd darknet
$ make

- 컴파일이 정상적으로 완료되면, darknet이라는 실행파일이 생성됩니다.

2. weight 파일 다운로드하기

- darknet을 실행하기 위해서는 cfg 파일과 weights 파일이 필요합니다.

- weights 파일은 크기가 커서(over than 250MB) git 소스에 포함되어 있지 않으며, 따로 다운로드 해야 합니다.

- weights 파일의 종류는 pjreddie.com/darknet/yolo/에 있는 아래 그림에서 wieghts 부분을 누르면 다운로드 할 수 있습니다.

Darknet original weights

- 시험에 사용한 3개의 weights들(yolo-voc.weights, yolov3-tiny.weights, yolov3.weights)은 아래 명령어로도 다운로드 받을 수 있습니다.

$ wget https://pjreddie.com/media/files/yolo-voc.weights
$ wget https://pjreddie.com/media/files/yolov3-tiny.weights
$ wget https://pjreddie.com/media/files/yolov3.weights

- cfg 파일과 weights 파일은 pair가 맞아야 합니다.

3. 예제 실행하기

- data 폴더에는 여러개의 예제 jpg 파일들이 있으며, 이를 이용해서 시험할 수 있습니다.

- 아래 명령어들을 이용해서 darknet을 실행할 수 있습니다. 이 두 명령은 동일합니다.

$ ./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg

- 여기서 'detecor test' 명령에는 data 파일이 사용되는데, data 파일의 형식은 다음과 같습니다. (coco.data 파일에 주석을 달았습니다.)

# #는 주석 표시
# class의 갯수
classes= 80
# train에 사용하는 파일
train  = /home/pjreddie/data/coco/trainvalno5k.txt
# validation이나 test에 사용하는 파일
valid  = coco_testdev
#valid = data/coco_val_5k.list
# class와 class id를 matching시키기 위한 names 파일
names = data/coco.names
backup = /home/pjreddie/backup/
eval=coco

- 시험에 사용할 파일명( (여기서는 data/dog.jpg)을 맨 마지막에 넣어 줬는데, 파일명이 없는 경우 아래와 같은 메시지가 출력되면서 파일 경로 입력을 기다립니다.

"Enter Image Path: 

- 인식 확률이 출력되는데, '-ext_output' 옵션을 추가하면, 검출된 objects의 위치와 크기 정보를 출력합니다.

$ ./darknet detector test cfg/coco.data cfg/yolov3.cfg yolov3.weights data/dog.jpg -ext_output
....
bicycle: 99%	(left_x: 118 top_y: 124 width: 452 height: 309)
dog: 100%	(left_x: 124 top_y: 223 width: 196 height: 320)
truck: 93%	(left_x: 474 top_y: 87 width: 216 height: 79)
Not compiled with OpenCV, saving to predictions.png instead


4. mAP 측정하기

- 성능의 측정을 위해서 주로 사용하는 것은 mAP(mean Average Precision)입니다.

- 자세한 설명은 https://bskyvision.com/465를 참고해 주세요. mAP를 전혀 몰랐지만, 어렴풋이 이해하는데 큰 도움이 됩니다.

- mAP는 다음 명령어로 확인할 수 있습니다.

$ ./darknet detector map cfg/coco.data cfg/yolov3.cfg yolov3.weights

- cfg/coco.data 파일의 valid 필드에 포함된  파일에 시험을 진행할 files이 적혀 있어야 합니다.

- 본 예제에서는 coco_testdev 파일이며, 해당 파일에 data/dog.jpg만 적도록 합니다.

- mAP 계산을 위해서는 이미지 파일과 정답 annotation 파일(해당 파일에 있는 objects의 위치와 크기를 표시해 둔 파일)이 필요합니다.

- 본 예제에서는 data/dog.jpg와 data/dog.txt 파일이 됩니다.

- data/dog.jpg는 git source에 포함되어 있지만, data/dog.txt 파일은 따로 없습니다.

- 앞서'-ext_output' 옵션을 사용해서 확인한 내용을 정리해서 dog.txt 파일로 만들어 시험했습니다.

- dog.txt 파일의 형식은 "class ID, X, Y, width, height" 순서입니다.

   https://github.com/AlexeyAB/Yolo_mark/issues/60를 참고하면 다음의 내용을 확인할 수 있습니다.

.txt-file for each .jpg-image-file - in the same directory and with the same name, but with .txt-extension, and put to file: object number and object coordinates on this image, for each object in new line: <object-class> <x> <y> <width> <height>

Where:

    <object-class> - integer number of object from 0 to (classes-1)
    <x> <y> <width> <height> - float values relative to width and height of image, it can be equal from (0.0 to 1.0]
    for example: <x> = <absolute_x> / <image_width> or <height> = <absolute_height> / <image_height>
    atention: <x> <y> - are center of rectangle (are not top-left corner)

For example for img1.jpg you will be created img1.txt containing:

- 여기서 X, Y는 이미지의 start point가 아니라, 전체 이미지의 center 값입니다. 내용을 이해하기 어려운데 git source의 script/voc_lable.py의 convert() 함수에 다음 내용이 있습니다.

x = (box[0] + box[1])/2.0 - 1
y = (box[2] + box[3])/2.0 - 1
x = x*dw
w = w*dw

여기서 box[0], box[1]은 xmin, xmax로, box[2], box[3]은 ymin, ymax로 이해하면 되며, 이를 수식으로 표시하면 다음과 같습니다.

x1 : (xmin + xmax)/2 - 1 = xmin + width/2 - 1
y1 : (ymin + ymax)/2 - 1 = ymin + height/2 - 1

x = x1 / image_width
y = y1 / image_height

즉, X, Y는 object의 center 값입니다.

- 시험에 사용한 dog.txt는 다음과 같습니다.

1  0.447 0.483 0.588 0.536
16 0.289 0.664 0.255 0.555
7  0.757 0.219 0.281 0.137

- 이제 준비는 다 되었고, 앞서 명령어를 실행합니다.

$ ./darknet detector map cfg/coco.data cfg/yolov3.cfg yolov3.weights

-시험 결과는 다음과 같습니다.

...
for conf_thresh = 0.25, precision = 1.00, recall = 1.00, F1-score = 1.00 
for conf_thresh = 0.25, TP = 3, FP = 0, FN = 0, average IoU = 99.31 % 

IoU threshold = 50 %, used Area-Under-Curve for each unique Recall 
mean average precision (mAP@0.50) = 0.037500, or 3.75 %

- 여기서 mAP 3.75%는 80개의 class 중 3개 class에 대해서 AP가 100%이기 때문입니다. (3x100%/80 = 0.0375)

 

이상으로 간단하게 정리한 darknet의 예제 실행을 마무리 합니다.

 

- End -

반응형

'프로그래밍 > Big data' 카테고리의 다른 글

[Big data] AP, mAP  (0) 2020.09.23
[Big data] darknet 기본 시험 방법 - 2  (0) 2020.09.15

+ Recent posts