KNOWLEDGE · 물체 탐지
크고 작은 물체를, YOLOv3는 어떻게 한 번에 찾을까?
YOLOv3는 13 × 13, 26 × 26, 52 × 52 세 격자에서 칸마다 앵커 3개로 박스를 예측해 크고 작은 물체를 나눠 맡고, 정답마다 앵커 9개 중 가장 잘 맞는 하나에만 물체 있음을 가르친다.
YOLOv2는 416 × 416 사진을 13 × 13 칸으로 나누고, 칸마다 앵커 박스 5개로 박스 845개를 냈다. 칸 하나가 사진의 32 × 32픽셀이라 작은 물체에는 거칠었고, COCO에서 작은 물체의 AP는 5.0이었다. YOLOv3는 작은 변화 여럿을 더했다. 이 글은 그중 두 가지, 세 크기의 격자에서 예측하기(멀티 스케일 예측)와 박스마다 무엇을 배우는지(바운딩 박스 예측)를 직접 만져 본다.
YOLOv2와 YOLOv3의 COCO 성적 (논문 표 3, test-dev)
- 작은 물체 APS01·025.0 → 18.3
- 중간 물체 APM22.4 → 35.4
- 큰 물체 APL35.5 → 41.9
- AP50 (IOU 0.5)44.0 → 57.9
- AP (IOU 0.5~0.95 평균)21.6 → 33.0
YOLOv2YOLOv3 608 × 608
막대는 0부터 60까지. 백본(Darknet-53)과 입력 크기를 포함한 여러 변화가 함께 든 비교이고, 하나씩 더하며 잰 표는 논문에 없다. 논문은 작은 물체의 향상을 새 다중 크기 예측 덕분으로 본다(§3).
01 멀티 스케일 예측
세 격자, 칸마다 앵커 셋
YOLOv3는 416 × 416 사진을 크기가 다른 세 격자로 나눠 본다. 13 × 13(칸 한 변 32픽셀), 26 × 26(16픽셀), 52 × 52(8픽셀)이다. 격자마다 칸마다 앵커 박스 3개를 두므로 앵커는 모두 9개다. 큰 앵커 셋은 13 × 13, 가운데 셋은 26 × 26, 작은 셋은 52 × 52가 쓴다. 물체마다 9개 중 모양이 가장 잘 맞는 앵커 하나가 물체를 맡고, 그 앵커가 속한 격자에서 물체 중심이 든 칸이 박스를 예측한다.
버스, 개, 새를 끌어 보자. 크기 막대로 고른 물체를 키우거나 줄이면 맡는 앵커와 격자가 바뀐다. 키보드로는 그림을 선택한 뒤 화살표로 움직이고(Shift는 크게), + −로 크기를 바꾸고, 스페이스로 물체를 바꾼다.
박스 13 × 13 × 3 = 507 · 26 × 26 × 3 = 2,028 · 52 × 52 × 3 = 8,112 · 합 10,647개
선택한 물체
버스 → 13 × 13 격자 · 7행 9열 칸 · 앵커 156 × 198
앵커 9개와 겹치는 정도(중심을 맞춘 IOU). 가장 큰 앵커 하나가 물체를 맡고, 그 앵커의 격자가 예측한다.
격자를 크기로 정하는 규칙은 따로 없다. 모양이 가장 닮은 앵커가 정해지면 격자도 따라 정해진다. 그래서 작은 물체는 칸이 8픽셀인 52 × 52에서, 큰 물체는 칸이 32픽셀인 13 × 13에서 예측한다. YOLOv2는 박스 845개(13 × 13 × 앵커 5)를 모두 13 × 13에서 냈고, YOLOv3는 세 격자에서 10,647개를 낸다.
출처: 논문 §2.3 Predictions Across Scales · 앵커 9개는 §2.3의 COCO 값 · 격자마다 앵커 셋은 저자 Darknet 설정 cfg/yolov3.cfg(mask 6,7,8 / 3,4,5 / 0,1,2) · 물체를 맡는 앵커를 9개 전체에서 고르는 규칙은 저자 코드(yolo_layer.c)
02 업샘플링과 이어 붙이기
깊은 특징을 펼쳐 세밀한 격자에 붙인다
세 격자에서 예측하려면 13 × 13, 26 × 26, 52 × 52 특징 지도가 모두 있어야 한다. 신경망 앞쪽의 26 × 26, 52 × 52 지도는 세밀하지만 지난 층이 적고, 끝의 13 × 13 지도는 많은 층을 지났지만 거칠다. YOLOv3는 끝 쪽 특징을 2배씩 펼쳐(업샘플링) 앞쪽 지도와 이어 붙인다. 논문은 업샘플한 특징에서 의미 있는 정보를, 앞쪽 지도에서 세밀한 정보를 얻는다고 쓴다.
107층을 피라미드로 쌓으면
YOLOv3는 107층이다(저자 설정 파일의 층 번호 0~106). 아래 그림은 층 하나를 판 하나로 그려 해상도 순서로 쌓고, 물체 탐지기를 흔히 그리는 대로 백본·넥·헤드 세 열로 나눴다. 판의 가로세로는 해상도, 두께는 채널 수다. 백본(Darknet-53, 0~74번)은 사진을 반씩 줄이며 위로 쌓여 피라미드가 된다. 넥은 꼭대기에서 시작해 한 층씩 내려온다. 층마다 같은 높이의 백본 지도(74번, 61번, 36번)를 옆에서 받고, 79번과 91번의 특징을 1 × 1 합성곱과 2배 업샘플로 펼쳐 아래 층으로 보내 이어 붙인다(86번, 98번). 그래서 넥은 아래로 갈수록 넓어진다. 헤드는 넥의 세 층에서 3 × 3과 1 × 1 합성곱으로 예측한다. 논문이 특징 피라미드 네트워크(FPN)와 비슷하다고 한 모양이 이 세 갈래(아래에서 위로, 위에서 아래로, 옆 연결)다.
단계 탭을 따라가 보자. ‘층 지도’를 누르면 정면에서 층 번호와 함께 보고, ‘피라미드’를 누르면 비스듬히 본다. 판에 올리거나 누르면 그 층이 무엇인지 나오고, ①~⑤를 누르면 아래 그림이 그 단계로 간다. 끌어서 돌린다. 키보드: 화살표로 회전. 판의 가로세로는 실제 비율이 아니라 해상도가 반이 될 때마다 같은 만큼 줄여 그렸고, 두께는 채널 수에 비례한다.
층 하나를 판 하나로 그려 해상도 순서로 쌓은 YOLOv3 전체다. 왼쪽 백본은 사진에서 13 × 13까지 좁아지는 피라미드, 가운데 넥은 13 × 13에서 52 × 52로 넓어지며 내려오는 거꾸로 된 피라미드, 오른쪽 헤드는 세 높이의 예측이다. ‘층 지도’로 돌리면 정면에서 층 번호와 함께 본다.
넥이 받는 백본 지도: 74번(13 × 13 × 1024), 61번(26 × 26 × 512), 36번(52 × 52 × 256) · 헤드의 예측: 13 × 13, 26 × 26, 52 × 52 × 255
- ① 가져오는 곳넥의 13 × 13 줄 마지막 층인 79번(1 × 1 × 512)이 낸 13 × 13 × 512. 헤드의 두 층(80, 81번)을 지나기 전이라, 예측을 내는 출력 합성곱(81번)보다 2층 앞이다. 논문이 말하는 "2층 앞의 특징 지도"다.
- ② 줄이기1 × 1 합성곱 256개(84번)로 13 × 13 × 256을 만든다.
- ③ 펼치기2배 업샘플(85번). 값마다 2 × 2 네 칸에 복사해 26 × 26 × 256이 된다.
- ④ 합치는 곳Darknet-53의 61번 층(26 × 26 해상도의 마지막 잔차 블록, 26 × 26 × 512)과 채널 방향으로 이어 붙인다(86번). 256 + 512 = 768채널이다.
- ⑤ 예측넥의 합성곱 5층(87~91번)과 헤드의 3 × 3 합성곱(92번), 출력 합성곱(93번)을 지나 26 × 26 × 255를 예측한다(94번). 같은 설계를 한 번 더 하면 52 × 52다. 91번 → 1 × 1 × 128 → 2배 업샘플 → 36번(52 × 52 × 256)과 이어 붙이기(384채널) → 52 × 52 × 255(106번).
어떻게 펼쳐 붙이나
②~⑤를 13 × 13에서 26 × 26으로 가는 길에서 직접 본다. 업샘플링은 값 하나를 2 × 2 네 칸에 그대로 복사한다(최근접 이웃). 학습하는 가중치가 없고 새 값도 만들지 않는다. 26 × 26의 세밀한 정보는 이어 붙이는 앞쪽 지도에서 온다.
단계 탭을 눌러 따라가 보자. 위 그림에서 지금 단계가 일어나는 곳이 밝아진다. 칸을 누르면 그 칸이 어디로 가는지 따라간다. 끌어서 돌린다. 키보드: 화살표로 회전, Shift + 화살표로 칸 이동.
① 넥의 13 × 13 줄 마지막 층(79번)이 낸 13 × 13 × 512 특징이다. 헤드의 출력 합성곱(81번)보다 2층 앞이다. 칸 하나가 사진의 32 × 32픽셀을 맡는다.
고른 칸: 13 × 13의 7행 7열 · 값 512개
값의 수: 13 × 13 × 512 = 86,528
YOLOv2의 패스스루는 방향이 반대였다. 26 × 26 지도를 2 × 2씩 채널로 접어 13 × 13에 붙였다(세밀한 특징을 거친 격자로). YOLOv3는 거친 격자의 깊은 특징을 펼쳐 26 × 26, 52 × 52로 보내고, 그 격자에서도 예측한다. FPN과 다른 점도 있다. FPN은 두 지도를 더하고, YOLOv3는 이어 붙인다.
그림의 색은 설명을 위한 개념도다. 깊은 특징은 개가 있는 곳을 13 × 13 해상도로, 앞쪽 지도는 개의 윤곽을 26 × 26 해상도로 담는다고 가정하고 칠했다. 실제 특징 값은 사람이 이렇게 읽을 수 있는 모양이 아니다.
출처: 논문 §2.3 · 층의 순서와 모양은 저자 Darknet 설정 cfg/yolov3.cfg(route −4, upsample 2, route −1, 61 / route −1, 36) · 업샘플링은 저자 코드(upsample_layer.c, 최근접 이웃) · 백본·넥·헤드라는 이름은 YOLOv4 논문 §2.1, §3.4에서 왔고(YOLOv3 논문에는 없다), 넥과 헤드의 경계는 MMDetection의 YOLOv3 구현(YOLOV3Neck, YOLOV3Head)을 따랐다
03 바운딩 박스 예측
정답 하나에 앵커 하나, 나머지는 0 아니면 무시
예측 박스 10,647개는 저마다 좌표 4개, 물체 여부(objectness: 박스 안에 물체가 있을 확률) 1개, 클래스 80개를 낸다. 좌표는 YOLOv2와 같은 식으로 앵커를 옮기고 늘린다. 달라진 것은 학습에서 각 박스가 맞혀야 할 목표다. 정답 물체 하나마다 앵커 9개 중 가장 잘 맞는 하나의 박스만 물체 여부 1과 좌표, 클래스를 배운다. 정답과 0.5보다 많이 겹치지만 가장 잘 맞지는 않은 앵커의 박스는 벌점 없이 둔다. 나머지는 모두 물체 여부 0을 배운다.
단계 탭을 따라가 보자. 개를 끌거나 크기 막대를 움직이면 단계마다의 개수가 바뀐다. 겹침은 학습을 시작할 때의 예측 박스, 곧 칸 가운데에 놓인 앵커로 잰다. 키보드: 그림에서 화살표로 개를 움직이고, + −로 크기를 바꾼다.
① 정답 박스와 앵커 9개를 중심을 맞춰 겹쳐 본다. 위치는 보지 않고 모양만 비교한다. 겹침(IOU)이 가장 큰 앵커 하나가 이 개를 맡는다.
앵커 9개와 겹치는 정도(중심을 맞춘 IOU)
YOLOv2에서는 물체를 맡은 박스의 물체 여부가 예측 박스와 정답의 IOU를 맞혔다. YOLOv3는 로지스틱 회귀로 1을 맞힌다. 그리고 정답마다 앵커 9개 중 하나의 박스만 맡는다. 가장 잘 맞지는 않아도 정답과 많이 겹치는 박스는 0도 1도 배우지 않는다.
클래스는 하나만 고르지 않는다
YOLOv3는 클래스 80개를 softmax로 한꺼번에 나누지 않고, 클래스마다 따로 로지스틱(0~1 확률)으로 예측한다. softmax는 모든 클래스의 확률을 더하면 1이라서 박스 하나에 클래스가 정확히 하나라고 가정한다. 레이블이 겹치는 데이터(예: Open Images의 '여성'과 '사람')에서는 그 가정이 틀린다.
한 박스의 정답이 '사람'이면서 '여성'이라고 하자. 신경망이 내는 점수(로짓)를 움직여 두 방식의 확률을 비교해 보자.
정답: 사람 1 · 여성 1 · 개 0
softmax (YOLOv2): 셋을 더하면 1
클래스마다 로지스틱 (YOLOv3): 따로따로 0~1
softmax: 사람 0.72, 여성 0.27 · 로지스틱: 사람 0.88, 여성 0.73. softmax는 두 정답이 확률 1을 나눠 가져 둘 다 0.5를 넘을 수 없다. 로지스틱에서는 사람과 여성이 둘 다 0.5를 넘는다. 둘 다 정답이라는 것을 그대로 나타낸다.
학습은 클래스마다 이진 교차 엔트로피로 한다. 논문은 COCO에서 softmax가 좋은 성능에 필요하지 않았다고 쓴다. 탐지 점수는 클래스마다 물체 여부 × 클래스 확률이다.
출처: 논문 §2.1 Bounding Box Prediction, §2.2 Class Prediction · 정답을 맡을 앵커를 9개 전체에서 고르는 규칙과 탐지 점수는 저자 코드(yolo_layer.c)
정리
YOLOv2에서 YOLOv3로
- 13 × 13 하나 → 세 격자. 13 × 13 × 앵커 5 = 845개였던 박스가 13 × 13 × 3 + 26 × 26 × 3 + 52 × 52 × 3 = 10,647개가 된다. 앵커 9개를 크기순으로 셋씩 나눠, 작은 물체는 칸이 8픽셀인 52 × 52에서 예측한다.
- 접어 내리기 → 펼쳐 올리기. YOLOv2는 26 × 26을 접어 13 × 13에 붙였다. YOLOv3는 13 × 13의 깊은 특징을 2배씩 펼쳐 26 × 26, 52 × 52의 앞쪽 지도와 이어 붙이고, 거기서도 예측한다.
- IOU 맞히기, softmax → 1·무시·0, 클래스마다 로지스틱. 정답마다 앵커 하나의 박스만 물체 여부 1을 배우고, 0.5보다 많이 겹친 다른 앵커의 박스는 무시하고, 나머지는 0을 배운다. 클래스는 서로 독립인 확률이다.
그래도 박스를 딱 맞추는 데는 약하다. COCO에서 IOU 0.5 기준의 AP50은 57.9로 높지만, IOU 0.5~0.95로 평균한 AP는 33.0이다. 작은 물체(APS 18.3)는 좋아졌지만 중간·큰 물체에서는 같은 표의 다른 탐지기보다 비교적 낮고, 논문도 원인은 더 조사해야 한다고 쓴다(§3, 표 3).
오해큰 물체는 13 × 13, 작은 물체는 52 × 52로 보내는 크기 기준이 있다.
실제로는그런 기준은 없다. 앵커 9개 중 모양(중심을 맞춘 IOU)이 가장 잘 맞는 앵커가 정해지면 그 앵커의 격자가 따라 정해진다. 그래서 넓이가 같은 1,000픽셀이라도 50 × 20 박스는 52 × 52, 20 × 50 박스는 26 × 26으로 간다.
오해업샘플링이 거친 특징에서 세밀한 정보를 되살린다.
실제로는업샘플링은 값 하나를 2 × 2 네 칸에 복사할 뿐, 새 정보를 만들지 않는다(학습하는 가중치도 없다). 세밀한 정보는 이어 붙이는 앞쪽 지도(61번, 36번 층)에서 온다.
출처: 논문 §2.1, §2.2, §2.3, §3, 표 3 · 저자 Darknet 설정 cfg/yolov3.cfg와 코드(yolo_layer.c, upsample_layer.c) · 50 × 20과 20 × 50의 격자는 이 페이지의 계산
질문
자주 묻는 질문
YOLOv3는 YOLOv2와 무엇이 다른가?
세 크기의 격자(13 × 13, 26 × 26, 52 × 52)에서 예측하고, 앵커를 9개로 늘려 격자마다 3개씩 나눈다. 물체 여부는 로지스틱 회귀로 정답마다 앵커 하나의 박스만 1을 배우고, 클래스는 softmax 대신 서로 독립인 로지스틱으로 예측한다. 백본은 Darknet-19에서 잔차 연결이 있는 Darknet-53으로 바뀌었다. COCO에서 AP는 21.6에서 33.0으로, 작은 물체의 AP는 5.0에서 18.3으로 올랐다(논문 표 3).
YOLOv3의 멀티 스케일 예측(multi-scale prediction)이란?
한 사진을 크기가 다른 세 격자에서 예측하는 것이다. 416 × 416 입력에서 13 × 13(칸 32픽셀), 26 × 26(16픽셀), 52 × 52(8픽셀) 격자가 각각 칸마다 앵커 3개로 박스를 낸다. 큰 앵커는 거친 격자, 작은 앵커는 촘촘한 격자에 두어 작은 물체도 맡는다.
YOLOv3의 출력 크기와 박스 수는?
416 × 416 입력에서 13 × 13 × 255, 26 × 26 × 255, 52 × 52 × 255다. 255는 앵커 3개 × (좌표 4 + 물체 여부 1 + COCO 클래스 80)이다. 박스는 507 + 2,028 + 8,112 = 10,647개이고, 608 × 608 입력이면 22,743개다.
YOLOv3의 앵커 9개는 무엇이고 어떻게 나누나?
COCO 정답 박스에 k-평균을 돌려 고른 (10 × 13), (16 × 30), (33 × 23), (30 × 61), (62 × 45), (59 × 119), (116 × 90), (156 × 198), (373 × 326)픽셀이다. 작은 셋은 52 × 52, 가운데 셋은 26 × 26, 큰 셋은 13 × 13 격자가 쓴다. 논문은 9개와 3크기를 임의로 골랐다고 쓴다.
물체는 YOLOv3의 어느 격자에서 예측되나?
앵커 9개 중 물체와 모양이 가장 잘 맞는(중심을 맞춘 IOU가 가장 큰) 앵커가 물체를 맡고, 그 앵커가 속한 격자에서 물체 중심이 든 칸이 예측한다. 크기로 격자를 정하는 기준이 따로 있지는 않다.
YOLOv3의 업샘플링과 이어 붙이기(concatenation)는 무엇을 하나?
넥의 13 × 13 줄 마지막 층(79번) 특징을 1 × 1 합성곱으로 256채널로 줄이고 2배로 업샘플링해 26 × 26으로 만든 뒤, Darknet-53 앞쪽의 26 × 26 × 512 지도(61번 층)와 채널 방향으로 이어 붙여 768채널을 만든다. 같은 일을 한 번 더 해 52 × 52 지도(384채널)를 만든다. 논문은 업샘플한 특징에서 의미 있는 정보를, 앞쪽 지도에서 세밀한 정보를 얻는다고 쓴다.
YOLOv3의 물체 여부(objectness)는 어떻게 학습하나?
로지스틱 회귀로 학습한다. 정답마다 앵커 9개 중 가장 잘 맞는 앵커의 박스 하나만 목표가 1이고, 그 박스만 좌표와 클래스도 배운다. 가장 잘 맞지는 않지만 정답과 0.5보다 많이 겹치는 앵커의 박스는 무시하고(벌점 없음), 나머지는 목표가 0이다.
YOLOv3는 왜 softmax 대신 로지스틱 분류기를 쓰나?
softmax는 박스마다 클래스가 정확히 하나라고 가정한다. Open Images처럼 '여성'과 '사람' 같은 레이블이 겹치는 데이터에서는 맞지 않아, 클래스마다 독립인 로지스틱 분류기와 이진 교차 엔트로피를 쓴다. 논문은 COCO에서 softmax가 좋은 성능에 필요하지 않았다고 쓴다.
출처: 논문 §2.1, §2.2, §2.3, §2.4, 표 3 · 저자 Darknet 설정 cfg/yolov3.cfg · 박스 수는 이 페이지의 계산
더 보기
- Redmon & Farhadi, YOLOv3: An Incremental Improvement (arXiv 2018)
- 저자의 Darknet 설정 yolov3.cfg
- Lin et al., Feature Pyramid Networks for Object Detection (CVPR 2017)
- Bochkovskiy et al., YOLOv4: Optimal Speed and Accuracy of Object Detection (arXiv 2020)
- MMDetection의 YOLOv3 설정(백본 · 넥 · 헤드)
- YOLOv2, 앵커 박스와 패스스루 · YOLOv1, 한 번 보고 모두 찾기 · IOU와 NMS
이 페이지의 숫자는 논문과 저자 설정 파일에서 왔고, 그림 속 격자와 겹침은 페이지가 직접 계산한다. 사진과 데이터셋은 쓰지 않았다.