English

KNOWLEDGE · 물체 탐지

붙어 있거나 작은 물체를, YOLOv2는 어떻게 더 잘 찾을까?

YOLOv2는 칸마다 데이터에서 고른 앵커 박스 5개를 두어 한 칸에서도 여러 물체를 나눠 맡고, 패스스루 레이어로 26 × 26의 세밀한 특징을 13 × 13 칸에 접어 붙인다.

YOLOv1은 사진을 7 × 7 칸으로 나누고, 칸마다 박스 2개를 내지만 클래스는 한 벌만 맞혔다. 그래서 한 칸에 물체 중심이 둘이면 하나를 놓치고, 여러 번 줄어든 거친 특징 탓에 위치가 자주 어긋났다. YOLOv2는 이 약점을 여러 개선으로 고쳤다. 이 글은 그중 두 가지, 앵커 박스와 패스스루 레이어를 직접 만져 본다.

YOLOv1에서 YOLOv2까지 하나씩 더하며 잰 VOC 2007 mAP (논문 표 2)

  1. YOLOv163.4
  2. 배치 정규화65.8+2.4
  3. 고해상도 분류기69.5+3.7
  4. 합성곱 + 앵커 박스0169.2−0.3
  5. 새 네트워크 Darknet-1969.6+0.4
  6. 데이터로 고른 앵커 + 칸에 묶은 위치01·0274.4+4.8
  7. 패스스루0375.4+1.0
  8. 여러 크기로 학습76.8+1.4
  9. 고해상도 탐지(544)78.6+1.8

막대는 mAP 60부터 80까지. 앵커 박스로 바꾼 단계는 mAP가 조금 내려갔지만 재현율은 81%에서 88%로 올랐다(§2).

  1. 01 앵커 박스한 칸, 박스 틀 다섯
  2. 02 앵커 고르기틀 모양은 데이터가
  3. 03 패스스루접어서 붙이기

01 앵커 박스

한 칸에 박스 틀 다섯, 틀마다 클래스 하나

YOLOv2는 416 × 416 사진을 받아 13 × 13 칸으로 나눈다. 칸마다 모양이 다른 박스 틀 5개, 곧 앵커 박스를 둔다. 물체는 중심이 든 칸에서, 중심을 맞춰 겹쳤을 때 가장 많이 겹치는 앵커 하나가 맡는다. YOLOv1과 달리 앵커마다 물체 여부와 클래스를 따로 맞히므로, 한 칸에 물체가 둘이어도 모양이 다르면 둘 다 배울 수 있다.

사람, 자동차, 개를 끌어 보자. 위의 단추로 YOLOv1과 YOLOv2를 바꿔 본다. 키보드로는 그림을 선택한 뒤 화살표로 움직이고(Shift는 한 칸씩), 스페이스로 물체를 바꾼다.

박스 13 × 13 × 5 = 845개 · 클래스 확률 845벌(앵커마다 1벌)

선택한 물체

사람 → 7행 7열 칸 · 앵커 2

이 칸의 앵커 5개와 겹치는 정도(중심을 맞춘 IOU). 가장 큰 앵커가 맡는다.

칸 안의 위치 σ(tx), σ(ty)
0.11, 0.76
앵커 대비 크기 etw, eth
0.74, 0.67
신경망이 맞힐 tw, th
−0.30, −0.40

bx = σ(tx) + cx · by = σ(ty) + cy · bw = pwetw · bh = pheth

0%면 앵커 그대로 칸 한가운데에 놓인다. 신경망은 앵커를 옮기고 늘려 물체에 맞춘다. 중심은 시그모이드 σ 때문에 자기 칸을 벗어나지 못하고, 크기는 앵커의 et배가 된다. 앵커 모양이 물체와 비슷할수록 tw, th가 0에 가까워 배우기 쉽다.

VOC 2007 테스트 세트의 물체 12,032개로 세어 보면, YOLOv1(7 × 7 × 박스 2, 클래스는 칸마다 한 벌)에서는 6.8%가 같은 칸의 다른 물체에 자리를 내준다. YOLOv2(13 × 13 × 앵커 5, 클래스는 앵커마다 한 벌)에서는 1.5%다. 사진 넓이의 1%보다 작은 물체만 보면 24.0%에서 7.9%로 준다.

출처: 논문 §2 Convolutional With Anchor Boxes, Direct location prediction, 그림 3 · 앵커 배정 규칙은 저자 Darknet 코드(region_layer.c) · 앵커 크기와 6.8%·1.5%는 VOC 정답 박스로 직접 계산

02 앵커 고르기

박스 틀 다섯, 어떤 모양으로 고를까

앵커가 물체 모양과 비슷할수록 신경망이 고칠 양이 작아 배우기 쉽다. YOLOv2는 앵커를 손으로 고르지 않고, 학습 데이터의 정답 박스를 k-평균으로 묶어 고른다. 점마다 가장 가까운 앵커를 고르고, 앵커를 그 점들의 평균 자리로 옮기기를 더 바뀌지 않을 때까지 되풀이한다. 거리는 1 − IOU다. 중심을 맞춰 겹쳤을 때 많이 겹칠수록 가깝다.

점 하나가 VOC 정답 박스 하나의 너비와 높이다(사진 대비, 눈금은 로그). 반복 막대나 곡선을 끌어 k-평균이 앵커를 옮기는 과정을 따라가 보자. 앵커가 지나온 길이 남는다(고리가 출발점). 손잡이를 끌면 그 자리에서 다시 시작한다. 키보드: 반복 막대는 화살표, 그림에서는 [ ]로 앵커를 고르고 화살표로 크기를 바꾼다.

거리

k-평균 과정: 앵커를 옮길 때마다의 평균 IOU

반복 0 · 처음 틀: 정사각형 5개. 점의 색은 가장 가까운 앵커다. 평균 IOU 57.9%. 막대를 오른쪽으로 끌어 k-평균이 앵커를 옮기는 과정을 따라가 보자.

평균 IOU57.9%
작은 박스 절반53.7%
큰 박스 절반62.2%

평균 IOU: 박스마다 가장 잘 맞는 앵커와의 IOU를 평균한 값

지금 앵커를 416 × 416 입력의 가운데 칸에 그린 모양

논문 표 1: VOC 2007 정답 박스와 가장 가까운 앵커의 평균 IOU
앵커를 고른 방법개수평균 IOU
k-평균, 유클리드 거리558.7
k-평균, 1 − IOU 거리561.0
k-평균, 1 − IOU 거리967.2

같은 5개라도 1 − IOU 거리가 유클리드 거리보다 잘 맞는다. 유클리드 거리는 큰 박스의 오차를 크게 쳐서 앵커가 큰 박스 쪽으로 끌린다. 위에서 거리를 바꿔 앵커가 지나온 길과 작은 박스 절반의 점수를 비교해 보자. 앵커를 9개로 늘리면 더 잘 맞지만 모델이 복잡해진다. 논문은 그 사이의 균형으로 k = 5를 골랐다.

출처: 논문 §2 Dimension Clusters, 표 1, 그림 2 · 점은 VOC 2007+2012 학습 세트의 정답 박스 40,058개 중 무작위 2,000개(사진 없이 숫자만), 점수는 이 점들로 직접 계산

03 패스스루

26 × 26의 세밀한 특징을 접어서 붙인다

13 × 13 특징 지도의 한 칸은 입력의 32 × 32픽셀이다. 큰 물체에는 충분하지만 작은 물체의 위치를 잡기에는 거칠다. 패스스루 레이어(passthrough layer)는 더 앞 층에 남아 있는 26 × 26 특징을 가져와 13 × 13 특징에 이어 붙인다. 탐지기는 이 넓어진 특징 위에서 박스를 맞힌다.

어디서 가져와 어디에 붙이나

YOLOv2 탐지기는 합성곱 22개다. Darknet-19에서 분류용 마지막 합성곱을 뗀 18개 뒤에, 탐지용 3 × 3 × 1024 합성곱 3개와 출력용 1 × 1 합성곱 1개를 붙였다. 논문은 패스스루를 "마지막 3 × 3 × 512 층에서 끝에서 두 번째 합성곱으로" 잇는다고 쓴다. 블록에 올리거나 누르면 그 층이 무엇인지 나오고, ①~④를 누르면 아래 접기 그림이 그 단계로 간다.

합성곱 13 · 3 × 3 × 512 · 출력 26 × 26 × 512 · 26 × 26 해상도의 마지막 층. 패스스루가 이 출력을 가져간다

  1. ① 가져오는 곳13번째 합성곱(3 × 3 × 512)의 출력 26 × 26 × 512. 26 × 26 해상도의 마지막 층이고, 다섯 번째 최대 풀링 바로 앞이다.
  2. ② 원래 길같은 출력이 다섯 번째 최대 풀링에서 13 × 13이 되고, 합성곱 7개(Darknet-19의 14~18번, 탐지용 19, 20번)를 지나 13 × 13 × 1024가 된다.
  3. ③ 지름길패스스루는 이 길을 건너뛴다. 26 × 26 × 512를 2 × 2씩 채널로 접어 13 × 13 × 2048로 만든다. 아래에서 직접 접어 본다.
  4. ④ 합치는 곳21번째 합성곱(끝에서 두 번째, 3 × 3 × 1024) 바로 앞에서 두 길을 채널 방향으로 이어 붙여 13 × 13 × 3072를 만든다. 21번째 합성곱이 이것을 받아 13 × 13 × 1024를 내고, 22번째 합성곱(1 × 1 × 125)이 13 × 13 × 125를 낸다.

어떻게 접어 붙이나

③ 지름길에서는 이웃한 2 × 2 칸을 공간이 아니라 채널 방향으로 쌓는다. 26 × 26 × 512는 13 × 13 × 2048이 되고, ④에서 원래 길의 13 × 13 × 1024 옆에 이어 붙어 13 × 13 × 3072가 된다.

단계 탭을 눌러 접어 보자. 위 그림에서 지금 단계가 일어나는 곳이 밝아진다. 26 × 26 면의 칸을 누르면 그 칸이 든 2 × 2 묶음이 어디로 가는지 따라간다. 끌어서 돌린다. 키보드: 화살표로 회전, Shift + 화살표로 묶음 이동.

1 / 4

① 13번째 합성곱(26 × 26 해상도의 마지막 3 × 3 × 512 층)이 낸 26 × 26 × 512 특징이다. 칸마다 512개의 숫자가 있다. 색은 칸이 2 × 2 묶음의 어디에 있는지다.

고른 묶음: 26 × 26의 13–14행 13–14열 → 13 × 13의 7행 7열 한 칸

값의 수: 26 × 26 × 512 = 346,112 → 13 × 13 × 2048 = 346,112

2 × 2 묶음의 값 4개가 출력 한 칸의 서로 다른 채널로 들어간다. 값을 하나도 버리지 않고 자리만 옮기므로, 26 × 26 해상도의 세밀한 정보가 13 × 13 칸에 그대로 남는다. 최대 풀링이었다면 넷 중 가장 큰 값 하나만 남는다. 논문에서 패스스루는 mAP를 74.4에서 75.4로 1 올렸다.

저자가 공개한 설정 파일은 시기에 따라 다르다. 2016년 11월 첫 판은 이 그림처럼 512채널을 그대로 접어 3072채널을 만든다. 2017년 3월 판부터는 ③ 지름길에서 접기 전에 1 × 1 합성곱으로 채널을 64개로 줄여, 13 × 13 × 256을 붙인다(합쳐 1280채널). 가져오는 곳과 합치는 곳은 같다.

출처: 논문 §2 Fine-Grained Features, §3 Training for detection, 표 2 · 층의 순서와 연결은 저자 Darknet 저장소 cfg/yolo-voc.cfg(route −9, reorg 2, route −1,−3)와 그 이력

정리

YOLOv1의 한계에서 YOLOv2로

  1. 칸마다 클래스 하나 → 앵커마다 클래스 하나. YOLOv1은 7 × 7 × 박스 2 = 98개 박스에 클래스 확률이 49벌(칸마다 1벌)이었다. YOLOv2는 13 × 13 × 앵커 5 = 845개 박스에 클래스 확률이 845벌(앵커마다 1벌)이다. 한 칸에 모양이 다른 물체 여럿을 맡는다. 출력은 13 × 13 × 125다.
  2. 박스를 처음부터 → 데이터로 고른 틀에서 조금만. 앵커 모양은 정답 박스에 1 − IOU 거리의 k-평균을 돌려 고르고, 신경망은 중심을 칸 안에서, 크기를 앵커의 et배로 고친다. 고칠 양이 작고 중심이 칸을 벗어나지 않아 학습이 안정된다.
  3. 거친 13 × 13 → 세밀한 26 × 26을 접어 붙이기. 패스스루가 2 × 2 이웃을 채널로 쌓아 13 × 13 × 3072를 만든다. 작은 물체의 위치를 잡을 정보가 남는다.

그래도 작은 물체는 여전히 약하다. COCO에서 작은 물체의 AP는 5.0으로, 같은 표의 SSD512(9.0)보다 낮다(논문 표 5).

오해앵커 박스를 쓰면 박스 크기가 앵커 5가지로 정해진다.

실제로는앵커는 출발점이다. 신경망이 너비와 높이를 앵커의 et배로 고치고, 중심은 칸 안 어디로든 옮긴다. 앵커는 어느 예측기가 어느 물체를 맡을지 정하고, 고칠 양을 작게 만든다.

오해패스스루는 앞 층의 특징을 줄여서(풀링해서) 붙인다.

실제로는줄이지 않는다. 2 × 2 이웃을 채널로 옮겨 쌓을 뿐이라, 26 × 26 × 512의 값 346,112개가 13 × 13 × 2048에 모두 들어간다. 최대 풀링이었다면 4개 중 1개만 남는다.

출처: 논문 §2, §3, 그림 3, 표 5

질문

자주 묻는 질문

YOLOv2는 YOLOv1과 무엇이 다른가?

배치 정규화, 고해상도 분류기, 앵커 박스, k-평균으로 고른 앵커 크기, 칸에 묶은 위치 예측, 패스스루 레이어, 여러 크기로 학습하기, 새 네트워크 Darknet-19를 더했다. 논문 표 2에서 VOC 2007 mAP가 63.4에서 78.6으로 올랐고, 같은 모델을 416 × 416에서 돌리면 초당 67장에 mAP 76.8이다.

앵커 박스(anchor box)란 무엇인가?

미리 정해 둔 박스 모양이다. 신경망은 박스를 처음부터 그리지 않고, 앵커를 얼마나 옮기고 늘릴지를 예측한다. YOLOv2는 13 × 13 칸마다 앵커 5개를 두고 앵커마다 물체 여부와 클래스를 따로 예측해서, 한 칸에 모양이 다른 물체가 둘 있어도 둘 다 찾을 수 있다.

YOLOv2의 앵커 박스는 몇 개이고 어떻게 정하나?

5개다. 학습 데이터 정답 박스의 너비와 높이에 k-평균 군집을 돌려 고르고, 거리로 1 − IOU를 쓴다. 앵커를 늘릴수록 평균 IOU가 오르지만 모델이 복잡해져, 논문은 그 사이의 균형으로 5개를 골랐다(표 1: 5개 61.0, 9개 67.2).

앵커를 고르는 k-평균에 왜 유클리드 거리 대신 1 − IOU를 쓰나?

유클리드 거리를 쓰면 큰 박스가 오차를 더 많이 만들어 군집 중심이 큰 박스 쪽으로 끌린다. 원하는 것은 박스 크기와 상관없이 IOU가 높은 앵커라서 1 − IOU를 쓴다. 논문 표 1에서 같은 5개일 때 평균 IOU는 유클리드 거리 58.7, IOU 거리 61.0이었다.

YOLOv2는 박스 위치와 크기를 어떻게 예측하나?

칸의 왼쪽 위 (c_x, c_y)와 앵커 크기 (p_w, p_h)를 기준으로 b_x = σ(t_x) + c_x, b_y = σ(t_y) + c_y, b_w = p_w·e^(t_w), b_h = p_h·e^(t_h)로 박스를 만든다. 시그모이드 σ가 중심을 자기 칸 안에 묶어 학습이 안정되고, k-평균으로 고른 앵커와 함께 쓰면 논문 표 2에서 mAP가 69.6에서 74.4로 오른다.

패스스루 레이어(passthrough layer)란 무엇인가?

앞 층의 26 × 26 × 512 특징을 가져와 이웃한 2 × 2 칸을 채널 방향으로 쌓아 13 × 13 × 2048로 바꾸고, 원래의 13 × 13 특징에 이어 붙이는 층이다. 값을 버리지 않고 자리만 옮기므로 세밀한 특징이 그대로 남아 작은 물체의 위치를 잡는 데 쓰인다. 논문에서 mAP를 74.4에서 75.4로 올렸다.

YOLOv2의 출력은 왜 13 × 13 × 125인가?

416 × 416 입력을 32분의 1로 줄여 13 × 13 칸이 되고, 칸마다 앵커 5개가 좌표 4개, 물체 여부 1개, 클래스 20개(PASCAL VOC)를 내기 때문이다. 5 × (4 + 1 + 20) = 125이고, 한 장에 박스 845개가 나온다. 13이 홀수라 사진 한가운데에 칸이 하나 생긴다.

YOLOv2와 YOLO9000은 같은 것인가?

같은 논문(YOLO9000: Better, Faster, Stronger, CVPR 2017)에 나오지만 다른 모델이다. YOLOv2는 앞부분에서 개선한 탐지기이고, YOLO9000은 그 구조로 COCO 탐지 데이터와 ImageNet 분류 데이터를 함께 학습해 9000개 넘는 물체 종류를 찾는 모델이다. YOLO9000은 앵커를 5개 대신 3개 쓴다.

출처: 논문 §2, §3, §4, 표 1, 표 2, 표 3 · 845개와 출력 크기는 이 페이지의 계산

더 보기

01의 앵커 크기, 02의 점과 점수, 01의 6.8%·1.5%는 PASCAL VOC 정답 박스의 숫자로 직접 계산했다. 사진은 쓰지 않았다.