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 부분을 누르면 다운로드 할 수 있습니다.
- 시험에 사용한 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 |