

수식으로 쓰면 다음과 같다.

| 상황 | 판정 |
|---|---|
| 클래스 맞고 + IOU ≥ threshold | TP |
| 클래스 맞지만 IOU < threshold | FP |
| 클래스 틀림 | FP |
| 실제 객체 있는데 못 찾음(예측 자체가 없음) | FN |
- Recall: “진짜 중에 내가 잡은 건?”
- Precision: “내가 잡았다고 한 것 중 진짜는?”
- AP: “Recall 전 구간에서 Precision의 질(면적/평균)”
- mAP: “클래스별 AP 평균”

TP : 예측 박스가 클래스도 맞고, GT와의 IOU가 threshold 이상이며, 그 GT가 아직 다른 예측으로 TP 처리되지 않은 경우FP : 다음 중 하나FN : GT가 존재하지만 모델이 해당 객체를 TP로 맞추지 못한 경우(누락)앞글자는 예측이 맞았는지 아닌지, 뒷글자는 실제 정답값을 나타낸다고 생각하면 쉽다.

“실제 객체 중에, 내가 얼마나 많이 잡았는가”
- “놓치지 않는 능력”


“잡았다고 한 것 중에, 진짜 맞은 비율”
- “쓸데없는 탐지”를 얼마나 줄였는가



object detection 모델은 보통 예측 박스마다 confidence score를 함께 출력한다.
confidence score는 모델/계열마다 정의가 조금 다르지만, “이 예측이 믿을 만한가”를 나타내는 점수다.
YOLOv1의 경우 대표적으로
(일반적 관점) objectness(객체 존재 가능성) + 위치/분류 신뢰가 혼합된 점수로 이해하면 된다.
PR 곡선은 confidence threshold를 움직이며 만들어진다.
threshold를 낮추면 더 많은 박스를 남김 → Recall은 올라가기 쉽지만 FP도 늘어 Precision이 떨어질 수 있음
threshold를 높이면 박스가 줄어듦 → Precision은 올라가기 쉽지만 FN이 늘어 Recall이 떨어질 수 있음
Recall과 Precision은 보통 한쪽이 오르면 다른 쪽이 떨어지는 trade-off가 있어 둘을 함께 봐야 한다.
그래서 confidence threshold를 바꿔가며 (Precision, Recall) 점들을 찍고 곡선을 만든다.
왜 Precision과 Recall을 하나로 합쳐야 하나
- 모델 A: 박스를 1개만 쳐서 1개 맞힘 → Precision = 1.0, Recall 매우 낮음
- 모델 B: 박스를 100개 쳐서 50개 맞힘 → Recall 높지만 Precision 낮음
- 단일 숫자로는 비교가 어려움 → PR Curve와 AP를 사용
PR Curve 생성 절차
모델의 예측 박스들을 confidence score 내림차순으로 정렬
위에서부터 하나씩 누적하며 TP/FP를 판정
각 시점의 Precision, Recall을 계산
x축 Recall, y축 Precision으로 연결
중요한 점
threshold 하나 = 점 하나
threshold 여러 개 = 곡선

Precision–Recall 곡선 아래 면적(Area Under PR Curve)
직관: Recall 0~1 구간에서 Precision이 얼마나 높게 유지되는가
계산 방식은 벤치마크에 따라 다르지만, 보통 다음 아이디어를 사용한다.
PR 곡선을 “들쭉날쭉”한 그대로 쓰기보단,
Recall이 증가할수록 Precision이 감소하지 않게끔 단조 형태로 보정(interpolation) 후 면적을 계산한다.

과거 VOC 2007은 11-point 방식(Recall을 0.0~1.0까지 0.1 간격으로 샘플링)도 사용했으나,
mAP는 클래스별 AP의 평균
클래스가 하나면 AP = 성능
클래스가 여러 개면
클래스마다 AP 계산
평균
예:
person AP = 0.60
car AP = 0.50
dog AP = 0.40
의미:
IOU threshold를 0.50, 0.55, …, 0.95 (총 10개)로 바꿔가며 AP를 구하고
그 평균을 다시 평균낸 값
그래서 VOC mAP@0.5보다 더 엄격하며 수치가 더 낮게 나오는 경향이 있다.