mAP 계산법
2019.02.24 09:53
https://inspace4u.github.io/dllab/lecture/2017/11/07/Mean_Average_Precision.html
https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173
https://eehoeskrap.tistory.com/237
개요
mAP는 이진 분류기의 성능 지표로 사용되는 정밀도와 재현율을 이용한 지표이며 객체 검출 알고리즘의 성능을 평가하는데 널리 사용합니다.
- 정밀도(Precision)는 양성으로 판정된 것 중 실제로 참인 것의 비율을 나타냅니다. ‘참 양성 / (참 양성 + 거짓 양성)’으로 정의됩니다.
- 재현율(Recall)은 실제 값이 참인 것 중 판정이 양성인 것의 비율을 나타냅니다. ‘참 양성 / (참 양성 + 거짓 음성)’으로 정의됩니다.
재현율은 민감도(sensitivity)라는 이름으로도 불립니다.
딥러닝 객체 검출 알고리즘에서는 검출된 상자가 참일 가능성(확률)이 같이 출력됩니다. 확률이 몇 퍼센트 이상일 때 양성으로 판정할지의 기준선인 ‘임계값’을 몇으로 정하는지에 따라서 예측 결과가 참인지 거짓인지가 달라지기 때문에 정밀도와 재현율도 모두 달라지게 됩니다. 임계값을 바꿔가면서 실제로 참인 객체가 임계값 내에 포함될 때마다 정밀도와 재현율을 모두 측정하면 실제로 참인 객체 만큼의 정밀도, 재현율 쌍이 생기게 됩니다. 여기서 정밀도만을 골라 내어 평균을 낸 것이 평균 정밀도(AP; average precision)입니다.
객체 검출에서 출력되는 경계 박스는 참인지 거짓인지가 출력되지 않고 경계 박스의 위치만이 출력됩니다. 이 경계 박스를 실제로 참으로 볼지 거짓으로 볼지는 실체 위치(ground truth)와 검출된 객체 상자 간의 IoU 값이 일정 이상인지를 평가하여 이루어집니다.
mAP는 평균 정밀도를 다시 한번 더 평균 낸 값입니다. 분류기가 검출 가능한 각 분류 별로 정해진 테스트셋에서 평균 정밀도를 구하고 평균 정밀도를 다시 한번 더 평균 내면 mAP 값의 결과가 나오게 됩니다.
예제
파이썬 패키지 중 scikit-learn은 mAP를 계산하고 정밀도-재현율 그래프를 작성할 수 있는 기능을 제공하기 때문에 위 과정을 직접 구현할 필요는 없습니다.
truths = []
scores = []
for img_path in images_path:
detected_box = # 딥러닝 객체검출에서 검출된 경계박스
prob = # 딥러닝 객체검출이 출력한 객체일 확률
true_box = # 실제 객체의 위치에 대한 경계박스
is_true = int(get_iou(detected_box, true_box) > 0.5)
truths.append(is_true)
scores.append(prob)
먼저 위와 같이 각 경계박스가 실제로 참인지 거짓인지를 나타내는 값을 0 또는 1로 가지고 있는 레이블 리스트와 객체 검출 알고리즘에서 출력된 확률을 담은 점수 리스트를 작성합니다. 여기서 get_iou는 두 경계 박스의 IoU를 구하는 사용자 정의 함수입니다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.metrics import average_precision_score, precision_recall_curve
truths = np.array(truths)
scores = np.array(scores)
ap = average_precision_score(truths, scores)
print('평균 정밀도(AP)는 {}입니다.'.format(ap))
precision, recall, _ = precision_recall_curve(truths, scores)
plt.plot(recall, precision, color=colors[graphidx], label='{0} ({1:0.2f})'.format(key, ap), lw=2)\
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('Precision-recall curve')
plt.ylim([0.0, 1.05])
plt.xlim([0.0, 1.0])
plt.legend(loc='lower left')
plt.savefig('prcurve.png')
그 후 두 리스트를 넘파이 배열로 변환한 다음에 위 예제 코드와 같이 average_precision_score, precision_recall_curve 함수에 인자로 넘겨주면 각각 평균 정밀도 값과, 그래프를 그리는데 사용할 수 있는 정밀도, 재현율 리스트를 얻을 수 있습니다.
Computer Vision 쪽에 Object Detection 알고리즘 논문을 보면
성능평가지표로 mAP (mean Average Precision) 이라는 것을 이용한다.
mAP 란 무엇인지 알아보고 python 으로 구현하는 방법을 정리하자.
1. mAP (mean Average Precision)
먼저 용어해석을 통해 mAP 가 대략적인 의미를 알아보자.
Precision
분류기의 성능평가지표로 사용하는 Precision-Recall 에서의 Precision과 같은 의미이다.
인식기 (object-detector) 가 검출한 정보들 중에서 Ground-Truth 와 일치하는 비율을 의미한다.
AP (Average Precision)
Recall value [0.0, 0.1, …, 1.0] 값들에 대응하는 Precision 값들의 Average 이다.
mAP (mean Average Precision)
1개의 object당 1개의 AP 값을 구하고, 여러 object-detector 에 대해서 mean 값을 구한 것이 mAP 이다.
* Note: mAP 를 이해하기 위해서는 Precision-Recall 값에대한 이해가 필요하다. Precision / Recall 를 참고하자. *
즉 mAP란 mutiple object detection 알고리즘에 대한 성능을 1개의 scalar value로 표현한 것이다.
2. mAP 를 구하는 방법
The PASCAL Visual Object Classes (VOC) Challenge (1) 수식에 보면 object detection 의 성능평가 지표로 mAP 를 어떻게 구하는 지가 나와있다.
이를 토대로 구하는 순서를 정리해보자.
2.1 recall-precision 그래프를 그린다.
웹상에서 recall-precision 그래프에 대한 설명은 많이들 나와있다. 그러나 object-detection 과정에서 recall-precision 그래프를 어떻게 그리는지에 대해서는 자료를 찾기가 어려웠다.
몇 가지 자료를 찾아보고 구현하기 위해 고민해본 결과 아래와 같은 Procedure 를 생각할 수 있었다.
1) Threshold 를 0으로 정해놓고 detection 알고리즘을 모든 test image 에 돌려본다.
이 때 non-maximum-suppression 을 on 으로 설정하였다.
실제 Test Time 에서 객체를 검출할 떄 NMS 를 on 하고 operation 하기 때문에 이렇게 하는 것이 맞는 것 같다.
2) bounding-box 에 해당하는 confidence score (객체일 확률)과 true positive / false positive 여부를 Pair로 저장한다.
bounding-box 좌표는 필요없다.
true positive / false positive 는 검출영역과 Ground-Truth 영역간의 겹치는 영역 (overlapped region) 으로 판단한다.
if is true positive
else is false positive
: prediction box
: ground truth box
3) (prob, ) pair 를 확률값에 따하 내림차순으로 정렬한다.
이렇게 하면 아래와 같은 recall-precision 그래프를 그릴 수 있다. 그래프 그리는 과정은 Evaluation 11: interpolated recall-precision plot 를 참조하자.
2.2. Interpolated recall-precision 값 11개를 구한다.
위 수식에 따라 11개의 recall 값에 대한 precision 값을 구한다.
11개의 recall 값 : [0.0, 0.1, …, 1.0] 의 evenly-spaced 11-values
2.3. AP 를 구한다.
이 과정은 간단하다. 11개의 precision 값을 평균낸다. 수식으로 표현하면 아래와 같다.
2.4. mAP 를 구한다.
여기도 간단하다. 1개 object 에 대한 측정값이 AP 이므로 여러개의 object 에 대해 AP 를 구하고 평균내면 mAP 가 된다.
출처: https://eehoeskrap.tistory.com/237 [Enough is not enough]
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
1789 | Russian - русский | WHRIA | 2024.05.24 | 17 |
1788 | Romanian - română | WHRIA | 2024.05.24 | 36 |
1787 | Punjabi - ਪੰਜਾਬੀ | WHRIA | 2024.05.24 | 26 |
1786 | Portuguese - português | WHRIA | 2024.05.24 | 22 |
1785 | Polish - polski | WHRIA | 2024.05.24 | 37 |
1784 | Persian - فارسی | WHRIA | 2024.05.24 | 26 |
1783 | Pashto - پښتو | WHRIA | 2024.05.24 | 29 |
1782 | Odia - ଓଡ଼ିଆ | WHRIA | 2024.05.24 | 17 |
1781 | Nyanja - Nyanja | WHRIA | 2024.05.24 | 28 |
1780 | Norwegian - norsk | WHRIA | 2024.05.24 | 27 |
1779 | Nepali - नेपाली | WHRIA | 2024.05.24 | 25 |
1778 | Māori - te reo Māori | WHRIA | 2024.05.24 | 29 |
1777 | Mongolian - монгол | WHRIA | 2024.05.24 | 40 |
1776 | Marathi - मराठी | WHRIA | 2024.05.24 | 21 |
1775 | Maltese - Malti | WHRIA | 2024.05.24 | 17 |