일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- Algorithm
- computer vision
- SQLD
- Baekjoon
- RNN
- Multi-Head Attention
- Machine Learning
- CNN
- assignment1
- do it! 알고리즘 코딩테스트: c++편
- marchine learning
- Generative Models
- assignment2
- Optimization
- 밑바닥부터 시작하는 딥러닝2
- Regularization
- Adam
- Python
- cs231n
- Alexnet
- C++
- CPP
- Transformer
- BFS
- 밑바닥부터 시작하는 딥러닝
- deep learning
- DFS
- mask r-cnn
- 딥러닝
- dropout
- Today
- Total
newhaneul
[Seoul National Univ: Computer Vision] Lecture 15. Image Segmentation 본문
[Seoul National Univ: Computer Vision] Lecture 15. Image Segmentation
뉴하늘 2025. 6. 12. 21:42본 포스팅은 서울대학교 이준석 교수님의 M3224.000100 Machine Learning for Visual Understanding을 수강하고 공부한 내용을 정리하기 위한 포스팅입니다.
https://youtu.be/QtzaSZdmUrg?si=w5JvUazBk4bMdiMk
Computer Vision Tasks
Semantic Segmentations with CNNs
Semantic Segmentation: Applications
First Ideas for Semantic Segmentation
Semantic Segmentation의 가장 단순한 아이디어는 Input image를 작은 patch단위로 분리하고 그 patch의 중심 pixel에 대해서 CNN을 진행시킨뒤 classification 하는 것이다. 하지만 이렇게 단순한 방법은 비효율적이다.
또한 training 과정에서는 전체 pixel이 아닌 patch의 중심 pixel만 보고 classification 하지만, prediction 과정에서는 모든 pixel에 대해 classification을 해야하므로 많은 비용이 들게 된다.
이러한 단순한 방법보다는 전체 image에 대해 CNN을 진행하여 feature를 뽑은 뒤 효율적이게 semantic segmentation을 진행하는 방법이 있다. 하지만 semantic segmentation의 경우에는 input size와 output size가 동일해야 한다. 그런데 CNN을 거치고 얻은 feature map의 size는 깊은 네트워크일수록 점점 줄어들기 때문에 output size가 작아지는 문제가 있다.
위의 문제를 해결하는 방법으로 conv layer의 output을 input size로 유지시키는 방법을 사용해볼 수 있을 것이다. 적절하게 padding과 stride, kernel size를 사용하면 conv layer의 output size를 input size와 동일하게 유지시킬 수 있다.
- 입력:
- 크기가 H×W×3H인 컬러 이미지가 입력된다.
- Conv Layer들:
- 중간 단계에서 H×W×F 형태의 feature map을 생성한다.
- 여기서도 size 감소 없이 padding과 stride 조절을 통해 입력 크기를 유지한다.
- 출력 Score Map:
- 최종적으로 각 픽셀에 대해 C개의 클래스 score를 가지는 H×W×C 크기의 텐서가 나온다.
- argmax를 통해 pixel-wise class 선택:
- 각 위치에서 가장 높은 class score를 갖는 index를 선택하여 H×W 크기의 예측 결과를 생성한다.
하지만 Downsampling이 없기 때문에 각 conv layer의 feature map size가 HxW를 유지하게 된다. 따라서 연산량이 매우 크며, backpropagation 시 early layer까지의 gradient 전달 비용이 매우 크다.
Deconvolution Networks
아래 슬라이드는 Downsampling과 Upsampling을 함께 사용하는 Fully Convolutional Network 구조를 나타낸다.
Downsampling 단계(Encoder)
- Conv + Pooling 등을 통해 feature map의 spatial resolution을 점점 줄인다.
Upsampling 단계(Decoder)
- Upsampling(deconvolution, transposed convolution 등)을 사용하여 해상도를 복원한다.
- 중간 중간 decoder에서 encoder의 feature map을 skip connection으로 이어주는 경우도 많다.
이 네트워크 구조는 중간 단계에서 resolution을 줄여 계산량을 감소시키고, output resolution을 유지하는 특징이 있다.
Deconvolution Networks: Upsampling
Upsampling에서는 작아진 feature map의 resolution를 증가시켜 더 큰 크기로 복원하는 것이 목적이다.
- Nearest Neighbor: 각 픽셀 값을 주변 영역으로 복사해서 채운다.
- Bed of Nails: 각 값을 고정된 위치에 두고 나머지는 0으로 채운다.
Deconvolution Networks: Learnable Upsampling
Deconvolution(= Transposed Convolution)은 학습가능한 Upsampling 기법이다. 일반적인 convolution이 feature map의 공간 크기를 줄이는 데 반해, transpose convolution은 공간 크기를 키우는 연산이다.
1. 입력의 각 값에 필터를 곱한다.
2. 그 결과를 stride 간격으로 출력 공간에 펼쳐(stamp) 놓는다.
3. 겹치는 부분은 합산된다.
수학적 관점으로 deconvolution은 transpose convolution이라고도 불린다. 일반 convolution은 다음과 같이 표현된다.
여기서 X는 convolution을 수행하는 행렬을 의미한다. transpose convolution은 위 연산의 전치 연산을 수행한다.
Deconvolution Networks
downsampling → bottleneck → upsampling 구조로, convolution network에서는 conv + ReLU → Max Pooling을 반복하여 feature map의 해상도를 점점 줄인다. 마지막엔 1x1 convolution으로 feature map을 축소해 bottleneck vector를 만든다.
deconvolution network에서는 각 단계에서 unpooling 연산을 사용하여 해상도를 점차 복원한다. 이때 unpooling은 보통 max pooling의 위치 정보를 기억해 두었다가 그 위치에 다시 값을 복원하는 방식으로 동작한다. 마지막에 원본 이미지 크기와 동일한 output map을 생성하여 pixel-wise segmentation 수행한다.
1. U-Net(2015)
U-Net은 encoder-decoder 기반의 fully convolutional network이다. 생김새가 U자 형태로 생겨서 U-Net으로 불린다.
U-Net: Architecture
1. U-Net Encoder(contracting path)
- Conv → ReLU → MaxPooling(Downsampling)
- resolution은 줄이되, semantic 정보를 추출
- 각 단계마다 feature channel 증가
2. U-Net Decoder(expanding path)
- Upsampling (Transpose Convolution) → Conv → ReLUS
- resolution을 점차 복원하며 원본 크기로 되돌린다.
- 각 단계에서 encoder에서 나온 같은 resolution의 feature map을 skip connection으로 이어붙인다.
3. Skip Connection
- Encoder에서 얻은 feature map을 Decoder로 concatenation하여 전달
- low-level feature와 high-level feature를 함께 사용하게 해줘서, 더 정확한 위치 정보 복원이 가능해진다.
U-Net: Detailed Ideas
U-Net과 같은 네트워크는 contracting path(encoder)에서 pooling 연산을 반복적으로 사용하기 때문에 output은 input보다 작아지는 현상이 발생한다. 따라서 실제로 예측하고자 하는 영역(output)을 정확히 얻기 위해서는 더 큰 입력 이미지가 필요하다. 이 문제를 U-Net에서는 zero padding이 아닌 mirror extrapolation을 사용한다.
1. Mirror extrapolation
- 경계 주변에서 부족한 context를 채우기 위해 입력을 거울처럼 반사해서 확장한다.
- zero-padding보다 자연스러운 경계 보존이 가능하다.
2. Overlap-tile strategy
- 전체 이미지를 작은 타일로 나누되, 이 타일들이 겹치게하여 segmentation을 수행한다.
- 각 타일에서 완전한 context를 가진 영역만 출력으로 사용
- 이후 타일별 출력 결과를 seamless하게 이어붙여 전체 이미지에 대한 segmentation 결과를 구성한다.
U-Net: Loss Function
1. Pixel-wise Cross-Entropy
- 각 pixel마다 softmax 확률 분포를 계산하고, 그 pixel이 정답 class일 확률의 log를 취한다.
- 전체 pixel에 대해 평균을 낸다.
2. Weighted Cross-Entropy
- 경계에 있는 pixel은 더 중요한 정보이지만 전체 image에서는 비중이 작기 때문에 무시될 수 있다.
- 이를 방지하기 위해 픽셀마다 가중치 w(x)를 곱해서 loss에 반영한다.
이 식은 object간 경계 부근에서 weight가 크고, 그 외부로 갈수록 weight가 작아지는 가우시안 형태의 weight map을 구성한다.
- w_c(x): 각 class의 class balancing을 위한 기본 가중치
- d(x): pixel x에서 가장 가까운 두 개의 object 경계까지의 거리
- w_0, : hyperparameter
2. Semantic Segmantation with Transformers: SEgmentation TRansformer(SETR, 2020)
SETR은 ViT 구조를 확장하여 pixel 단위 예측이 가능한 Decoder를 추가하여 semantic segmantation task에 적용한 모델이다. 제안한 Decoder는 총 3개(Navie, Progressive UPsampling, Multi-Level feature Aggregation)이다.
SETR: Encoder
- 입력 이미지를 16x16 patch로 분할
- 각 patch를 linear projection 하여 C-dim 1D embedding 생성
- position embedding 추가
- 24번의 transformer layer를 통해 모든 patch 간 전역적 관계를 모델링
SETR: Decoder: Naive
- transformer의 출력 feature z를 사용하여 각 patch 위치에 대해 k-dim(class) vector로 projection
- 이후 2개의 1x1 conv layer를 통과하여 원래 이미지 해상도로 upsampling
- pixel-wise classification하고 pixel-wise cross entropy 사용
Transformer encoder로부터 얻은 출력 Z의 shape은 다음과 같다.
Decoder는 이 feature를 각 patch마다 K개의 class score로 변환해야 하므로, 보통 linear layer 또는 1x1 convolution을 적용한다.
즉, 각 patch에 대해 K개의 class score가 할당되며, 이제 pixel-wise classification을 사용할 수 있다. 이 NxK 형태의 feature map은 H/P x W/P x K 형태로 reshape되고 이후 upsampling을 통해 원래 이미지 크기 HxWxK로 확장된다.
SETR: Decoder: Progressive UPsampling(PUP)
- Transformer의 output z를 입력으로 받아 Conv → Upsampling → Conv → Upsampling을 반복하여 점차적으로 해상도를 증가시킨다.
- 기존의 Naive Decoder는 한번에 해상도를 올렸지만, PUP에서는 점진적으로 복원되기 때문에 계층적인 의미 정보와 위치 정보 보존에 효과적이다.
SETR: Decoder: Multi-Level feature Aggregation(MLA)
- Transformer의 여러 중간 layer(ex: 6, 12, 18, 24 layer)에서 feature를 추출하는 방식이다.
- 이 feature들은 모두 동일한 spatial resolution을 가지므로, reshape → conv → concatenation → Upsampling을 수행한다.
3. Semantic Segmantation with Transformers: Segmenter(2021)
Segmenter: Encoder
- ViT와 동일
- 총 L개의 Transformer layer로 구성된 ViT encoder를 통과시키고 얻은 output z_L은 semantic representation을 담고 있다.
Segmenter: Decoder
- Transformer encoder의 출력 z_L에 K개의 learnable class embedding [cls]를 concat한다.
- 총 M개의 Transformer layer로 구성된 Mask Transformer에 위 입력을 넣는다. 여기서 앞의 N개는 patch embedding, 뒤의 K개는 class embedding이다.
- 각 class sembedding과 각 patch embedding 간 dot-product 수행. 즉, 각 patch가 각 class에 속할 확률처럼 해석 가능한 class mask 생성
- class mask s를 2D 공간(patch gride) 형태로 reshape한 뒤 원래 이미지 크기 HxW로 복원한다.
Segmenter: Experiments
Transformer encoder의 input으로 넣는 path size를 작게 줄일수록 더 섬세한 semantic segmantation이 가능해진다. 하지만 그만큼 patch size를 줄였기 때문에 연산량이 크게 늘어나게 된다.
4. Semantic Segmantation with Transformers: Dense Prediction Transformer(DPT, 2021)
Semantic Segmantation with Transformers: Further Reading
Instance Segmentation
Instance Segmentation은 object detection과 semantic segmentation을 결합한 computer vision task에 해당한다. Object Detection처럼 이미지 내의 각 객체(instance)를 탐지(bounding box)하고, Semantic Segmentation처럼 픽셀 단위로 객체의 형태를 예측한다. → 즉, 동일한 클래스에 속한 객체라도 개별적으로 구분하여 segmentation을 수행한다.
5. Instance Segmentation: Mask R-CNN(Mask Regions with CNN features, 2017)
Mask R-CNN은 RoIAlign 연산을 사용하여 기존 RoI Pooling의 한계를 극복한 모델이다.
(1) RoI Pooling
- Region proposal을 고정된 크기의 cell로 분할한 뒤 max pooling을 수행(정수 grid에 강제 정렬)
- 이 과정에서 소숫점 좌표의 위치 정보가 손실된다.
(2) RoIAlign
- RoIAlign은 정수 좌표로 강제하지 않고, 정확한 부동소수점 위치에서 feature 값을 얻는다.
- 각 cell의 sampling 위치를 부동소수점으로 유지하고, 그 위치의 값을 bilinear interpolation으로 계산한다.
Bilinear Interpolation 동작 방식은 아래와 같다.
Mask R-CNN: Mask Prediction Network
1. Backbone(Feature Extractor)
- ResNet의 conv4까지 feature map 추출
2. Region Proposal Network(RPN)
- 입력 이미지에서 object 후보 영역(Region of Interest, RoI)을 생성
- feature map 상의 여러 anchor box를 통해 다양한 위치의 객체 후보를 예측
- 예측된 RoI들은 NMS(Non-Maximum Suppression)를 통해 정제됨
3. RoIAlign
- 각 RoI를 feature map 상에 정확히 대응시키고, bilinear interpolation을 사용해 sub-pixel 단위에서 feature 추출
- 이 과정을 통해 고정 크기(14x14)로 정규화됨
(1) Bounding Box Head(Classification & Regression)
- RoIAlign output → conv5 → avg pooling → 2048-dim vector
- object class 예측
- bounding box 좌표 보정
(2) Mask Head(Segmentation)
- RoIAlign output → conv layer + upsampling (deconv) → 14x14xC(C: class 개수)
- 픽셀 단위의 binary mask를 class 별로 예측(Per-class Mask)
Mask R-CNN: Loss Function
Mask R-CNN의 Loss는 Faster R-CNN의 classification + bounding box regression loss에 더해, instance segmentation을 위한 mask prediction loss가 추가된 형태이다.