Object의 크기가 receptive field가 고정돼있어서 이보다 클 경우 한 object를 다른 여러가지 object로 인식하거나, 이보다 작을 경우 무시되는 경우가 발생
Max pooling, deep layer의 문제로 인해 무시되기도 함
Deconvolution(upsampling)의 절차가 간단해서 detail한 정보를 살리지 못함
Decoder와 encoder를 대칭으로 만듬
Convolution Network(backbone): VGG16을 사용, 각 conv layer는 conv-BN-ReLU로 구성
Deconvolution Network: unpooling, deconvolution, ReLU로 구성
Real time(특히 자율주행)에서 segmentation을 하기 위해 차량, 도로, 차선, 보도, 하늘 등의 class를 빠르고 정확하게 구분하기 위해 등장
DeconvNet에서 중간의 1x1 conv를 제거하고, 마지막 deconv layer를 제거하고 3x3 conv로 역할을 대신해 weight parameter를 감소시켜 train/test 시간이 감소
Decoder에서 deconvolution을 convolution으로 대체한 이유는 나와있지 않으나 속도에서 큰 차이는 없을것
Block 내부에서 이전 모든 layer의 정보를 넘겨서 concat
4개의 skip connection
자세한 내용은 이후 UNet에서 다룸
Receptive field가 작으면 semantic information을 고려하지 못하는 문제가 있음
Conv -> max pooling -> conv를 반복하면 receptive field를 효율적으로 늘릴 수 있음
하지만 resolution 측면에서는 반복할수록 feature의 해상도가 떨어진다는 단점이 있음
이를 개선하기 위해 기존 convolution에 dilation rate를 줘서 receptive field를 늘림
DeeplabV1에서는 conv5 block에서 rate = 2, FC6에서 rate = 12를 줌
마지막 upsampling은 bilinear interpolation을 사용
Bilinear interpolation으로 생성한 결과는 픽셀 단위의 정교한 segmentation이 불가능하기 때문에 개선하기 위한 후처리 방법으로 Dense CRF를 사용
Deeplab에서 pooling layer를 제거하고 FC6의 kernel size를 늘림
Upsampling에서 bilinear interpolation 대신 deconv를 사용
Basic context module을 추가해 dilate rate를 다양하게 줘서 다양한 크기의 object를 잘 감지하게 함
Padding은 동일한 size로 줘서 크기의 변동을 방지
다양한 크기의 dilate rate를 줘서 low rate에서는 kernel size가 작아 small obj를 위주로, high rate에서는 kernel size가 커서 big obj 위주로 segmentation
각 conv block은 (strided) conv-BN-ReLU로 구성된 sub block으로 이루어지며 sub block 단위로 skip connection이 추가됨
Channel 수가 변경될 때엔 skip connection에도 1x1 conv가 들어가서 channel 수를 맞춰줌
Mismatched relationship: boat - car의 외관이 비슷해서 호수 주변에 있는 boat도 car로 예측
Confusion Categories: 비슷한 범주인 skyscraper - building
Inconspicuous Classes: pillow의 obj size가 작고 bed sheet와 같은 무늬라 예측에 한계
Max pooling을 5번 해서 image size가 1/32로 줄어서 생긴 문제
또한 receptive field의 이론-실제 size의 차이가 많이 남
Feature map에 1x1, 2x2, 3x3, 6x6 출력의 average pooling을 적용해 sub-region 생성
Feature map과 pyramid pooling module을 upsampling한 output을 서로 concat
Average pooling은 convolution에 비해 global info를 잘 잡아낸다는 장점이 있음
성능 올라간걸 확인 가능
Deeplab v2에서 dilate rate를 변경하고, GAP 추가, sum을 concat으로 변경한게 차이점
GAP의 output은 1x1이라 bilinear interpolation을 적용
1x1 pixel의 bilinear interpolation은 padding처럼 확장하는 식으로 전개
Encoder-Decoder 구조
modified Xception을 backbone으로 사용
Xception에서는 depthwise, pointwise conv를 합친 depthwise separable convolution을 사용
Max pooling을 depthwise separable convolution으로 바꿔서 더 detail한 정보를 고려할 수 있음
Task에 따라 input size를 줄이는 정도가 다름
Atrous separable convoltion을 적용한 ASPP 모듈 사용
Backbone 내 low-level feature와 ASPP 모듈 출력 모두 decoder에 전달
Skip connection은 entry flow의 첫 블록 출력을 이용함
ASPP module의 출력을 bilinear upsampling해서 low-level feauture와 결합