수민 '-'

플오그래밍

제가 작성하는 모든 글은 절대 상업적인 이용이 아니며, 그저 개인적인 공부 용도로만 사용하는 것임을 밝힙니다.

Object Detection - 개념, 전통 기법, YOLO, Pascal VOC 2007, mAP

객체 탐지(Object Detection) 한 눈에 정리하기

이미지나 영상에서 무엇이 어디에 있는지를 찾는 기술이 바로 객체 탐지(Object Detection)다. 이 글에서는 전통 기법부터 YOLO·Faster R-CNN, Pascal VOC 2007, YOLO 형식 어노테이션, Ultralytics YOLOv8 학습·평가·추론, mAP·IoU 같은 평가 지표까지 한 번에 정리한다.

(Object Detection - 류지 프로젝트를 기반으로 재구성)


1. Object Detection이란?

Object Detection(객체 탐지) 는 이미지/영상에서 특정 객체의 존재 여부를 확인하고, 위치를 바운딩 박스(bounding box)로 표시하는 기술이다.

  • 역할: 여러 객체를 동시에 탐지 + 클래스 분류
  • 대표 딥러닝 기법:
    • R-CNN 계열: Faster R-CNN, Mask R-CNN
    • YOLO(You Only Look Once) 시리즈
    • SSD(Single Shot MultiBox Detector)
  • 활용: 자율 주행, CCTV·보안, 의료 영상 분석, 증강 현실(AR) 등

2. 전통적인 객체 탐지 기법

딥러닝 등장 전에는 특징 추출 + 머신러닝 분류기 조합이 주류였다.

2-1. 특징 추출 (Feature Extraction)

  • 핸드크래프트 특징: 사람이 규칙을 설계해 이미지를 수치화
    • HOG: 경계선·윤곽선 방향 히스토그램
    • SIFT: 크기·회전에 불변인 특징점 검출
    • SURF, LBP 등도 사용
  • 결과:
    → “경계선이 많다/둥글다/텍스처가 이렇다” 같은 특징 벡터

2-2. 분류기 학습 (Classifier Training)

  • 특징 벡터 → 머신러닝 모델에 입력
    • SVM, Adaboost, 랜덤 포레스트 등
  • 예: 얼굴 탐지
    HOG로 얼굴 특징 추출 → SVM이 “얼굴 / 비얼굴” 판별

2-3. 후보 영역 탐색 (Region Proposal)

  • 객체가 있을 법한 위치를 찾는 단계
    • 슬라이딩 윈도우: 작은 창을 전체 이미지 위로 슬라이딩하며 탐색
    • 선택적 탐색(Selective Search): 색·질감·경계선 기반으로 후보 영역 생성

한계는 "특징을 사람이 설계해야 한다"는 점과 복잡한 배경·스케일 변화에 약하다는 점이고, 이후 딥러닝 기반 탐지로 빠르게 대체되었다.


3. 딥러닝 기반 객체 탐지 – 1단계 vs 2단계

딥러닝 객체 탐지는 크게 1단계(One-Stage)2단계(Two-Stage) 로 나뉜다.

3-1. 1단계 탐지 (One-Stage Detection)

입력을 한 번에 처리해 위치 + 클래스를 동시에 예측하는 방식이다.

  • 대표 알고리즘: YOLO, SSD, RetinaNet
  • 장점: 속도가 매우 빨라 실시간 응용에 적합
  • 단점: 작은 객체·복잡한 배경에서 상대적으로 정확도 떨어질 수 있음

예측 방식

  • Anchor-based: 여러 크기·비율의 앵커 박스를 준비해 두고 조금씩 보정
  • Anchor-free: 별도의 앵커 없이 직접 중심·크기를 예측

학습 방식

  • 모델이 박스+클래스를 예측 → 손실 함수가
    • "클래스 맞았나?"
    • "박스 위치 얼마나 차이나나?"를 채점
  • 이 손실을 줄이는 방향으로 파라미터를 업데이트하면서 학습한다.

3-2. 2단계 탐지 (Two-Stage Detection)

1단계에서 후보 영역을 만든 뒤, 2단계에서 세밀하게 분류·박스 보정을 하는 방식이다.

  • 대표 알고리즘: R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN
  • 장점: 정확도가 높고 작은 객체에도 강함
  • 단점: 속도가 느려 실시간 처리에는 불리

학습 관점

  • 1단계: "진짜 물체 근처 후보를 잘 잡았는가?" (Region Proposal 품질)
  • 2단계: "해당 영역의 클래스·좌표를 얼마나 정확히 맞췄는가?"
  • 두 단계 모두 손실을 통해 점점 더 정확하게 후보·박스를 조정한다.

4. YOLO 한 번에 보기

YOLO(You Only Look Once) 는 이미지를 격자로 나누고 각 격자에서 바운딩 박스 좌표 + 클래스를 동시에 예측하는 1단계 탐지 알고리즘이다.

  • 한 번의 추론으로 전체 이미지 탐지 → 매우 빠름
  • 실시간 객체 탐지에 적합

4-1. YOLO 모델 크기

  • n (nano): 초경량, 모바일·임베디드용
  • s (small): 빠르고 정확도도 괜찮아 실시간 추론에 많이 사용
  • m (medium): 속도·성능 균형
  • l (large): 높은 정확도 필요할 때
  • x (extra-large): 최상 성능, 속도는 느림

4-2. YOLO 모델 유형

  • YOLO Detect: 일반적인 객체 탐지 (바운딩 박스)
  • YOLO Segment: 탐지 + 픽셀 단위 분할 (Segmentation)
  • YOLO Pose: 관절 키포인트 기반 포즈 추정
  • YOLO Cls: 이미지 분류
  • YOLO OBB: 회전된 객체(Oriented Bounding Box) 탐지

YOLO v1–v3는 Joseph Redmon, v4·v7은 커뮤니티, v5·v8·v11은 Ultralytics가 주도적으로 발전시키고 있다.


5. Pascal VOC 2007과 YOLO 포맷

Pascal VOC 2007은 객체 탐지·분할·동작 인식 등을 위한 클래식 벤치마크 데이터셋이다.

  • 클래스 20개 (person, car, dog, cat 등)
  • train / val / test 세트
  • 바운딩 박스 + 클래스 레이블 제공
  • 평가 기준: mAP(Mean Average Precision)

5-1. VOC → YOLO 라벨 변환

YOLO는 바운딩 박스를 다음 형태의 정규화된 텍스트 파일로 저장한다.

<class_id> <x_center> <y_center> <width> <height>
예) 8 0.587 0.733 0.122 0.341
  • class_id: 클래스 인덱스
  • x_center, y_center: 중심 좌표 (이미지 너비·높이로 나눈 0~1 값)
  • width, height: 박스 너비·높이 (0~1 값)

convert2Yolo 같은 스크립트를 이용해 VOC XML 어노테이션을 YOLO 포맷으로 변환한 뒤, train/val/test 구조로 이미지·라벨을 정리하면 YOLO 학습에 사용할 수 있다.


6. Ultralytics YOLOv8 학습 설정

6-1. YAML 설정 파일

YOLO는 data.yaml로 데이터 경로와 클래스 정보를 정의한다. 예:

path: /content/pascal_datasets/VOC
train:
  - images/train2007
val:
  - images/val2007
test:
  - images/test2007

nc: 20
names: ['aeroplane', 'bicycle', 'bird', 'boat', 'bottle',
        'bus', 'car', 'cat', 'chair', 'cow',
        'diningtable', 'dog', 'horse', 'motorbike', 'person',
        'pottedplant', 'sheep', 'sofa', 'train', 'tvmonitor']
  • path: 데이터 루트
  • train / val / test: 이미지 폴더 상대 경로
  • nc: 클래스 개수
  • names: 클래스 이름 리스트

6-2. YOLOv8 설치·학습 코드

pip install ultralytics
from ultralytics import YOLO

model = YOLO('yolov8s.pt')

results = model.train(
    data='/content/pascal_datasets/custom_voc.yaml',  # data.yaml 경로
    epochs=10,
    batch=32,
    imgsz=640,
    device=0,        # 0: 첫 번째 GPU, CPU는 -1 또는 'cpu'
    workers=2,
    name='custom_s'  # 결과 저장 폴더 이름
)

7. 객체 탐지 모델 성능 평가 지표

7-1. Precision (정밀도)

  • 모델이 "객체다"라고 예측한 것 중 정답 비율
  • 식:

  • FP(위양성)가 많을수록 Precision이 떨어진다.

7-2. Recall (재현율)

  • 실제로 존재하는 객체 중 모델이 놓치지 않고 찾은 비율
  • 식:

  • FN(위음성)이 많을수록 Recall이 떨어진다.

7-3. IoU (Intersection over Union)

  • 예측 박스와 정답 박스가 얼마나 겹치는지를 나타내는 값
  • 식:

  • 1에 가까울수록 예측이 정답과 거의 일치
  • 보통 IoU ≥ 0.5 이상이면 "맞췄다"고 취급하는 경우가 많다.

7-4. AP (Average Precision)

  • 한 클래스에 대해 Precision-Recall 곡선을 그리고 그 아래 넓이(면적)를 적분한 값
  • 보통 AP@IoU=0.5처럼 특정 IoU 기준으로 계산한다.

7-5. mAP (mean Average Precision)

  • 여러 클래스의 AP를 평균 낸 값
  • 전체 모델의 탐지 성능을 대표하는 지표
  • 변형:
    • mAP@50: IoU ≥ 0.5인 경우만 기준
    • mAP@50-95: IoU 0.5~0.95를 0.05 간격으로 바꿔가며 평균 (더 엄격)

7-6. FPS와 Latency

  • FPS: 초당 처리 가능한 프레임 수 (예: 30 FPS → 1초에 30장)
  • Latency: 한 장 처리에 걸리는 시간 (예: 50ms → 0.05초/장)

8. YOLOv8 평가와 추론 예시

8-1. 테스트셋 성능 검증

from ultralytics import YOLO

# 학습된 모델 로드
model = YOLO("runs/detect/custom_s2/weights/best.pt")

# 검증 수행
results = model.val(
    data="/content/pascal_datasets/custom_voc.yaml",  # 데이터셋 설정
    imgsz=640,
    iou=0.5,
    batch=32,
    device=0,
    workers=2,
    half=True,         # FP16 연산 (속도 향상)
    split="test"       # 테스트 셋 사용 (오타 주의)
)

print(results)

8-2. 이미지 폴더에 대한 예측

model = YOLO("/content/runs/detect/custom_s2/weights/best.pt")

results = model.predict(
    source="/content/pascal_datasets/VOC/images/custom2007",
    imgsz=640,
    conf=0.25,     # Confidence 임계값
    device=0,
    save=True,     # 이미지에 박스 그려 저장
    save_txt=True, # YOLO 포맷 라벨 저장
    save_conf=True # 라벨에 Confidence 함께 저장
)

print(results)

마치며

  • 객체 탐지는 이미지 속 객체의 클래스 + 위치를 동시에 예측하는 기술로, 전통 기법(HOG+SVM)에서 딥러닝 기반(1단계 YOLO, 2단계 Faster R-CNN)으로 발전해 왔다.
  • YOLO는 격자 단위 1단계 탐지로 매우 빠르며, 모델 크기(n~x)·유형(Detect/Segment/Pose/Cls/OBB)으로 상황에 맞게 선택할 수 있다.
  • Pascal VOC 2007는 클래식 벤치마크 데이터셋이고, YOLO 포맷 어노테이션data.yaml 설정을 갖추면 Ultralytics YOLOv8으로 손쉽게 학습·평가·추론을 할 수 있다.
  • 모델 성능 평가는 Precision·Recall·IoU·AP·mAP·FPS·Latency를 함께 보면서, 정확도와 속도의 균형을 잡는 방향으로 진행하는 것이 중요하다.

다음에는 Segmentation 태스크나 COCO 기반 YOLO 실습으로 확장해 보면 좋다.