우노
[DL] Semantic Segmentation (FCN, U-Net, DeepLab V3+) 본문
Semantic Segmentation이란?
- Semantic Segmentation 은 컴퓨터비젼 분야에서 가장 핵심적인 분야 중 하나이며,
- 위 그림처럼, 이미지 내에 있는 물체들을 의미 있는 단위로 분할해내는 것입니다.
- 더 구체적으로는 아래 그림처럼, 이미지의 각 픽셀이 어느 클래스에 속하는지 예측하는 것입니다.
- Semantic Segmentation은 다른 컴퓨터비젼 문제들과 마찬가지로, Deep Convolution Neural Network (깊은 신경망)을 적용해서 많은 발전을 이루었습니다.
- 이번 포스트에서는 Semantic Segmentation 에 대해서 자세히 설명하고, 자주 활용되는 몇가지 접근방법을 알아보겠습니다.
Semantic Segmentation의 의미와 목적
Semantic Segmentation 의 의미와 목적에 대해 알아보겠습니다.
우선, 컴퓨터 비젼에서 가장 많이 다뤄지는 문제들은 아래와 같은 것들이 있습니다.
- Classification (분류)
- 인풋에 대해서 하나의 물체를 구분하는 작업
- LeNet, AlexNet, VGG Nets, GooLeNet, ResNet, Xception 등의 모델
- Object Detection (객체 탐지)
- 물체를 구분함과 동시에, 그 물체가 어디에 있는지까지 Boxing하는 작업
- RCNN, Fast RCNN, Faster RCNN, SPP Net, YOLO, SDD, Attention Net 등의 모델
- Segmentation (분할)
- 모든 픽셀에 대해, 각 픽셀이 어떤 물체의 class인지 구분하는 작업
- FCN, DeepLab, U-Net, ReSeg 등의 모델
- Classification (분류)
따라서, Semantic Segmentation의 목적은 사진에 있는 모든 픽셀을, 해당하는 class로 분류하는 것입니다.
- 이미지에 있는 모든 픽셀에 대한 예측을 하는 것이기 때문에, dense prediction 이라고도 불립니다.
또한, Semantic Segmentation은 두 가지로 나뉩니다.
바로, Semantic Segmentation과 Instance Segmentation입니다.
예제를 통해 자세히 알아보겠습니다.
만약, 위 예제처럼 가족사진이 주어졌을 때,
Semantic Segmentation은 오른쪽처럼, 픽셀 단위로 어떤 class인지만 구분하지만
Instance Segmentation은 왼쪽처럼, 픽셀 단위로 어떤 class인지 구분한 이후, 동일한 class 내에서도 다른 Instance를 구분합니다.
FCN(Fully Convolutional networks)
FCN은 Semantic Segmentation의 대표적인 모델 중 하나입니다.
기존 Classification용 CNN 모델의 문제
AlexNet, VGG 등 분류에 자주 쓰이는 깊은 신경망들은, Semantic Segmentation 을 하는데 적합하지 않습니다.
이러한 모델들은 아래 그림처럼, 일반적으로 convolution 층들과 fully connected 층들로 이루어져있습니다.
따라서, 항상 입력이미지를 네트워크에 맞는 고정된 사이즈로 작게 만들어서 입력해줘야합니다.
또한, 이러한 분류용 CNN 모델들은, 물체가 어떤 클래스에 속하는지는 예측해낼 수 있지만, parameter의 개수와 차원을 줄이는 layer들을 가지고 있어서, 자세한 위치정보를 잃게 됩니다.
- 마지막에 쓰이는 Fully Connected Layer에 의해서 물체가 어디에 존재하는지 예측할 수 없게 됩니다.
물론, 공간/위치에 대한 정보를 잃지 않기 위해서, Pooling 과 Fully Connected Layer 를 없애고 stride와 padding을 1로 설정해, 일정한 Convolution 을 진행할 수도 있을 것입니다.
하지만, 이렇게 진행한다면 인풋의 차원은 보존하겠지만, parameter의 개수가 많아져, 메모리 문제나 계산비용이 너무 많이 들어, 현실적으로는 불가능 할 것입니다.
따라서, 이러한 문제를 해결하기 위해, FCN 모델은 아래 그림처럼 fully connected 층을 1x1 convolution 층으로 바꿨습니다.
- 이를 통해, 네트워크 전체가 convolution층들로 이루어지게 되며,
- fully connected 층들이 없어졌으므로, 더 이상 입력 이미지 크기에 제한을 받지 않게 됩니다.
- 즉, 이제 어떠한 사이즈(H x W)의 이미지든 네트워크에 입력될 수 있습니다.
- 여러 층의 convolution층들을 거치고 나면, 특성맵(feature map)의 크기가 H/32 x W/32가 되는데, 그 특성맵의 한 픽셀이 입력이미지의 32 x 32 크기를 대표하게 됩니다.
- 즉, 입력이미지의 위치 정보를 '대략적으로' 유지하고 있는 것입니다.
- 여기서 중요한 것은, 이 convolution 층들을 거치고 나서 얻게 된 마지막 특성맵의 갯수는, 훈련된 클래스의 갯수와 동일하다는 것입니다.
- 5개의 클래스로 훈련된 네트워크라면, 5개의 특성맵(heatmap)을 산출해냅니다.
- 각 특성맵은 하나의 클래스를 대표합니다.
- 만약, 고양이 클래스에 대한 특성맵이라면 고양이가 있는 위치의 픽셀값들이 높고,
- 강아지 클래스에 대한 특성맵이라면 강아지 위치의 픽셀값들이 높게됩니다.
이제 FCN 모델의 Architecture에 대해서 더 자세히 살펴보겠습니다.
우선, FCN의 Architecture는 크게 4단계로 나뉩니다.
- Convolution Layer를 통해 Feature 추출
- 1 x 1 Convolution Layer를 통해, 낮은 해상도의 Class Presence Heat Map 추출
- Transposed Convolution 을 통해서, 이 낮은 해상도의 Heat Map을 Upsampling 한 뒤, 인풋과 같은 크기의 Map 생성
- Map의 각 pixel class에 따라 색칠 한 뒤, Segmentation 결과 반환
1,2번 과정은 downsampling 단계로, convolution을 통해 차원을 줄이는 단계입니다.
3번 과정은 upsampling 단계로, 1,2번 과정을 통해 만들어진 특성맵(heatmap)의 크기를 원래 이미지의 크기로 다시 복원해주는 단계입니다.
- 이미지의 모든 픽셀에 대해서 클래스를 예측하는 것이, semantic segmentation의 목적이기 때문입니다.
4번 과정은 upsampling된 특성맵(heatmap)들을 종합해서, 최종적인 segmentation map을 만드는 단계입니다.
- 간단히 말해서, 각 픽셀당 확률이 가장 높은 클래스를 선정해주는 것입니다.
- 만약, 클래스가 5개이며, (1, 1) 픽셀에 해당하는 클래스당 확률값들이 강아지 0.45, 고양이 0.94, 나무 0.02, 컴퓨터 0.05, 호랑이 0.21 라면
- 0.94로 가장 높은 확률을 산출한 고양이 클래스를 (1, 1) 픽셀의 클래스로 예측하는 것입니다.
- 이런 식으로 모든 픽셀이 어느 클래스에 속하는지 판단합니다.
그런데 단순히 upsampling을 시행하면, 특성맵의 크기는 한 번에 원래 이미지의 크기로 복원되고, 그것들로부터 원래 이미지 크기의 segmentation map을 얻을 수 있지만, 디테일하지 못한 segmentation map을 얻게 됩니다.
- 1/32만큼 줄어든 특성맵들을 한 번에 32배만큼 upsampling 했기 때문에, 당연히 coarse할 수 밖에 없습니다.
이렇게 한 번에 32배 upsampling하는 방법을 논문에서는 FCN-32s라고 소개하고 있습니다.
아래 그림을 보면, ground truth와 비교해, FCN-32s로 얻은 segmentation map은 많이 뭉뚱그려져 있고 디테일하지 못함을 알 수 있습니다.
따라서, FCN의 개발자들은 좀 더 디테일한 segmentation map을 얻기 위해, skip combining이라는 기법을 제안했습니다.
기본적인 생각은 다음과 같습니다.
컨볼루션과 풀링 단계로 이루어진 이전 단계의 컨볼루션층들의 특성맵을 참고하여 upsampling을 해주면, 좀 더 정확도를 높일 수 있지 않겠냐는 것입니다.
왜냐하면, 이전 컨볼루션층들의 특성맵들이 해상도 면에서는 더 낫기 때문입니다.
따라서, 바로 전 컨볼루션층의 특성맵(pool4)과 현재 층의 특성맵(conv7)을 2배 upsampling한 것을 더합니다.
그 다음 (pool4 + 2x conv7)을 16배 upsampling 해 얻은 특성맵들로 segmentation map을 얻는 방법을 FCN-16s라고 부릅니다.
더 나아가서, 전전 단계의 특성맵(pool3)과, 전 단계의 특성맵(pool4)을 2배 upsampling한 것과, 현 단계의 특성맵(conv7)을 4배 upsampling 한 것을 모두 더한 다음에,
(pool3 + 2xpool4 + 4xcon7)을 8배 upsampling을 해 얻은 특성맵들로 segmentation map을 얻는 방법을 FCN-8s라고 부릅니다.
FCN-32s, FCN-16s, FCN-8s 그림
아래 그림을 보면, FCN-8s가 FCN-16s보다 좀 더 세밀하고, FCN-32s보다는 훨씬 더 정교해졌음을 알 수 있습니다.
다른 논문에서, 또는 웹상에서 누군가 FCN을 말할 때는 보통 이 FCN-8s를 의미한다고 봐도 무방합니다.
U-Net
U-Net이란?
U-Net은 Semantic Segmentation Task 수행에 널리 쓰이는 모델 중 하나입니다.
네트워크 형태가 알파벳 U와 비슷하다고 하여 붙여진 이름으로, 의생명공학 이미지 Segmentation을 위해 개발된 모델입니다.
모델의 구조는 아래 그림과 같습니다.
U-Net의 장점
- U-Net은 기존의 Segmentation 모델의 문제점을 해결할 수 있습니다.
- 1) 빠른 속도
- 기존 Segmentation 모델의 단점이었던 느린 연산 속도를 개선했습니다.
- 속도 개선이 가능했던 이유는, 이미지를 인식하는 단위(Patch)에 대한 Overlap 비율이 적기 때문입니다.
- 기존의 모델에서 많이 사용되었던 Sliding Window 방식의 경우, 이전 Patch에서 검증이 끝난 부분을 다음 Patch에서 다시 검증하게 됩니다. 이는 일종의 연산 낭비라고 볼 수 있습니다.
- U-Net의 경우, 이전 Patch에서 검증이 끝난 부분을 다음 Patch에서 중복하여 검증하지 않기 때문에, 연산의 낭비가 없고 이로 인해 향상된 속도를 얻을 수 있습니다.
- 2) Context와 Localization의 늪에서 탈출
- Segmentation Network는 클래스 분류를 위한 인접 문맥 파악(Context)과 객체의 위치 판단(Localization)을 동시에 수행해야 합니다.
- 각 성능은 Patch의 크기에 영향을 받는데, 이때 Trade-Off 관계를 가지게 됩니다.
- Patch의 크기가 커지면 더 넓은 범위의 이미지를 한 번에 인식할 수 있어 Context 파악에는 탁월한 효과를 보이지만,
- 많은 Max-Pooling을 거치며 Localization 성능에는 부정적인 영향을 미치게 됩니다.
- 반대로 Patch의 크기가 작아지면 Localization 성능은 좋아지나, 인식하는 범위가 지나치게 협소해져 Context 파악 성능에 좋지 않은 영향을 미칩니다.
- U-Net은 다층의 Layer의 Output을 동시에 검증해서 이러한 Trade-Off를 극복합니다.
자세한 U-Net 구조
U-Net의 구조는 알파벳 U의 왼쪽 절반에 해당하는 Contracting Path와
오른쪽 절반에 해당하는 Expanding Path의 2가지 Path로 분리할 수 있습니다.
1) Contracting Path
- Contracting Path는 Encoder의 역할을 수행하는 부분으로 전형적인 Convolution Network로 구성됩니다.
- Contracting Path는 입력을 Feature Map으로 변형해 이미지의 Context를 파악합니다.
- 이 경우에 Contracting Path의 앞단에 이미 잘 학습된 모델을 Backbone으로 사용해 학습 효율과 성능을 높일 수 있습니다. 주로 ResNet 등의 모델을 사용합니다.
2) Expanding Path
- Expanding Path는 Decoder의 역할을 수행하는 부분으로, 전형적인 Upsampling + Convolution Network로 구성됩니다.
- 즉, Convolution 연산을 거치기 전 Contracting Path에서 줄어든 사이즈를 다시 복원하는(Upsampling) 형태입니다.
- Expanding Path에서는 Contracting을 통해 얻은 Feature Map을 Upsampling하고,
- 각 Expanding 단계에 대응되는 Contracting 단계에서의 Feature Map과 결합해서(Skip-Connection Concatenate) 더 정확한 Localization을 수행합니다.
- 즉, Multi-Scale Object Segmentation을 위하여 Downsampling과 Upsampling을 순서대로 반복하는 구조입니다.
DeepLab v3+
- DeepLab 이라 불리는 semantic segmentation 방법은, version 1부터 시작하여 지금까지 총 4번의 개정본(1, 2, 3, 3+)이 출판되었습니다.
- DeepLab V1Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs. ICLR 2015.
- DeepLab V2DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs. TPAMI 2017.
- DeepLab V3Rethinking Atrous Convolution for Semantic Image Segmentation. arXiv 2017.
- DeepLab V3+Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation. arXiv 2018.
- 전체적으로 DeepLab은 semantic segmentaion을 잘 해결하기 위한 방법으로 atrous convolution을 적극적으로 활용할 것을 제안하고 있습니다.
- V1에서는 atrous convolution을 적용해 보았고,
- V2에서는 multi-scale context를 적용하기 위한 Atrous Spatial Pyramid Pooling (ASPP) 기법을 제안하고,
- V3에서는 기존 ResNet 구조에 atrous convolution을 활용해 좀 더 dense한 feature map을 얻는 방법을 제안하였습니다.
- 그리고 최근 발표된 V3+에서는 separable convolution과 atrous convolution을 결합한 atrous separable convolution의 활용을 제안하고 있습니다.
- 우선, 관련된 용어부터 살펴보겠습니다.
Atrous convolution
- Atrous convolution은 기존 convolution과는 다르게, 필터 내부에 빈 공간을 둔 채로 작동하게 됩니다.
- 위 예시에서, 얼마나 빈 공간을 둘 지 결정하는 파라미터인 rate r=1일 경우, 기존 convolution과 동일하고, r이 커질 수록, 빈 공간이 넓어지게 됩니다.
- Atrous convolution을 활용함으로써 얻을 수 있는 이점은,
- 기존 convolution과 동일한 양의 파라미터와 계산량을 유지하면서도, field of view (한 픽셀이 볼 수 있는 영역) 를 크게 가져갈 수 있게 됩니다.
- 보통 semantic segmentation에서 높은 성능을 내기 위해서는, convolutional neural network의 마지막에 존재하는 한 픽셀이 입력값에서 어느 크기의 영역을 커버할 수 있는지를 결정하는 receptive field 크기가 중요하게 작용합니다.
- Atrous convolution을 활용하면 파라미터 수를 늘리지 않으면서도 receptive field를 크게 키울 수 있기 때문에, DeepLab series에서는 이를 적극적으로 활용하려 노력합니다.
Spatial Pyramid Pooling
- Semantic segmentaion의 성능을 높이기 위한 방법 중 하나로, spatial pyramid pooling 기법이 자주 활용되고 있는 추세입니다.
- DeepLab V2에서는 feature map으로부터, 여러 개의 rate가 다른 atrous convolution을 병렬로 적용한 뒤,
- 이를 다시 합쳐주는 atrous spatial pyramid pooling (ASPP) 기법을 활용할 것을 제안하고 있습니다.
- 최근 발표된 PSPNet에서도 atrous convolution을 활용하진 않지만, 이와 유사한 pyramid pooling 기법을 적극 활용하고 있습니다.
- 이러한 방법들은 multi-scale context를 모델 구조로 구현하여, 보다 정확한 semantic segmentation을 수행할 수 있도록 돕게 됩니다.
- DeepLab 에서는 ASPP를 기본 모듈로 사용하고 있습니다.
Encoder-Decoder
U-Net 구조 (Contracing Path : Encoder, Expanding Path : Decoder)
Encoder-decoder 구조 또한 semantic segmentation을 위한 CNN 구조로 자주 활용되고 있습니다.
특히, U-Net이라 불리는 encoder-decoder 구조는 정교한 픽셀 단위의 segmentation이 요구되는 biomedical image segmentation task의 핵심 요소로 자리잡고 있습니다.
왼쪽의 encoder 부분에서는 점진적으로 spatial dimension을 줄여가면서 고차원의 semantic 정보를 convolution filter가 추출해낼 수 있게 됩니다.
이후 오른쪽의 decoder 부분에서는 encoder에서 spatial dimension 축소로 인해 손실된 spatial 정보를 점진적으로 복원하여 보다 정교한 boundary segmentation을 완성하게 됩니다.
U-Net이 여타 encoder-decoder 구조와 다른 점은, 위 그림에서 가운데 놓인 회색 선입니다.
Spatial 정보를 복원하는 과정에서, 이전 encoder feature map 중 동일한 크기를 지닌 feature map을 가져 와 prior로 활용함으로써 더 정확한 boundary segmentation이 가능하게 만듭니다.
이번에 발표된 DeepLab V3+에서는 U-Net과 유사하게 intermediate connection을 가지는 encoder-decoder 구조를 적용하여, 보다 정교한 object boundary를 예측할 수 있게 됩니다
Depthwise Separable Convolution
위 그림처럼, 입력 이미지가 8×8×3 (H×W×C) 이고, convolution filter 크기가 3×3 (F×F) 이라고 했을 때, filter 한 개가 가지는 파라미터 수는 3×3×3 (F×F×C) = 27 이 됩니다.
만약 filter가 4개 존재한다면, 해당 convolution의 총 파라미터 수는 3×3×3×4 (F×F×C×N) 만큼 지니게 됩니다.
위 그림처럼, Convolution 연산에서 channel 축을 filter가 한 번에 연산하는 대신에,
아래 그림처럼, 같이 입력 영상의 channel 축을 모두 분리시킨 뒤, filter의 channel 축 길이를 항상 1로 가지는 여러 개의 convolution filter로 대체시킨 연산을 depthwise convolution이라고 합니다.
이제, 위의 depthwise convolution으로 나온 결과에 대해, 1×1×C 크기의 convolution filter를 적용한 것을 depthwise separable convolution 이라 합니다.
이처럼 복잡한 연산을 수행하는 이유는 기존 convolution과 유사한 성능을 보이면서도 사용되는 파라미터 수와 연산량을 획기적으로 줄일 수 있기 때문입니다.
- 예를 들어, 입력값이 8×8×3 라면
- 16개의 3×3 convolution 필터를 적용할 때 사용되는 파라미터의 개수는
- Convolution: 3×3×3×16 = 432
- Depthwise separable convolution: 3×3×3 + 3×16 = 27 + 48 = 75
- 임을 확인할 수 있습니다.
Depthwise separable convolution은 기존 convolution filter가 spatial dimension과 channel dimension을 동시에 처리하던 것을 따로 분리시켜 각각 처리한다고 볼 수 있습니다.
이 과정에서, 여러 개의 필터가 spatial dimension 처리에 필요한 파라미터를 하나로 공유함으로써 파라미터의 수를 더 줄일 수 있게 됩니다.
두 축을 분리시켜 연산을 수행하더라도 최종 결과값은 결국 두 가지 축 모두를 처리한 결과값을 얻을 수 있으므로, 기존 convolution filter가 수행하던 역할을 충분히 대체할 수 있게 됩니다.
픽셀 각각에 대해서 label을 예측해야 하는 semantic segmentation은 난이도가 높은 편에 속하기 때문에 CNN 구조가 깊어지고
receptive field를 넓히기 위해 더 많은 파라미터들을 사용하게 되는 상황에서, separable convolution을 잘 활용할 경우, 모델에 필요한 parameter 수를 대폭 줄일 수 있게 되므로
보다 깊은 구조로 확장하여 성능 향상을 꾀하거나, 기존 대비 메모리 사용량 감소와 속도 향상을 기대할 수 있습니다.
DeepLab V3
- DeepLab V3+ 바로 이전 논문인 DeepLab V3의 경우, 아래 요소들로 이루어져있습니다.
- Encoder: ResNet with atrous convolution
- ASPP
- Decoder: Bilinear upsampling
DeepLab V3+
- DeepLab V3+는 제목에서도 알 수 있듯이 V3에 비해서 약간의 변화만이 존재합니다.
- Encoder: ResNet with atrous convolution → Xception (Inception with separable convolution)
- ASPP → ASSPP (Atrous Separable Spatial Pyramid Pooling)
- Decoder: Bilinear upsampling → Simplified U-Net style decoder
- 우선, ResNet을 사용하던 encoder가 앞서 소개드린 separable convolution을 적극 활용한 구조인 Xception으로 대체됩니다.
- Multi-scale context를 얻기 위해 활용되던 ASPP에는, separable convolution과 atrous convolution을 결합한 atrous separable convolution이 적용된 ASPP로 대체되었습니다.
- 또한, 기존에 단순하게 bilinear upsampling으로 해결했던 decoder 부분이 U-Net과 유사한 형태의 decoder로 대체됩니다.
- Encoder와 ASPP, 그리고 decoder 모두 separable convolution을 적극 활용함으로써 파라미터 사용량 대비 성능 효율을 극대화시키려는 노력이 보이는 구조입니다.
Segmentation Dataset
- PASCAL VOC 2012 Segmentation Competition
- COCO 2018 Stuff Segmentation Task
- BDD100K: A Large-scale Diverse Driving Video Database
- Cambridge-driving Labeled Video Database (CamVid)
- Cityscapes Dataset
- Mapillary Vistas Dataset
- ApolloScape Scene Parsing
참고
- https://medium.com/hyunjulie/1편-semantic-segmentation-첫걸음-4180367ec9cb
- https://reniew.github.io/18/
- https://tech.socarcorp.kr/data/2020/02/13/car-damage-segmentation-model.html
- https://bskyvision.com/491
- https://blog.lunit.io/2018/07/02/deeplab-v3-encoder-decoder-with-atrous-separable-convolution-for-semantic-image-segmentation/
- Stanford CS231n: Detection and Segmentation
- Kaggle 2018 Data Science Bowl 1등 Solution
'AI > Deep Learning' 카테고리의 다른 글
[DL] Distributed Training (분산 학습) 이란? (0) | 2021.07.29 |
---|---|
[DL] DNN Grid Search (3) | 2021.07.16 |
[DL] Autoencoder (오토인코더) (0) | 2021.03.03 |
[DL] Word2Vec, CBOW, Skip-Gram, Negative Sampling (3) | 2021.02.18 |
[DL] One-Hot Vector, Word Embedding (1) | 2021.02.17 |