AI/딥러닝

이미지 데이터와 불량 검출 3일차 (Object Detection, YOLO, OpenCV)

edcrfv458 2025. 3. 20. 13:53

목표

  • Object Detection 개요
    • 분류 vs 검출의 차이
    • Bounding Box, IoU(Intersection over Union), NMS(Non-Max Suppression) 개념
    • R-CNN 계열 (2-stage) vs YOLO/SSD (1-stage) 모델
  • OpenCV 기초
    • 이미지 입출력, 색공간 변환, 도형 그리기
  • 실습
    • 동전 이미지에서 원 검출 (Contour/Hough Circle)
    • 동전 크기별 금액 계산 후 시각화

 

Object Detection

 

이미지 분류(Classification) vs Object Detection

  • 이미지 분류: 이미지가 어떤 객체인가
  • Object Detection: 어디에 어떤 객체가 있는가

 

Object Detection 특징

  • 전처리 (Pre-processing)
  • 특징 추출 (Feature Extraction)
  • 분류 (Classifier)

 

R-CNN 계열 (2-stage) vs YOLO (1-stage) 비교

  • R-CNN: 객체 탐지 (Object Detection) 분야에서 처음으로 CNN 적용한 모델
  • R-CNN 계열 주요 아이디어
    • 이미지를 영역 제안(Region Proposal)을 통해 여러 개의 작은 후보로 나눔
    • 후보 각각을 CNN에 입력해 특징을 추출
    • 추출된 특징 벡터를 분류기(SVM)에 입력해 객체 분류
    • Bounding Box Regression을 통해 위치를 보정
      • "Region Proposal + CNN = 객체 탐지"

 

YOLO (you only look once)

  • one-shot 특징 분류기
    • 이미지를 단 한번만 호출하고 동시에 각 영역에 가중치를 부여 (분류 + location 동시에 가능)
    • 실시간 영상에 특화
  • 주요 아이디어
    • 이미지 입력 및 CNN 처리해 특징 추출 및 정보를 생성
    • Bouding Box 및 클래스 예측을 통해 객체 위치 및 클래스를 예측
    • Non-Maximum Supperession(NMS)을 통해 중복된 박스 제거 및 최종 객체를 결정

 

R-CNN vs YOLO

  • YOLO에서 오버헤드가 크게 감소
    • R-CNN 계열은 Region Proposal 후보를 수천개 제안
    • YOLO는 총 7x7x2 = 98 개의 연산 후보를 제안
  R-CNN YOLO
구조 Region Proposal 단계 + CNN 탐지 단계(2-stage) 단일 CNN 구조(1-stage)
Region Proposal Selective Search 사용 ➡️ 매우 느림 Region Proposal 단계 없음
복잡도 Region Proposal 단계와 CNN 단계에서 연산 반복 ➡️ 연산량 증가 CNN Forward Pass 한 번에 해결
속도 매우 느림 ➡️ 실시간 탐지 불가 매우 빠름 ➡️ 실시간 탐지 가능(FPS > 30)
성능 높은 정확도 정확도는 조금 떨어짐 (하지만 속도 빠름)
활용 분야 정밀한 객체 탐지 (의료) 실시간 탐지 (영상)

 

YOLO

 

등장 개념

  • 바운딩 박스(bounding Box): 최종 객체 검출 영역
    • 객체가 존재하는 위치 나타내는 직사각형 상자
    • YOLO는 (x, y, w, h) 값으로 경계 상자 예측
      • (x, y): 경계 상자의 중심 좌표
      • (w, h): 경계 상자의 너비와 높이
  • ROI (region on interest): 관심있는 지역
    • 분석하고자 하는 특정 영역
    • 이미지에서 전체가 아닌 특정 부분만 선택해 처리할 때 사용
  • IOU (Intersection over Union): 예측한 Bounding Box와 실제 객체의 Bounding Box 간 겹치는 정도를 나타내는 지표
    • IoU = (예측 영역 실제 영역) / (예측 영역 ∪ 실제 영역)
  • NMS: Non Maximum Suppression
    • YOLO는 같은 객체에 대해 여러 개의 Bounding Box 출력 가능
    • NMS는 겹치는 박스 중 신뢰도가 가장 높은 것만 선택하고 나머지는 제거

 

구조

  • 입력 이미지 448 x 448 x 3 (RGB) 크기에 맞춰 변환한 뒤, CNN에 입력
  • 이미지를 7 x 7 크기의 그리드 셀로 나눔 (총 49개)
  • 각 그리드셀에서 다음 정보를 출력 ➡️ 총 30개:
    • Bouding Box 2개 ➡️ 각 Box 당 5개 값 (x, y, w, h, c)
    • 클래스 확률 (20개) ➡️ VOC 데이터셋에서 기준 클래스 수

 

빨간색 그리드셀 위치에서 예측한 노란색 바운딩 박스 2개

  • 각 그리드 셀은 최대 두 개의 Bounding Box 예측
설명
x, y 그리드 셀 내에서 Bouding Box의 중심 좌표
w, h 전체 이미지 기준 Bounding Box의 너비 및 높이
c Bouding Box의 신뢰도(confidence), 객체가 있을 확률

 

그리드 셀에서 존재하는 20개 클래스 예측 확률

  • 각 그리드 셀은 20개의 클래스 확률을 출력
  • 클래스 예측 예시:
    • 개 (Dog) ➡️ 0.8
    • 자전거 (Bike) ➡️ 0.1
    • 자동차 (Car) ➡️ 0.05

 

NMS 단계

  • 여러 개의 중복된 박스 중에서 가장 신뢰도가 높은 박스를 남기고 나머지는 제거
  • 예를 들어 IoU(Intersection over Union)가 일정 값 이상이면 중복된 것으로 판단하고 제거

 

OpenCV

  • 실시간 이미지 및 비디오 처리용 오픈소스 라이브러리 (C++, Python 지원)
  • YOLO가 객체 탐지 시 이미지 불러오고, 전처리하고, 결과 시각화하는 작업에서 OpenCV 필요

 

활용 범위

  • 이미지 및 영상 데이터 처리
    • YOLO가 입력할 이미지나 영상을 OpenCV로 읽기
    • YOLO가 탐지한 결과 이미지를 OpenCV로 표시
  • 전처리 필수 도구
    • YOLO가 정확히 탐지할 수 있도록 이미지 크기 조정
    • 노이즈 제거, 색상 변환 등 전처리 작업 수행
  • 결과 시각화
    • YOLO가 탐지한 객체를 Bouding Box로 표시
    • 탐지 결과에 텍스트 추가 및 저장
  • 속도가 빠르고 효율적
    • C++ 기반 ➡️ 연산 속도 빠름
    • Python 지원 ➡️ 코드 작성이 간단
  • 다양한 딥러닝 모델과 연동 가능
    • YOLO, Faster R-CNN 등 객체 탐지 모델에서 사용 가능