2019-04-09 17:29:31

물체 검출(object detection) 알고리즘의 성능은 precision-recall 곡선과 average precision(AP)로 평가하는 것이 대세다. 이에 대해서 이해하려고 한참을 구글링했지만 초보자가 이해하기에 적당한 문서는 찾기 쉽지 않았다. 거의 모든 문서들이 물체 검출 분야에 대한 선지식이 있어야만 이해할 수 있는 수준이었다.

 

여러 문서들에서 헤매다가 어렵게 이해한 내용들을 여기에 정리하려고 한다. 천천히 정독한다면 누구에게든 도움이 될 것이다. precision-recall 곡선과 AP를 이해하기 위해서는 우선 precision과 recall에 대한 지식이 필요하다. 

 

Precision과 Recall

Precision은 한국어로 정밀도라고 불린다. precision은 모든 검출 결과 중 옳게 검출한 비율을 의미한다. 다음과 같이 식으로 나타낼 수 있다. 

 

 

여기서 TP는 true positive의 약자로 '옳은 검출'을 의미하고, FP는 false positive의 약자로 '잘못된 검출'을 의미한다. 그러니까 Precision은 알고리즘이 검출해낸 것들 중에서 제대로 검출해낸 것의 비율을 의미하는 것이다. 예를 들어 알고리즘이 5개를 검출해냈는데(실제 몇 개의 물체가 검출되어야 하는지와 상관없이) 그 중 4개가 옳게 검출해낸 것이라면 Precision은 4/5 = 0.8이다. 

 

Recall은 한국어로 재현율이라고 불린다. (왜 precision과 recall이 각각 정밀도와 재현율로 불리는지 이해하려고 하는 것보다 그냥 precision과 recall이 각각 무엇을 의미하는지를 이해하면 된다고 생각한다.) Recall은 마땅히 검출해내야하는 물체들 중에서 제대로 검출된 것의 비율을 의미한다. Recall을 구하는 공식을 살펴보자. 

 

 

여기서 FN은 false nagative의 약자로 '검출되었어야 하는 물체인데 검출되지 않은 것'을 의미한다. 예를 들어, 라벨이 붙어있는 물체(즉, 마땅히 검출되어야 할 물체)가 10개인데 그 중 4개가 옳게 검출되었다면 recall은 4/10 = 0.4가 된다. 

 

TP, FP, FN 그리고 설명하지 않은 TN(true negative)에 대해서 표로 정리해보았다. 

 

TP, FP, FN, TN이란?

 

Precison만으로 물체 검출 알고리즘의 성능을 평가하는 것은 적절하지 않다. 또한 Recall만으로 성능을 평가하는 것도 적절하지 않다. 위에서 예시로 든 것처럼, 실제 검출되어야하는 물체가 10개인데 알고리즘이 검출해낸 물체는 5개이고 그 중 4개가 맞다고 가정해보자. 그러면 이때 Precision = 4/5 = 0.8이고, Recall = 4/10 = 0.4다. Precision으로 보면 성능이 좋아보이지만 Recall로 보면 성능이 그닥 좋지 않아보인다. 중요한 것은 Precision과 Recall은 항상 0과 1사이의 값으로 나오게 되는데, Precision이 높으면 Recall은 낮은 경향이 있고, Precision이 낮으면 Recall이 높은 경향이 있다는 것이다. 따라서 어느 한 값 만으로 알고리즘의 성능을 평가하는 것은 거의 불가능하고, 두 값을 종합해서 알고리즘의 성능을 평가해야 한다. 그래서 필요한 것이 precision-recall 곡선 및 AP이다. 이것들에 대해서는 밑에서 다루도록 하겠다.

 

그 전에 먼저 살펴봐야 할 것이 있다. 물체를 검출했을 때 옳게 검출되었다와 옳게 검출되지 않았다를 구분해주는 기준, 즉 TP(옳은 검출)와 FP(틀린 검출)를 결정해주는 기준은 무엇일까? 그 기준은 바로 intersection over union(IoU)이다.

 

Intersection over union (IoU)

아래와 같은 ground truth 바운더리 박스를 라벨로 가진 이미지가 있다고 가정해보자. ground truth 바운더리 박스는 마땅히 검출되어야 할 물체를 감싸고 있다. 

 

ground truth 바운더리 박스

 

이 이미지의 ground truth 바운더리 박스가 주어지지 않은 상황에서 어떤 알고리즘에 의해 예측된 바운더리 박스가 다음과 같다고 가정해보자.

 

예측된 바운더리 박스

 

이런 상황에서 예측된 검출이 맞는지 틀린지를 어떻게 결정하면 좋겠는가? 이런 고민 끝에 나온 것이 바로 IoU이다. IoU는 예측된 바운더리 박스와 ground truth 바운더리 박스간 중첩되는 부분의 면적을 측정해서 중첩된 면적을 합집합의 면적으로 나눠준다. 아래 공식을 보자.

 

IoU 계산

 

이 값이 0.5 이상이면 제대로 검출(TP)되었다고 판단한다. 반면 0.5 미만이면 잘못 검출(FP)되었다고 판단한다. (이 문턱값은 다른 값으로 설정될 수도 있다.) 꽤 합리적이지 않는가? 

 

Precision-Recall 곡선

이제 Precision-recall 곡선(PR 곡선)을 다룰 준비가 되었다. PR 곡선은 confidence 레벨에 대한 threshold 값의 변화에 의한 물체 검출기의 성능을 평가하는 방법이다. confidence 레벨은 검출한 것에 대해 알고리즘이 얼마나 확신이 있는지를 알려주는 값이다. 만약에 어떤 물체를 검출했는데 confidence 레벨이 0.999라면 굉장히 큰 확신을 가지고 검출한 것이다.

 

알고리즘 曰 "이 검출은 거의 99.9% 정확해. 난 그렇게 생각해."

 

참고로 confidence 레벨이 높다고 해서 무조건 검출이 정확한 것은 아니다. 알고리즘 스스로 그런 느낌 또는 확신을 갖고 있는 것이다. confidence 레벨이 낮으면 그만큼 검출 결과에 대해서 자신이 없는 것이다. 따라서 알고리즘의 사용자는 보통 confidence 레벨에 대해 threshold 값을 부여해서 특정값 이상이 되어야 검출된 것으로 인정한다. threshold 값이 0.4라면 confidence 레벨로 0.1 또는 0.2를 갖고 있는 검출은 무시하는 것이다. 

 

따라서 이 confidence 레벨에 대한 threshold 값의 변화에 따라 precision과 recall 값들도 달라질 것이다. 이것을 그래프로 나타낸 것이 바로 PR 곡선이다. 아마 무슨 말인지 잘 이해가 안되는 분들도 계실 것이다(어쩌면 그게 정상일 수도...). 하지만 좌절하지 말고 아래 예를 통해서 이해해보자.

 

15개의 얼굴이 존재하는 어떤 데이터셋에서 한 얼굴 검출(face detection) 알고리즘에 의해서 총 10개의 얼굴이 검출(confidence 레벨 0부터 100%까지 모두 고려했을 때)되었다고 가정해보자. 이때 각 검출의 confidence 레벨과 옳게 검출되었는지 잘못 검출되었는지에 대한 여부는 아래 표에 나타냈다. (TP는 옳은 검출, FP는 틀린 검출)

 

 

10개 중 7개가 제대로 검출되었고, 3개는 잘못 검출되었다. 이때 Precision = 옳게 검출된 얼굴 갯수/검출된 얼굴 갯수 = 7/10 = 0.7이 되고, Recall = 옳게 검출된 얼굴 갯수/실제 얼굴 갯수 = 7/15 = 0.47이 된다. 이것은 confidence 레벨이 13%와 같이 아주 낮더라도 검출해낸 것은 모두 인정했을 때의 결과이다. 

 

이번에는 검출된 결과를 confidence 레벨에 따라 재정렬해보자. 

 

 

confidence 레벨에 대한 threshold 값을 아주 엄격하게 적용해서 95%로 했다면, 하나만 검출한 것으로 판단할 것이고, 이때 Precision = 1/1 = 1, Recall = 1/15 = 0.067이 된다. threshold 값을 91%로 했다면, 두 개가 검출된 것으로 판단할 것이고, 이때 Precision = 2/2 = 1, Recall = 2/15 = 0.13이 된다. threshold 값을 검출들의 confidence 레벨에 맞춰 낮춰가면 다음과 같이 precision과 recall이 계산될 것이다. 

 

 

이 Precision값들과 Recall값들을 아래와 같이 그래프로 나타내면 그것이 바로 PR 곡선이다. 

 

 

PR 곡선에서 x축은 recall 값이고, y축은 precision값이다. 즉, PR 곡선에서는 recall 값의 변화에 따른 precision값을 확인할 수 있다.

 

Average Precision (AP)

PR 곡선은 성능을 평가하는데 매우 좋은 방법이긴 하지만 단 하나의 숫자로 성능을 평가할 수 있다면 훨씬 더 좋을 것이다. 그래서 나온 것이 AP이다. AP는 precision-recall 그래프에서 그래프 선 아래쪽의 면적으로 계산된다.

 

그런데 보통 계산 전에 PR 곡선을 살짝 손봐준다. PR 곡선을 단조적으로 감소하는 그래프가 되게 하기 위해서 다음과 같이 바꿔준다. 

 

 

이렇게 바꾼 다음에 그래프 선 아래의 넓이를 계산함으로 AP를 구한다. 이 경우 AP = 왼쪽 큰 사각형의 넓이 + 오른쪽 작은 사각형의 넓이 = 1*0.33 + 0.88*(0.47-0.33) = 0.4532가 된다. 

 

컴퓨터 비전 분야에서 물체 검출 및 이미지 분류 알고리즘의 성능은 대부분 이 AP로 평가한다. 물체 클래스가 여러 개인 경우 각 클래스당 AP를 구한 다음에 그것을 모두 합한 다음에 물체 클래스의 갯수로 나눠줌으로 알고리즘의 성능을 평가한다. 이것을 mAP(mean average precision)라고 한다. mAP를 구하는 잘 작동하는 파이썬 코드는 여기서 다운받을 수 있다. https://github.com/Cartucho/mAP

 

누군가에게 도움이 되셨길 바라며 글을 마칩니다. 끝까지 읽어주셔서 감사합니다! 질문은 항상 환영합니다. 

 

관련 글

이진 분류기 성능 평가방법 AUC(area under the ROC curve)의 이해

 

참고자료

[1] https://medium.com/@jonathan_hui/map-mean-average-precision-for-object-detection-45c121a31173, Jonathan Hui의 Medium "mAP for Object Detection"

[2] https://darkpgmr.tistory.com/162?category=460965, 다크프로그래머 "precision, recall의 이해"

[3] https://github.com/rafaelpadilla/Object-Detection-Metrics#average-precision, rafaelpadilla "Metrics for object detection"

[4] https://www.cheonghyun.com/ko/precision-vs-recall/, Cheonghyun's Lab "[용어] Precision vs Recall (정밀도 vs 재현율)"

[5] https://sanchom.wordpress.com/tag/average-precision/, sanchom.wordpress.com "Tag: average precision"

 

 

(이 글은 2021-4-9에 마지막으로 수정되었습니다.)