🤖AI/ML

객체 탐지

Object Detection

이미지나 영상에서 객체의 위치(바운딩 박스)와 종류(클래스)를 동시에 식별하는 컴퓨터 비전 기술. YOLO, Faster R-CNN, DETR 등 다양한 모델이 자율주행, 보안, 의료 영상 분석에 활용됩니다.

📖 상세 설명

객체 탐지(Object Detection)는 이미지나 영상에서 특정 객체의 위치(바운딩 박스)와 종류(클래스)를 동시에 식별하는 컴퓨터 비전 기술입니다. 단순 이미지 분류와 달리 "어디에" "무엇이" 있는지를 함께 예측하며, 자율주행, 보안 카메라, 의료 영상 분석, 제조업 품질 검사 등에서 핵심적으로 활용됩니다.

객체 탐지는 크게 두 가지 접근법으로 나뉩니다. Two-stage 방식(R-CNN, Fast R-CNN, Faster R-CNN)은 먼저 Region Proposal Network(RPN)로 후보 영역을 추출하고 각 영역을 분류하는 방식으로 정확도가 높습니다. One-stage 방식(YOLO, SSD, RetinaNet)은 이미지 전체를 한 번에 처리하여 속도가 빠릅니다. 최근에는 Transformer 기반의 DETR이 등장하며 새로운 패러다임을 제시하고 있습니다.

성능 평가에는 mAP(mean Average Precision)와 IoU(Intersection over Union)가 사용됩니다. mAP@0.5는 IoU 50% 이상을 정답으로 인정하며, COCO 데이터셋 기준으로 모델 성능을 비교합니다. YOLOv8/v9/v10은 실시간 성능과 정확도의 균형을 잘 맞춘 최신 모델이며, RT-DETR은 Transformer 기반으로도 실시간 처리가 가능합니다.

실무에서는 데이터 품질이 가장 중요합니다. 라벨링 정확도, 클래스 불균형, 다양한 크기/각도의 객체 포함 여부가 모델 성능에 직접적인 영향을 미칩니다. 엣지 디바이스 배포를 위해서는 모델 경량화(Pruning, Quantization)와 ONNX/TensorRT 변환이 필수입니다.

📊 성능 & 비용

주요 객체 탐지 모델 성능 비교 (COCO val2017 기준, 2025년 1월)

모델 mAP@0.5:0.95 FPS (T4 GPU) 파라미터 용도
YOLOv8n 37.3% ~450 3.2M 엣지/모바일
YOLOv8m 50.2% ~180 25.9M 균형
YOLOv8x 53.9% ~60 68.2M 고정확도
YOLOv10x 54.4% ~55 56.9M 최신 SOTA
RT-DETR-L 53.0% ~114 32M Transformer 기반
Faster R-CNN 43.0% ~15 41M 연구/고정밀

선택 가이드: 실시간 처리가 필요하면 YOLOv8n/s, 정확도가 중요하면 YOLOv8x 또는 YOLOv10x, 작은 객체 탐지가 중요하면 RT-DETR을 권장합니다. 엣지 배포 시 INT8 양자화로 2-4배 속도 향상이 가능합니다.

💻 코드 예제

Ultralytics YOLOv8을 사용한 객체 탐지 예제입니다.

# pip install ultralytics

from ultralytics import YOLO
import cv2

# YOLOv8 모델 로드 (nano 버전 - 가장 빠름)
model = YOLO('yolov8n.pt')

# 이미지에서 객체 탐지
image_path = 'street.jpg'
results = model(image_path)

# 결과 처리
for result in results:
    boxes = result.boxes  # 바운딩 박스

    for box in boxes:
        # 좌표 추출 (x1, y1, x2, y2)
        x1, y1, x2, y2 = box.xyxy[0].tolist()

        # 클래스와 신뢰도
        cls_id = int(box.cls[0])
        cls_name = model.names[cls_id]
        confidence = float(box.conf[0])

        print(f"객체: {cls_name}")
        print(f"  위치: ({x1:.0f}, {y1:.0f}) - ({x2:.0f}, {y2:.0f})")
        print(f"  신뢰도: {confidence:.2%}")

# 결과 이미지 저장
result_img = results[0].plot()  # 바운딩 박스가 그려진 이미지
cv2.imwrite('result.jpg', result_img)

# 실시간 웹캠 탐지
# results = model(source=0, show=True, stream=True)  # 웹캠

# 출력 예시:
# 객체: car
#   위치: (120, 200) - (450, 380)
#   신뢰도: 94.32%

커스텀 데이터셋으로 Fine-tuning 예제입니다.

# 커스텀 학습 - YOLO 포맷 데이터셋 필요
# data.yaml 예시:
# path: /data/custom_dataset
# train: images/train
# val: images/val
# names:
#   0: helmet
#   1: vest
#   2: person

from ultralytics import YOLO

# 사전학습된 모델로 시작
model = YOLO('yolov8n.pt')

# Fine-tuning
results = model.train(
    data='data.yaml',
    epochs=100,
    imgsz=640,
    batch=16,
    device=0,  # GPU 0번
    workers=8,
    patience=20,  # Early stopping
    augment=True,
    mosaic=1.0,  # 모자이크 어그멘테이션
    mixup=0.1
)

# 검증
metrics = model.val()
print(f"mAP@0.5: {metrics.box.map50:.3f}")
print(f"mAP@0.5:0.95: {metrics.box.map:.3f}")

# ONNX 내보내기 (엣지 배포용)
model.export(format='onnx', imgsz=640, simplify=True)

# TensorRT 내보내기 (NVIDIA GPU 최적화)
model.export(format='engine', imgsz=640, half=True)  # FP16

🗣️ 실무 대화 예시

💬 회의에서

"CCTV 영상 분석에 YOLOv8 nano를 쓰면 RTX 3060에서 초당 200프레임 이상 처리가 가능해요. TensorRT로 변환하면 더 빨라지고, 정확도는 조금 떨어지지만 실시간 처리가 우선이라면 최선입니다."

💬 면접에서

"자동차 번호판 인식 시스템을 구축했습니다. YOLOv8으로 번호판 영역을 먼저 검출하고, CRNN 기반 OCR로 문자를 인식하는 파이프라인을 설계했어요. 야간/역광 상황을 위해 합성 데이터로 어그멘테이션하여 mAP@0.5에서 97%를 달성했습니다."

💬 기술 토론에서

"작은 객체 탐지가 어려우면 입력 해상도를 1280으로 올리거나 SAHI(Slicing Aided Hyper Inference)를 써야 해요. 메모리가 부족하면 RT-DETR이 작은 객체에 더 강해요. Transformer의 self-attention이 전역 컨텍스트를 잘 잡거든요."

⚠️ 주의사항

클래스 불균형 무시

학습 데이터에서 특정 클래스가 너무 적으면 그 클래스를 잘 탐지하지 못합니다. Focal Loss나 오버샘플링, 또는 클래스별 가중치 조정이 필요합니다.

라벨링 품질 경시

바운딩 박스가 정확하지 않거나 라벨이 일관성 없으면 모델이 제대로 학습되지 않습니다. 라벨링 가이드라인을 명확히 하고 QA 프로세스를 도입하세요.

운영 환경 차이 무시

학습 데이터와 실제 운영 환경(조명, 날씨, 카메라 각도)이 다르면 성능이 크게 저하됩니다. 도메인 적응(Domain Adaptation) 기법을 고려하세요.

올바른 방법

충분한 데이터 어그멘테이션(회전, 스케일, 모자이크, 색상 변환)을 적용하고, NMS threshold와 confidence threshold를 도메인에 맞게 조정하세요. 엣지 배포 시 ONNX/TensorRT 변환과 INT8 양자화로 최적화하세요.

🔥 실제 장애 사례

Tesla Autopilot 2016-2021

객체 탐지 실패로 인한 다수의 자율주행 사고

원인: 흰색 트레일러/트럭을 밝은 하늘 배경으로 오인, 정지된 응급차량 미탐지, 역광 상황에서의 인식 실패

영향: 다수의 사망 사고 발생, NHTSA 조사 및 리콜 권고

해결: 카메라 기반에서 카메라+레이더 퓨전으로 전환(이후 다시 카메라만으로 복귀), 학습 데이터 다양화

교훈: 안전 크리티컬 시스템에서는 단일 센서/모델에 의존하지 말고 멀티모달 퓨전과 충분한 엣지 케이스 테스트가 필수입니다.

📎 NHTSA 보고서
Amazon 2018

Rekognition 얼굴 인식의 인종 편향 논란

원인: 학습 데이터의 인종별 불균형으로 흑인 여성에 대한 오탐률이 백인 남성 대비 31% 높음

영향: 법 집행기관 사용 중단 요청, 신뢰도 하락

해결: 학습 데이터 다양성 확보, 공정성 테스트 도입

교훈: AI 모델의 공정성(Fairness)과 편향(Bias)을 사전에 검증하고, 다양한 인구통계학적 그룹에서 균일한 성능을 보장해야 합니다.

📎 Gender Shades 연구

📝 이해도 퀴즈

Q1. 객체 탐지에서 Two-stage 방식의 대표적인 모델은?

Q2. 객체 탐지 성능 평가에서 바운딩 박스의 겹침 정도를 나타내는 지표는?

Q3. 엣지 디바이스에 객체 탐지 모델을 배포할 때 속도 최적화를 위해 주로 사용하는 기법이 아닌 것은?

🔗 관련 용어

📚 더 배우기