KNOWLEDGE · 물체 탐지

사진 한 장에서 물체를 모두 찾으려면, 몇 번 봐야 할까?

YOLOv1은 사진을 7×7 칸으로 나누고, 신경망을 한 번만 통과시켜 모든 물체의 위치와 종류를 한꺼번에 맞힌다.

YOLO 이전의 탐지기는 물체가 있을 법한 후보 영역을 약 2,000개 뽑아 하나씩 검사했다. YOLO는 이 과정을 한 번의 예측으로 바꿨다. 이름도 그래서 You Only Look Once다. 네 장면을 직접 만져 보며 어떻게 가능한지 따라가 보자.

  1. 01 격자누가 찾나
  2. 02 구조무엇으로 계산하나
  3. 03 추론98개에서 몇 개로
  4. 04 학습무엇을 벌점으로 주나

01 격자

물체의 중심이 떨어진 칸이 맡는다

사진을 가로세로 7칸, 모두 49칸으로 나눈다. 물체의 중심이 들어간 칸 하나가 그 물체를 맡는다. 칸마다 박스 2개와 클래스 확률 20개, 모두 30개의 숫자를 내놓는다.

개나 자전거를 끌어 보자. 키보드로는 그림을 선택한 뒤 화살표로 움직이고(Shift는 한 칸씩), 스페이스로 물체를 바꾼다.

선택한 물체

개 → 5행 3열 칸

x, y (칸 안에서)
0.10, 0.48
w, h (사진 대비)
0.36, 0.30
√w, √h (예측하는 값)
0.60, 0.55

이 칸이 내놓는 숫자 30개 중 채워지는 곳

1–5: 박스 16–10: 박스 211–30: 클래스 20개

박스 두 개 중 정답과 더 많이 겹치는 쪽이 물체를 맡고, 신뢰도는 그 겹침(IOU)을 배운다. 나머지 박스와 48칸은 신뢰도 0을 배운다.

출처: 논문 §2, 그림 2, §2.4

02 구조

448 × 448 사진이 7 × 7 × 30이 되기까지

합성곱 24층이 가로세로를 64분의 1로 줄이며 특징을 뽑고, 완전연결 2층이 7 × 7 × 30개의 숫자를 만든다. 앞 20층은 ImageNet 사진 분류로 미리 배우고, 나머지 4층과 완전연결 층은 탐지를 위해 붙였다.

블록 하나가 한 층의 출력이다. 정사각형 면은 가로세로 크기, 두께는 채널 수다(둘 다 로그 척도).

합성곱 24 · 완전연결 2 · 파라미터 271,703,550 · 한 장에 곱셈-덧셈 약 203억 번

가로세로는 448에서 7로 64분의 1이 되고, 채널은 3에서 1024로 늘어난다. 층을 고르면, 입력의 어느 창이 모든 채널을 거쳐 출력 한 칸이 되는지 선으로 보인다.

끌어서 돌리고, 휠이나 두 손가락으로 확대한다. 블록을 누르면 그 층으로 간다. 키보드: 화살표로 회전, +/−로 확대, [ ]로 층 이동.

사전 학습한 앞 20층 탐지용으로 붙인 합성곱 4층 완전연결 풀링·입출력

0 / 31 · 입력

448 × 448 크기의 사진, RGB 3채널. 원본 사진을 이 크기로 바꿔 넣는다.

출처: 논문 §2.1, §2.2, 그림 3 · 수치는 이 구조를 PyTorch로 구현해 센 값

03 추론

98개의 박스가 몇 개로 줄어드나

신경망을 한 번 통과시키면 칸마다 박스 2개, 모두 98개가 나온다. 박스의 점수는 클래스 확률 × 신뢰도다. 점수가 낮은 박스를 버리고, 같은 물체를 겹쳐 잡은 박스는 NMS(겹침 제거)로 점수가 가장 높은 하나만 남긴다.

점수 기준을 올려 보고, NMS를 켜 보자.

신경망 출력98
점수 기준 통과98
최종98

이 박스들은 논문대로 직접 구현한 YOLO(합성곱 8층의 작은 구성)를 사각형·원·삼각형 그림으로 학습시킨 뒤, 처음 보는 장면에서 낸 실제 출력이다.

출처: 논문 §2, 식 1, §2.3

04 학습

무엇을 틀리면 벌점이 큰가

학습은 다섯 가지 오차의 제곱합을 줄인다. 박스 중심, 박스 크기, 물체가 있는 박스의 신뢰도, 물체가 없는 박스의 신뢰도, 클래스다. 그런데 제곱합을 그대로 쓰면 두 군데서 어긋난다.

크기 오차: 같은 오차도 작은 박스에 더 치명적이다

Δw는 예측 너비와 정답 너비 w의 차이다. √w의 차이가 아니라, 사진 너비를 1로 둔 w 자체를 얼마나 틀렸는지다. 같은 Δw라도 작은 박스는 겹침(IOU)이 크게 떨어지고 큰 박스는 거의 그대로다. 그래서 YOLO는 w 대신 √w를 예측하고, 벌점도 √w끼리의 차이로 매긴다.

정답 박스 · 너비 w 예측 박스 · 너비 w + Δw

예측 너비 w + Δw 0.15겹침 IOU 0.667

벌점 = λcoord × (예측 − 정답)², λcoord = 5

w 그대로0.0125

5 × (0.15 − 0.10)²

√w (YOLO)0.0253

5 × (√0.15 − √0.10)² = 5 × (0.387 − 0.316)²

Δw를 0.05에 고정하고 정답 너비 w만 바꾼 벌점

같은 Δw(0.05)에서 √w의 차이는 작은 박스(w = 0.1)가 0.071, 큰 박스(w = 0.8)가 0.028이다. 벌점은 이 차이의 제곱이라 작은 박스 쪽이 6.7배 크다. w를 그대로 쓰면 두 벌점이 같다(0.0125).

빈 박스: 98개 중 대부분은 물체가 없다

7 × 7 칸마다 박스가 2개씩, 모두 98개다. 물체의 중심이 있는 칸에서 박스 하나만 그 물체를 맡고, 나머지 박스는 모두 신뢰도 0을 배운다. 빈 박스가 압도적으로 많아 그대로 두면 물체를 맡은 박스의 신호를 덮는다. 논문은 빈 박스의 벌점에 λnoobj = 0.5를 곱한다.

막대 높이가 신뢰도 벌점의 무게다. 끌어서 돌리고, 칸을 누르면 물체를 놓거나 뺀다(누른 박스가 맡는다). 키보드: 화살표로 회전.

물체를 맡은 박스 · 무게 1 빈 박스 · 무게 λnoobj 물체 중심이 있는 칸

물체를 맡은 박스 2 · 빈 박스 96

칸을 눌러 물체를 놓으면, 그 칸의 두 박스가 각각 무엇을 배우는지 여기에 나온다.

신뢰도 벌점의 무게

빈 박스 하나의 무게(λnoobj = 0.50)는 작아도 96개를 모두 합하면 신뢰도 벌점 무게의 96.0%를 차지한다(λnoobj = 1이면 98.0%). 논문은 λnoobj = 0.5로 빈 박스의 벌점을 줄이는 동시에, 좌표 벌점에는 λcoord = 5를 곱해 키운다.

출처: 논문 §2.2, 식 3

한계

한 번에 보는 대가

오해한 번만 본다는 건 대충 본다는 뜻이다.

실제로는사진 전체를 한 번에 보기 때문에 주변 맥락을 쓴다. 논문에서 배경을 물체로 착각하는 실수는 Fast R-CNN의 절반 이하였다.

출처: 논문 §1, §2.4, §4.2

질문

자주 묻는 질문

YOLO는 무슨 뜻인가?

You Only Look Once의 줄임말이다. 사진 속 물체의 위치와 종류를 찾는 물체 탐지(객체 탐지, object detection) 방법으로, 후보 영역을 하나씩 검사하지 않고 사진 전체를 신경망에 한 번만 통과시켜 모든 물체를 한꺼번에 예측한다.

YOLOv1은 어떤 구조인가?

합성곱 24층과 완전연결 2층으로 이루어진다. 448 × 448 사진을 받아 7 × 7 × 30을 낸다. 논문 구조대로 구현해 세면 파라미터는 약 2억 7천만 개이고, 그중 약 76%가 첫 완전연결 층에 있다.

출력은 왜 7 × 7 × 30인가?

사진을 7 × 7 칸으로 나누고, 칸마다 박스 2개와 클래스 확률 20개를 내기 때문이다. 박스 하나는 x, y, w, h, 신뢰도의 5개 숫자라서 2 × 5 + 20 = 30이다.

한 장에서 박스는 몇 개 나오고, 어떻게 줄이나?

7 × 7 칸 × 2개 = 98개가 나온다. 박스마다 클래스 확률 × 신뢰도로 점수를 매겨 낮은 것을 버리고, 같은 물체를 겹쳐 잡은 박스는 NMS(겹침 제거)로 점수가 가장 높은 하나만 남긴다.

왜 너비 대신 √너비를 예측하나?

같은 크기의 오차라도 작은 박스에서는 겹침(IOU)이 크게 떨어지고, 큰 박스에서는 거의 그대로이기 때문이다. √w의 차이로 벌점을 매기면, 너비를 똑같이 0.05 틀렸을 때 작은 박스(w = 0.1)의 벌점이 큰 박스(w = 0.8)의 약 6.7배가 된다. 논문도 이 방법이 문제를 일부만 해결한다고 쓴다.

손실의 λcoord와 λnoobj는 무엇인가?

손실(식 3)에 곱하는 가중치다. 박스 좌표 오차에는 λcoord = 5를 곱해 키우고, 물체가 없는 박스의 신뢰도 오차에는 λnoobj = 0.5를 곱해 줄인다. 대부분의 칸에는 물체가 없어서, 그대로 두면 신뢰도를 0으로 끌어내리는 신호가 물체가 있는 칸의 신호를 압도해 학습이 불안정해지기 때문이다.

YOLOv1은 얼마나 빠른가?

논문 기준으로 Titan X GPU에서 초당 45장을 처리하고, 더 작은 Fast YOLO는 초당 155장을 처리한다. 스트리밍 영상을 25밀리초 이내의 지연으로 실시간 처리할 수 있는 속도다.

YOLOv1의 한계는 무엇인가?

칸마다 박스 2개와 클래스 1개만 예측해서, 새 떼처럼 붙어 있는 작은 물체는 놓치기 쉽다. 학습에서 보지 못한 비율이나 배치의 물체에 약하고, 가장 흔한 오류는 부정확한 위치다.

출처: 논문 초록, §1, §2, §2.2, §2.3, §2.4, 표 1 · 파라미터 수와 벌점 배율은 이 페이지의 구현과 계산

더 보기

이 페이지의 층 구조와 계산량, 예측 박스는 논문대로 직접 구현한 PyTorch 코드에서 뽑았다.