Semantic segmentation¶
✅ Semantic segmentation architectures¶
1️⃣ Fully Convolutional Networks(FCN)¶
- end-to-end architecture
- input size에 상관없이 input size에 맞게 output을 출력해 낼 수 있다.
📌 Fully connected vs Fully convolutional¶
- Fully Connected layer: Output은 고정된 차원의 vector를 가지고 공간의 정보는 없어진다.
- Fully Convolutional layer: 공간 좌표가있는 분류 맵을 출력한다.
만약 Fully-connected로 분류를 하게 된다면 위와 같이 모든 feature map에 대해서 Flattening을 진행하여 하나의 벡터 값을 가지고 오게 된다. 이러면 각각의 feature map에 대한 정보를 고려하기 힘들다.
전에 방법을 좀 더 확장해서 각 feature들의 정보를 살리고 싶다면 채널 축으로 각각의 벡터를 만들어서 Fully-connected layer를 통과 시키면 된다. 이 방법은 1x1 convolution layer를 지나는 것과 완전 같은 기능을 수행한다고 볼 수 있다. 따라서 Fully-connected layer을 convolutional layer로 대체할 수 있다.
❗ 문제점¶
이제 우리는 1x1 convolution layer를 통해서 모든 feature map에 대한 정보를 얻었다.
✅ 하지만 여기서 문제는 Predicted score map이 매우 작은 해상도를 가지게 된다.
Why?
- 큰 receptive field를 가지는 것이 더 좋은 성능을 기대 할 수 있다.
- 큰 receptive field를 가지기 위해서 여러개의 공간 pooling layers가 배치 된다.
- pooling layers를 거치게 되면 그 만큼 image의 size가 줄어들게 된다.
이를 해결 하기 위해서 Upsamplig을 진행한다.
📌 Upsampling¶
학습이 진행 되면서 입력 이미지의 크기가 더 작은 feature map으로 축소가 진행이 된다. 마지막 단에서 입력 이미지의 크기로 Upsampling을 진행 한다.
Upsampling은 작은 acrivation map을 입력 이미지 크기로 재조정하는데 사용한다.
- Unpooling
- Transposed Convolution
- Upsample and Convolution
여기서 Unpooling은 잘 사용하지 않아 아래 2가지 경우에 대해서만 살펴 보자.
📌 Transposed Convolution¶
위 그림을 보면 새로운 필터를 거쳐서 더 큰 영역으로 확장이 일어나게 된다. 다시 자세히 보게 되면 아래와 같이 진행이 된다.
위 처럼 진행하게 되면 계속해서 겹치는 부분(az+bx)이 생기게 된다. 먼저 kernel size와 stride size를 잘 조정해서 겹치는 부분이 없게 튜닝을 해줘야 한다.
Upsampling을 위한 더 나은 접근
- 먼저 transposed convolution에서 겹치는 문제를 피해야 한다.
- spatial upsampling과 feature convolution으로 분해 한다.
- {Nearest-neighbor NN , Bilinear} interpolation을 진행 한 후 convolution을 진행한다.
📌 다시 전체적인 과정을 살펴보게 되면
각 layer 별로 살펴보게 되면,
- 낮은 layer쪽은 receptive field size가 작기 때문에 국지적인이고 작은 차이에 민감하게 보게 된다.
- 높은 layer쪽에서는 해상도는 꽤 낮아 지지만 큰 receptive field를 가지고 영상에서 전반적이고 의미론적인 정보를 많이 포함 한다.
❗ 하지만 Semantic Segmentaion에서는 이 둘 모두의 정보가 필요하다.
📌 이 두 특징을 모두 확보하기 위해서¶
- 높은 layer에서 activation map을 Upsampling을 통해서 더 높은 해상도를 가진다.
- 동시에 중간 단계의 activation map을 가지고 온다.
- 이것들을 concat을 해서 최종 출력을 만들게 된다.
결과를 보게 되면 중간의 activation map을 활용한 것이 더 정확하게 나온 것을 확인 할 수 있다.
2️⃣ Hypercolumns for object segmentation¶
- 낮은 layer와 높은 layer의 해상도를 맞춰 놓고 합쳐서 쓰는 법을 제시
- 최종 architecture를 보면 FCN과 많이 유사하다.
- 차이점은 end-to-end가 아니고 각각의 bounding box를 추출하여 적용한다.
3️⃣ U-Net¶
- fully convolutional networks 사용
- 낮은 층의 feature와 높은 층의 feature을 더욱 잘 결합하는 방법을 제시했다.
- skip connections을 통해서 제시
- 이로 인해서 FCN보다 더 정교한 결과물을 볼 수 있었다.
📌 Overall architecture¶
📌 Contracting Path
- 3x3 convolutions 적용
- 더 큰 receptive field 가지기 위해서 해상도를 반으로 낮춘다.
- 대신 feature channels의 수를 2배로 증가 시킨다.
- 전체적인 맥락을 얻는데 사용한다.
- 여기까지는 이전의 일반적인 CNN과 동일하다.
📌 Expanding Path¶
- 2x2 convolution를 적용한다.
- feature channels의 수를 점차적으로 반씩 줄이고 해상도는 점차 늘린다.
- 여기서 주목할 점은 contracting path에서 오는 feature maps과 concat을 진행하고 size도 같게 맞춰준다.
- 이는 낮은 층에 있는 activation map을 합쳐서 고려할 수 있도록 설계한 것이다.
🔎 전체 요약¶
❗ 주의 사항¶
feature map의 spatial size가 홀수 이면 어떻게 될까?
만약 입력이 7x7로 들어 왔다면 Downsampling하면 3x3이 될것이고 다시 Upsampling을 하게 되면 6x6이 되어 원래 입력하고 해상도 차이가 나게 된다. 입력 영상을 넣어 줄때 중간에 어떤 layer에서도 홀수 해상도가 나오지 않게 유의 해야한다.
4️⃣ DeepLab¶
📌 Conditional Random Fields(CRFS)¶
- 후처리 방식
📌 Dilated convolution¶
- 커널 요소 사이에 공백을 삽입하여 커널을 팽창시킨다.(Dilation factor)
- 이렇게 하면 같은 파라미터의 수를 가지고 더 큰 receptive field를 가지는 효과이다.
📌 Depthwise separable convolution(proposed by Howard et al.)¶
- 원래는 왼쪽 그림과 같은 연산이 진행된다.
- 이 연산을 오른쪽 처럼 쪼개서 진행하게 되면 같은 정보를 가지고 있지만 더 적은 파라미터를 사용하게 된다.
📌 전체적인 구조¶
'AI > 이론' 카테고리의 다른 글
Instance segmentation (0) | 2021.03.11 |
---|---|
Conditional generative model (0) | 2021.03.11 |
torch.autograd (0) | 2021.03.10 |
Object Detection (0) | 2021.03.10 |
Image classification II (0) | 2021.03.09 |
Annotation data efficient learning (2) | 2021.03.08 |
Image classification I (0) | 2021.03.08 |
그래프 신경망이란 무엇일까? (심화) (0) | 2021.02.26 |