11  객체탐지: 분류를 넘어 위치로

학습 목표
  • 이미지 분류와 객체탐지의 출력 차이를 설명할 수 있다
  • 바운딩 박스의 두 가지 표기법을 이해하고 서로 변환할 수 있다
  • 두 박스의 IoU를 직접 계산할 수 있다
  • NMS(비최대 억제) 절차를 단계별로 따라갈 수 있다
  • 정밀도와 재현율로 탐지 성능을 평가하고, 산업 맥락에서 해석할 수 있다
  • 사전학습 YOLO를 내 데이터로 파인튜닝하는 흐름을 이해한다
  • 라벨링 도구로 내 데이터셋을 직접 제작할 수 있다

이 장은 응용 주간이다. 새 이론은 IoU와 NMS 두 가지 손계산뿐이고, 나머지는 지금까지 배운 것(전이학습, 동결, 데이터 품질)을 탐지 문제에 적용하는 것이다. 그리고 이번 주에 팀 프로젝트가 시작된다.


11.1 분류에서 탐지로

11.1.1 질문이 바뀐다

Ch08 마지막에서 예고했던 그 문제다. 이미지 분류는 “이 이미지는 무엇인가?”에 답한다. 그런데 산업 현장의 질문은 대부분 그다음을 요구한다:

  • 품질 검사: 불량이 있는가? → 어디에 있는가? (그래야 그 부품을 골라낼 수 있다)
  • 안전 관리: 소화기가 있는가? → 몇 개가, 어디에 있는가?
  • 재고 관리: 선반 사진에서 어떤 상품이 몇 개 남았는가?

“어디에, 무엇이, 몇 개” — 이것이 객체탐지(Object Detection)의 질문이다.

11.1.2 출력의 차이

이미지 분류 객체탐지
입력 이미지 1장 이미지 1장
출력 클래스 확률 \(K\)개 (고정) {클래스, 박스, 신뢰도} × 가변 개수
예시 “소화기: 0.97” “소화기 (120, 80, 60, 140), 신뢰도 0.95” × 2개

출력이 가변 개수라는 점이 탐지를 어렵게 만드는 본질이다. 이미지마다 객체가 0개일 수도, 20개일 수도 있다.


11.2 바운딩 박스 (Bounding Box)

정의: 바운딩 박스 (Bounding Box)

객체를 둘러싸는 최소 크기의 직사각형. 두 가지 표기법이 쓰인다.

  • 모서리 표기: \((x_1, y_1, x_2, y_2)\) — 왼쪽 위 모서리와 오른쪽 아래 모서리
  • 중심 표기: \((x_c, y_c, w, h)\) — 중심 좌표와 너비·높이 (YOLO가 쓰는 방식)

두 표기는 간단히 변환된다:

\[x_c = \frac{x_1 + x_2}{2}, \quad y_c = \frac{y_1 + y_2}{2}, \quad w = x_2 - x_1, \quad h = y_2 - y_1\]

예: 모서리 표기 \((2, 2, 6, 5)\)인 박스는 → 중심 표기로 \(x_c = 4\), \(y_c = 3.5\), \(w = 4\), \(h = 3\).

여러분이 라벨링 도구에서 마우스로 그리게 될 것이 바로 이 사각형이고, 모델이 예측하는 것도 이 네 개의 숫자다.


11.3 IoU: 두 박스는 얼마나 겹치는가

11.3.1 왜 필요한가

탐지 모델을 만들면 곧바로 이런 질문에 부딪힌다:

  • 모델이 예측한 박스가 정답 박스와 “맞았다”고 인정하려면 얼마나 겹쳐야 하는가?
  • 같은 물체에 예측 박스가 여러 개 나왔을 때, “같은 물체를 가리킨다”는 판단 기준은?

두 질문 모두 겹침의 정도를 숫자 하나로 재는 도구를 요구한다. 그것이 IoU다.

정의: IoU (Intersection over Union)

두 박스의 교집합 넓이를 합집합 넓이로 나눈 값.

\[\text{IoU} = \frac{\text{교집합 넓이}}{\text{합집합 넓이}} = \frac{A \cap B}{A + B - (A \cap B)}\]

  • 완전히 일치하면 1, 전혀 안 겹치면 0
  • 관례적으로 IoU ≥ 0.5면 “맞은 예측”으로 인정한다

11.3.2 손계산

박스 A \((2, 2, 6, 5)\)와 박스 B \((4, 3, 8, 6)\)의 IoU를 계산해 보자 (모서리 표기).

교집합 사각형의 모서리는 “왼쪽 위는 두 박스 중 더 안쪽, 오른쪽 아래도 더 안쪽”으로 정해진다:

\[x_1^{\cap} = \max(2, 4) = 4, \quad y_1^{\cap} = \max(2, 3) = 3, \quad x_2^{\cap} = \min(6, 8) = 6, \quad y_2^{\cap} = \min(5, 6) = 5\]

코드
import pandas as pd

ax1, ay1, ax2, ay2 = 2, 2, 6, 5
bx1, by1, bx2, by2 = 4, 3, 8, 6

area_a = (ax2 - ax1) * (ay2 - ay1)
area_b = (bx2 - bx1) * (by2 - by1)

ix1, iy1 = max(ax1, bx1), max(ay1, by1)
ix2, iy2 = min(ax2, bx2), min(ay2, by2)
iw, ih = max(0, ix2 - ix1), max(0, iy2 - iy1)
inter = iw * ih
union = area_a + area_b - inter
iou = inter / union

pd.DataFrame([
    {'단계': 'A의 넓이', '계산': '$(6-2) \\times (5-2)$', '값': area_a},
    {'단계': 'B의 넓이', '계산': '$(8-4) \\times (6-3)$', '값': area_b},
    {'단계': '교집합 너비', '계산': '$\\min(6,8) - \\max(2,4) = 6 - 4$', '값': iw},
    {'단계': '교집합 높이', '계산': '$\\min(5,6) - \\max(2,3) = 5 - 3$', '값': ih},
    {'단계': '교집합 넓이', '계산': '$2 \\times 2$', '값': inter},
    {'단계': '합집합 넓이', '계산': '$12 + 12 - 4$', '값': union},
    {'단계': '**IoU**', '계산': '$4 / 20$', '값': f'**{iou:.2f}**'},
]).to_html(index=False, border=0, escape=False)
표 11.1: IoU 손계산 — 박스 A(2,2,6,5) vs 박스 B(4,3,8,6)
단계 계산
A의 넓이 \((6-2) \\times (5-2)\) 12
B의 넓이 \((8-4) \\times (6-3)\) 12
교집합 너비 \(\\min(6,8) - \\max(2,4) = 6 - 4\) 2
교집합 높이 \(\\min(5,6) - \\max(2,3) = 5 - 3\) 2
교집합 넓이 \(2 \\times 2\) 4
합집합 넓이 \(12 + 12 - 4\) 20
IoU \(4 / 20\) 0.20

IoU = 0.20 — 관례 기준(0.5)에 한참 못 미친다. 눈으로 보면 꽤 겹쳐 보여도 합집합이 분모라서 IoU는 생각보다 박한 점수를 준다. 아래 위젯에서 직접 확인해 보자.


인터랙티브 — 박스를 움직여 IoU의 감각을 익히세요

박스 B의 위치와 크기를 조절하면서 IoU가 어떻게 변하는지 확인하세요. “IoU 0.5”가 시각적으로 얼마나 빡빡한 기준인지 감각을 잡는 것이 목표입니다.

시도해 보세요: 박스 B를 A와 똑같이(x₁=2, y₁=2, 너비 4, 높이 3) 맞추면 IoU = 1.0. 거기서 한 칸만 옆으로 밀어도 IoU가 얼마나 떨어지는지 확인해 보세요.


11.4 NMS: 겹치는 예측 정리하기

11.4.1 문제 상황

탐지 모델은 한 물체에 대해 비슷한 박스를 여러 개 예측하는 경향이 있다. 소화기 하나에 박스가 3개 겹쳐 나오면, 최종 출력은 1개여야 한다. 어떤 박스를 남기고 어떤 박스를 지울 것인가?

정의: NMS (Non-Maximum Suppression, 비최대 억제)

겹치는 예측 박스들 중 신뢰도가 가장 높은 것만 남기고 나머지를 제거하는 절차.

  1. 남은 박스 중 신뢰도 최고인 박스를 채택한다
  2. 채택된 박스와 IoU가 임계값(보통 0.5) 이상인 박스를 모두 제거한다 (같은 물체로 간주)
  3. 남은 박스가 없을 때까지 1~2를 반복한다

11.4.2 손계산

모델이 박스 5개를 예측했다. 신뢰도와 상호 IoU가 다음과 같을 때 NMS(임계값 0.5)를 실행해 보자.

코드
import pandas as pd

pd.DataFrame([
    {'박스': 'B1', '신뢰도': 0.95, 'B1과 IoU': '—', 'B4와 IoU': 0.05},
    {'박스': 'B2', '신뢰도': 0.85, 'B1과 IoU': 0.70, 'B4와 IoU': 0.02},
    {'박스': 'B3', '신뢰도': 0.60, 'B1과 IoU': 0.65, 'B4와 IoU': 0.01},
    {'박스': 'B4', '신뢰도': 0.90, 'B1과 IoU': 0.05, 'B4와 IoU': '—'},
    {'박스': 'B5', '신뢰도': 0.75, 'B1과 IoU': 0.03, 'B4와 IoU': 0.60},
]).to_html(index=False, border=0)
표 11.2: NMS 입력 — 예측 박스 5개
박스 신뢰도 B1과 IoU B4와 IoU
B1 0.95 0.05
B2 0.85 0.7 0.02
B3 0.60 0.65 0.01
B4 0.90 0.05
B5 0.75 0.03 0.6

절차를 따라가면:

라운드 남은 박스 채택 제거 (채택 박스와 IoU ≥ 0.5)
1 B1~B5 B1 (신뢰도 0.95 최고) B2 (0.70), B3 (0.65) — B1과 같은 물체
2 B4, B5 B4 (신뢰도 0.90) B5 (0.60) — B4와 같은 물체
3 없음 종료

최종 출력: B1, B4 — 박스 5개가 물체 2개로 정리되었다.

B5(신뢰도 0.75)가 B3(0.60)보다 신뢰도가 높은데도 제거된 이유를 설명할 수 있는가? B5는 B4와 겹쳤고(같은 물체의 중복 예측), B3은 B1과 겹쳤기 때문이다 — NMS는 신뢰도 순위가 아니라 “누구와 겹치는가”로 제거를 결정한다.


11.5 탐지 성능 평가

11.5.1 맞았다/틀렸다의 기준

분류는 정답 클래스와 비교하면 끝이지만, 탐지는 박스가 맞아야 한다. 기준은 이미 배웠다:

  • 예측 박스가 어떤 정답 박스와 IoU ≥ 0.5이고 클래스도 맞으면 → TP (맞은 예측)
  • 그런 정답 박스가 없으면 → FP (허탕 — 없는 물체를 예측)
  • 어떤 예측과도 매칭되지 않은 정답 박스 → FN (놓침)

11.5.2 정밀도와 재현율

\[\text{정밀도(Precision)} = \frac{TP}{TP + FP} \qquad \text{재현율(Recall)} = \frac{TP}{TP + FN}\]

수치 예시: 이미지에 실제 소화기가 5개 있고, 모델이 6개를 예측했는데 그중 4개가 정답과 매칭됐다면:

\[\text{정밀도} = \frac{4}{6} = 0.67 \qquad \text{재현율} = \frac{4}{5} = 0.80\]

11.5.3 산업 맥락에서의 해석

두 지표의 균형은 문제가 결정한다. 산업공학도라면 이 표를 그냥 지나치면 안 된다:

상황 중요한 지표 이유
불량품 검출 재현율 놓친 불량(FN)이 고객에게 출하되는 비용이 훨씬 크다
자동 폐기 시스템 정밀도 허탕(FP)이 정상품을 폐기하는 비용을 만든다
안전모 미착용 경보 균형 놓치면 위험, 오경보가 잦으면 무시된다

mAP(mean Average Precision)라는 종합 지표도 자주 보게 된다 — 신뢰도 임계값을 바꿔가며 정밀도·재현율을 종합한 점수로, “이 모델의 전반적 탐지 실력” 정도로 읽으면 된다. 계산 절차는 이 수업 범위 밖이다.


11.6 YOLO: 한 번만 본다

11.6.1 아이디어

초기 탐지 모델은 “물체가 있을 만한 후보 영역을 먼저 찾고, 각 영역을 분류”하는 2단계 방식이었다 — 정확하지만 느렸다.

YOLO(You Only Look Once)는 이름 그대로 답했다: 이미지를 그리드로 나누고, 모든 셀이 자기 구역의 박스·클래스·신뢰도를 동시에 예측한다. CNN 순전파 한 번으로 탐지가 끝나므로 실시간 처리가 가능하다 — 공장 라인 위를 지나가는 부품을 검사할 수 있는 속도다.

깊이 계약 확인

YOLO의 내부 구조(앵커, 손실 함수 구성, 버전별 차이)는 이 수업의 범위 밖이다. 여러분에게 필요한 것은 “그리드 기반 동시 예측이라 빠르다”는 개념과, 아래의 파인튜닝 사용법이다. 문제집과 시험은 IoU·NMS·정밀도/재현율 계산까지만 다룬다.

11.6.2 파인튜닝: 이미 배운 원리다

사전학습된 YOLO는 COCO 데이터셋(80개 클래스, 33만 장)으로 학습되어 “물체다움”에 대한 일반적인 감각을 이미 갖고 있다. 여러분이 할 일은 Ch08의 전이학습 그대로다:

  1. 사전학습 YOLO를 가져온다 (특성 추출 능력 재사용)
  2. 출력을 내 클래스(예: 소화기, 표지판)에 맞게 교체한다
  3. 내 데이터 200~300장으로 파인튜닝한다

소량의 데이터로 되는 이유도 Ch08에서 배운 그대로다 — 에지·형태 같은 저수준 특성은 이미 학습되어 있고, 여러분의 데이터는 “내 물체가 어떻게 생겼는지”만 가르치면 된다.


11.7 데이터셋 만들기: 라벨링

11.7.1 라벨이 곧 정답지다

탐지 모델의 학습 데이터는 이미지 + 라벨(박스 좌표와 클래스)의 쌍이다. 여러분이 그린 박스가 모델에게는 정답지이므로, 라벨 품질이 곧 모델 품질이다.

도구: makesense.ai — 브라우저에서 계정 없이 동작하고, 이미지가 서버로 업로드되지 않으며, YOLO 포맷으로 바로 내보낼 수 있다. 절차: 이미지 업로드 → 클래스 정의 → 박스 그리기 → Export (YOLO format).

11.7.2 YOLO 라벨 포맷 — 좌표 정규화

내보낸 라벨 파일의 한 줄은 이렇게 생겼다: 클래스번호 x_c y_c w h — 모두 이미지 크기로 나눈 0~1 값이다.

수치 예시: \(640 \times 480\) 이미지에서 모서리 표기 \((160, 120, 480, 360)\)인 박스는:

\[x_c = \frac{(160+480)/2}{640} = 0.5, \quad y_c = \frac{(120+360)/2}{480} = 0.5, \quad w = \frac{320}{640} = 0.5, \quad h = \frac{240}{480} = 0.5\]

→ 라벨: 0 0.5 0.5 0.5 0.5 (클래스 0이 이미지 정중앙에, 절반 크기로)

11.7.3 라벨 품질 체크리스트

  • 일관성: 팀원끼리 기준을 통일하라 — “박스를 물체에 딱 붙일 것인가, 여유를 둘 것인가”가 사람마다 다르면 모델이 혼란스러워한다. 킥오프 때 기준을 문서로 정하라
  • 빠짐없이: 프레임에 걸친 물체, 작게 보이는 물체도 라벨링할지 규칙을 정하라 — 라벨 안 된 진짜 물체는 모델에게 “이건 물체가 아니다”라고 가르치는 셈이 된다
  • 다양성: Ch05의 촬영 체크리스트(시점·거리·조명·배경)가 여기서 실전이 된다

11.8 팀 프로젝트 킥오프

이번 주 제출: 데이터 수집 계획서

팀(3~4인)을 구성하고 다음을 담은 계획서를 제출한다.

  1. 대상 사물과 클래스 (1~3개): 캠퍼스·일상에서 충분히 촬영 가능한 것 — 소화기, 표지판, 자전거, 학식 메뉴 등
  2. 촬영 계획: 장소, 시점·거리·조명·배경을 어떻게 다양화할 것인가 (Ch05 체크리스트 기준)
  3. 라벨링 기준: 박스를 어떻게 그릴지 팀 규칙
  4. 역할 분담과 일정: 11주차 중간점검(라벨링 완료 데이터셋 + 베이스라인)까지의 계획

금지 사항 재확인: 사람(얼굴·신체) 촬영 금지. 오픈데이터셋을 학습 데이터로 사용 금지.

실패해도 좋다 — 단, 분석하라

성능이 낮게 나오는 것은 감점 사유가 아니다. 왜 낮은지 모르는 것이 감점 사유다. “어두운 조명 사진에서 재현율이 떨어졌다 — 수집 데이터의 90%가 낮 사진이었기 때문” 같은 분석이 이 수업이 원하는 결과물이다. 오늘 배운 정밀도·재현율이 그 분석의 언어다.


11.9 핵심 요약

개념 핵심 내용
객체탐지 “어디에, 무엇이, 몇 개” — 출력이 {클래스, 박스, 신뢰도}의 가변 목록
바운딩 박스 모서리 \((x_1,y_1,x_2,y_2)\) ↔︎ 중심 \((x_c,y_c,w,h)\) 표기
IoU 교집합/합집합 — 겹침의 정도, 0.5가 관례적 인정 기준
NMS 신뢰도 최고 박스 채택 → IoU ≥ 임계값인 박스 제거 → 반복
정밀도/재현율 허탕을 줄이는가 / 놓침을 줄이는가 — 문제가 균형을 결정
YOLO 그리드 기반 동시 예측 → 순전파 1번으로 실시간 탐지
파인튜닝 Ch08 전이학습 그대로 — 사전학습 YOLO + 내 데이터 200~300장
라벨 품질 일관성·빠짐없음·다양성 — 라벨이 정답지, 라벨 품질 = 모델 품질

다음 장 예고: 이미지를 숫자로 바꾸는 데 성공했으니(Ch05), 이제 남은 큰 질문 — 컴퓨터는 글자를 어떻게 읽는가? 텍스트를 숫자로 바꾸는 여정이 시작된다.