IoU (Intersection Over Union)
Object Detection 모델의 성능을 평가하기 위한 지표이다.
즉, 다음 그림과 같이 Ground Truth Bounding Box (정답 Bounding Box)가 주어지고 Predict Bounding Box (예측 Bounding Box)를 출력했을 때, 예측한 BBox가 맞는지 틀린지를 결정하기 위해 사용된다.
IoU는 다음 그림과 같이 예측 BBox와 정답 BBox간 교집합 부분의 면적을 합집합 면적으로 나눈 값이다.
이때 맞다 틀리다를 Threshold(임계값)을 지정하여 판단하는데 만약 임계값이 0.5로 주어진다면 IoU 값이 0.5 이상이면 제대로 검출(True Positive) 0.5 미만이면 잘못 검출 (False Positive)라고 판단한다.
IoU Pytorch 구현
def intersection_over_union(boxes_preds, boxes_labels, box_format="midpoint"):
"""
Calculates intersection over union
Parameters:
boxes_preds (tensor): Predictions of Bounding Boxes (BATCH_SIZE, 4)
boxes_labels (tensor): Correct labels of Bounding Boxes (BATCH_SIZE, 4)
box_format (str): midpoint/corners, if boxes (x,y,w,h) or (x1,y1,x2,y2)
Returns:
tensor: Intersection over union for all examples
"""
if box_format == "midpoint":
box1_x1 = boxes_preds[..., 0:1] - boxes_preds[..., 2:3] / 2
box1_y1 = boxes_preds[..., 1:2] - boxes_preds[..., 3:4] / 2
box1_x2 = boxes_preds[..., 0:1] + boxes_preds[..., 2:3] / 2
box1_y2 = boxes_preds[..., 1:2] + boxes_preds[..., 3:4] / 2
box2_x1 = boxes_labels[..., 0:1] - boxes_labels[..., 2:3] / 2
box2_y1 = boxes_labels[..., 1:2] - boxes_labels[..., 3:4] / 2
box2_x2 = boxes_labels[..., 0:1] + boxes_labels[..., 2:3] / 2
box2_y2 = boxes_labels[..., 1:2] + boxes_labels[..., 3:4] / 2
if box_format == "corners":
box1_x1 = boxes_preds[..., 0:1]
box1_y1 = boxes_preds[..., 1:2]
box1_x2 = boxes_preds[..., 2:3]
box1_y2 = boxes_preds[..., 3:4] # (N, 1)
box2_x1 = boxes_labels[..., 0:1]
box2_y1 = boxes_labels[..., 1:2]
box2_x2 = boxes_labels[..., 2:3]
box2_y2 = boxes_labels[..., 3:4]
x1 = torch.max(box1_x1, box2_x1)
y1 = torch.max(box1_y1, box2_y1)
x2 = torch.min(box1_x2, box2_x2)
y2 = torch.min(box1_y2, box2_y2)
# .clamp(0) is for the case when they do not intersect
intersection = (x2 - x1).clamp(0) * (y2 - y1).clamp(0)
box1_area = abs((box1_x2 - box1_x1) * (box1_y2 - box1_y1))
box2_area = abs((box2_x2 - box2_x1) * (box2_y2 - box2_y1))
return intersection / (box1_area + box2_area - intersection + 1e-6)
Precision & Recall
Ground Truth | Predict Result | |
Positive | Negative | |
Positive | TP (True Positive) : 옳은 검출 |
FN (False Negative) : 검출 되어야 할 것이 검출되지 않음 |
Negative | FP (False Negative) : 틀린 검출 |
TN (True Negative) : 검출되지 말아야할 것이 검출되지 않음 |
Precision
정확도를 의미하며 검출 결과들 중 옳게 검출한 비율을 의미한다.
$$ Precision = \frac{TP}{TP + FP} $$
Recall
재현율을 의미하며, 실제 옳게 검출된 결과물 중에서 옳다고 예측한 것의 비율을 의미한다.
$$ Recall = \frac{TP}{TP+FN} $$
일반적으로 정확도와 재현율은 서로 반비례 관계를 가진다.
즉, 정확도가 높으면 재현율은 낮아지고, 재현율이 높으면 정확도가 낮아진다.
따라서 정확도와 재현율의 성능 변화 전체를 확인하기 위해 Preicision-Recall 그래프를 이용한다.
Precision-Recall Curve
PR Curve는 Object Detection 모델의 성능을 평가하는 방법 중 하나로, Confidence Score Threshold 값의 변화에 따라 값이 달라집니다. 이 Score 값은 검출한 객체가 정확하다고 모델이 판단하는 정도이다.
이 Score에 특정 임계값(Threshold)을 부여해 이 임계값 이상이 되어야 검출된 것으로 인정한다. 따라서 이 Threshold 값에 따라 Precision과 Recall의 값이 달라지며 이것을 그래프로 그린 것이 바로 PR 곡선이다.
다음 예제를 통해 자세히 살펴볼 수 있습니다.
15개의 번호판이 존재하는 이미지에서 10개의 객체가 검출되었다고 가정합니다.
10개 중 7개가 제대로 검출되었고
10개 중 3개가 잘못 검출되었습니다.
이 때, Threshold가 0이라는 가정하에
Precision은 제대로 검출 / 검출된 번호판 수 = 7/10 = 0.7 이 되고,
Recall은 제대로 검출 / 실제 번호판 수 = 7 / 15 = 0.47 이 됩니다.
이번에는 검출된 결과를 Score 값에 따라 재정렬합니다.
여기서 위에서부터 하나씩 Precision과 Recall 값을 구한다면,
첫 번째로, Precision = 1/1 = 1
Recall = 1/15 = 0.067이 됩니다.
두 번째로, Precision = 2/2 = 1
Recall = 2/15 = 0.13이 됩니다.
...
이렇게 진행하다 보면 다음과 같은 결과표를 확인할 수 있습니다.
위 Precision 값들과 Reacall 값들을 아래와 같이 그래프로 나타내면 바로 PR Curve입니다.
Average Precision
PR Curve는 모델의 성능을 전반적으로 파악하기에는 쉽지만, 숫자로 비교하여 두 모델간의 성능을 비교하기에는 불편함이 있습니다. 이를 위해 Average Precision이 고안되었으며 이는, PR Curve에서 그래프 선 아래 쪽의 면적을 계산한 값입니다. 즉, 이 AP의 값이 높을수록 그 모델의 성능이 전체적으로 우수하다는 의미입니다.
주로 Object Detection Task에서 AP로 성능을 평가합니다.
위 그래프에선 AP = (1 * 0.33 + 0.86 * (0.4 - 0.33) + 0.77 * (0.46 - 0.4) = 0.4364 이 됩니다.
객체가 여러개인 경우 AP를 클래스의 개수로 나눠줌으로 모델의 성능을 평가하며, 이를 mAP라고 합니다.
참고
https://ctkim.tistory.com/79?category=880317
'ML & DL > Deep Learning' 카테고리의 다른 글
[Time Series Forecasting] Sliding Window Dataset (0) | 2024.10.14 |
---|---|
[Time Series Forecasting] Model (LSTM, GRU, CNN, ... ) PyTorch 구현 (0) | 2024.10.10 |
WBF, Ensemble for Object Detection 정리 (0) | 2023.05.19 |
NMS, Soft-NMS 정리 및 구현 (0) | 2023.05.19 |
Mixup 정리 및 구현 (0) | 2023.04.27 |