강의내용
(04강) FCN의 한계를 극복하려고 한 논문들
FCN의 단점은 지역적으로 관찰해서 커다란 물체가 가까이서 찍히면 하나의 물체로 보지 못하고, 사진상에서 작은 물체는 사라지고, FCN-8s도 경계선을 자세하게 못잡는 문제가 있었음.
이걸 해결하려는 모델 중 하나가 DeConvNet
- Unpooling은 디테일한 경계를 포착
- Transposed Convolution은 전반적인 모습을 포착
단점은 어디서 maxpool을 했는지 따로 정보를 저장해놔야 함.
여기서 얕은 층, 깊은 층이 무슨말이냐 하면 평소 CNN에서도 얕은 층은 전반적인 지식을, 깊은층으로 갈수록 목적에 맞는 구체적인 지식으로 바뀌는데 그거랑 같은거다.
위 그림에서 c, e, g, i가 unpooling이고 b,d,f,h,j가 deconv로 한거임. 보면 unpool은 해당 특징값을 잘 저장하지만 deconv가 자세하게 잘 잡아냄.
그래서 이렇게 만든 DeConvNet 단독으로도 mIoU가 잘 나오고, FCN8s 이랑 합치면 더 잘 나온다.
DeConvNet에선 BatchNorm도 추가됨. 또 나중에 unpool에서 사용할 위치정보 저장을 return_indices=True 를 통해 해서 여기서 추가로 return된 정보를 unpool에서 불러온다.
자세한 코드내용은 pdf 보자.
출처 : V. Badrinarayanan, A. Kendall and R. Cipolla, "SegNet: A Deep Convolutional Encoder-Decoder Architecture for
Image Segmentation," in IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. 39, no. 12, pp. 2481-2495,
1 Dec. 2017, doi: 10.1109/TPAMI.2016.2644615.
반면 SegNet은 속도중심. 얼마나 빠르게 찾아내느냐. 그래서 fc없애고 deconv대신 그냥 conv 사용한다.
skip connnection은 걍 건너뛰는거. FC DenseNet 말고 Unet 도 있음. 둘 다 그냥 더한게 아니고 concat 한거인듯.
지금까진 encoder decoder 구조를 통해서 성능을 향상시키고 skip connection 구조를 이용해서 성능을 향상시키는 두가지 방법..
receptive field를 더 키워서 넓게 보자! 해서 나온게 DeepLab v1. 막 좁게보니까 버스에 창문달려있으면 각각 다른걸로 구분하고 그러니까..
그래서 평소에 하던것처럼 max pool로 획기적으로 늘릴 수 있긴 한데 Resolution 측면에서는 low feature resolution을 가지는 문제점 발생. 어떻게 하면 이미지 크기는 많이 줄이지 않고 파라미터 수도 변함없이 receptive field만 넓게 하는게 없을까? 해서 나온게 Dilated Convolution. 평범한 CNN에서 듬성듬성 읽게 만든거다.
실제론 사이사이를 0으로 채워서 넣는 방식으로 작동함.
자세한 코드 내용은 pdf.. 다른점은 conv4와 conv5 뒤에 Maxpooling을 붙이지만 이미지 사이즈 크기는 고정하게 함.
자세히 보면 Up Sampling 부분에 Bi-linear Interpolation이 있는데 이게 뭐냐면 up sampling으로 빈공간이 생기는 사이 값을 채워주는거.
align_corners 의 true false 차이점도 있다. 그렇게 엄청난 차이는 아닌듯.
이걸 보고 감명받아서 나온게 DilatedNet.
아까 위에서 봤던 DeepLab v1에서 conv4의 maxpool과 conv5의 maxpool이 사이즈도 고정하는데 그럼 maxpool해서 정보만 잃어버린다. 그럼 왜 쓰지? 해서 걍 없앰. 결과는 더 잘 나오더라.
Dilated cnn으로 듬성듬성 읽는거니까 그걸 줄이기 위해 여러개를 읽게하는게 어떨까 하는게 이 논문에서 제안하는 거.
DeepLab v2는 감동받아 바로 모델에 채용함.
이것도 문제가 있어서 PSPNet이라는게 나왔는데, Mismatched Relationship, Confusion Catgories, Inconspicuous Classes 문제가 있었음. FCN도 maxpool로 reception field를 늘렸는데 왜 안됬나 분석해보니 이론상의 reception field와 실제 reception field가 상당이 차이가 있다. 거의 3배 수준.
그래서 아 maxpool 같은거 쓰지 말고 Global Average Pooling을 써보자 해서 만듬.
Global Average Pooling이 뭐냐면 그냥 그 정보에 해당하는 모든 것들을 평균내서 저장함.
그래서 추상적으로 정보가 남는 conv와 달리 확실하게 해당 정보가 남는다.
또 감동받아서 DeepLab v3에서 채용함. 단지 기존의 Dilated conv랑 같이 사용하는 방식. 결과는 더 잘나오더라.
목표
ipynb로 주어진 baseline code를 IDLE로 만들기. unlabel를 label로 바꿔서 훈련데이터로 넣는거 알아보기, 점프 투 장고 소 1챕터 공부하기.
행동
IDLE로 모듈화 하는건 못했음. 좀 고민이 있다. 이미 만들어진 깃허브 레지스토리에 어떻게 넣어야 할지. 과제코드도 같이 넣어야 할지, 폴더 구성은 어떻게 해야 할지..
unlabel 바꾸는건 좀 나중에 할 수 있을 것 같음.
점프 투 장고 했고.
SegNet 짜는거 과제로 했는데 완전히 처음부터 학습하는 것보다 vgg16 pretrained 된걸 불러와서 하는게 확실히 성능이 좋아지더라. 똑같이 10 epoch 했을 때 val mIoU가 0.2160에서 0.3467로 상승.
일단 SegNet으로 한건 epoch 11로 했을 때가 val 최대로 나옴. 이 이상하는건 overfitting이 일어나는 듯.
회고
zoom 중 공부하는 방에 들어가는게 집중이 더 잘되는듯.
'과거의 것들 > AI Tech boostcamp' 카테고리의 다른 글
P-stage3 [Day4] (0) | 2021.12.01 |
---|---|
P-stage3 [Day3] 모듈화 대강 다함 (0) | 2021.12.01 |
P-stage3 [Day1] 역사, metric 등 (0) | 2021.11.30 |
P-stage2 마지막 정리 (0) | 2021.11.30 |
P-stage2 [Day9] 외부 데이터 (0) | 2021.11.30 |