이미지에서 object들을 detect했는데, 얼마나 정확한지 평가를 해야 합니다. 이를 위해서는 일종의 평가 지표가 필요하죠. AP와 mAP(mean average precision)도 평가의 지표입니다.

이에 대한 상세하고 쉬운 설명은 아래 링크를 참고해 주세요.

https://bskyvision.com/465

 

물체 검출 알고리즘 성능 평가방법 AP(Average Precision)의 이해

물체 검출(object detection) 알고리즘의 성능은 precision-recall 곡선과 average precision(AP)로 평가하는 것이 대세다. 이에 대해서 이해하려고 한참을 구글링했지만 초보자가 이해하기에 적당한 문서는 찾�

bskyvision.com

글쓴이가 전문가라서 그런지, 매우 이해하기 쉽게 설명해 주셔서 처음 접하는 개념인데도 이해하기 쉬웠습니다.

mAP를 구하기 위한 코드로 아래 링크를 제안해 주셨습니다.

https://github.com/Cartucho/mAP

 

Cartucho/mAP

mean Average Precision - This code evaluates the performance of your neural net for object recognition. - Cartucho/mAP

github.com

git 소스에 예제 파일들이 포함되어 있어서, 실행 및 결과를 쉽게 확인할 수 있습니다.

 

원할한 수행을 위해서는 numpy, matplotlib, opencv-python 패키지가 필요합니다.

virtualenv를 이용한 가장 기본적인 환경 설정은 다음과 같습니다.

# virtualenv 환경 설치
virtualenv venv --python=python3
# virtualenv 실행
source venv/bin/activate
# 필요한 패키지 설치
pip install numpy
pip install matplotlib
pip install opencv-python

이후에는 단순히 아래 명령어를 수행하면 됩니다.

python main.py

프로그램이 실행되면서 화면이 계속 변경되는 것을 확인할 수 있습니다.

최종적인 디렉토리 구조는 아래와 같습니다.

├── input
│   ├── detection-results # detection 결과 txt 파일들
│   ├── ground-truth      # object 정보 txt 파일들 (정답)
│   └── images-optional   # 원본 이미지
└── output                # 통계 이미지, output.txt
    ├── classes           # class별 AP 그림
    └── images            # 원본과 detection 결과를 같이 보여 주는 이미지
        └── detections_one_by_one # 각각의 object별 이미지

소스를 처음 받으면 input 폴더와 하위 폴더만 있고, 실행 후에 output 폴더가 생성됩니다.

각 폴더 및 폴더에 포함된 파일들에 대한 상세 설명은 아래와 같습니다.

  • input/detection-results : 모델을 통해서 얻어진 detection 결과값
  • input/ground-truth : ground-truth data. 일종의 정답
  • input/images-optional : 실제 사용한 이미지들
  • output : 통계 이미지. AP, mAP를 위한 실제 데이터 값 (output.txt)
  • output/classes : class별 AP 이미지
  • output/images : detection 정보 및 ground-truth data가 box 형태로 실제 이미지에 표시된 최종 결과 이미지
  • output/images/detections_one_by_one : detection된 내용이 개별적으로 이미지에 표시된 파일

detection-results에 포함된 "이미지파일명.txt" 파일들의 구성은 다음과 같습니다.

class명 confidence xtl ytl xbr ybr
  • confidence : 모델이 해당 class로 확신하는 정도. float. %
  • xtl, ytl : box의 좌측상단 좌표(top left)
  • xbr, ybr : box의 우측하단 좌표(bottom right)

ground-truth에 포함된 "이미지파일명.txt"는 위와 동일한데, confidence만 없습니다.

class명 xtl ytl xbr ybr

다음에는 예제 실행을 통해서 얻은 데이터를 확인하도록 하겠습니다.

 

- End -

반응형

 

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