https://gmongaras.medium.com/yolox-explanation-what-is-yolox-and-what-makes-it-special-c01f6a8a0830
YOLOX Explanation — What is YOLO and What Makes It Special
The first article in my YOLOX explanation series where I introduce the original YOLO model
gmongaras.medium.com
위 글의 한국어 번역입니다.
What Does the YOLO Algorithm Solve?
시작하기에 앞서 우선 YOLO가 풀고자하는 문제에 대해 알아보겠습니다. YOLO는 2015년에 object detection 문제를 해결하기 위해 처음 제안되었습니다. Object detection 문제란 컴퓨터가 한 장의 이미지를 입력으로 받아 그 이미지 안에서 특정 객체들이 어디에 있는지를 찾아내는 문제입니다.
객체 탐지 문제를 풀기 위해서 YOLO는 바운딩 박스(bounding box, 이하 bbox)를 사용합니다. bbox는 이미지의 특정 부분을 박스로 둘러싸 그 박스 영역 안에 객체가 있음을 표시하는 상자입니다. 예를 들어, 이 사진에서 고양이가 어디에 있는지를 알고 싶다고 할 때:

이 고양이를 둘러싸는 bbox는 아래와 같이 생겼을 수 있습니다:

그런데 만약 고양이의 귀와 눈의 위치를 각각 찾고 싶다면? 그러면 아래와 같이 4개의 bbox를 만들 수 있습니다:

이 작업은 우리 사람에게는 충분히 쉬운 문제이지만, 컴퓨터에게는 그렇게 쉬운 문제는 아닙니다. 우선 컴퓨터가 마주하는 문제들은 다음과 같습니다:
(1) 한 이미지에 둘러칠 bbox의 개수가 정해져 있지 않음
(2) 서로 크기가 다른 bbox들을 이미지에 배치해야 함
(3) 다양한 스케일에서 객체가 어떻게 보이는지 이해할 필요가 있음
How Does YOLO Work?
YOLO 알고리즘은 다음 세 가지를 예측함으로써 동작합니다:
(1) 이미지에서의 bbox 위치
(2) 그 bbox 안에 객체가 있을 신뢰도(confidence). 이때 신뢰도는 특정 클래스의 신뢰도가 아닌 모델이 아는 "어떤 객체"든 그 박스 안에 있을 신뢰도를 말합니다.
(3) 박스 안 객체의 클래스/레이블
따라서 위 고양이 얼굴을 둘러싼 바운딩 박스는 다음과 같은 feature를 가질 수 있습니다:
bbox: (25, 5, 185, 183)
Confidence: 0.9567
Clss: cat
일부 bbox 알고리즘에서는 bbox가 다음 속성들로 표현됩니다:
(좌상단 x 좌표, 좌상단 y 좌표, bbox의 너비, bbox의 높이)
다른 알고리즘들은 다음 속성들로 표현하기도 합니다:
(좌상단 x 좌표, 좌상단 y 좌표, 우하단 x좌표, 우하단 y좌표)
어느 쪽이든 예측이 의미하는 바는 본질적으로 같습니다.
How Does YOLO Make Predictions?
초기 YOLO 알고리즘의 목표는 이미지를 빠르게 처리하면서 정확한 예측을 하는 것이었습니다. 이러한 속도는 자율주행처럼 물체가 지금 어디에 있는지를 즉시 알아야 하는 실시간 작업에 필수적입니다. YOLO는 bbox 문제를 회귀(regression) + 분류(classification) 문제로 취급하여, 원본 이미지를 입력으로 받아 위에서 말한 3가지 예측을 출력합니다.
이 글이서는 YOLOv1이 이 작업을 어떻게 하는지 간단하게만 설명하겠습니다. 다음 글에서는 이 알고리즘의 개선판이 YOLOX와 어떻게 비교되는지 더 깊이 다룰 예정입니다.

YOLOv1은 이미지를 입력으로 받아 bbox의 세 가지 속성(위치, 신뢰도, 클래스)으로 분해될 수 있는 하나의 텐서(tensor)를 출력합니다. 이때 입력은 448x448x3 tensor입니다. 이 tensor는 본질적으로 가로 448 pixels x 세로 448 pixels의 이미지이며, 3은 RGB 채널을 의미합니다. 즉, 컬러 이미지는 R, G, B 값을 각각 담는 3개의 텐서로 나눌 수 있습니다.
출력은 7x7x30 tensor입니다. 이 tensor가 무엇을 나타내는지 들어가기 전에, 저자들이 bbox를 어떻게 정의했는지 먼저 살펴보겠습니다.

YOLO의 저자들은 S x S 그리드를 사용하며, 여기서 S = 7입니다. 그림 1.에 표시된 네트워크 출력도 S x S, 즉 7x7 입니다. 네트워크 출력은 7x7 그리드이며, 그 7x7 그리드의 각 칸이 서로 다른 bbox 예측을 나타내어 총 49개의 bbox 예측을 만듭니다.
7x7의 각 칸은 30개의 값을 가집니다. 저자들은 다음과 같이 명시합니다:
"해당 모델은 이미지를 S x S 그리드로 나누고 각 그리드 셀마다 B개의 bbox, 그 box들의 신뢰도, 그리고 C개의 클래스 확률을 예측합니다. 이 예측들은 S x S x (B*5 + C) tensor로 인코딩됩니다."
따라서 각 길이 30의 tensor는 클래스 부분 C와 bbox 부분 B로 나뉩니다. 논문에서 저자들은 B=2, C=20을 사용합니다.
tensor의 C 부분은 그 바운딩 박스 안의 클래스가 i-th 클래스일 확률입니다. C 부분이 20개 요소이므로, 모델은 그 box안에 20개 클래스 중 하나가 있다고 예측합니다. 클래스 예측을 얻으려면 tensor에서 값이 가장 큰 인덱스를 택하면 되고, 그 인덱스를 실제 클래스에 매핑합니다. 예를 들어, 1은 개(dog), 15는 고양이(cat)일 수 있습니다.
tensor의 B 부분은 5개 값으로 나뉩니다:
(1) Confidence(신뢰도) - 그 박스 안에 객체가 있을 것이라는 모델의 확신 정도는?(2) x - bbox 중심의 x축 위치(3) y - bbox 중심의 y축 위치(4) w - bbox의 너비(width)(5) h - bbox의 높이(height)
이미지가 주어지면 YOLO 알고리즘은 신뢰도가 낮은 bbox를 제거하고 신뢰도가 높은 bbox를 남깁니다(=NMS).

3) NMS (Non-Maximum Suppression) & Anchor box
## 서론 앞서 [1) General process of object detection](https://wikidocs.net/152376) 에서 언급했듯, 대다수의 objec…
wikidocs.net
What Makes YOLO Special?
YOLO가 처음 공개되었을 때, 당시 최첨단(SOTA) 모델들보다 속도가 더 빠를 뿐만 아니라, 배경에 대한 오탐지를 최소화하여 정확도도 더 뛰어난 혁신적인 알고리즘이었습니다. 이후의 YOLO 계열 알고리즘들은 정확도와 속도를 더 끌어올려 YOLO를 최조 수준의 객체 탐지 알고리즘을 만들었습니다. 다음 글에서는 이 시리즈의 최신 버전 중 하나인 YOLOX가 어떻게 동작하는지 설명하겠습니다.