- 이번 포스팅에서는 객체 탐지 기술 범주의 Faster R-CNN 에서 바로 넘어가 YOLO 시리즈의 첫번째 모델을 정리하겠습니다.
현 시점 최고 정확도, 최고 속도의 객체 탐지 모델은 YOLO 시리즈가 장악했으며, Image Segment 영역에 있어서도 YOLO 모델이 강세를 띄고 있는 만큼, 이번 정리글을 기반으로 YOLO 모델의 뼈대를 이해하고, 최신 모델(현재 v12 까지 나왔습니다.)까지 빠르게 진행해나갈 예정입니다.
(YOLO 설명)
- YOLO 모델은 Joseph Redmon 이 2016 년에 제안(v1)한 논문 "You Only Look Once: Unified, Real-Time Object Detection" 를 기반으로 하는 1-stage 구조의 객체 탐지 모델입니다.
앞서 설명한 Faster R-CNN 와 같은 기존의 객체 탐지 모델은,
후보 구역 선정 -> 후보 구역별 탐색
이라는 2-stage 를 수행해서 객체 탐지를 진행했으며, 그렇기에 실행 속도 향상에 한계가 존재했지만,
YOLO 모델은 객체 탐지를 공간적으로 분리된 경계 상자와 관련된 클래스 확률에 대한 회귀 문제로 바라보는 형식으로 한번만 이미지를 탐지함으로써 실시간 탐지가 가능할 정도로 실행 속도를 끌어올렸습니다.
그렇기에 YOLO 모델의 이름은 You Only Look Once 인 것으로, 자세한 내용은 아래에 설명하겠습니다.
- YOLO v1 의 구조는 아래와 같습니다.

거의 일반적인 CNN 분류 모델로 보이는 단순한 형태에, Faster API 와 달리 단방향으로 직선 전계가 되는 구조를 가지고 있습니다.

YOLO 의 탐지 프로세스 역시,
1. 이미지 리사이즈
2. 특징맵 추출
3. 객체 위치 검출
이렇게 단순화 할 수 있습니다.
- 자세히 설명하겠습니다.
1. 입력 이미지 전처리
입력된 이미지를 논문 기준 448x448 로 리사이징 하고,
이미지 픽셀 값을 0~1 사이로 정규화 합니다.
(3, 448, 448)
이렇게 3채널 컬러 이미지가 주어집니다.
2. 전처리된 이미지를 CNN 백본에 입력
YOLO v1 의 CNN 백본의 결과로,
(1024, 7, 7)
이런 크기의 Feature Map 이 생성됩니다.
3. Flatten + Fully Connected
(1024×7×7) = 50,176
이렇게 차원을 펼치고,
Fc1 -> ReLU -> FC2
과정을 거쳐서
1470
의 벡터가 만들어집니다.
4. YOLO Detection Head 출력
FC2 결과의 (1470,) 를 reshape 하여, (7, 7, 30) 로 만들어주며, 이것이 YOLO 모델 최종 출력값이 됩니다.
최종 출력값의 의미를 알아보면,
앞의 7, 7 은 Grid 라는 것의 수입니다.
뒤에 설명할텐데, 미리 말하자면 이미지를 7x7 영역으로 균등분할 했을 때의 각 영역(셀)을 의미합니다.
즉, 각 셀별로 30이라는 형태의 값을 예측하는 것이죠.
30 컬럼의 의미는, 2 * 5 + 20 을 의미합니다.
여기서 2 는 바운딩 박스를 의미하며, 셀별 바운딩 박스를 2개씩 예측한다는 것(설정에 따라 더 늘려도 됩니다.)이고, 바운딩박스 정보는,
x, y, w, h, confidence
로, 바운딩박스의 크기 정보와 정확도 정보를 합친 5 개 컬럼이 되는 것입니다.
그리고 나머지 20 은 클래스 수입니다.
논문상으로는 VOC 기준 클래스 수를 사용하여 20인데, 객체 탐지 클래스 수를 변경함에 따라 얼마든 늘거나 줄 수 있습니다.
이로서 YOLO v1 입력에서 출력까지의 모든 프로세스를 살펴보았습니다.
Faster R-CNN 과 같이 앵커를 생성하거나 후보 영역을 선정하거나, 앵커에 투사를 하는 등 복잡한 작업이 없이 일반적인 CNN 모델처럼 단순하게 흘러가는데,
여기까지 따라오신 분들이라면 이것이 수학적으로나 알고리즘적으로 어떻게 가능한지를 고민하고 계실지도 모르겠네요.
딥러닝이 나오기 이전 모든 데이터 분석 분야에서는 현실 문제를 수학적 수식이나 알고리즘으로 풀어내는 것이 전부였는데,
객체 탐지라는 것 역시 지금 눈 앞에 보이는 것을 프로그래밍적으로 구현하는 것을 진지하게 고민해 보셨다면,
위와 같은 단순 이미지 분류 같은 형태의 모델이 이미지 의미 분석을 통한 분류문제가 아니라 메타 정보라고 할 수 있는 화면상 좌표를 탐지할 수 있는지에 대해 의문을 품으실 수도 있을 것 같습니다.
저 역시 처음 YOLO 를 공부했을 때에는 그러한 고민을 했지만,
결론적으로 저도 뚜렸하게 설명드릴 수는 없습니다.
다만, 딥러닝 모델을 공부해보면 다른 머신러닝 알고리즘과 달리 '구조'만 잘 만들어두고 '그럴싸 하다'라면 그대로 동작하는 경우가 많습니다.
CNN 특징 추출에서는 이미지가 가진 공간적 특성을 모두 가지고 있기에 이미지 내의 객체를 탐지하는데에 부족함이 없고(재료는 준비된 상태),
그렇기에 마지막 부분에 FC 를 반복하여 위와 같은 최종 형태를 만들면(회귀 분류에 부족함이 없는 상태),
모든 준비가 완료된 상태이므로, 남은 것은 딥러닝 모델 스스로가 입력 데이터를 기반으로 학습 되는 것입니다.
중요한 것은 출력값에 설정한 의미이며, 그 의미를 고착시키기 위한 학습 방식이기 때문에,
아래에서 출력값의 의미와 학습 방법에 대해 더 자세히 알아보겠습니다.
- 이미지 Grid 분할의 의미

위 시각 자료는 YOLO v1 의 탐지 프로세스를 3단계로 나타낸 것입니다.
먼저, 이미지를 위와 같이 S x S 의 Grid 로 나눕니다.(논문상으론 7x7)
Grid 의 의미는 객체의 중심점의 기준이 되는 것입니다.
어떠한 객체가 존재할 때, 그 중심점이 어떠한 셀 안에 있다면 해당 셀만 해당 객체를 예측하는 것(cx, cy, w, h 형태)으로,
위 YOLO 모델 출력 결과에서 각 셀 위치 내에서 B 개(위에선 2개)의 바운딩 박스 좌표, 신뢰도, C개(위에선 20개)의 클래스 확률을 반환하도록 된 것이죠.
이렇게 되면 위의 두번째 단계에서와 같이,
각 셀별 바운딩 박스와 class 확률 값이 이미지 구역단위로 나온 것이나 마찬가지입니다.
이러한 정보를 기반으로 각 셀마다 존재하는 B개의 박스의 confidence 와 class probability 값을 곱한 최종 신뢰도를 기준으로 셀마다의 상위 박스를 1개씩 선택하고,
NMS 로 중복을 제거한 후 나온 최종 바운딩 박스 + 클래스를 원본 이미지 크기에 투사하여 표시하는 것이 YOLO 모델의 객체 탐지 순전파 원리의 전부입니다.
- YOLO 모델의 학습은 위에서 파악한바와 같이 NMS 를 거치고 나온 최종 결과물을 가지고 행하면 됩니다.
손실 함수는 복합적으로 이루어지며,
x, y, w, h 의 bbox 좌표에 대한 손실,
object confidence 에 대한 손실(정답은 최대),
no-object confidence 에 대한 손실(정답은 최소),
class 손실(정답은 one hot vector)
위와 같은 손실들을 전부 더한 총 손실을 기반으로 역전파하여 학습하는 것입니다.
- 이상입니다.
YOLO 시리즈는 이후 많은 발전을 거쳤으므로 v1 에 대한 설명은 이만하도록 하고, 본 게시글에서는 1-stage 객체 탐지가 어떤식으로 이루어진 것인지에 대해 자세히 알아보았습니다.