YOLO, You Only Look Once

YOLO(Joseph Redmon, et al.)는 One-stage detector의 대표로, 가장 보편적으로 활용된다고 해도 과언이 아닌 Object Detector입니다.
간단한 구조의 네트워크 독창적인 방법으로 ‘높은 성능’과 ‘빠른 속도’ 두 목표를 한 번에 달성했습니다.

1. 간단한 구조의 네트워크, DarkNet

YOLO의 Backbone Network는 독자적으로 구성한 DarkNet이라는 모델을 사용합니다. DarkNet 뒤로 Head Network를 기대했지만 없다시피 합니다. 이 부분은 YOLO v1 모델의 특징 중 하나 입니다.
Backbone Network는 이미지에서 Feature들을 추출하는 역할을 합니다. 이렇게 추출된 Feature들을 Feature map이라고 합니다. Image Classification에서 활용되는 Network들이 적용되는 경우가 많습니다.
Head Network는 Backbone으로 부터 넘겨받은 Feature들을 이용해 피사체의 위치와 크기, 종류 등을 식별하는 역할을 합니다.
YOLO v1 Architecture
DarkNet은 VGGNet과 유사하게 Convolutional Layer가 단순히 나열되고, 끝 부분에서 Fully-Connected Layer를 거친 다음 3D Tensor로 출력됩니다. 매우 단순한 구조 덕분에 Backbone Network 교체가 비교적 수월한 편입니다.

2. YOLO의 독창적인 방법, 그리드(Grid)

Anchor, Confidence등 R-CNN에서 부터 사용되던 유용한 이론들을 베이스로 YOLO는 그리드(Grid)라는 새로운 이론을 함께 제시하고 있습니다. 사실 Grid 그 자체는 새로운 개념이 아니지만 YOLO에서는 기존에 존재하던 Grid 개념을 이용해 새로운 방법을 고안했습니다. 이 내용에 대해 설명하기 전 Anchor Box와 Grid를 사용하는 이유에 대해 이해해야 합니다.

2-1. Anchor Box와 Grid를 사용하는 이유

좌표를 0~1로 표현한다면, 이미지 정중앙에 있는 피사체는 (0.5,0.50.5, 0.5)로 표현할 수 있습니다.
만약 모델의 출력이 Sigmoid를 거쳐 출력되는 경우, 0.5 주변에 분포될 가능성이 높습니다.
0을 기점으로 노드의 활성 정도를 판단하는 딥러닝 모델의 특성상 0 주변에 출력이 분포할 가능성이 높습니다. 그런데 Sigmoid는 xx가 0일 때 0.5를 반환하므로 0.5 주변 값이 출력될 가능성이 높아집니다.
랜덤 초기화된 모델의 Sigmoid 출력 분포
즉, 피사체가 중앙에서 멀어지면 멀어질수록 모델에서 학습 또는 인식할 가능성이 낮아진다는 말이 됩니다.
이 문제를 해결하기 위해 이전 모델들은 Anchor Box, YOLO에서는 Grid를 함께 사용합니다.

2-2. Anchor Box

위의 문제를 다시 살펴보면 좌표의 영점이 (0,00,0)에 있습니다. 그러면 이 영점을 (0.5,0.50.5, 0.5)로 옮긴다면 (1,11,1)에 많이 분포될 겁니다. 즉, 영점의 위치에 따라 밀집 분포의 위치가 달라집니다. 너무 당연한 얘기입니다.
영점이 (0,0)인 분포
영점이 (0.5,0.5)인 분포
여기서 영점Anchor로 본다면, 여러 개의 Anchor를 여러 곳에 둠으로써 분포 밀집 현상을 완화해줄 수 있습니다. 또, 실제 데이터에서 피사체가 항상 완벽한 분포를 가지지 않습니다. 차량 데이터의 경우 Y축에서 대부분 0.5에 밀집돼있을 것입니다.
대부분 Y축 중앙에 위치한 차량들
그러므로 여러 개의 Anchor를 실제 데이터의 위치 분포에 뿌려준다면 더 좋은 결과를 기대할 수 있습니다. 이 과정에서 K-means Clustering을 이용해 Anchor의 위치를 결정합니다.
여기서 위치 뿐만 아니라 크기(Width, Height)까지 적용하면 Anchor Box라는 개념이 됩니다. 즉, 모델이 예측해야할 BBox의 영점을 제시하는 Box가 바로 Anchor Box 입니다.

2-3. YOLO의 Grid

YOLO에서 제시하는 Grid 개념은 좀 더 나아가서 영점의 위치를 특정 구획(Cell)안에서만 움직이도록 하는 것입니다.
우선 이미지를 4x4 Grid로 나누어놓고, 영점을 한 칸 안에서만 움직일 수 있도록 제한하면 모든 Cell에 대해 일정한 간격으로 Anchor를 두는 효과를 기대할 수 있습니다. 또, 모델은 Cell 안에서 작은 움직임만으로 정답에 가깝게 학습할 수 있으므로 인식율에 대한 부담이 적습니다.
특정 Cell안으로 움직임이 제한된 영점
좁아진 모델의 예측 범위 부담
Grid가 Anchor와 비슷하게 다가오지만 다른 개념이므로 혼동해선 안됩니다. YOLO에서도 Anchor Box는 여전히 사용하고 있기 때문입니다.
사람이나 신호등 처럼 피사체가 세로로 생긴 경우가 있고, 자동차나 고양이 처럼 가로로 생긴 경우가 있습니다. 두 경우의 가능성을 모두 보장하기 위해 가로형 Anchor Box와 세로형 Anchor Box를 각 Cell마다 가지고 있습니다. (YOLO v2에서는 5개로 확장됩니다.)
Cell마다 존재하는 2개의 Anchor Box

3. 모델의 확신, Confidence

Confidence는 YOLO에서만 사용되는 것이 아니라 과거 많은 모델이 사용해왔던 개념입니다. 모델이 예측해내는 수 많은 BBox중 어떤 것이 사용가능한 BBox인가 판단하기 위한 값으로 사용합니다.

3-1. Confience를 사용하는 이유

Object Detection 모델은 이 Truth BBox를 예측하기 위해 수 많은 Predicted BBox를 생성하게 될 겁니다. 모델 입장에서는 Truth BBox와 비슷한 BBox를 최대한 많이 생성해야 높은 점수를 받을 가능성이 높아지기 때문입니다. 예를 들어 어떤 BBox가 60% 일치한다면 분명 다른 BBox는 더 많이 일치할 수 있기 때문에 더 많은 시도를 합니다. 우리가 수능을 한 번만 치를 수 있는게 아니라 10번이고 20번이고 치를 수 있다면, 최대한 많이 치루는게 더 이득이듯 말입니다.
우리집 마스코트 ‘둥실’과 수 많은 Predicted BBoxes
이렇게 많은 BBox가 겹치게 되면 어떤 BBox가 정답에 가장 가까운지 파악할 수 없게 됩니다. 위의 그림만 봤을땐 ‘이게 왜 파악이 안돼?’ 라고 생각할 수 있습니다. 하지만 이렇게 보면 어떨까요?
정답 정보가 없는 예측들
이 그림은 모델의 예측 BBox만 그려놓은 것입니다. 정답에 가까운지 판단하기 위해서는 정답이라는 정보가 필요합니다. 하지만 모델의 독립적인 입장에서는 정답이라는 정보가 존재하지 않기 때문에 어떤 BBox가 정답인지 판단할 수 없게 됩니다. 수학적 관점에서 한 번 더 예를 들면, 수식으로 일치가능성(pp, Probability)에 대해 표현하면 p=1(yy^)2p=1-(y-\hat{y})^2 이런 수식으로 표현할 수 있겠습니다. 그런데 정답 정보 yy가 존재하지 않으니 영원히 풀리지 않는 식이 됩니다.
이 문제를 해결하고자 NMSConfidence를 사용합니다.

3-2. Confidence

정답 데이터에서 실제로 BBox가 존재하는 Cell을 1, 존재하지 않는 Cell을 0으로 설정합니다. 모델의 BBox마다 이 값을 학습하도록 하면 모델 스스로가 BBox마다 피사체 존재 가능성를 판단하도록 유도할 수 있습니다. 이 개념이 바로 Confidence입니다. 모델이 BBox에 대한 확신을 0~100%로 표현하도록 한다는 말이 재밌는 표현입니다.
Truth BBox에 학습되는 BBoxes
높은 Confidence로 인해 선택된 BBox
그런데 YOLO의 경우 Cell당 예측하는 피사체가 다를 가능성이 높고, 딱 2개의 BBox만 예측하므로 여러 개의 BBox가 동시에 출력될 일이 적은 편입니다. 따라서 연산 비용이 높은 편인 NMS를 획기적으로 줄일 수 있습니다.

3-2. NMS(non-Max Suppression)

그럼에도 BBox가 겹치는 일은 분명 일어날 수 있습니다. 이런 경우가 발생했을 때 Confidence를 활용할 수 있습니다. 먼저, 가장 높은 Confidence를 가진 BBox를 기준으로 IoU가 일정 값 이상인 BBox들을 모두 삭제하면 겹치는 BBox들은 모두 사라지게 됩니다. 이 과정을 NMS라고 합니다.

4. Loss Function

YOLO의 Loss function은 아래 수식 처럼 위치(x,yx,y)에 대한 오차, 크기(w,hw,h)에 대한 오차, Confidence(CC)에 대한 오차, Class(cc)에 대한 오차를 덧셈해 Loss를 계산합니다.
단순해보이지만 1obj,1noobj1^{obj}, 1^{noobj}는 분명 이해하기 힘든 부분입니다. 논문에서는 Responsible이라는 단어를 사용합니다. 모델은 2개의 Anchor Box에 대해 2개의 BBox를 예측하므로 정답(Truth BBox)와 비교하기 위해서는 둘 중 하나를 선택해야 합니다. 여기서 1obj1^{obj}는 비교에 선택된 BBox를 의미하고, 1noobj1^{noobj}는 선택되지 못한 BBox와 Truth Tensor에 아무 피사체도 없는 구획의 BBox를 의미합니다. 1obj1^{obj}를 선택할 때, 해당 구획에 존재하는 2개의 BBox 중 정답(Truth BBox)과의 IoU가 더 높은 BBox를 선택합니다.
λcoord\lambda_{coord}는 위치에 대한 Loss의 영향력, λnoobj\lambda_{noobj}는 non-Reposible BBoxes의 Confidence 영향력을 의미합니다. Loss에 대한 영향력을 의미하므로 이 값이 클수록 해당 값이 Fitting 되는 속도가 더 빨라지며, 상대적으로 다른 값은 느려집니다. 이는 상수 값으로 필요에 따라 조절해 사용할 수 있습니다.

5. 결론

YOLO는 Grid, Anchor Box를 모두 사용하면서도 매우 단순한 Network 구조를 가지고 있어서 적은 연산 비용으로 높은 인식율과 빠른 속도를 낼 수 있었습니다.
YOLO v2 부터는 Fully-connected Layer 없이 Convolutional Neural Network(CNN)으로만 구성됩니다. 그런데 CNN 특성상 출력 Tensor의 한 위치는 이미지의 특정 범위를 가장 잘 커버하는 결과를 출력하게 됩니다. 마치 그 지역을 가장 잘 알고있는 터줏대감 같은 느낌입니다.
CNN의 연산 과정, 원본 이미지의 3x3칸이 1칸으로 압축된다.
따라서 Grid의 각 칸은 해당 위치의 피사체들을 가장 잘 인식할 수 있으므로 Grid 방식이 좋은 효율을 낼 수 있다고 개인적으로 생각하고 있습니다.
글이 마음에 들었다면, 다음 글이 올라올 때 알려드릴게요.
PC
Mobile