YOLO

인화·2026년 6월 17일

영상처리

목록 보기
5/9
post-thumbnail

1. 문제 정의 : 객체 탐지는 무엇을 푸는 문제인가?

  • 객체 탐지가 분류(classification)이나 분할(segmentation)과 어떻게 다른지 알아보자!

1.1 분류, 위치 추정, 객체 탐지, 분할의 차이

  • Image Classification : 이미지 전체에 대해 하나의 라벨을 예측하는 것
    (ex) 이 사진은 고양이인가?
  • Localization : 이미지에 하나의 주요 객체가 있다고 가정하고, 라벨과 박스를 예측함.
    → Single Object를 가정하므로 하나의 주된 객체에 대해 라벨과 박스를 함께 예측한다.
    (ex) 고양이는 어디에 있는가? / 암 분류 문제에서 관심 가는 클래스가 하나 뿐인 경우
  • Object Detection : 이미지 안의 여러 객체에 대해 각 객체의 클래스와 위치(박스)를 동시에 예측하므로 여러 객체의 클래스, 위치, 개수를 동시에 다룬다는 특징이 있다.
    → 출력이 단순한 클래스 하나가 아니라, (bi,ci,si)i=1N{(b_i, c_i, s_i)}^N_{i=1}의 형태임.
    → 이때, bib_i는 bounding box, cic_i는 class probability, sis_i는 confidence score를 의미함.
    bounding box하나의 객체 전체를 포함하는 가장 작은 직사각형을 의미함. → confidence score는 bounding box에 대한 신뢰도를 의미함. (bounding box에 객체가 있는지 없는지 유무에 관한 확률) → 객체 탐지는 “무엇이 있는가?”“어디에 있는가?”를 동시에 푸는 문제이기에 분류보다 출력 구조가 훨씬 복잡한 경향을 지닌다. 단순히 Bounding box만 맞으면 Detection이 아니라, 클래스와 score도 적절해야 한다. → 물체가 하나만 있는 이미지면 Detection과 Localization의 출력 형태가 비슷할 수도 있지만, 일반적인 객체 탐지는 다중 객체를 전제로 한다는 점에서 차이가 있다. 즉, Localization = 라벨 + 박스, 객체 1개 가정 / Object Detection = 라벨 + 박스, 객체 여러 개 가정 이라는 차이가 있다. 따라서 Detection은 여러 객체를 다루는 일반적인 문제이고, Localization은 이를 단일 객체(single object) 상황으로 제한한 형태로 볼 수 있다. 또, Localization과는 다르게 Detection은 박스와 라벨 뿐만 아니라 클래스 결정, 중복 제거, confidence score 해석까지 포함하는 보다 복합적인 문제이다. (ex) 사진 안에 사람 몇 명이 있고, 각각 어디에 있는가?
  • Segmentation : 객체의 윤곽이나 픽셀 단위 마스크까지 예측함. → 객체의 외곽 또는 픽셀 수준 마스크까지 다루므로 더 세밀한 출력을 요구한다.

1.2 객체 탐지의 일반적 입력과 출력

입력은 보통 H×W×3 이미지이고, 출력은 여러 예측 박스이며, 각 박스는 보통 다음과 같은 정보를 지닌다.

  • x, y : 박스 중심 좌표
  • w, h : 박스 너비와 높이
  • c : 클래스 라벨
  • s : 신뢰도 (score)
b=(x,y,w,h),c,sb = (x, y, w, h), c, s

2. One-stage Detection과 Two-stage Detector 비교

Object Detection은 Proposal-based model(Two-stage model)Proposal-free model(One-stage model)로 구분된다.

2.1 Two-stage Detector

Two-stage Detector(=Proposal-based model)은 후보 영역(Region Proposal)들을 명시적으로 만들고, 2차적으로 후보 박스들을 분류하는 모델을 의미한다. R-CNN 계열 모델(Fast R-CNN, Faster R-CNN)처럼 Region Proposal을 먼저 찾은 후 분류하는 방식을 지니는 모델들이 이에 해당한다.

 Two-stage Detector은 객체를 탐지하기 위해 먼저 Region Proposal 단계에서 객체가 있을 가능성이 높은 후보 영역을 찾고, 이후 Classification 단계에서 후보 영역을 정제하여 최종적으로 객체를 분류한다.

하지만, 이러한 Two-stage Detector는 일반적으로 높은 정확도를 보인다는 장점이 있으나, 구조가 상대적으로 복잡하고, 속도가 느릴 수 있고, 각 단계가 모듈화되어 end-to-end 학습이 어렵다는 단점이 존재한다.

Two-stage Detector의 단계

  1. 후보 영역(region proposals)을 만든다.
  2. 각 후보 영역에 대해 분류 + 박스 보정을 수행한다.

2.2 One-stage Detector

One-stage Detector(=Proposal-free model)은 별도의 Region Proposal 과정 없이, 이미지를 한 번만 처리하여 객체를 탐지하는 방식을 의미한다. 즉, Region Proposal 단계를 분리하지 않고 이미지에서 바로 클래스와 박스를 예측하는 것이다. YOLO, SSD, RetinaNet 같은 모델들이 이에 해당한다. 이때, Dectector는 밀집된(dense) 후보 위치들에 대해 한 번에 예측하므로 구조가 단순하고 빠르다는 특징이 있다.

쉽게 설명해서, Two-stage Detector는 수상한 곳 몇 군데를 뽑고, 그 부분만 확대하여 자세히 보는 방법인데 반해, One-stage Detector는 사진 전체에 격자를 촘촘히 깔고 모든 칸에서 동시에 “여기 물체 있나? 있으면 뭐고 박스는 어디지?”를 바로 판단하는 것임.

2.3 YOLO가 중요한 이유

YOLO는 객체 탐지를 단일 회귀(Single Regression) 문제로 바라본 대표 모델로, 원 논문은 객체탐지 파이프라인 전체를 하나의 네트워크로 묶어 end-to-end로 최적화하는 관점을 제시하였다.

다시 말해, YOLO는 이미지 전체를 입력으로 받아 별도의 proposal 단계 없이, 하나의 네트워크가 bounding box 좌표와 클래스 확률을 직접 한 번에 예측하는 구조를 지닌다.

  • Two-stage : “후보를 먼저 뽑고, 그 다음 분류하자” — 후보 영역을 먼저 만들고(proposal), 그 뒤에 각 영역을 분류하고 박스만 보정함. (후보 영역을 먼저 좁힌 뒤 정제) → Image -> Proposal -> Classifier/Regressor -> Output
  • YOLO식 One-Stage : “처음부터 박스와 클래스를 한 번에 예측하자” — 명시적인 proposal 단계를 분리하지 않고, 이미지에서 바로 조밀한 위치의 박스와 클래스를 예측함. (전체 위치에 대해 직접 예측하는 Dense Prediction 구조) → “One-stage면 후보 박스가 전혀 없다”라고 이해하면 안 된다. 실제로는 여러 위치와 스케일에서 박스 후보를 예측하지만, proposal을 별도 모듈로 떼어 놓지 않는다는 뜻에 가깝다. → Image -> Dense Prediction -> NMS -> Output

YOLO의 출발점은 Proposal을 별도로 두지 않고 바로 예측하자는 철학이며, 이러한 특성으로 인해 빠르다는 장점이 있어 실시간 객체 탐지의 대표 계열이 되었다. 과거에는 One-stage의 정확도가 Two-stage보다 낮은 경향성이 있었으나, 현대의 YOLO 계열은 정확도와 속도를 모두 크게 개선했다. 또한, One-stage는 내부적으로 많은 위치/스케일에서 예측하므로 일종의 Dense Candidates 개념이 남아 있긴 하기에 후보 박스가 전혀 없는 것은 아니다. 하지만, Two-stage처럼 명시적 Proposal 단계가 분리되지는 않았다는 특징이 있다. YOLO가 빠른 이유는 단순히 One-stage여서가 아니라, RPN 같은 별도 proposal 생성 모듈이 따로 분리되어 있지 않고, backbone이 뽑은 feature에서 바로 detection head가 예측하는 구조이기 때문이다.

3. YOLO의 핵심 아이디어와 YOLOv1의 문제 설정

3.1 YOLOv1의 대표적 문제 설정

YOLOv1은 입력 이미지를 S × S grid로 나누고, 각 grid cell이 자신의 영역에 속한 객체 중심(center)를 담당하게 한다. 원 논문에서 대표적으로 소개되는 설정은 다음과 같다.

  • 전체 이미지를 SxS 크기의 grid로 나눠줍니다. 여기서 객체의 중심이 특정 grid cell에 위치한다면, 해당 grid cell은 그 객체를 탐지하도록 할당(responsible for)합니다.
  • 쉽게 말해, 물체의 중심점(center)이 들어 있는 칸이 그 물체를 담당한다.
  • 모델은 입력 전체를 본 뒤, 특정 위치의 cell이 그 객체의 예측 책임을 지도록 한다. 따라서 grid cell은 이미지를 잘라 독립적으로 처리하는 창(window)이라기 보다, 예측을 배정하는 기준 좌표계에 가깝다. 객체 중심이 어느 cell에 들어가는지가 label assignment의 핵심이 된다.
  • 4행 3열의 grid cell이 왼쪽의 개를 예측하도록 할당되었고, 4행 4열의 grid cell이 오른쪽의 개를 예측하도록 할당 (개가 커서 여러 칸을 덮고 있어도 모든 칸이 다 예측하는 게 아니라 중심이 들어 있는 칸 하나만 담당하도록 설정함)

S=7,B=2,C=20S = 7, B = 2, C = 20

최종 출력 텐서 크기는 다음과 같다.

  • 박스 하나당 (x, y, w, h, confidence) 5개를 예측하므로 B * 5
  • 클래스 정보도 예측하므로 +C
S×S×(B×5+C)S×S×(B×5+C)

위 설정이면

7×7×(2×5+20)=7×7×307×7×(2×5+20) = 7×7×30

이 된다.

3.2 각 grid cell이 예측하는 것

각 grid cell은 다음을 예측한다.

  1. B개의 Bounding box

    1. b=(x,y,w,h)b = (x, y, w, h)

    2. bbox 표기에서의 핵심은 좌상단과 우하단 좌표를 저장하는 것이 아니라, 중심과 크기를 기반으로 위치를 기술한다는 것이다. YOLO Detection 라벨은 대게 class x_center, y_center, width, height 형식을 따름.

    3. 정규화 좌표를 쓰면 이미지 해상도가 달라도 같은 표현을 유지할 수 있고, 추론 결과를 해석할 때는 이 값들이 다시 픽셀 좌표로 복원되어 화면에 그려짐.

    4. 이때, YOLO 형식의 기본 detection 라벨은 xyxy가 아니라 normalized wywh이다.

  2. 각 bounding box에 대한 confidence score

    1. confidence score는 해당 bounding box에 객체가 포함되어 있는지 여부와, box가 얼마나 정확하게 ground truth box를 예측했는지를 반영하는 수치임. 다시 말해, 박스 안에서 객체가 존재할 확률과 그 박스가 실제 객체와 얼마나 잘 겹치는지를 함께 반영한 값이다.
    2. Pr(Object)IoU(truthpred)Pr(Object) * IoU(truthpred)로 정의함.
    3. 이때, Pr(Object)는 objectness와 같은 개념(객체 존재 확률)으로, grid cell이 객체를 담당하면 Pr(Object)=1, 배경만 있으면 Pr(Object)=0임.
    4. 만약 grid cell 내에 객체가 존재하지 않는다면 confidence score는 0이며, grid cell 내에 객체가 존재한다면 confidence score는 IoU(예측 박스와 정답 박스의 overlap 정도) 값과 같음.
    5. confidence score는 단순히 객체가 있다/없다가 아니라 객체가 있더라도 그 박스 위치가 정확한지, 박스 위치가 그럴듯해도 실제 객체가 실제로 있는지 없는지 두 가지 측면을 동시에 반영하는 값이다. YOLOv1에서는 박스의 품질을 나타내는 핵심 값이고, 실전에서는 보통 class score와 결합해 최종 score를 만든다.
  3. C개의 conditional class probabilities

    1. Objectness : 물체인지 아닌지 여부

    2. Class Probability : 물체라면 어떤 클래스인지 확률

    3. YOLO의 score를 해석할 때는 objectness, class probability, 즉 클래스를 맞추는 것그 박스가 실제 객체를 담고 있는가 라는 문제의 축이 결합되어 최종 순위가 결정된다.

      • Detection score는 단순한 분류 확률이 아니라 박스의 신뢰성과 클래스 정보가 결합된 값이다.
      • class probability가 높아도 objectness가 낮으면 최종 score는 낮아지고, objectness가 높아도 클래스 구분이 불명확하면 특정 클래스의 score는 높지 않다.
      • 실제 후처리에서는 이 score를 기준으로 thresholding과 NMS가 이어진다.
      • 이때, confidence와 class probability를 같은 값으로 생각하면 안 되며, score가 높다는 사실만으로 localization 품질이 자동으로 보장되는 것은 아니다.

      • Detection score는 단순한 분류 확률이 아니라 박스의 신뢰성과 클래스 정보가 결합된 값이다.
      • class probability가 높아도 objectness가 낮으면 최종 score는 낮아지고, objectness가 높아도 클래스 구분이 불명확하면 특정 클래스의 score는 높지 않다.
      • 실제 후처리에서는 이 score를 기준으로 thresholding과 NMS가 이어진다.
      • 이때, confidence와 class probability를 같은 값으로 생각하면 안 되며, score가 높다는 사실만으로 localization 품질이 자동으로 보장되는 것은 아니다.

Bounding box 하나는 보통 다음과 같이 요약한다.

(x,y,w,h,confidence)(x, y, w, h, confidence)

3.3 왜 이 formulation이 혁신적이었는가

이전 계열은 “영역 후보 → 분류”의 파이프라인이 강했다. 반면, YOLO는 이미지 전체를 보고 한 번에 예측하기 때문에, 전역 문맥(global context)를 활용하기 쉽고 속도도 매우 빨랐다.

하지만, YOLOv1은 각 grid cell이 강한 공간 제약을 가지므로, 작은 객체나 촘촘히 모여 있는 객체에 약했다. 원 논문도 localization error가 상대적으로 많음을 언급한다.

3.4 NMS : Non-Maximum Suppression

NMS는 객체당 대표 박스 하나만 남기기 위해 사용하는 대표적인 후처리 방식이다. 객체 감지 모델에서 겹치는 Bounding Box를 제거하여 최종 결과를 정리한다. 이러한 NMS은 “최대가 아닌 것을 억제한다”라는 뜻으로, 높은 score의 대표 박스를 하나 남기고 겹치는 중복 박스를 줄이는 알고리즘이다. 이는 간단하고 효과적이며, 중복 탐지를 크게 줄여준다는 장점이 있으나, 서로 가까이 있는 객체가 많으면 박스를 과하게 제거할 수 있고, 임계값 τ와 confidence threshold에 민감할 수 있다.

실제 YOLO에서는 Image → Model Prediction → Score Filtering → NMS → Final Detection의 흐름으로 진행된다. NMS는 학습 과정이라기보다는 보통 추론 후처리의 과정이며, IoU threshold를 낮춘다고 해서 무조건 좋은 것이 아니라, 너무 낮으면 서로 다른 객체까지 제거될 수 있다.

NMS 절차

NMS는 같은 객체 주변에 여러 박스가 생성되었을 때, 대표 박스를 남기고 중복 박스를 제거하는 절차이다. score가 가장 높은 박스를 먼저 선택한 뒤, IoU가 큰 나머지 박스를 차례로 제거한다.

  1. score가 가장 높은 박스를 선택한다
  2. 그 박스와 IoU가 큰 나머지 박스들을 제거한다 (score가 높은 박스와 겹치는 부분이 많은 박스 제거)
  3. 남은 박스들에 대해 같은 작업을 반복한다.

4. 수식과 지표

  • IoU, NMS, Precision, Recall, AP, mAP, loss를 연결해 이해한다.

4.1 IoU : Intersection over Union

IoU는 예측 박스와 정답 박스의 겹침 정도를 나타내는 대표 지표로, 예측 박스와 정답 박스가 얼마나 겹치는지를 정량화하기 위해 다음과 같은 수식을 활용한다.

  • BpredB_{pred} : 예측 박스 / BgtB_{gt} : ground truth 박스 / ∩ : 교집합 영역 / ∪ : 합집합 영역
  • 이러한 IoU가 필요한 이유는, 분류는 맞았더라도 박스가 엉뚱한 위치라면 Detection이 잘 된 것이 아니기에 얼마나 정확히 위치를 맞췄는지 평가하기 위해서이다.
  • IoU는 Localization 정확도를 정량화하는 가장 기본적인 지표(분류 확률이 아닌 localization 품질을 나타내는 값)로, Detection에서 맞았다의 기준은 단순 클래스 일치 뿐만 아니라, 클래스 + IoU 기준 충족이다. 이는 분류 score가 아닌 박스 겹침 정도를 의미하며, IoU가 높다고 confidence도 반드시 높아지는 것은 아니다. (IoU와 confidence는 학습된 모델에서는 관련이 있지만, 둘은 개념적으로 다른 값이다.)
  • IoU를 이해할 때는 숫자보다 면적의 대비를 먼저 보는 것이 좋으며, 겹치는 면적이 클수록 IoU는 커지고, 박스가 전혀 겹치지 않으면 IoU는 0이다. 같은 중심을 가지더라도 크기가 크게 다르면 IoU는 생각보다 낮아질 수 있다.
  • YOLO에서는 어떻게 쓰이는가?
    • 학습 중 박스 회귀 품질을 반영하는 Loss 설계의 기준
    • 추론 후 NMS에서 중복 박스 제거 판단 기준
    • 평가에서 true positive 판정 기준 (ex. IoU ≥ 0.5)
IoU=Area(BpredBgtArea(BpredBgt)IoU = \frac{Area(B_{pred}∩B_{gt}}{Area(B_{pred}∪B_{gt})}

4.2 Precison(정밀도)과 Recall(재현율)

Object Detection(객체 검출) 모델의 성능을 측정하기 위해선 Precision(정밀도), Recall(재현율), Average Precision(AP)에 대해 알아야 한다. 객체 검출과 작업에서는 Precision, Recall 등의 개념이 중요한데, 그 이유는 객체 검출 성능이 좋지 않을 때 오검출을 많이 했을 수도 있고, 검출 자체가 잘 안됐을 수도(미검출) 있기 때문이다.

Precision (정밀도)

  • 모델이 양성으로 예측한 것 중에서 실제로 양성인 비율 (모델이 “있다”고 예측한 것 중 실제로 맞는 비율)
  • Precision = (True Positives) / (True Positives + False Positives)
  • Precision ↑ : 모델이 예측한 양성이 대부분 실제 양성 → 오검출 적음
  • Precision ↓ : 모델이 양성으로 예측한 대부분이 실제로는 음성 → 오검출 다수 → 거짓 검출(False Alarm)을 얼마나 줄였는지 알 수 있음.

Recall (재현율)

  • 실제 양성 중에서 모델이 정확하게 감지한 비율 (실제로 존재하는 객체 중 모델이 찾아낸 비율)
  • Recall = (True Positives) / (True Positives + False Negatives)
  • Recall↑ : 모델이 대부분의 실제 양성을 감지 → 미검출 적음
  • Recall↓ : 모델이 실제 양성 중 일부를 감지하지 못한 경우 → 미검출 다수 → 객체를 놓치는 정도를 알 수 있다.

Precision이 낮다는 것은 오검출이 많다는 것이고, Recall이 낮다는 것은 미검출이 많다는 것이다. 때문에 일반적으로 Confidence threshold에 따라 Precision과 Recall은 변화하며, 두 수치 간의 관계는 반비례이다. Threshold를 낮춰 많이 검출하다 보면 미검출(Recall)은 적어지지만 오검출(Precision)이 많아지고, Threshold를 높여 보수적으로 검출하다보면 놓치는 객체가 많아져 오검출(Precision)은 적어지지만 미검출(Recall)이 많아지기 때문이다..

Precision이 중요한 경우 (Precision이 낮으면 안되는 경우)

  • 오검출이 적어야 하는 경우
  • 잡초 제거 로봇 : 오검출 시 잡초가 아닌 작물을 뽑기 때문
  • 스팸 메일 필터링 : 중요한 메일을 오판단으로 스팸 메일로 분류하는 경우 크리티컬한 이슈이기 때문
  • 오검출/오판단 시 리소스 사용량이 더 많이 드는 경우

Recall이 중요한 경우 (Recall이 낮으면 안되는 경우)

  • 미검출이 적어야 하는 경우
  • 의료 진단 (암 진단) : 암인데 암이 아니라고 판단하는 경우가 가장 크리티컬 하기 때문에 recall이 높아야 함. 암이 아닌데 암이라고 하는경우는 그저 정밀 검사를 해야 하는 귀찮음이 발생하는 정도이지만, 암인데 암이 아니라고 판단하는 경우는 위험하기 때문
  • 자율 주행 사람 검출 : 자율 주행 차량의 경우 사람을 미검출하는 경우 사고로 이어질 수 있음.
  • 미검출 시 리소스 사용량이 더 많이 드는 경우

4.3 AP

  • AP는 Precision-Recall curve(양성 예측의 Precision과 Recall 간의 관계를 보여주는 곡선) 아래의 면적을 요약한 값으로 볼 수 있으며, 수식으로는 다음과 같다. 이때, p(r)p(r)은 recall rr에서의 precision이다. → Precision-Recall curve를 보면, Recall이 0~1까지 바뀌는 동안 Precision이 전반적으로 얼마나 높은지 면적으로 볼 수 있음. (여러 Threshold에서의 Precision/Recall 변화를 평균적으로 본 값) 이 면적이 클수록 Recall을 높여가면서도 Precision이 잘 유지된다는 의미임. 따라서 AP가 높을수록 좋은 모델에 해당함.
    AP=01p(r)drAP = ∫^1_0 p(r)dr
  • AP는 모델이 어떤 Recall 값에서 얼마나 좋은 성능을 보이는지를 측정하며, 여러 Recall 값에 대한 AP를 평균내면 모델의 전반적인 성능을 측정할 수 있다.
  • 모델의 적절한 Precision-Recall 비율을 설정하기 위해 Score Threshold 를 설정하는 과정이 필요한데, 이 과정 전에 어떤 모델 Weight를 선택할지가 선행되어야 한다. 이 때 일반적으로 AP가 높은 모델을 선택한다.

이러한 AP를 봐야하는 이유는, Threshold를 바꾸면 Precision과 Recall이 함께 바뀌기 때문이다. 따라서 하나의 지점에서의 Precision, Recall만을 보는 게 아니라 그 변화 전체를 봐야 한다. 일반적으로 Precision과 Recall은 Trade-off 관계이다. 위의 오른쪽 그림은 PR curve이며, 이는 threshold 0.3일 때의 (recall, precision), threshold 0.5일 때의 (recall, precision), threshold 0.7일 때의 (recall, precision)과 같은 점들을 이어서 만든 곡선이다. 즉, Recall이 0~1까지 변하는 동안 Precision이 전반적으로 얼마나 높게 유지되는지를 나타낸다. 그래서 이 면적이 클수록 Recall을 높여도 Precision이 잘 유지되고, Precision이 높을 때 Recall도 잘 유지된다는 것이므로 모델이 전반적으로 균형 있게 잘 검출한다는 의미가 된다.

Detection 성능은 threshold 하나만으로 요약하기 어렵다. 예를 들어 threshold를 0.5로 정했을 때 precision 0.8, recall 0.7이 나왔다고 해도 이는 그 Threshold에서만의 성능일 뿐이다. 실제로 Threshold는 계속 변화시킬 수 있는 값이므로 모델 자체의 성능을 제대로 보려면 Threshold를 움직였을 때 전체적으로 어떤 모습인지를 봐야 한다.

Precision, Recall, AP는 객체 검출 모델의 성능을 종합적으로 평가하기 위해 사용된다. 고정된 Threshold에서 측정되는 Precision과 Recall은 모델의 성능을 특정한 조건에서 평가하는 데 사용되며, AP는 모델의 성능을 다양한 Threshold 값에서 평균화하여 측정한 값이다.

PR curve를 읽을 때는 precision과 recall이 서로 경쟁 관계에 있다는 점을 먼저 떠올리면 된다.

  • threshold를 높이면 보통 precision은 올라가고 recall은 내려간다.
  • threshold를 낮추면 더 많은 객체를 잡을 수 있지만 false positive도 늘 수 있다.
  • AP는 이런 변화 전체를 하나의 면적으로 요약한 값이다.

오해하기 쉬운 점

  • precision이 높다고 해서 항상 좋은 모델은 아니다. recall이 지나치게 낮을 수 있다.
  • AP는 하나의 threshold에서 읽은 값이 아니라, curve 전체의 요약값이다.

4.4 mAP

  • 다중 클래스 환경에서는 클래스별 AP를 평균낸 것
mAP=1Cc=1CAPcmAP = \frac{1}{C} \sum_{c=1}^C AP_c
  • AP: 한 클래스에 대한 평균 정밀도
  • mAP: 여러 클래스의 AP를 평균낸 값

mAP@0.50와 mAP@0.50 : 0.95

  • mAP@0.50 (VOC 스타일) : IoU ≥ 0.5일 때의 평균 AP → 예측 박스와 정답 박스의 IoU가 0.50 이상이면 정답이고, 그 기준으로 AP를 구하고, 클래스별 평균을 내면 mAP@0.50 (상대적으로 단순한 AP/mAP 관점)
  • mAP@0.50 : 0.95 (COCO 스타일) : 0.50, 0.55, …, 0.95 여러 IoU Threshold에서 평균한 값 → 0.05 간격으로 여러 개의 IoU Threshold를 써서 각각 AP를 구한 뒤, 평균낸 값 → AP@0.50+AP@0.55+AP@0.60++AP@0.9510\frac{AP@0.50+AP@0.55+AP@0.60+…+AP@0.95}{10} 을 클래스들에 대해 평균낸 형태 → 일반적으로 mAP@0.50 : 0.95가 더 엄격한 지표임. (여러 IoU Threshold와 객체 크기까지 고려하므로)

**정리

  • Precision** : “헛검출(오탐, FP)을 얼마나 줄였는가?”
  • Recall : “놓친 객체(미탐, FN)를 얼마나 줄였는가?”
  • AP : PR Curve 요약
  • mAP : 클래스별 평균 성능
  • mAP@0.50과 mAP@0.50 : 0.90은 엄격도가 다르다.
  • Precision이 높아도 Recall이 매우 낮을 수 있기에 Precision이 높을 수록 무조건 좋은 모델은 아니다.
  • mAP50이 높다고 무조건 Localization이 좋은 것은 아니다. 더 엄격한 Localization 평가는 mAP@0.50 : 0.95를 같이 봐야 한다.

구조 이해

  • YOLO 계열의 Backbone-Neck-Head 구조와 버전별 발전 맥락 파악

5.1 Anchor box와 Anchor-free 경향

Anchor Box(= Template, Prior Box)는 미리 정해 둔 박스 prior(template) box이다. Anchor-based 방식은 미리 정해둔 prior box를 기준으로 오프셋을 예측한다. 모델은 “처음부터 완전히 새로운 박스를 직접 내기”보다 anchor를 기준으로 offset을 예측한다. 즉, 어떤 Feature Map의 한 위치마다 기본 박스들을 여러 개 두고, 박스를 처음부터 완전히 새로 만들기보다 이 Anchor에서 중심을 얼마나 옮길지, 너비와 높이를 얼마나 늘리거나 줄일지를 예측해 offset을 보정하는 방식을 택한다.

YOLOv2는 anchor box를 도입하고, anchor 크기를 hand-crafted가 아니라 clustering 기반으로 정하는 개선을 포함했다. 또한 feature fusion, multi-scale training 등을 통해 original YOLO의 약점을 보완했다.

직관적으로 보면 anchor box는 다음 문제를 완화한다.

  • 다양한 크기/비율의 객체 처리
  • 박스 회귀 안정화
  • 작은 객체와 큰 객체를 다른 prior로 다루기 쉬움

Anchor-free와의 차이점

Anchor-free 방식은 미리 정한 anchor prior에 덜 의존하거나, anchor 없이 center/box를 직접 예측하려는 경향을 말한다. 즉, 미리 정한 박스 템플릿에 덜 의존하거나, 아예 없이 객체 위치를 더 직접적으로 예측하자는 흐름이다. (정답 객체의 center와 box side들과의 거리(width, height)를 구하는 방식) 예를 들어, 객체 중심점이 어디인지 그 중심에서 좌/우/위/아래 경계까지의 거리 예측, 좌상단 우하단 좌표 예측을 통해 박스를 만든다. 기본 박스를 수정하는 대신 물체를 바로 설명해 박스를 만드는 방식이다. 따라서 중심점이나 경계 거리 등 보다 직접적인 표현으로 박스를 예측하는 방식이라고 할 수 있다.

Anchor-free와 Anchor-based 중 절대적으로 하나가 항상 더 좋다고 말하기는 어려우나, 최근 계열은 구조 단순화, 유연성, 성능 향상을 위해 anchor-free 또는 objectness/head 구조의 재설계를 적극적으로 활용하는 흐름을 보인다. (YOLO 계열은 anchor 기반 설계에서 출발해, 최근에는 anchor-free 흐름을 적극적으로 받아들였으며, Ultralytics의 YOLOv8 문서는 YOLOv8의 핵심 특징으로 anchor-free split head를 강조한다.)

Anchor-based와 Anchor-free의 결과물은 모 bounding box지만, 출발점과 label assignment 방식이 다르다. 다시 말해, 결과는 둘 다 Bounding Box이지만, Anchor-based는 기준 박스와의 차이를 학습하고, Anchor-Free는 객체 자체의 위치/크기 표현을 학습한다는 차이가 있다. Anchor-based의 label-assignment는 정답 박스(GT Box)와 각 Anchor의 IoU를 계산해 Positive Anchor를 찾고(IoU 기반 label assignment), Anchor Free는 어떤 위치가 객체 중심인지 예측해 그 중심에서 박스 크기를 예측하거나, 특정 위치 (x, y)를 기반으로 좌우상하 경계까지의 거리를 예측해 박스를 만들어 예측하며, 어떤 위치가 객체 중심/내부/주변에 있느냐에 따라 label-assignment를 한다. (IoU가 아니라 중심 영역, 박스 내부 위치, 거리 기반 규칙 등 공간적 기준에 더 크게 의존)

요약
-
anchor 설계는 단순한 구현 디테일이 아니라, 모델이 박스를 어떻게 parameterize하고 학습하느냐와 연결된다.

  • anchor-based는 prior box와의 차이를 학습한다.
  • anchor-free는 기준 박스를 덜 의존하고, 중심점 기반 할당과 직접 회귀를 강조한다. 최근 계열은 복잡한 anchor tuning 부담을 줄이기 위해 anchor-free 방향으로 이동하는 경향이 뚜렷하다.
  • 중심점 기반 할당 : 객체의 중심점을 Positive Sample로 정의하고, 객체의 중심 근처 픽셀은 해당 객체를 학습하고, 배경 근처 픽셀은 배경으로 학습하는 것
  • 직접 회귀 : 특정 픽셀(중심점 근처)에서 해당 객체의 경계 박스까지의 거리(좌, 우, 상, 하, 또는 중심점으로부터의 상대 좌표)를 딥러닝 모델이 직접 회귀(Regression)하여 찾아내는 것

**오해하기 쉬운 점

  • anchor-free라고 해서 박스가 없어지는 것은 아니다.
  • anchor-based가 항상 구식이고 anchor-free가 항상 우월하다고 단정할 수는 없다. 데이터셋과 head 설계, 학습 전략을 함께 봐야 한다.

Anchor-based는 사전 정의 다양한 크기의 박스(Anchor)를 활용해 객체 위치를 조정하는 전통적 방식(Faster R-CNN, YOLOv3 등)이다. 반면, Anchor-free는 사전 정의된 박스 없이 객체의 중심점, 특징점(Keypoint) 또는 영역을 직접 예측하는 방식(FCOS, CenterNet 등)이다.

  • Anchor-based : “기준 박스(anchor)를 놓고 얼마나 수정할지 예측하는 것” / 즉, 미리 준비된 박스 후보(anchor)를 기준으로 조금씩 수정해서 정답 박스를 만드는 방식
  • Anchor-free : “객체 중심/경계 정보를 더 직접적으로 예측하는 것” / 즉, 미리 준비된 박스 없이, 물체의 중심이나 경계까지의 거리를 직접 예측해서 박스를 만든다.
    이때, Anchor-free도 최종 출력은 여전히 Bounding Box이며, Anchor를 없앤다고 무조건 단순하고 좋은 것도 아니라는 것을 알아야 한다. 구현과 학습 안정성은 모델 설계 전체와 함께 봐야한다.

5.2 YOLO 버전별 발전 흐름 : YOLOv1, v2, v3, v5, v8

YOLOv1

YOLOv1은 객체탐지를 단일 회귀 문제로 공식화하여, 이미지 전체를 한 번에 입력받고 bounding box와 class probability를 직접 예측했다. 하나의 네트워크로 end-to-end 추론이 가능해 실시간 탐지가 가능했지만, 작은 객체 탐지와 localization 정확도에서는 한계가 있었다.

  • YOLOv1의 가장 중요한 아이디어는, 이전처럼 후보 영역을 먼저 만들고 그걸 다시 분류하는 2-stage 방식이 아니라, 이미지 전체를 한 번 보고 바로 bounding box와 class probability를 예측하는 것이다.
  • 하지만, YOLOv1은 박스 위치를 정교하게 맞추는 데는 약하다. grid 기반으로 이미지를 나눠 예측하는 특성상, 한 칸 안에 여러 작은 객체가 몰려 있으면 잘 처리하지 못하기 때문이다.
  • localization error가 많고 recall이 낮다

YOLOv2 / YOLO9000

YOLO9000 논문은 YOLOv2 개선과 더불어 9000개 이상의 클래스 검출 아이디어를 제시했다. 핵심 포인트는 다음과 같다. (YOLOv2는 anchor 도입과 multi-scale training으로 중요한 전환점을 만들었다.)

  • anchor box 도입
    • YOLOv1은 박스를 비교적 직접적으로 예측했는데, YOLOv2는 미리 정해둔 박스 형태(prior)를 기준으로 박스를 맞춰나가는 방식으로 바뀌었다.
  • cluster 기반 anchor 크기 선택
    • anchor를 아무렇게나 정하면 비효율적이기에 k-means clustering으로 데이터셋에 맞는 박스 prior 크기를 추출했다. 즉, 데이터셋에 자주 나오는 박스 모양을 통계적으로 뽑아 anchor를 정한 것이다.
  • fine-grained feature fusion
    • fine-grained feature : 세밀한 정보가 많은 feature
    • earlier layer의 feature를 뒤로 전달하는 구조
    • passthrough layer를 넣어서 earlier layer의 fine-grained feature를 뒤쪽 detection 쪽으로 전달해 앞쪽의 세밀한 정보와 뒤쪽의 의미 있는 정보를 함께 활용함.
    • 신경망 내의 중간 단계에서 나온 특징 맵(Feature Map)을 최종 레이어까지 직접 전달(Pass-through)하여 연결하는 계층
  • multi-scale training
    • 같은 모델을 다양한 입력 크기로 학습해 입력 해상도가 바뀌어도 잘 동작하도록 학습함.
  • detection + classification joint training (WordTree)
    • 분류(Classification) 데이터셋과 검출(Detection) 데이터셋을 결합하여 모델을 동시에 훈련

YOLOv3

YOLOv3는 여러 작은 설계 변경으로 성능을 높였다. 대표 포인트는 다음과 같다.

  • 3개 scale에서 예측 (서로 다른 3개 해상도의 feature map에서 각각 예측)
  • feature pyramid와 유사한 multi-scale prediction
    • 서로 다른 해상도의 feature를 계층적으로 활
  • Darknet-53 backbone
  • class prediction에서 독립 logistic classifier 사용
    • class prediction에서 softmax를 쓰지 않고 independent logistic classifiers를 사용하며, class prediction에는 binary cross-entropy loss를 쓴다.

즉, 작은 객체 처리를 더 강화하고, backbone과 multi-scale 전략을 개선했다.

YOLOv5

YOLOv5는 Ultralytics가 널리 보급시킨 실용적 구현 계열이다. 공식 문서는 YOLOv5에 대해 formal research paper는 없고, 최신 정보는 문서와 저장소를 참고하라고 명시한다.

  • 실용성 높은 PyTorch 구현
  • CSPDarknet 기반 backbone
  • PANet + SPPF 구조
  • 학습/배포/추론 파이프라인이 매우 편리

즉, YOLOv5는 “논문보다는 실무 생태계와 사용성 측면에서 중요성이 매우 큰 버전”이라고 볼 수 있다.

“YOLOv5가 YOLOv4의 공식 후속 논문인가요?” → 반드시 그렇게 단순화할 수는 없고, Ultralytics 구현 계열로 이해하는 것이 안전하다.

YOLOv8

Ultralytics 문서는 YOLOv8의 특징으로 다음을 강조한다.

  • anchor-free split head

    • anchor-free : 미리 정한 anchor box에 덜 의존하거나 사용하지 않는 방식
    • split head : classification branch와 box regression branch를 더 분리해서 처리하는 설계
  • 향상된 backbone / neck

  • detection뿐 아니라 segmentation, pose, classification 등 다양한 task 지원

  • accuracy-speed tradeoff 개선

    따라서 YOLOv8은 단순히 detector 하나가 아니라, 현대 Ultralytics 비전 프레임워크의 중심 모델로 이해하는 것이 좋다.

“YOLOv8은 그냥 v5보다 조금 좋아진 버전인가요?” → head 설계 철학과 task 확장성이 더 크다.

정리
YOLO의 발전은 단순히 “버전 번호 증가”가 아니라,
1. 예측 방식 개선
2. backbone 개선
3. multi-scale 처리 강화
4. 학습/배포 사용성 향상
의 흐름이다.

버전별 흐름을 읽을 때는 각 세대가 해결하려 한 문제를 함께 보는 것이 중요하다.
1. YOLOv1은 end-to-end one-stage detection의 관점을 정립했다.
2. YOLOv2는 anchor와 multi-scale training으로 성능과 안정성을 높였다.
3. YOLOv3는 multi-scale prediction과 Darknet-53으로 작은 객체 대응을 강화했다.
4. YOLOv5는 실무 친화적인 구현과 사용 편의성 측면에서 큰 영향을 주었다.
5. YOLOv8은 anchor-free split head와 다양한 task 지원을 전면에 내세운다.

오해하기 쉬운 점

  • 최신 버전이라고 해서 항상 모든 상황에서 최선인 것은 아니다.
  • 버전 비교는 단순 accuracy 숫자보다 목표한 문제와 사용 환경을 함께 봐야 한다.

5.3 Backbone, Neck, Head

Backbone (= 특징 추출)

Backbone은 이미지에서 시각 특징(feature)을 추출하는 부분이다. edge, texture, shape, semantic feature를 점점 추상적으로 추출하고, 다운샘플링을 통해 receptive field를 넓힌다.

  • YOLOv1 : 초기 custom convolutional stack
  • YOLOv3 : Darknet-53 [3]
  • YOLOv5 : CSPDarknet 계열 설명이 널리 사용됨

Neck (= 특징 융합)

Neck은 서로 다른 해상도의 feature를 결합한다. (서로 다른 해상도의 특징을 융합한다) 큰 객체는 깊은 레벨 feature가 유리하고, 작은 객체는 상대적으로 고해상도 feature가 중요하기 때문이다.

  • FPN 계열 top-down fusion
  • PANet 계열 path aggregation
  • SPP / SPPF 계열 receptive field 확장
  • YOLOv5 문서는 Neck에서 SPPF와 PANet 사용을 설명한다.

Head (= 최종 예측)

Head는 최종적으로 bounding box, class score, objectness / confidence에 해당하는 값(버전에 따라 구조 차이 존재)을 예측한다. (최종 box, class, objectness 관련 예측을 생성한다.) YOLOv8 문서는 anchor-free split head를 강조한다.

YOLO 계열을 이해할 때는 모델을 하나의 CNN 덩어리로 보기보다, 특징 추출–특징 융합–최종 예측의 세 부분으로 나누어 보는 것이 훨씬 유용하다. 이는 Backbone이 표현을 만들고, Neck이 서로 다른 해상도의 feature를 결합하며, Head가 각 위치에서 box/class/objectness 관련 출력을 생성하는 흐름을 지닌다. 이때, Backbone이 약하면 표현력이 부족하고, Neck이 약하면 multi-scale 객체를 잘 다루기 어려우며, Head가 약하면 최종 detection 품질이 떨어진다.

또한, 작은 객체 검출이나 multi-scale detection을 설명할 때는 Backbone 뿐만 아니라 Neck의 역할을 함께 강조하는 것이 중요하다. 저수준 Feature map은 해상도가 높아 작은 객체 위치를 잘 살리고, 깊은 Feature map은 추상적 의미가 강해 이게 무엇인지를 잘 판단할 수 있다. 이때, Neck은 이 둘을 연결해 작지만 중요한 물체도 놓치지 않게 해주는 역할을 한다. 여러 scale의 feature를 연결하고 융합해주기 때문이다. 다시 말해, 작은 객체 검출 성능이 단순히 여러 scale에서 예측한다는 점만으로 설명하기 어려운 이유는 서로 다른 해상도의 feature를 융합하는 Neck이 있기 때문에 작은 객체와 큰 객체를 모두 더 잘 탐지할 수 있다.

  • “Backbone이 곧 YOLO 전체인가요?” → 아니다. detector는 backbone만으로 끝나지 않는다. 따라서 Backbone만 좋아도 Detector 전체가 좋아진다고 볼 수는 없다.
  • “Head는 classifier랑 같은 건가요?” → detection head는 class뿐 아니라 box 관련 예측도 함께 수행하므로 classifier와는 차이가 있다. (Head를 단순 classifier로 이해하면 안 된다. detection head는 box와 score까지 함께 다룬다.)

5.4 Loss Function 구성 요소

YOLO의 loss는 버전에 따라 구현이 달라지지만, 교육적으로는 보통 다음 세 부분으로 나누어 이해하면 좋다.

L=λboxLbox+λobjLobj+λclsLclsL = \lambda_{box}L_{box} + \lambda_{obj}L_{obj}+\lambda_{cls}L_{cls}
  • LboxL_{box} : localization loss
  • LobjL_{obj} : objectness loss
  • LclsL_{cls} : classification loss
  • Loss는 결국 위치, 존재성, 클래스를 동시에 학습시키는 구조이다.
  • Classification Loss를 줄인다고 좋은 Detector인 것이 아니라, Localization과 Objectness를 함께 고려해야 한다. (Objectness와 Class Score는 다르다)

Localization Loss

  • 정답 박스와 예측 박스의 위치/크기 차이를 줄이고, 박스 위치와 크기를 정확하게 맞추기 위한 손실 → 박스 위치와 크기 오차를 줄인다
  • 변수 정의 : 예측 박스 파라미터, 정답 박스 파라미터
  • 필요성 : 클래스만 맞고 박스가 틀리면 Detection 품질이 낮기 때문임. Localization Loss는 박스 회귀의 핵심 손실이며, 작은 위치 오차도 성능에 영향을 줄 수 있다.
    Lbox=losson(x,y,w,h)L_{box} = loss on (x, y, w, h)

Objectness Loss

  • Objectness는 이 위치/박스가 실제 객체를 담고 있는지를 학습한다. 간단한 Binary Cross Entropy 형태 예시에서는 속하는지 아닌지 여부를 이진 분류한다. 즉, Objectness Loss는 객체 존재 여부를 학습하는 손실이다. → 객체가 있는 위치와 배경을 구분한다
  • 변수 정의 : y ∈ {0, 1} : 객체 존재 여부, y^\hat y : 모델이 예측한 objectness score
  • 필요성 : 모델은 이미지 전체에서 수많은 후보를 보고, 그 중 대부분은 배경이다. 따라서 배경과 객체를 구분하는 능력을 위해 Objectness Loss를 활용한다. 이는 실제 YOLO에서 False Positive(오탐)을 줄이는 데 큰 역할을 한다.
    Lobj=[ylog(y^)+(1y)log(1y^)]L_{obj} = - [ylog(\hat y) + (1 - y)log(1 - \hat y)]

Classification Loss

  • 객체가 무엇인지 맞추기 위한 손실로, 박스를 잘 찾았더라도 클래스를 잘못 맞추면 Detection은 실패이기에 Classification Loss를 활용한다. 실제 YOLO에서는 클래스 수, 데이터셋 특성, head 구조에 따라 구체 구현이 달라질 수 있다. → 해당 객체의 클래스를 맞추게 한
  • 클래스 분류 손실 예시는 다음과 같이 쓸 수 있으며, multilabel 상황에서는 BCE 계열을 쓸 수 있다.
    Lcls=k=1Cyklog(p^k)L_{cls} = - \sum_{k=1}^C y_k log (\hat p_k)

5.5 Label format과 Dataset 구성 방식

Ultralytics YOLO Detection Label 형식

  • 이미지당 하나의 *.txt 파일을 사용하며, 각 줄은 class x_center, y_center width, height 형식을 따른다. 단, 이미지에 객체가 없으면 txt 파일이 없어도 된다.
  • 이때, 좌표는 정규화된 xywh 형식, 즉 [0, 1] 범위이다. (bounding box 좌표를 픽셀값 그대로 쓰지 않고, 이미지 크기 대비 비율로 바꾸는 것)
    • 이미지 크기가 달라도 같은 기준으로 학습할 수 있고, 학습이 더 안정적이기에 이 방법을 활용
    • multi-scale training에 유리하기도 함. (YOLO는 입력 크기를 바꿔가며 학습하는 경우가 많은데, 좌표가 비율로 표현되면 해상도가 달라져도 같은 객체를 비슷한 방식으로 다룰 수 있음)
  • 중요 포인트는 각 이미지에는 대응하는 txt 라벨이 있어야 하고, 라벨은 normalized xywh 형식을 따라야 하며, data.yaml은 train/val/test 경로와 클래스 이름을 정확히 연결해야 한다는 것이다.
  • 정규화 좌표를 쓰는 이유는 이미지 해상도가 달라도 같은 비율 표현을 예상할 수 있기 때문이다.

디렉터리 예시

my_data/
├── images/
│   ├── train/
│   ├── val/
│   └── test/
├── labels/
│   ├── train/
│   ├── val/
│   └── test/
└── data.yaml

data.yaml 예시

  • *.txt 파일을 사용하며, 각 줄은 class x_center, y_center width, height 형식을 따른다 에서 classdata.yaml의 names를 매칭해 이름을 읽어옴.
path: /content/my_dataset
train: images/train
val: images/val
test: images/test
names:
  0: person
  1: helmet
  2: vest

좋은 데이터셋의 조건

  1. 클래스 정의가 명확할 것
  2. annotation consistency가 높을 것
  3. train/val/test 분할이 적절할 것
  4. 도메인 편향이 심하지 않을 것
  5. 작은 객체, 가림, 다양한 조명 조건을 충분히 포함할 것

5.6 학습, 추론, 후처리 전체 파이프라인

추론 파이프라인

  • 입력 이미지 → 전처리 (resize, normalize 등) → 모델 forward → 박스/클래스/score 후보 생성 → confidence threshold 적용 → NMS → 최종 박스 출력

학습 파이프라인

  • 이미지 + 라벨 로드 → augmentation → forward → box/objectness/class loss 계산 → backpropagation → optimizer step → epoch 반복 → validation

Validation 해석 핵심

  • 박스가 많이 나오는데 틀린 것도 많다 → precision 문제
  • 객체를 자주 놓친다 → recall 문제
  • 박스는 대충 맞는데 localization이 거칠다 → IoU / box regression 문제
  • 특정 클래스만 유독 약하다 → data imbalance 또는 annotation quality 문제
  • “loss만 보면 충분하지 않나요?” → 아니다. detection은 정성 결과를 반드시 함께 봐야 한다
    • 정량 지표 + 정성 시각화 결과를 모두 봐야 함.
  • “mAP만 높으면 배포 가능한가요?” → latency, memory, domain shift, class imbalance도 함께 고려해야 한다.
profile
얼렁뚱땅 바보 학부생...

0개의 댓글