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

네트워크 프로토콜 관련해서 시험해 보았습니다.

프로토콜의 맨 마지막 형식은 CRC로 패킷 일부에 대한 CRC를 계산하도록 되어 있고,  사용하는 형식은 "표준 CRC 16"이라고 되어 있었습니다.

CRC 16 관련 코드를 찾아서 구현하고 서버로 패킷을 전송했습니다.

그런데 response packet에서 CRC 16 error를 확인할 수 있었습니다.

코드를 다시 한번 확인해 보아도 이유를 알 수가 없었습니다.

다행시 response packet에서 CRC 필드를 확인할 수 있고, 제가 사용하는 코드에 넣어서 시험했더니 받은 CRC 값과 계산한 CRC 값이 틀린겁니다.

검색을 해 봐도 이유를 확인하기 어렵고 ㅠㅠ

그러다 만난 사이트입니다.

 

https://crccalc.com/

 

Online CRC-8 CRC-16 CRC-32 Calculator

Please enable JavaScript on this site or click one of the buttons above. Share your result: Cookies policies

crccalc.com

사이트에 접속하면 아래와 같은 화면을 볼 수 있습니다.

(1) 입력한 데이터를 Hex로 확인합니다. Byte align이 맞지 않는 경우는 (3)의 9를 표시하는 방법을 참고하면 되겠습니다.

(2) 맨 아래 Processed data 필드 (3)를 활성화합니다. 실제 계산에 사용하는 입력 데이터를 확인할 수 있습니다.

(3) 실제 계산에 사용하는 데이터입니다.

(4) CRC 계산 방법을 선택합니다.

 

CRC16을  선택했는데, 사용하는 Algorithm이 아래와 같이 매우 다양했습니다.

입력 packet의 CRC와 일치하는 algorithm을 확인해보니 CRC-16/MODBUS였습니다.

이를 검색해서 코드를 사용했더니 CRC 에러가 발생하지 않았습니다.

 

- End -

반응형

'프로그래밍 > Tips & sites' 카테고리의 다른 글

[Obsidian] Google drive와 연동하기  (0) 2022.04.03
[Tips] 파워포인트 매크로  (0) 2019.12.28
[Tips] VIM  (0) 2019.12.17
[Tips] Notepad++  (0) 2019.12.15

Python으로 프로그래밍을 하다 보면, 반복해서 수행하는 함수나 loop등에서 변수들의 상태를 모니터링하고 싶은 경우가 많습니다. 물론 print 함수를 이용해서 하나 하나 trace할 수도 있지만, Python이 제공하는 디버깅 기능을 이용하면 좋습니다.

기본적인 예제는 다음과 같습니다.

from IPython.core.debugger import set_trace

sum = 0

for i in range(10):
    sum += i
    set_trace()

set_trace()가 동작할 때는 jupyter notebook에 아래와 같은 입력창이 활성화됩니다.

입력창에 필요한 디버깅 command를 입력하거나, 확인하고자 하는 변수를 입력하고 enter를 눌러 결과를 확인할 수 있습니다.

디버깅 command와 관련해서는 입력창에 'help'를 입력하면 아래와 같이 사용가능한 command들이 나타납니다. 그리고 디버깅 command에 대해서 좀 더 확인하고 싶으면, 'help command명'을 입력하면 설명을 확인할 수 있습니다.

아래는 위의 예제를 실제 실행하면서, i와 sum 변수를 중간 중간 출력한 화면입니다. 출력 이후 다시 실행하기 위해서는 'c' 명령을 입력하였습니다. 마지막으로 디버깅을 멈추기 위해서는 'q'를 입력했습니다.

 

만약 'q'를 입력해서 프로그램을 종료하지 않은 상태로, jupyter notebook의 다른 명령을 실행시키는 경우 실행이 종료되지 않습니다. 이 경우 해당 notebook을 'Shutdown'후 다시 실행하면 됩니다.

- End -

반응형

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

[Python] Unicode error  (0) 2021.11.23
[Python] 폴더 생성, tar 예제  (0) 2020.05.03
[Python] Animation 예제  (0) 2020.05.03
[Python] matplotlib 예제  (0) 2020.05.03

+ Recent posts