14장. 비전의 과제들
이 장의 질문: "무엇이 있나"를 넘어 "어디에, 정확히 어떤 픽셀에"까지 답하려면 무엇이 달라져야 하는가? 탐지·분할의 원리, 그리고 합성곱 없이 보는 ViT까지 — 시각 과제의 지형도를 그린다.
전제: 13장(CNN, 특징 맵, 전이학습).
과제의 사다리
시각 과제는 요구하는 답의 정밀도에 따라 사다리를 이룬다.
| 과제 | 질문 | 출력 |
|---|---|---|
| 분류 | 무엇이 있나? | 클래스 하나 |
| 탐지(detection) | 무엇이 어디에 있나? | 상자들 + 클래스들 |
| 분할(segmentation) | 어떤 픽셀이 무엇인가? | 픽셀마다 클래스 |
위로 갈수록 출력이 풍부해지고, 레이블 비용도 정확히 그만큼 비싸진다(사진에 "고양이" 한 단어 vs 픽셀 단위 칠하기). 반가운 소식은 셋 모두 같은 몸통을 공유한다는 것 — 13장의 CNN(또는 이 장 끝의 ViT)이 만든 특징 맵 위에, 과제별 "머리"를 얹는 구조다. 전이학습이 모든 과제에 통하는 이유이기도 하다.
탐지: 상자를 배우다
탐지의 출력은 상자(box) 목록이다 — 각 상자는 위치(좌표 4개), 클래스, 확신도를 가진다. 두 가지 근본 문제를 해결해야 한다.
문제 1: 상자 개수를 미리 모른다. 사진에 자동차가 0대일 수도 30대일 수도 있다. 신경망의 출력 크기는 고정인데 어쩌나. 표준 해법은 발상의 전환이다 — 후보 상자를 화면 가득 깔아 두고, 각 후보에 대해 "여기 물체가 있는가"를 분류 문제로 풀게 한다. 특징 맵의 각 위치마다 몇 가지 모양의 기준 상자를 붙이고, 각 기준 상자에 대해 (물체 여부, 클래스, 좌표 보정값)을 예측한다. 가변 개수 문제가 "수만 개의 고정된 분류+회귀 문제"로 바뀌었다.
문제 2: 같은 물체에 상자가 수십 개 겹쳐 나온다. 후보를 가득 깔았으니 당연한 부작용이다. 후처리로 정리한다 — NMS(비최대 억제): 확신도가 가장 높은 상자를 채택하고, 그것과 많이 겹치는 나머지 후보를 지우고, 반복. "겹침"의 잣대는 IoU(교집합/합집합 넓이 비율, 0~1)다. IoU는 탐지 평가에서도 "맞았다"의 기준(보통 IoU ≥ 0.5)으로 쓰이는, 이 동네의 미터법이다.
계보는 두 갈래였다. 후보 영역을 추린 뒤 정밀 분류하는 2단계(R-CNN 계열 — 정확하지만 느림)와, 한 번의 순전파로 전 화면의 상자를 쏟아내는 1단계(YOLO 계열 — 빠름). 하드웨어와 기법의 발전으로 1단계가 정확도까지 따라잡아, 실무의 기본 선택은 YOLO 계열이 되었다. 상세 구조 암기는 불필요하다 — "후보를 깔고, 분류·보정하고, NMS로 정리한다"는 뼈대와, IoU/NMS를 직접 구현해 보는 경험(코드랩 05)이면 실전에 충분하다.
분할: 픽셀마다 답하다
분할은 출력이 입력과 같은 크기의 클래스 지도다. 13장의 CNN은 공간을 계속 줄이며 "어디"를 지워 왔는데, 이제는 어디가 답 그 자체다. 모순을 어떻게 푸나.
표준 답이 U-Net 구조다. 전반부(인코더)는 여느 CNN처럼 공간을 줄이며 "무엇이 있는지"를 파악한다. 후반부(디코더)는 거꾸로 공간을 키우며(업샘플링) 픽셀 지도를 복원한다. 그리고 결정적 장치 — 스킵 연결: 인코더의 각 해상도 특징 맵을, 디코더의 같은 해상도 지점에 직접 이어 붙인다. 디코더는 "무엇"(깊은 층의 추상 정보)과 "정확히 어디"(얕은 층의 위치 정보)를 모두 손에 쥐고 경계를 그린다. 스킵 연결을 빼면 물체는 맞추되 경계가 뭉개진 그림이 나온다 — 잔차 연결(11장)과 형제뻘인, "정보의 지름길"이라는 같은 사상이다.
손실은 픽셀마다의 교차 엔트로피(5장)가 기본인데, 함정이 하나 있다 — 배경 픽셀이 95%인 사진에서는 "전부 배경"이라고 답해도 픽셀 정확도 95%다(8장의 불균형 문제가 픽셀 단위로 재림!). 그래서 겹침 비율 기반 손실(Dice — 예측 영역과 정답 영역의 겹침을 직접 최대화)을 함께 쓰고, 평가는 클래스별 IoU로 한다. 코드랩 04에서 U-Net을 밑바닥부터 짓는다.
합성곱 없이 보기: Vision Transformer
2020년, 도발적인 실험이 나왔다. 13장에서 그토록 공들여 설명한 시각의 귀납 편향(지역성, 위치 무관성)을 전부 버리고, 언어 모델용 구조(Transformer — 18장에서 완전 해부한다)에 이미지를 넣은 것이다. 방법은 단순하다: 이미지를 16×16 조각(패치)들로 잘라 각 패치를 벡터로 만들고, 그 벡터 열을 "단어들의 문장"처럼 취급한다. 이것이 ViT(Vision Transformer)다.
결과는 교훈적이었다. 중간 규모 데이터에서는 CNN이 이긴다 — 편향을 버렸으니 "가까운 픽셀이 관련 깊다"조차 데이터에서 배워야 하고, 그만한 데이터가 없으면 배우지 못한다. 그러나 데이터가 수억 장 규모로 커지면 ViT가 역전한다 — 편향은 데이터가 부족할 때의 보조 바퀴였고, 데이터가 충분하면 오히려 제약이 된다. 4장의 편향-분산 이야기가 아키텍처 수준에서 재연된 것이다.
귀납 편향과 데이터 양은 교환 관계다. 데이터가 적으면 상식을 구조에 새겨라. 데이터가 넘치면 구조를 비우고 데이터가 말하게 하라.
이 원칙은 이 책에서 가장 일반적인 교훈 중 하나다. 실무 감각으로는: 대규모 사전학습된 ViT를 전이학습으로 쓰는 것은 언제나 훌륭한 선택이고(사전학습이 데이터 문제를 대신 해결해 줬으므로), 내 데이터 수천 장으로 밑바닥부터 학습한다면 여전히 CNN이 안전하다. 코드랩 06에서 ViT를 직접 만들어 이 트레이드오프를 실험한다.
지형도와 실무 나침반
시각 과제를 만났을 때의 사고 순서를 정리해 두자.
- 출력이 무엇인지부터 정의한다 — 클래스 하나? 상자? 픽셀 지도? (과제의 사다리에서 위치 결정. 레이블 비용도 여기서 결정된다.)
- 사전학습 몸통을 빌린다 — 밑바닥 학습은 최후의 수단이다(13장).
- 과제별 표준 머리를 얹는다 — 분류는 선형 층, 탐지는 YOLO 계열, 분할은 U-Net 계열.
- 평가는 과제의 미터법으로 — 분류는 8장의 지표들, 탐지는 IoU 기반 mAP, 분할은 클래스별 IoU. 그리고 언제나 틀린 사례 눈검사(8장).
시각 과제는 이 밖에도 있다 — 자세 추정, 깊이 추정, 이미지 생성(6부에서!), 이미지-텍스트 결합(멀티모달 — 24장 근처에서 만난다). 그러나 전부 같은 문법 위에 있다: 공유 몸통이 만든 표현 + 과제별 머리 + 과제에 맞는 손실. 이 문법을 읽을 줄 알면 처음 보는 과제의 논문도 구조가 보인다.
핵심 요약
- 시각 과제는 출력 정밀도의 사다리(분류→탐지→분할)이며, 모두 공유 몸통 + 과제별 머리 구조다.
- 탐지: 후보 상자를 가득 깔아 가변 개수 문제를 분류+보정 문제로 바꾸고, NMS로 중복을 정리한다. IoU가 겹침과 정답 판정의 미터법.
- 분할: 인코더(무엇)-디코더(어디) + 스킵 연결(위치 정보의 지름길) = U-Net. 픽셀 불균형 때문에 Dice류 손실과 IoU 평가를 쓴다.
- ViT: 이미지를 패치 문장으로 취급. 귀납 편향 ↔ 데이터 양의 교환 관계를 보여주는 대표 사례 — 데이터가 적으면 구조에 상식을, 많으면 데이터에 발언권을.
스스로 점검
- 상자 A(0,0)~(10,10)과 상자 B(5,5)~(15,15)의 IoU를 계산해 보라. (교집합과 합집합의 넓이부터.)
- NMS가 없으면 탐지 출력이 어떤 모양이 되는지, 왜 그런 출력이 필연인지 설명해 보라.
- U-Net의 스킵 연결이 없을 때 "물체는 맞추되 경계가 뭉개지는" 이유를 인코더가 버린 정보의 관점에서 설명해 보라.
- 사내 데이터 5천 장으로 제품 결함 분할 모델을 만든다. CNN 기반 U-Net과 밑바닥 ViT 중 무엇을 고르겠는가? 근거는?
다음 장에서
눈을 만들었으니 귀를 만들 차례다. 소리는 1차원 파동일 뿐인데 어떻게 신경망의 입력이 되는가 — 그리고 놀랍게도, 적절한 변환 하나를 거치면 소리가 사실상 "이미지"가 되어 13장의 도구가 그대로 통한다는 것을 보게 된다.