관련 논문
(사실상 논문 리뷰이지만, 내가 리뷰한 게 아니라 정리한 것이므로 리뷰라고 적지 않겠다.)
DeepLab V1 : Semantic image segmentation with deep convolutional nets and fully connected CRFs
DeepLab V2 : DeepLab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected CRFs
0. DeepLab : Deep Labelling for Semantic Image Segmentation
DeepLab is a state-of-art deep learning model for semantic image segmentation, where the goal is to assign semantic labels (e.g., person, dog, cat and so so) to every pixel in the input image. Cureent implementation includes the following features :
1) DeepLabv1 : We use atrous convolution to explicitly control the resolution at which feature responses are computed within Deep Convolutional Neural Networks.
2) DeepLabv2 : We use atrous spatial pyramid pooling (ASPP) to robustly segment objects at multiple scales with filters at multiple sampling rates and effective fields-of-views.
3) DeepLabv3 : We augment the ASPP module with image-level feature to capture longer range information. We also include batch normalization parameters to facilitate the training. In particular, we applying atrous convolution to extract output features at different output strides during training and evaluation, which efficiently enables training BN at output stride = 16 and attains a high performance at output stride = 8 during evaluation.
4) DeepLabv3+ : We extend DeepLabv3 to include a simple yet effective decoder module to refine the segmentation results especially along object boundaries. Furthermore, in this encoder-decoder structure one can arbitraily control the resoultion of extracted encoder features by atrous convolution to trade-off precision and runtime.
github.com/tensorflow/models/tree/master/research/deeplab
1. DeepLab V1과 V2의 차이
2015년에 발표된 구조 DeepLab V1
2016년에 발표된 구조 DeepLab V2
Atrous convolution과 fully connected CRF 개념을 사용한다는 점은 동일하지만, multiple-scale에 대한 처리 방법이 V2에서 개선되었다.
VGG-16 뿐만 아니라 ResNet-101도 DCCN으로 사용하여 성능을 끌어올렸다.
DCNN(Deep Convolutional Neural Networks)에서 max-pooling layer 2개를 제거함으로써, 1/8 크기의 feature-map을 얻고, atrous convolution을 통해 넓은 receptive field를 볼 수 있도록 했다.
pooling 후 동일한 크기의 convolution을 수행하면, 자연스럽게 receptive field가 넓어지는데, 여기서는 detail을 위해 pooling layer를 제거했기 때문에, 이 부분을 atrous convolution을 더 넓은 receptive field를 볼 수 있도록 하여, pooling layer가 사라지는 문제를 해소시켰다.
2. 알아야할 용어들
1) Receptive field ?
수용영역, 수용장
출력 레이어의 뉴런 하나에 영향을 미치는 입력 뉴런들의 공간 크기
얼마나 많은 문맥 정보를 사용하는 가와 비례한다.
이론적으로 CNN에서는 receptive field는 입력 이미지의 크기보다 더 크다.
하지만 실험적으로는 이론에 비해 훨씬 작기 때문에 많은 네트워크들이 문맥 정보를 잘 이용하지 못하고 있다.
dialted convolution은 이 문제를 해결하기 위한 방법 중 하나이다!!
2) Atrous Convolution(dilated convolution) ?
Atrous는 프랑스어의 'A trous' (구멍이 있는)에서 나온 말.
일반적인 convolution 사이에 공간을 넣어서 구멍이 뚫린 듯한 구조.
Dialted convolution (팽창된 컨벌루션)은 receptive field가 D에 따라서 다르다.
(그림1 참고)
D=1 인 경우, 1-dialted 3*3 convolution. receptive field가 9.
D=2인 경우, 2-dialted 3*3 convolution. receptive field가 5*5로 15.
D=3인 경우, 3-dialted 3*3 convolution. receptive field가 7*7로 49.
웨이브릿(wavelet)을 이용한 신호 분석에 사용되던 방식이며, 보다 넓은 scale을 보기 위해 중간에 hole(zero)를 채워 넣고 convolution을 수행하는 것을 말한다.
같은 연산량으로 더 큰 특징을 잡아낼 수 있다.
다양한 확장 비율을 가진 atrous convolution을 병렬적으로 사용해서 더 많은 특징을 담을 수 있다.
DeepLab V1~V3에서 쓰이는 방법이다.
atrous convolution(dilated convolution)을 사용하면 receptive field의 크기가 커지는 효과를 얻을 수 있다.
3. Atrous Convolution(dilated convolution) 결과
작은 이미지로부터 feature-map을 구한 다음 그것을 unsampling 하게 되면 오른쪽 위 이미지처럼 해상도가 많이 떨어질 수 있다. 이 과정이 파란 화살표로 표현되었다. 상단 2,3 번째 그림 사이에 있는 작은 이미지는 필터이다.
반면, 빨간 화살표처럼 큰 이미지로부터 dilated-convolution하면 해상도가 높은 feature-map을 구할 수 있다. 이 때 사용된 필터의 값들(아래 첫번째 작은 그림)에서 픽셀들이 인접해 있지 않고 떨어져 있는 것을 볼 수 있다.
일반적인 convolution, pooling에서 convolution의 stride를 4로 하는 경우이다.
레이어 k+1에서 2개의 픽셀간의 거리는 레이어 k에서 8픽셀 간의 거리에 해당한다.
convolution에서 1/4가 되었고, pooling에서는 1/2가 되서 총 1/8로 작아졌다.
convolution의 stride가 1이고 pooling이 없는 경우에는 해상도가 유지된다.
하지만, 이런 경우에는 pooling으로 사이즈가 줄어들지 않게 되므로 연산량이 많아진다.
convolution의 reception field를 늘이기 위해 kernel 사이즈를 키우게 되면 파라미터가 너무 많아져서 오버피팅된다.
이런한 문제를 해결하기 위해 dilated convolution을 사용한다!
convolution의 커널 크기는 9로 크긴 크다. 하지만 9개 중 3개의 값만 진짜이며 나머지 6개는 0이다. sparse(대부분 0이다)이다. 필터 값이 0인 부분은 계산을 하지 않도록 한다면 계산량 문제는 없다.
convolution하면 output 픽셀들간의 간격은 이전 레이어에서의 1픽셀 간격의 정보를 이용하였기 때문에 해상도가 유지가 된다. width, height도 변하지 않으므로 해상도 유지가 되는 것은 당연하다.
아래 그림은 마지막 레이어에 전체 픽셀 중 5개만 그렸다. 원래는 바로 왼쪽의 긴 15짜리 레이어와 동일하다.
VGG-16은 분류를 위한 넷이기 때문에 FC(Fully Connected)에서 width*height가 1*1이 된다. segmentation에서는 width*height가 입력의 크기와 같아야 한다.
그래서 DeepLab에서 한 것이 conv+pool 레이어를 dilated convolution을 사용하여 width*height가 유지되도록 바꾸었다. FC도 1*1 convolution을 사용해서 공간 차원 정보가 유지되도록 하였다.
하지만 공간 크기도 1, 2번째 conv+pool을 거치면서 이미 224*224에서 28*28로 1/8 줄어버렸다. 그러므로 최종레이어 쪽에서 bilnear upsampling로 원래 크기로 복원하였다.
두 net의 차이는 다이아몬드로 표시된 dilated convolution와, upsampling 8* 이다.
m.blog.naver.com/laonple/221000648527
medium.com/hyunjulie/1%ED%8E%B8-semantic-segmentation-%EC%B2%AB%EA%B1%B8%EC%9D%8C-4180367ec9cb
sthalles.github.io/deep_segmentation_network/
******Deeplab Code*******
'Daily > 김인턴의 하루' 카테고리의 다른 글
NVIDIA Jetson Nano (2) | 2020.10.20 |
---|---|
TPU 텐서처리장치 (0) | 2020.10.13 |
COCO Dataset (0) | 2020.10.12 |
DLL 파일 (0) | 2020.10.12 |
배쉬 Bash (0) | 2020.10.12 |
댓글