카테고리 없음

[컴퓨터 비전] 객체 검출 (object detection)

외손잡이 2024. 9. 19. 21:24
작성자 장원준
일 시 2024. 9. 19  (목) 18:00 ~ 21:00
장 소 복지관 b-128호
참가자 명단 임혜진, 이재영, 성창민, 김명원, 장원준
 사 진

 

 
 

객체 검출(Object Detection)은

이미지 속에서 객체를 찾아내고, 그 객체를 감싸는 가장 작은 직사각형, 즉 bounding box를 찾아내는 작업입니다. 이미지 분류(Image Classification)와 비교하자면, 이미지 분류는 객체마다 라벨을 붙이는 데 중점을 두지만, 객체 검출에서는 라벨을 붙이는 것뿐만 아니라 이미지 상의 좌표도 함께 출력해야 합니다. 비슷한 개념인 이미지 위치 지정(Image Localization)과 이미지 분류, 객체 검출을 비교하면 다음과 같습니다.

  • 이미지 분류: 하나의 객체가 무엇인지 분류합니다.
  • 이미지 위치 지정: 하나의 객체가 어디에 있는지 알아냅니다.
  • 객체 검출: 여러 객체의 위치를 파악하고 각각이 무엇인지 확인합니다.

 

 

R-CNN 

CNN을 사용하여 object detection task의 정확도와 속도를 획기적으로 향상시켰으나 초기 모델인 만큼 복잡하고, 엄청 오래 걸립니다.

네트워크 구조

 

 

  • 이미지 입력
    첫 단계는 이미지 입력입니다.
  • 영역 제안(Region Proposal)
    Selective Search 알고리즘을 사용해 약 2000개의 ROI(Region of Interest)를 추출하고, 각각의 영역에 대해 bounding box를 생성합니다. 이 알고리즘은 색상, 질감, 객체의 주변 상황 등을 분석해 다양한 방식으로 객체 위치를 제안합니다. 아래 그림처럼 여러 개의 bounding box를 무작위로 생성한 후, 이를 점차적으로 병합해가며 물체를 찾아내는 방식입니다.
  • 워핑(Warping)
    CNN에 넣기 전에 각 bounding box를 동일한 크기(227 x 227)로 변환합니다. 이 과정에서 이미지가 왜곡되고 정보 손실이 발생할 수 있습니다.
  • CNN 피처 추출
    워핑된 이미지를 CNN 모델에 넣어 특징 벡터를 추출합니다. 미리 학습된 CNN 모델을 사용하고, 객체 검출 데이터로 fine-tuning을 거칩니다.
  • SVM을 통한 이미지 분류
    CNN으로 추출된 특징 벡터를 기반으로 각 클래스별 SVM(Support Vector Machine) 분류기를 학습시킵니다. CNN 분류기를 사용했을 때보다 SVM을 사용한 성능이 더 높았기 때문입니다. SVM을 통해 2000여 개의 bounding box는 각각 객체일 확률을 가지게 됩니다.
  • 비최대 억제(Non-Maximum Suppression)
    2000여 개의 bounding box 중 같은 객체에 대해 여러 개의 박스가 생성될 수 있습니다. 이 경우 Non-Maximum Suppression 기법을 사용해 가장 적합한 하나의 bounding box를 선택합니다.
  • Bounding Box Regression (BBR)
    Selective Search로 찾은 bounding box의 위치가 부정확할 수 있어, Bounding Box Regression을 수행해 이를 교정합니다. Ground Truth(G)와 초기 bounding box(P)의 위치를 중심점 좌표(x, y)와 크기(width, height)로 표현하며, P를 G에 맞게 이동시키는 함수를 학습시킵니다. Loss 함수는 MSE와 L2 정규화를 결합한 형태로 구성됩니다.



YOLO V1 

 

 

YOLO V1 네트워크는 One-Stage Detector의 시작을 알린 대표적인 객체 검출 모델입니다. 현재까지도 YOLO 계열은 지속적으로 발전해왔으며, 버전이 업데이트될수록 다른 네트워크의 장점을 흡수해 성능이 크게 향상되고 있습니다.

객체 검출 네트워크의 성능을 평가하는 두 가지 주요 지표는:

  1. 정확도(mAP): 모델이 객체를 얼마나 정확하게 검출하는지를 평가합니다.
  2. 속도(FPS): 수행 시간, 즉 모델이 얼마나 빠르게 결과를 도출하는지를 의미합니다.

YOLO V1은 정확도 측면에서 당시의 Two-Stage Detector인 Faster R-CNN보다 다소 부족했지만, 속도(FPS)에서는 큰 성능 향상을 이루었습니다. 이로 인해 실시간 객체 검출에서 주목받게 되었습니다.

YOLO V1의 네트워크 구조를 순서대로 살펴보면, 이러한 성능 향상의 원인을 더 깊이 이해할 수 있습니다. YOLO는 이미지 전체를 한 번에 처리해 객체를 검출하는 방식을 사용하기 때문에 속도에서 큰 이점을 가집니다.

총 24개의 convolutional layers과 2개의 fully connected layers으로 구성되어 있습니다.
학습 측면에서 네트워크를 큰 그룹으로 나누면 "Pretrain Network", "Training Network" 2그룹으로 나눌 수 있습니다.

 

네트워크 구조

 

Pretrained Network
YOLO V1은 Pre-trained GoogleLeNet을 Fine-Tuning하여 사용합니다. GoogleLeNet은 원래 이미지 분류에 사용되던 네트워크로, 입력 이미지에서 공간 정보를 잘 추출할 수 있어 객체 검출에도 유용합니다. YOLO에서는 약간의 차이가 있지만, Pretrained Network 자체가 핵심적인 부분은 아닙니다.

 

Training Network
Pretrained GoogleLeNet은 이미지 분류 모델이기 때문에, 이를 객체 검출에 적합하게 만들기 위해 네트워크에 4개의 Convolutional layer와 2개의 Fully Connected layer를 추가합니다. 이 추가된 부분은 따로 학습이 필요합니다.
학습이 끝나면 최종적으로 7x7x30 크기의 Prediction Tensor가 출력됩니다.

 

7x7x30 매트릭스인 이유
처음에 488x448x3 해상도의 이미지가 들어왔는데, 왜 7x7x30 매트릭스가 나오는지 의아할 수 있습니다. 이 출력은 YOLO의 핵심 철학과 밀접한 관련이 있으며, 객체 검출의 마지막 단계가 추가로 이어집니다. YOLO의 Training Network Output은 매우 중요한 부분으로, 이를 통해 객체의 위치와 클래스 정보를 효율적으로 검출할 수 있습니다.

 

Unified Detection (7x7x30)
YOLO는 448x448 크기의 이미지를 CNN을 사용해 7x7 크기의 feature map으로 변환합니다. CNN을 통해 공간 정보(Spatial Information)를 유지하면서, 이미지가 7x7 그리드로 나뉘는 것처럼 처리됩니다. 예를 들어, 7x7 매트릭스의 첫 번째 그리드(1,1)는 원래 이미지의 (064, 064) 픽셀 범위에서 추출된 피처를 나타냅니다. 각 그리드에서 YOLO는 객체 탐지를 수행해 결과를 출력합니다.

7x7x30 구조
YOLO 이전의 Two-Stage Detectors는 객체의 클래스와 bounding box 좌표를 리스트 형식으로 내보냈습니다. 예를 들어, {(비행기, 100, 200, 30, 40)}처럼 클래스와 좌표가 개별적으로 출력되었습니다. 하지만 YOLO는 그리드마다 30차원의 벡터를 사용하여 클래스 정보, bounding box 좌표, confidence score를 모두 포함한 결과를 한 번에 출력합니다.

각 그리드는 30차원의 값을 가지며, YOLO는 각 그리드에 2개의 bounding box를 할당합니다:

  1. 첫 번째 bounding box (1~5차원)
    • 첫 번째 BB의 x좌표 중심
    • y좌표 중심
    • BB의 너비
    • BB의 높이
    • BB 확률 (confidence score)
  2. 두 번째 bounding box (6~10차원)
    • 두 번째 BB에서 탐지된 객체의 정보가 동일한 순서로 포함됩니다.

이 방식으로 각 그리드에서 두 개의 bounding box 정보를 저장해, 다양한 크기의 객체를 탐지할 수 있습니다. YOLO는 이러한 unified detection 방식을 통해 효율적이고 빠른 객체 검출을 가능하게 했습니다.

 

객체 검출에 대해서 공부해보며 시간이 지남에 따라 투스테이지 모델에서 원스테이지 모델로 바뀌어 간 것을 알게 되었고 주어진 이미지에 대해서 어떤 객체인지 알아낼 수 있는 부분이 매우 흥미로웠습니다