Computer Vision - Sementic Segmentation
09 Sep 2021 | Deep LearningSementic Segmentation
영상을 픽셀 단위로 인식하는 것
의료 영상이나 자율주행 분야에서 많이 쓰이며, 스노우와 같은 이미지 합성 툴에도 사용된다.
FCN
첫번째 End-to-End 시맨틱 세그멘테이션 네트워크이다.
영상인식분야에서 많이 쓰이는 Fully Connected Layer에 비해, Fully Convolution Layer는 입력과 출력 모두 1x1 Conv 형태의 Tensor 로 구현된다.
사실 크게 다른것은 아니고, Connected Layer는 채널을 축으로 모두 더한 것이고, Convolution Layer는 채널축마다 슬라이딩 윈도우 방식으로 flatten을 시켜줘 하나의 Conv 레이어를 만들어주는 것이다.
결론적으로 FC Layer를 Fully Convolution Layer를 대체함으로써 어떤 입력 사이즈에도 대응 가능한 Sementic Segmentation 모델을 만들 수 있는 것이다.
다만 이런 방식을 거치면서 필연적으로 해상도가 매우 낮아지게 된다.
Upsampling
그런 문제를 제거하기 위하여 다시 사이즈 크기를 키우게된다.
- Transposed Convolution: 지정된 필터로 stride를 늘린 conv 레이어를 통해 upsampling 한다. 다만 겹쳐지는 부분은 적절하게 가중치를 조절하여 합성해준다.
- Bilinear-resize Convolution: 양 옆으로 연산을 해준다.
낮은 레벨의 작은 레이어는 조그만 특성에도 민감하게 반응하며, 높은 레벨의 레이어는 전체적인 특징에 주목한다.
Segmentation에서는 둘 다 필요하므로 작은레이어와 큰 레이어 둘 다 가져와 개별적으로 upsampling 하여 concat을 하는 방식으로 작동된다.
U-Net
- Fully Convolutional networks를 더 정교하게 만든 네트워크
- 해상도를 점층적으로 낮추는 일반적인 CNN과 같은 Contracting path
- Decoding이라 부르는 Expanding Path, 한번에 up sampling 하는게 아닌 점층적으로 상승시키는 하는 방법
- 낮은 레이어에서 전달된 특징이 Localize된 정보를 줄 수 있다.(경계선이나 소실점과 같은 정보를 줄 수 있다)
주의점
- 입력이 홀수라면 사이즈를 절반으로 줄이는 과정에서 내림 연산인 된다.
- 따라서, 기존 입력과 up sampling할 때 출력의 차이가 나면서 오류가 생기게된다.
- 결론적으로 어떤 해상도에서도 홀수 레이어가 나오지 않도록 주의해야한다.
PyTorch에서의 구현
내려가는 conv 부분은 기존 CNN과 같이 conv3d과 ReLU, MaxPool로 이루어졌고 올라가는 부분은 ConvTransposed2d에 padding과 stride 둘 다 2를 사용한다.