이미지 분할: 의미 분할 · 인스턴스 분할 · U-Net
의미 · 인스턴스 · 파노픽 분할, 전치 합성곱 크기, FCN · U-Net · Mask R-CNN · SAM, IoU · Dice · PQ
먼저 알아야 할 것
다루는 내용
픽셀 단위로 이름표를 붙이는 이미지 분할을 다룹니다. 세 가지 분할 과제를 구분하고, PyTorch 식으로 전치 합성곱 출력 크기를 계산하며, FCN · U-Net(스킵 연결) · Mask R-CNN(마스크 가지) · SAM(프롬프트 분할)이 무엇을 바꿨는지 원 논문 기준으로 정리합니다. 4×4 픽셀 예로 픽셀 정확도 · IoU · mIoU · Dice를, 세그먼트 예로 PQ = SQ × RQ를 계산합니다.
해설
이미지 분할: 의미 분할 · 인스턴스 분할 · U-Net
검출이 물체를 네모 상자로 감싼다면, 분할은 픽셀 하나하나에 "이건 도로, 이건 사람"이라는 이름표를 붙입니다. 이 수업은 분할의 세 종류(의미 · 인스턴스 · 파노픽)를 구분하고, 해상도를 되살리는 전치 합성곱의 출력 크기를 계산하며, FCN · U-Net · Mask R-CNN · SAM이 각각 무엇을 바꿨는지 정리합니다. 평가 지표 IoU · Dice · PQ도 4×4 픽셀 예로 직접 계산합니다.
| 항목 | 내용 |
|---|---|
| 참고 자료 | D2L '의미 분할과 데이터셋' · '전치 합성곱' · '완전 합성곱 신경망' 절 · d2l.ai/chapter_computer-vision/semantic-segmentation-and-dataset.html, FCN · U-Net · Mask R-CNN · 파노픽 분할 · SAM 원 논문(arXiv), PyTorch ConvTranspose2d 문서 |
| 트랙 · 수준 | 딥러닝 기초 · 중급 |
| 이 수업의 범위 | 의미 · 인스턴스 · 파노픽 분할, 픽셀 단위 교차 엔트로피, 전치 합성곱, FCN, U-Net 인코더-디코더와 스킵 연결, Mask R-CNN, SAM, 픽셀 정확도 · IoU · mIoU · Dice · PQ |
| 먼저 알면 좋은 것 | 합성곱 · 패딩 · 스트라이드, 객체 검출(IoU · 상자), 전이 학습 |
들어가기 전에
- 객체 검출: 경계 상자 · IoU · NMS · mAP — IoU와 Faster R-CNN 구조를 알고 오면 Mask R-CNN이 바로 이해됩니다.
- 합성곱 신경망 기초 — 합성곱 출력 크기 계산(패딩 · 스트라이드)이 전치 합성곱 계산의 바탕입니다.
한눈에 보기
- 의미 분할 · 인스턴스 분할 · 파노픽 분할이 각각 무엇을 구분하는지 압니다.
- 분할 모델이 왜 "줄였다가 다시 키우는" 모양인지, 전치 합성곱의 출력 크기를 식으로 계산합니다.
- FCN(2014), U-Net(2015), Mask R-CNN(2017), SAM(2023)이 각자 어떤 문제를 풀었는지 정리합니다.
- 4×4 픽셀 예로 픽셀 정확도 · IoU · mIoU · Dice를, 세그먼트 4개 예로 PQ를 계산합니다.
1. 분할의 세 종류
직관(해설용 비유): 색칠 공부를 생각해 봅시다. 의미 분할은 "사람은 빨강, 길은 회색"처럼 종류별로 칠하기, 인스턴스 분할은 "사람 1은 빨강, 사람 2는 주황"처럼 같은 종류라도 한 명씩 따로 칠하기, 파노픽 분할은 둘을 합쳐 그림 전체를 빈틈없이 칠하기입니다.
| 과제 | 출력 | 같은 클래스의 두 물체 | 배경(하늘 · 도로) |
|---|---|---|---|
| 의미 분할(semantic) | 픽셀마다 클래스 | 구분 안 함 | 클래스로 칠함 |
| 인스턴스 분할(instance) | 물체마다 마스크 + 클래스 | 구분함 | 보통 다루지 않음 |
| 파노픽 분할(panoptic) | 픽셀마다 (클래스, 물체 번호) | 구분함 | 클래스로 칠함 |
파노픽 분할은 Kirillov 외(2018)가 셀 수 있는 물체(things)와 셀 수 없는 영역(stuff)을 한 과제로 묶으며 제안했고, 함께 PQ라는 지표를 내놓았습니다.
학습 손실: 의미 분할은 "픽셀마다 하는 분류"이므로 가장 흔한 손실은 픽셀마다 계산한 교차 엔트로피의 평균입니다. 물체가 작아 클래스 비율이 크게 기울면 클래스 가중치나 Dice 손실을 섞기도 합니다.
2. 줄였다가 다시 키우기: 전치 합성곱
직관: 분류용 CNN은 층을 지나며 해상도를 줄여 "무엇인가"를 압축합니다. 분할은 입력과 같은 크기의 지도를 내야 하니, 줄인 특징을 다시 키우는 길이 필요합니다. 전치 합성곱(transposed convolution)은 학습 가능한 "키우기" 연산입니다.
출력 크기 (PyTorch ConvTranspose2d 문서의 식, 팽창 1일 때):
| 기호 | 뜻 |
|---|---|
| 입력 높이 | |
| 스트라이드 — 몇 배로 키울지와 관련 | |
| 패딩 — 전치 합성곱에서는 출력 가장자리를 잘라내는 양 | |
| 커널 크기 | |
| output_padding | 크기를 1 맞추는 보정(기본 0) |
숫자로 해 보기(해설용, PyTorch로 확인): 입력 8×8에서
- : → 16×16 (정확히 2배)
- : → 15×15 (2배에서 1 모자람 — output_padding=1로 보정)
- : → 16×16
D2L의 FCN 절은 "커널 , 패딩 , 스트라이드 면 높이 · 너비가 정확히 배"라는 규칙을 씁니다. 실제로 32배 키우기에 커널 64, 패딩 16, 스트라이드 32를 쓰며, 높이 10인 특징 맵은 이 됩니다.
왜 그냥 보간하지 않나: 쌍선형 보간(bilinear interpolation)은 학습할 것이 없어 단순하지만 경계를 날카롭게 되살리지 못합니다. 전치 합성곱은 키우는 방법 자체를 학습합니다. D2L은 전치 합성곱을 쌍선형 보간 가중치로 초기화해, 보간에서 출발해 더 나은 키우기를 배우게 합니다. 실무에서는 "보간 후 일반 합성곱"도 자주 쓰는데, 전치 합성곱이 만들 수 있는 바둑판무늬 잡음(checkerboard artifact)을 피하려는 선택입니다.
3. FCN과 U-Net
FCN (Long · Shelhamer · Darrell, 2014)
핵심: 분류 CNN의 마지막 완전 연결층을 합성곱으로 바꿔, 어떤 크기의 입력이든 받아 같은 크기의 출력을 내게 했습니다. 깊고 거친 층의 의미 정보와 얕고 세밀한 층의 모양 정보를 합쳐 더 자세한 분할을 만들었습니다. 논문은 PASCAL VOC 2012에서 평균 IU 62.2%(이전 대비 20% 상대 향상)와 전형적인 이미지 한 장 추론 1/3초를 보고했습니다.
D2L의 FCN 구현은 ImageNet으로 사전학습한 ResNet-18에서 전역 평균 풀링과 완전 연결층을 떼고, 1×1 합성곱으로 채널을 VOC2012의 21개 클래스로 맞춘 뒤, 위의 전치 합성곱으로 32배 키웁니다.
U-Net (Ronneberger · Fischer · Brox, 2015)
직관: 지도를 접었다 펴는 대신, 접을 때 각 단계의 사진을 찍어 두었다가 펼 때 옆에 붙여 보는 방식입니다.
단계
- 수축 경로(contracting path): 합성곱 + 풀링을 반복해 해상도를 줄이며 문맥을 모읍니다.
- 확장 경로(expanding path): 업샘플링으로 해상도를 되살립니다.
- 스킵 연결(skip connection): 같은 해상도의 수축 경로 특징을 확장 경로에 이어 붙여(concatenate) 세밀한 위치 정보를 되돌려 줍니다.
- 마지막 1×1 합성곱으로 픽셀마다 클래스 점수를 냅니다.
숫자로 해 보기(해설용): 256×256 입력을 풀링 4번으로 줄이면 128 → 64 → 32 → 16입니다. 확장 경로는 16 → 32 → 64 → 128 → 256으로 되돌아가며, 매 단계 같은 크기(예: 64×64) 수축 특징을 채널 방향으로 붙입니다.
논문 초록은 이 구조를 "문맥을 잡는 수축 경로와 정밀한 위치를 가능하게 하는 대칭 확장 경로"로 설명하고, 적은 학습 이미지로도 강한 데이터 증강을 써서 끝에서 끝까지 학습할 수 있다고 말합니다. 전자현미경 신경 구조 분할(ISBI)에서 이전 최고 방법을 넘었고, 512×512 이미지 분할에 당시 GPU로 1초가 안 걸렸다고 보고합니다.
왜 더하기가 아니라 이어 붙이기인가: ResNet의 잔차 연결은 더하기라 채널 수가 같아야 하고 정보가 섞입니다. U-Net은 이어 붙여 두 정보를 그대로 둔 채 다음 합성곱이 어떻게 섞을지 배우게 합니다. 의료 영상처럼 경계 몇 픽셀이 중요한 곳에서 U-Net 계열이 오래 기본값으로 쓰이는 이유입니다. 확산 모델의 잡음 예측망도 U-Net 구조를 많이 씁니다.
flowchart LR
A[입력 이미지] --> B[수축 경로: 합성곱 + 풀링 반복]
B --> C[가장 작은 해상도: 문맥 정보]
C --> D[확장 경로: 업샘플링 · 전치 합성곱]
B -. 같은 해상도 특징 이어 붙이기 .-> D
D --> E[1×1 합성곱: 픽셀마다 클래스 점수]
E --> F[픽셀별 교차 엔트로피로 학습]
E --> G[argmax → 분할 지도]4. 인스턴스 분할과 Mask R-CNN, 그리고 SAM
Mask R-CNN (He · Gkioxari · Dollár · Girshick, 2017)
핵심: Faster R-CNN에 물체 마스크를 예측하는 가지를 하나 더 붙였습니다. 기존의 상자 인식 가지와 나란히, 제안 영역마다 작은 마스크를 냅니다. 논문은 Faster R-CNN에 비해 추가 부담이 작고 초당 5프레임으로 동작한다고 보고합니다.
왜 상자 먼저인가: "어떤 물체인가"는 상자 단계에서 정하고, 마스크 가지는 "상자 안에서 어느 픽셀이 그 물체인가"만 풀면 되니 문제가 쉬워집니다. 같은 클래스의 두 사람이 자연스럽게 서로 다른 마스크가 됩니다.
SAM: 무엇이든 분할 (Kirillov 외, 2023)
핵심: 점 · 상자 · 마스크 같은 프롬프트를 주면 해당 물체의 마스크를 돌려주는 모델입니다. 구성은 (1) MAE로 사전학습한 ViT 이미지 인코더, (2) 프롬프트 인코더, (3) 빠른 마스크 디코더입니다. 이미지 임베딩을 한 번 계산해 두면 프롬프트 인코더 + 디코더는 웹 브라우저 CPU에서 약 50ms로 돌아 대화형으로 쓸 수 있다고 논문은 적습니다.
- 모호함 처리: 점 하나는 "셔츠"일 수도 "사람 전체"일 수도 있습니다. SAM은 프롬프트 하나에 마스크 3개를 내고 각자 예상 IoU 점수로 순위를 매깁니다.
- 데이터: 저자들은 1,100만 장 이미지와 10억 개가 넘는 마스크로 된 SA-1B 데이터셋을 만들었습니다.
- 제로샷 전이: 프롬프트로 동작하도록 학습해, 새 이미지 분포와 과제에 추가 학습 없이 옮겨 쓸 수 있다고 보고합니다.
5. 분할 평가 지표
숫자로 해 보기(해설용): 4×4 이미지, 클래스 0(배경)과 1(물체)입니다.
정답 예측
0 0 1 1 0 1 1 1
0 1 1 1 0 1 1 0
0 1 1 0 0 1 1 0
0 0 0 0 0 0 0 0| 지표 | 식 | 계산 |
|---|---|---|
| 픽셀 정확도 | 맞힌 픽셀 / 전체 | |
| 클래스 1 IoU | 겹침 6, 합집합 8 → 0.75 | |
| 클래스 0 IoU | 같은 식 | 겹침 8, 합집합 10 → 0.80 |
| mIoU | 클래스별 IoU 평균 | |
| 클래스 1 Dice |
(값은 python으로 재확인했습니다.)
Dice와 IoU의 관계: Dice 입니다. IoU 0.75면 Dice 로 위 표와 맞습니다. 둘은 순서가 같아 어느 쪽으로 비교해도 순위는 같고, Dice가 늘 같거나 더 크게 나옵니다. 의료 영상 쪽은 Dice를, 일반 분할 벤치마크는 mIoU를 주로 보고합니다.
왜 픽셀 정확도만 보면 안 되나: 배경이 95%인 사진에서 "전부 배경"이라고 답해도 픽셀 정확도는 0.95입니다. 분류의 정확도 함정과 같은 이유로 클래스별 IoU를 봅니다.
PQ (파노픽 품질)
파노픽 분할 논문은 예측 세그먼트와 정답 세그먼트를 IoU 0.5 초과로 짝지으면(이 조건이면 짝이 유일하게 정해짐을 논문이 증명) TP, 짝 없는 예측은 FP, 짝 없는 정답은 FN으로 두고 다음을 계산합니다.
숫자로 해 보기(해설용): 짝지어진 세그먼트 2개의 IoU가 0.9와 0.7, FP 1개, FN 1개라면 SQ , RQ , PQ 입니다. SQ는 "맞힌 것의 모양이 얼마나 정확한가", RQ는 "얼마나 빠짐없이 · 헛것 없이 찾았나"(검출의 F1과 같은 꼴)입니다. 클래스마다 PQ를 계산해 평균합니다.
연습 문제
1. 입력 16×16에 커널 4, 스트라이드 2, 패딩 1인 전치 합성곱을 쓰면 출력 크기는?
풀이: → 32×32, 정확히 2배입니다.
2. 어떤 클래스의 IoU가 0.6입니다. Dice는?
풀이: 입니다.
3. 거리 사진에서 "자동차 3대를 각각 따로" 칠해야 하고 하늘 · 도로는 칠하지 않아도 됩니다. 어떤 과제인가요?
풀이: 인스턴스 분할입니다. 하늘 · 도로까지 모두 칠해야 하면 파노픽 분할입니다.
4. PQ 예에서 FP가 0개가 되면 PQ는?
풀이: 분모가 이므로 입니다.
스스로 점검
- U-Net의 스킵 연결이 없으면 무엇이 나빠지나요?
- 답: 가장 작은 해상도로 압축하며 잃은 세밀한 위치 정보를 되찾을 길이 없어, 경계가 흐릿하고 작은 구조가 사라집니다.
- Mask R-CNN은 Faster R-CNN에서 무엇을 더했나요?
- 답: 제안 영역마다 물체 마스크를 예측하는 가지를 상자 인식 가지와 나란히 더했습니다.
- SAM이 프롬프트 하나에 마스크를 여러 개 내는 이유는?
- 답: 점 하나가 부분 · 전체 등 여러 물체를 뜻할 수 있는 모호함 때문입니다. 3개를 내고 예상 IoU로 순위를 매깁니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 의미 분할(semantic segmentation) | 픽셀마다 클래스 이름표 붙이기 |
| 인스턴스 분할(instance segmentation) | 물체 하나하나를 따로 마스크로 구분 |
| 파노픽 분할(panoptic segmentation) | 물체 구분 + 배경 영역까지 빈틈없이 분할 |
| 마스크(mask) | 어떤 픽셀이 대상인지 표시한 0/1 지도 |
| 전치 합성곱(transposed convolution) | 해상도를 키우는 학습 가능한 연산 |
| 쌍선형 보간(bilinear interpolation) | 이웃 픽셀 값을 거리 비율로 섞어 키우는 방법 |
| FCN(fully convolutional network) | 완전 연결층 없이 합성곱만으로 된, 크기 자유 분할망 |
| 스킵 연결(skip connection) | 앞쪽 층 특징을 뒤쪽에 바로 전달하는 연결 |
| 인코더-디코더(encoder-decoder) | 줄이며 요약하는 부분 + 키우며 복원하는 부분 |
| mIoU | 클래스별 IoU 평균 |
| Dice 계수 | 겹침 × 2 ÷ (두 영역 크기 합) |
| PQ(panoptic quality) | 파노픽 분할 지표 = 분할 품질 SQ × 인식 품질 RQ |
| 프롬프트 분할(promptable segmentation) | 점 · 상자 등 지시를 받아 해당 물체를 분할 |
더 깊이 보려면
D2L 컴퓨터 비전 장의 '의미 분할과 데이터셋' → '전치 합성곱' → '완전 합성곱 신경망' 세 절을 차례로 보면 VOC2012 데이터 읽기부터 FCN 학습까지 코드로 따라갈 수 있습니다(입력은 320×480 무작위 자르기). 인스턴스 분할은 Mask R-CNN 논문, 파노픽 분할과 PQ는 Kirillov 외(2018), 프롬프트 분할은 SAM 논문이 출발점입니다.
다음에 볼 것
- 비전 트랜스포머 · CLIP · 멀티모달 모델 한 번에 보기 — SAM의 이미지 인코더이기도 한 ViT와, 이미지와 글을 잇는 CLIP을 봅니다.
- 직접 해 보기: PyTorch로 합성곱 신경망 학습하기 — 지금까지 본 CNN을 직접 학습 루프로 돌려 봅니다.
라이선스
이 글은 원문 번역이 아니라 KAITABASE가 직접 쓴 해설이며, 숫자 예는 설명용입니다(전치 합성곱 크기는 PyTorch로, 지표는 python으로 재확인). 참고 자료 D2L은 CC BY-SA 4.0입니다. 논문 수치는 각 arXiv 초록 · 본문에서 확인한 것만 옮겼습니다.
출처
- 참고: d2l.ai/chapter_computer-vision/semantic-s… (D2L 의미 분할)
- 참고: d2l.ai/chapter_computer-vision/fcn.html (D2L FCN — ResNet-18, 1×1 합성곱 21클래스, 커널 64 · 패딩 16 · 스트라이드 32, 쌍선형 초기화)
- 참고: docs.pytorch.org/docs/2.14/generated/torc… (전치 합성곱 출력 크기 식)
- 원문: arxiv.org/abs/1411.4038 (2014 · Jonathan Long 외, FCN)
- 원문: arxiv.org/abs/1505.04597 (2015 · Olaf Ronneberger 외, U-Net)
- 원문: arxiv.org/abs/1703.06870 (2017 · Kaiming He 외, Mask R-CNN)
- 원문: arxiv.org/abs/1801.00868 (2018 · Alexander Kirillov 외, 파노픽 분할 · PQ)
- 원문: arxiv.org/abs/2304.02643 (2023 · Alexander Kirillov 외, Segment Anything)
AI 원리부터 이해하기 · 딥러닝 기초 모듈
딥러닝 기초 모듈 학습
이 글은 딥러닝 기초 모듈의 학습 자료입니다. 전체 29개 자료 중 22번째입니다.
출처·원문
원문 보기요약만