객체의 크기가 크거나 작은 경우 예측을 잘 하지 못하는 문
큰 Object의 경우 지역적인 정보만으로 예측 - 유리창에 비친 자전거를 자전거로 인식하는 문제
같은 Object여도 다르게 labeling
작은 Object가 무시되는 문제가 있음
Object의 디테일한 모습이 사라지는 문제 발생
Deconvolution의 절차가 간단해 경계를 학습하기 어려움
Decorder 를 Encoder와 대칭으로 만든 형태
1. Convolution Network는 VGG16을 사용
• 13개의 층으로 이루어짐
• ReLU와 Pooling이 convolution 사이에서 이루어짐
• 7 x 7 Convolution 및 1 x 1 Convolution 을 활용
2. Deconvolution Network는 Unpooling, deconvolution, ReLU으로 이루어짐
Unpooling ; 위치 정보 기억
Pooling의 경우 노이즈를 제거하는 장점이 있지만, 그 과정에서 정보가 손실되는 문제가 생김
• Unpooling을 통해서 Pooling시에 지워진 경계에 정보를 기록했다가 복원
• 학습이 필요 없기 때문에 속도가 빠름
• 하지만 sparse한 activation map을 가지기 때문에 이를 채워 줄 필요가 있음
• 채우는 역할을 Transposed Convolution이 수행
Deconvolution ; Pooling의 경우 노이즈를 제거하는 장점이 있지만 그 과정에서 정보가 손실되는 문제가 생김
• Deconvolution layers를 통해서 input object의 모양을 복원
• 순차적인 층의 구조가 다양한 수준의 모양을 잡아냄
• 얕은 층의 경우 전반적인 모습을 잡아냄
• 깊은 층의 경우 구체적인 모습을 잡아냄
Deconvolution Network의 Activation map을 보면 층과 pooling 방법에 따라 다른 특징이 있음
• Unpooling의 경우 “example-specific”한 구조를 잡아냄 (자세한 구조를 잡아냄)
• Transposed Conv의 경우 “class-specific”한 구조를 잡아냄 (위의 구조에 빈 부분을 채워넣음)
• 실제로 둘을 병행시에 FCN보다 DeconvNet의 활성화 맵이 디테일해지는 모습을 볼 수 있음
SegNet의 발전 동기
• Road Scene Understanding applications라는 분야에서 Semantic Segmentation을 수행하기 위해
모델이 필요한 능력에 대한 고민
• 특히, 자율 주행에 있어 차량, 도로, 차선, 건물, 보도, 하늘, 사람 등의 class를 빠르고, 정확하게 구분할 수 있어야함
-> Real Time segmentation
1. 가운데 부분 제거해서 파라미터 수 감서 -> 속도 향상
2. 크기 키우는 부분 Transposed 사용하지 않고 Unpooling 사용해서 학습 필요없음
3. Secoder 부분에서 Sparse -> Dense 로 바꾸어 줄때 Deconv가 아닌 conv 사용 | 마지막에 Deconv 두개 였는데 Conv 하나로 바꿈
4. Score 예측시 1x1 -> 3x3 Conv 사용
Skip Connection
Neural network에서 이전 layer의 output을 일부 layer를 건너 뛴 후의 layer에게 입력으로 제공하는 것
Resnet
Architecture
feature map합치는 방법은 channel 별 concat
인코더의 정보를 skip connection을 통해 decoder로 건네줌
Why the receptive field is so important?
Case I : bird Image (A) 에서, 서로 다른 receptive field를 가지는 segmentation을
진행한다면?
Case II : 아래 image에서, receptive field가 작은 segmentation을 진행한다면?
receptive field가 bus에 대한 정보를 다 포함하지 못하므로 예측 정확도가 낮음
What is the receptive field?
(Case I : Conv → Conv 의 receptive field)
(Case II : Conv → Max Pooling → Conv 의 receptive field)
conv-maxpooling-conv 반복시 효율적으로 receptive field를 넒힐 수 있음
그러나, Resolution 측면에서는 Upsampling 시 해상도가 낮아지는 문제점 발생
-> 이미지의 크기는 많이 줄이지 않고 마라미터의 수도 변함이 없는 채로 Receptive Field 만 넓게 하는 방식이 없을까?
Dilated Convolution
파라미터 갯수 동일하지만 Receptive Field만 넓어짐
DeepLab v1
2x2 max pooling -> 3x3 max pooling
dilated conv
conv4, 5는 pooling 시 padding 1 주어 이미지 사이즈 그대로 유지
conv 5는 dilation rate =2 주어 receptive field 더 크게 함 -> 코드에서는 max pool 과 avg pool 두번 하는 방법 사용
conv1,2,3 를 통해 input image 크기 1/8이 되었고, 이를 Bilinear Interpolation UpSampling 해줌
Bilinear Interpolation
내분을 이용한 계산
Dense Conditional Random Field (Dense CRF, a.k.a Fully-Connected CRF)
Bilinear Interpolation 으로는 픽셀 단위의 정교한 segmentation이 불가능
이를 개선하기 위한 후처리 방법 → Dense CRF
DeepLab v1 전체 pipeline
2x2 max poolong 적용
conv4,5 에서 pooling 제거
FC6 에서 7x7 conv에 rate = 4
UpSampling 시 Deconv 사용
conv5에서 dilate eate = 2를 줘서 이미지 크기 변함 없게 함
Further Reading
DeconvNet
SegNet
DeepLabv1
DilatedNet
서로 다른 dilate rate 를 가지는 branch 4개를 sum을 취하는 형태 : 논문에서는 ASPP 라고 표현
rate 작 : 작은 이미지 / rate 큰 : 큰 이미지
결과
ASPP 적용은 1.2 증가
CRF 적용시 훨씬 더 큰 성능향상 보임
PSPNet 도입배경
FCN의 문제점
Pooling이 진행될수록 이론적인 사이즈오 실제 사이즈의 크기 차이가 커짐
Global Average Pooling
주변 정보(문맥)을 파악해서 객체를 예측하는데 사용
Average pooling은 4개의 영역으로 나누어 평균을 내므로 golbal context 정보를 가짐
따라서 PSPNet에서는 grid 크기가 서로 다른 global Average pooling을 여러번 진행t 이후 (b)Feature map과 (c)pyramid pooling Module을 Upsample한 output을 서로 concat
결과
ASPP에 global Average Pooling (Feature map을 전부 평균내서 1x1 크기를 만들어줌) 추가로 golbal context 더 잘 캐치
차이점
Architecture
Encoder
Decoder
ASPP 모듈의 출력을 (bilinear)up-sampling하여 low-level feature와 결합
결합된 정보는 convolution 연산 및 up-sampling 되어 최종 결과 도출
기존의 단순한 up-sampling 연산을 개선시켜 detail을 유지하도록 함
modified Xception Backbone
Xception 구조는 Depthwise Separable convolution을 사용
인코더-디토더 구조를 갖는 DeconvNet, SegNet
Upsampling 기법으로 UnPooling사용(Max UnPooling) -> 자세한 구조적인 모습 복원
Transposed Conv 사용하여 구조 안을 채움 | 둘을 함께 쓰면 성능 향상
Segnet 은 real time가능
Skip Connection
FC Dense Net, UNEt
receptive field 크게
Dilated Convolution 사용 - DeepLab v1
Dense CRF - DeepLab의 단점을 보완하는 후처리 기법
Dilated Net - DeepLab v1에서는 3x3 maxpooling , 여기서는 2x2 3번 적용 / covnv4,5 max pooling 제거 / conv5, fc6 에서 dolated conv적용 / UpSampling시 Transposed conv 사용 | Basic Context module 추가로 dilate 비율 다양하게 적용
DeepLab v2 - covn5 avg pooling제거 / ASPP 적용 - 다른 rate를 가지는 dilate conv 이후 summation / backbone resnet
PSPNet - FCN의 3가지 문제점(객체들간의 관계 캐치 못함, 비슷한 클래스 객체 혼동, 무늬 비슷하고 작은 객체 구분 못함) 해결 -> global context -> global average pooling + average pooling 함께 사용
DeepLab v3 - global average pooling을 ASPP 영역에 적용 / sum이 아닌 concat하여 결과 합침
DeepLab v3+ - backbone에 modified Xception 적용 / 인코더-디코더 구조로 low level + ASPP feature 결합해서 사용 / 단계적인 UpSampling
Further Reading
DeepLabv2
PSPNet
DeepLabv3
DeepLabv3+