Object Detection은 현재 계속 시리즈가 나오는 YOLO와 RCNN 계열들이나 과거 SSD를 이해하기 위해 기본적으로 알아야 할 개념이다.
영어 단어 그대로 Object 객체 Detection 탐지이고, 딸려나오는 모든 개념이 영어 단어만 안다면 직관적으로 이해하기에 어렵진 않으나, 현재까지 흘러온 Object Detection의 개념이 어떤 방식으로 흘러오게 되었는지를 알아보자.
우선, Object Detection에 대해 바로 알기에 앞서 몇가지 단어를 함께 알아두어야 하는데,

위 사진에 보면 왼쪽의 고양이 사진에선 물체 즉 객체가 고양이 한 마리만 존재한다.
이런 경우를 Single object, 우측의 두 사진과 같이 강아지, 고양이 오리 등등 한 사진에 여러 물체가 있는 경우를 Multiple object라 볼 수 있다.
이미지에서 물체가 뭔지 파악하는 것을 Classification이라고 부르는데, 왼쪽 첫번째 경우 사진을 보고 '고양이!'라고 단순 지칭하는 것을 말한다. 사진에서 이미지를 분류하던 초창기에 그 이미지 자체가 뭔지 알아가는 것을 Classification이라 지칭했다고 알고 있다. 그 뒤 이미지가 뭔지만을 아는 것이 아니라 이미지 내에 그 물체가 어디 있는지도 판단할 필요가 있다는 의견 아래 나온 개념이 두번째 이미지인 Localization이다. 고양이라는 물체가 사진 속 빨간 박스 (: 바운딩박스) 내에 있다는 것을 표식하는 방식이다.
단, 이 경우 물체가 딱 하나인 이미지만 사용되어야 하므로 당장 실현성은 적다. 왼쪽 두 사진만 해도 고양이 뒤로 보이는 잔디가 있고 나무가 어렴풋이 있기 때문이다.
따라서 여러 물체를 동시에 파악하는 방식에 대해 고민하기 시작했는데, 이 때 나온 것이 바로 Object Detection 인 것이다.
세번째를 보면 사진 속 강아지, 고양이 두마리, 오리에 대해 각각의 바운딩박스를 둬 위치와 함께 그 물체가 무엇인지 맞추는 방식을 바로 Object Detection이라 한다.
참고로 네번째는 그 위치를 좀더 정확히 판별해 앵커 박스가 아닌 물체만을 찝어내는 방식으로 Instance Segmenation이라 부른다.
이러한 Object Detection에는 첫번째로 그 단계에 따라 두가지로 크게 나뉜다.
1. 1-Stage Detection

One-Stage Detection은 말 그대로 하나의 스텝을 지난다는 것이다.
기본 골조 네트워크(CNN 또는 Transformer 기반으로 한 네트워크)에서 한 단계 네트워크만으로 바로 물체의 위치 탐지인 Bounding Box와 물체가 뭔지를 파악하는 Object Class(Classification)을 한번에 해결한다.
YOLO 계열, SSD 계열(SSD, RetinaNet, RefineDet...)이 사용하며, 2-stage에 비교하면 굉장히 빠르다는 장점이 있다. 하지만 초창기엔 아무래도 두 단계를 거쳐 객체를 파악하는 방식 대비 정확성이 떨어졌지만, YOLO3~5를 지나며 이 마저도 굉장히 많이 개선되었다.
2. 2-Stage Detection

Two-Stage Detection은 두 단계를 거쳐 객체를 탐지한다.
마찬가지로 기본 골조가 되는 한단계 네트워크(CNN 또는 Transformer 기반으로 한 네트워크)를 거쳐 물체의 ➀ 위치를 찾는 문제(Localization)와 ➁분류(Classification)문제를 순차적으로 해결하는 방식이다.
R-CNN계열 (R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN ...)에서 사용하며 과거엔 정확성이 높다는 장점이 있었었다. 다만 비교해보면 확실히 시간이 많이 느리다는 큰 단점이 존재한다.
Object Detection은 두번째로 그 방식에 따라 두가지 방법으로 나뉜다.
1. Sliding Window

같은 두 빌딩 사진 중, 우측의 우상단을 보면 여러개의 색깔 박스가 존재하는 것을 볼 수 있다.
Sliding Window는 이미지에서 모든 영역을 다양한 크기의 window (different scale & ratio)로 탐색하는 방식을 말한다. 여기서 다양한 크기의 window가 바로 우측 사진의 여러개의 색깔 박스라고 보면 된다.
하나의 색깔 박스를 정해 좌측 그림의 빨간 박스가 움직이는 것처럼 위에서부터 우측으로 움직인 뒤, 그 박스가 아랫줄로 가면서 계속 탐색하는 방법이다.
이는 최악의 단점이 몇가지 있는데, 그 중 첫번째는 모든 영역을 여러 크기의 window로 탐색하기에 당연이 속도가 매우 느리며, 같은 종류의 물체라도 이미지 상태에 따라 다른 양상을 나타낼 수 있기도 하다. 예를들어 한 이미지 내에 크기가 다른 하나의 객체가 있다면 고정된 window사이즈로 슬라이딩 시 하나의 물체로 파악하기 어렵고, 이미지 해상도에 따라서도 왜곡등의 이슈가 있는 것이다.
2. Selective Search

Selective Search는 쉽게 말해 이미지 후보 영역 추천 알고리즘이라고 보면 된다. 이 방법이 나오기 전인 위의 Sliding Window의 최악의 단점들 때문에 새로운 방식이 필요했다.
Selective Search는 객체 탐지를 실행하기 전에 이미지를 올바르게 Segment(사전 뜻: 부분)하면 결과에 대해서 객체라고 판단되는 영역의 후보군(Candidate Object)으로 사용할 수 있다는 가설에서 출발했다.
따라서 Selective Search의 목표는 객체의 인식이나 검출을 위한 가능한 후보 영역을 알아낼 수 있는 방법을 제공하는 것이다.
사진 상 윗줄 좌측 첫번째 이미지를 보면, 이미지에 대해 부분화(Segmention)를 실시해 객체의 후보군이 될 영역을 쉽게 말해 다른 색으로 나누어 본다. 이를 "Seed를 설정"한다고 표현하기도 한다. 위 줄 사진처럼 초기에는 이러한 세그먼트가 굉장히 많다가 우측으로 갈수록 줄어드는데, 작은 영역을 큰 영역으로 통합하는 과정을 반복적으로 거치는 것이다.
(참고로 이 때 사용되는 알고리즘이 Greedy Algorithm!)
좀 더 자세하게 각자의 색깔로 나눠진 부분 중 가장 유사한 두 가지를 선택해 그 두 개를 한가지 큰 영역으로 결합하게 되는데 이 과정을 계속 반복해 윗 줄 가장 우측에 있는 사진처럼 된다고 이해하면 된다.
이를 통해 객체 당 바운딩 박스 역시 아랫줄 사진처럼 초반엔 다 각자의 객체로 보기에 그 위치를 지정하는 박스가 많았다가 최종적으로 하나의 객체마다 즉 사람, 양들, 나무 별로 박스가 형성된다.
R-CNN, SPPNet, Fast R-CNN 등에서 성능을 개선시키는 방법으로 활용되었으나 Region Proposal 과정이 기반 네트워크인 CNN과 별도로 이루어진다. 따라서 Selective Search를 사용하면 end-to-end 방식의 학습이 어렵고 실시간 탐지과정 불가능하게 된다.
그래서인지 요새 캐글같은 곳에서도 이미지 디텍션의 경우 YOLO시리즈를 이용하는 경우가 더 많아보이는 것 같다.
[Terms]
Exhaustive Search: 모든 객체의 위치(Locations)를 찾아내는 것