Segmentation
-
segmentation은 이미지를 pixel레벨로 이해하는 접근
-
픽셀 하나하나에 대해 분류, 탐지하는 task
-
동일한 label을 가진 모든 픽셀이 동일한 object또는 class에 속하도록 이미지의 각 pixel에 label을 할당하는 프로세스를 의미
-
이것은 image level로 분류하는 작업인 image classification보다 어렵다
-
input : RGB또는 흑백 이미지
-
output : 각 pixel이 어느 class에 속하는지를 나타내는 map
segmentation의 종류
- semantic segmentation
- 같은 class의 instance(같은 class에 있는 개별 개체)를 구별하지 않는다.
- instant segmentation
- 같은 class안에서도 다른 instance 구분
Sementic segmentation
- 픽셀 하나 하나마다 분류
- 가장 단순한 방법
- 학습이 효과적으로 작동만 하면 가장 강력한 모델이지만 굉장히 비효율적이고 연산량이 너무 많아진다.
- Bilinear Interpolation
- Interpolation이란 이미 아는 값 사이 위치한 값을 알려진 값으로 부터 추정하는 것을 의미한다.
- 즉 몇개의 픽셀만을 학습한 후 학습하지 않은 중간 픽셀은 interpolation으로 추정한다.
- 정확도는 떨어질지라도 계산량과 학습시간은 현저히 줄어들 것이다.
1) 1d linear interpolation
- 두 지점과의 직선 거리에 따라 선형적으로 결정하는 방법
- 두 지점 x1, x2에서의 데이터 값이 f(x1), f(x2)일때 x1, x2 사이의 점 x의 data 값은 f(x) = (d2/(d1+d2))f(x1) + (d1/(d1+d2))f(x2) 가 된다.
2) 2D linear interpolation(=Bilinear Interpolation)
-1D linear interpolation의 2차원 확장
- Convolution기반 모델들
- VGG, Restnet등의 classification모델들은 Sementic Segmentation에 적합하지 않다. 마지막 층의 Fully connected layer를 통과하면서 많은 parameter와 차원이 축소되면서 object의 위치정보를 잃기 때문에
- 위치 정보를 잃지 않기 위해서 Pooling과 FCN을 없애고 stride와 padding을 일정하게 한다고 하면 학습량이 너무 많아져 비효율적이다.
- 따라서, downsampling, upsampling을 활용한다.
- 논문에서는 보통 Downsampling을 인코더, Upsampling을 디코더라고 부른다.
- 인코더를 통해 입력받은 이미지의 정보를 벡터로 압축하고, 디코더를 통해 원하는 결과물로 확장시킨다.
- 인코더 : 차원을 줄여서 적은 메모리로 깊은 convolution을 할 수 있게 한다. 주로 convolution과 pooling을 이용한다.
- 디코더 : 인코더를 통과한 결과의 차원을 다시 늘려 input과 같은 차원으로 만들어준다. 주로 Transpose Convolution을 이용한다.
*Transpose convolution
- 이런 인코더 디코더 구조를 가지는 대표적인 모델은 다음과 같다-> FCN,DeepLab, U-Net
- 이들은 단지 network구조를 어떻게 변경했느냐의 차이이다.(특히, shortcut connection을 어떻게 했느냐가 중요)
FCN(Fully convolutional Network for Sementic Segmentaion)
-
FCN은 sementic segmentation을 위해 image classification에서 우수한 성능을 보인 CNN기반 모델(AlexNet, VGG16..)등을 목적에 맞추어 변형시킨 것이다.
-
기존 image classification에서 이용된 fc-layer의 위치 정보 소실문제를 방지하기 위해서 모든 fc-layer를 convolution layer로 대체
-
또한 transfer learning이용
-
VGG16으로부터 Transfer Learning을 사용
-
VGG16의 마지막 fully connecter layer를 1X1 convolution layer로 바꾼다(이때문에 이름이 Fully convolution Network이다.)
-
이후 Transposed Convolution을 이용해 압축되어 있는 heat map을 입력 이미지와 동일한 사이즈로 만든다.
-
또한 FCN은 skip connection구조 적용
-
Unsampling(디코딩)을 하면서 VGG16의 낮은 layer의 특징 map을 더한다.
-
Pooling을 통해 압축되며 소실되는 중요한 정보를 이를 통해 얻을 수 있다.
Transfer Learning
- 초기 weight를 좋은 weight로 설정하자
- 데이터가 다르더라도 이미지를 활용한 task에서는 공통된 feature들이 존재할 것이다.
- 따라서 공통된 feature를 활용하여 학습 성능을 높이자
Deep Lab
- FCN의 문제는 Receptive Field의 크기가 일정하게 정해져 있어서 작은 물체를 잘 인식하지 못했고 일정하지 않은 결과가 나오기도 했다.
- 따라서 DeepLab이라는 모델에서 Dilated Convolution을 이용하였다.
Dilated Convolution
(파란색은 input, 초록색은 output)
- 현재 위 그림에서 3X3의 kernel을 사용하고 있는데 여기에 추가적인 dilation rate(각 커널 사이의 간격) = 2 로 지정해 주어 5X5 필터를 쓰는 것과 동일한 결과를 도출해 낼 수 있다.
- Dilated convolution은 특히 real-time segmentation 분야에서 주로 사용됩니다. 넓은 시야가 필요하고 여러 convolution이나 큰 커널을 사용할 여유가 없는 경우 사용합니다
U-Net
- 신경망 구조를 skip connection을 평행하게 두고 가운데를 기준으로 좌우가 대칭이 되도록 레이어를 배치하여 이름 그대로 U자형으로 만들었다.