오늘은 Sematic Segmentation 분야의 RefineNet 차례입니다.
이번엔 제가 발표를 맡게 되어서 ppt로 설명을 대체합니다.
semantic segmentation은 저번 주에 설명했기 때문에 이번 주에는 설명하지 않습니다!
semantic segmentation 각 픽셀에 대해서 classfication을 해줘야 하므로 논문에서는 pixel level dense prediction이라고 설명하고 있습니다.
논문을 수월하게 읽기위해 필요할 거 같아서 high-resolution , high-level등에 대해 간단하게 소개합니다.
feature map의 size가 클 수록 해상도가 높다 즉 high resolution을 가지고 있다고 표현합니다.
반대로 size가 작을 수록 해상도가 낮다 low resolution을 가지고 있다고 표현합니다.
생각해보면 인풋 이미지가 CNN을 거치게 되면 High resolution에서 시작해서 layer를 거치면 거칠수록 low resolution으로 바뀌는 걸 알 수 있습니다.
초기 layer에서는 위의 그림처럼 정교한 정보들 (고양이의 무늬, 눈, 수염 등)을 잘 가지고 있게 됩니다.
초기이기 때문에 Row level visual information이라고 표현하고 이 때는 디테일하고 정교한 (detailed & finer) 정보를 가지고 있습니다.
layer가 깊어질수록 대충 형태정도만 알아볼 수 있을 정도로 정교한 정보들을 읽고, 거친 정보들만 남게 됩니다.
이 때 layer가 깊으니까 high levlel visual information이라고 하며 이때는 coarse한 정보들을 가지고 있습니다.
pooling이나 stirde가 2 이상인 conv를 하면 feature map의 사이즈가 줄어들게 됩니다.
receptive filed가 증가함녀서 좀 더 global한 정보를 볼 수 있게되고, 채널의 수가 증가하지만 feature map의 size 즉 해상도가 감소하게 됩니다.
Resnet을 생각해보면 처음 input image에 비해 32배 정도 해상도가 감소해 저해상도의 feature map이 만들어집니다.
CNN으로만 Segmentation을 하려고 하면 저해상도의 feature map만 남아 coarse한 map만 남게 돼 정확한 pixel별 classfication이 불가합니다.
그래서 나온 아이디어가 Deconvolution을 이용하는 것입니다.
subsampling을 통해 downsampling을 해준 만큼 unsampling을 해주는 겁니다.
FCN, UNet, SegNet 등등의 인코더-디코더 구조의 모델들이 있습니다.
단순하게 Deconvolution만 이용하면 너무 coarse해 skip connection을 이용해 downsampling이 될 때의 feature map을 upsampling시에 붙여줘 더 좋은 해상도의 이미지를 만들게 도와줍니다.
하지만 여전히 coarse합니다,,, 왜일까요?
upsampling을 통해서 똑같은 고 해상도의 이미지는 만들 수 있어도, downsampling이 되기 이전의 feature로 되돌릴 수는 없기 때문입니다. 왜 안되는지는 잘 생각해보세요,,,!
downsampling은 featuremap의 사이즈를 축소시키고, 위치 정보를 잃게 만듭니다.
그래서 나온 아이디어는 down sampling 없이 dilated convolution을 사용해보자!입니다.
논문에서는 DeepLab이라고 말하고 있지만 , Deeplab v2의 특징보다는 dilated conv에 집중하므로
dilated conv에 대해서만 설명하겠습니다.
dilated conv는 모든 pixel에 대해서 kernel 곱을 해주지 않고 띄엄띄엄 해주는 것이 특징입니다.
빨간색 pixel들은 가중치곱이 되는 pixel들을 표현한 것이고, 그 사이사이는 zero-padding을 해줍니다.
dilatrion rate는 커널에 의해 계산되는 pixel간 거리를 의미합니다.
(c) 사진의 경우 r= 4라서 계산이 되는 pixel(빨간색 pixel)들 사이의 거리가 4입니다.
dilation rate에 따라서 receptive filed가 달라집니다.
(a)의 경우 r=1로 filed가 3x3입니다.
(b)의 경우 r=2로 filed가 7x7이 됩니다.
dilated conv를 쓰면 뭐가 좋을까요?
동일 파라미터 수 대비 더 넓은 receptive field를 수용할 수 있고, 이는 global한 정보를 볼 수 있게 해줍니다.
conv를 사용했더라면 global한 정보를 보기 위해 feature size를 줄여서 해상도 손실이 발생하게 됩니다.
하지만 dilated conv를 사용하면 feautre size를 줄이지 않더라도 global한 정보를 볼 수 있끼 때문에, 해상도 손실이 발생하지 않습니다.
하지만 문제가 있습니다.
계산 비용이 너무 비쌉니다. 중간 layer에서의 feature들을 다 기억해야돼서 Memory소비가 너무 큽니다.
즉, 저희같이 코랩쓰는 소상공인들은 OOM으로 돌려보지도 못하게 됩니다,,,
이전 Related work들은 위와 같은 문제점들이 있었습니다.
Refinenet에서는 Refine Block을 통해서 다양한 해상도의 feature들을 합치고, 최종적으로 고해상도의 예측을 하는 것을 목표로 합니다.
사진이 좀 지저분하네요,,ㅎㅎ,,
전체적인 과정은 우선 Resnet을 4개로 나눠주고 각각의 block에 RefineBlock을 할당해줍니다.
이 때 각각의 Resnet block에서 나오는 다양한 레벨의 feature들이 Refinenet을 통해 취합됩니다.
RefineBlock에서는 이전 Refine Block의 output과 Resnet에서의 feature들이 2가지 path로 input을 받습니다.
RefineBlock을 좀 더 자세하게 들여다보면 4가지 모듈로 구성되어있습니다.
근데 구조가 어디서 본 거 같지 않나요? 네 UNET과 비슷하죠 왜냐면 동일한 encoder-decoder구조이기 때문입니다.
FCN, UNET과의 차이점은 기존 모델들은 그냥 downsampling를 통해 나온 feature들을 upsampling시 더해줬다면,
RefineNet에서는 기본 Skip connection이 아닌 RefineNet을 통해 취합해주게 됩니다.
이런 식으로 다양한 level에서의 feature들을 통합하기 떄문에 고해상도의 픽셀 별 클래스 예측이 가능해지고, 이런 Skip connection을 통해서 backpropagation이 효율적으로 가능해져 end-to-end학습합니다.
이런 block은 유연하게 구성됩니다.
Refine Block을 자세하게 들여다보면 2가지 path에서 들어온 서로 다른 feature들은 각각 따로 RCU를 2번 거치게 됩니다. RCU는 batch normalization이 제거 된 Residual block과 동일합니다. Imagenet Classfication에 맞춰진 Resnet을 sematic segmatation task에 맞춰 fine-tunning해주는 역할을 합니다.
그 다음 서로 다른 사이즈의 2가지 feature들은 Multi-resolution Fusion 모듈에 의해 하나로 합쳐지게 됩니다.
이 들은 각각 3x3 conv를 통해 사이즈가 작은 이미지에 맞춰 사이즈를 rescale합니다.
그 후 upsampling을 통해 다시 사이즈가 큰 이미지에 맞춰지고 이후 pixel-wise하게 더해져 Fusion됩니다.
그 다음 하나로 합쳐진 사진들은 Chained Residual Pooling 모듈에 input으로 들어가게 됩니다.
이 모듈은 논문에서 핵심역할을 하고 있는데, 5x5 maxpooling (s =1 , p =2)와 3x3 conv(s=1, p=1)로 이뤄집니다.
맨 처음 Relu가 딱! 한 번만 되는데 이는 비선형성을 증가해주기 위함이고,
계속해서 Residual pooling을 하게 되면 3x3 , 5x5, 7x7등 더욱 다양한 receptive filed를 가지게 됩니다.
이는 더 global한 정보를 가질 수 있게 해주고, 전체적인 맥락을 고려하게 해줍니다.
이 때, residual connection을 통해 계속 더해주는데, 이 또한 backpropagation을 용이하게 해줍니다.
그 다음 output conv를 거치게 됩니다.
맨 처음에 거쳤던 RCU와 똑같고 output conv는 비선형성을 추가해주는 역할을 해줍니다.
평가 지표로는 IOU, Pixel accuracy, mean accuracy 3가지가 사용됐습니다.
+ object detection에서의 IOU 구하기는 머릿속에 잘 그려지는데 Sematic segmentation은 잘 그려지지 않아 찾아봤더니 multi class에서는 MIou를 사용한다고 합니다. 김진솔님의 블로그에서 기똥차게 설명하고 있으니 꼭 확인하시면 좋을 거 같습니다.
Pixel accuracy , mean accuracy를 계산하는 방법은 FCN논문에 나와있습니다.
총 7개의 dataset에 대해 진행을 해 sota를 달성했습니다.
위에서 얘기한 것과 같이 자유롭게 cascaded 를 구성할 수 있습니다.
본 논문에서는 cascade가 4개일 때가 최적이었다 라고 설명하고 있습니다.
Refinenet을 요약해보자면
- Refine Block을 통해 multiple level에서의 features를 합쳐 high resolution regmentation map을 생성합니다.
- long & short range connection을 통해 backpropagation이 용이해지고 end-to-end로 학습합니다.
- chained residual pooling을 통해 더 큰 receptive field를 수용해 global한 시야를 가지게 됩니다.
- 7개의 dataset에 대해서 sota를 달성했고, 당시 sota였던 DeepLab-v2를 압승했습니다.
참고한 자료들입니다. 사진 출처는 각 슬라이드 밑에 적어놨습니다.
와 처음에는 엄청 어렵게 보여서 무서웠는데, 막상 읽어보니 쉬웠던 논문인 거 같습니다.
검색을 했을 때 한국어로 된 설명이 하나도 없는 걸 보니,,,, 많이 쓰는 모델은 아닌 거 같지만,,,
덕분에 다른 글들에 의존하지 않고 논문을 이해하려고 노력할 수 있었던 기회 같습니다.
그리고 dilated conv , miou 등 Refinenet모델외에도 배울 게 많았던 논문이었습니다.
아직 딥러닝 초보자 + 영알못이라서 미숙한 점이 많습니다.
잘못된 부분이나 수정해야할 부분이 있다면 댓글로 알려주세요 😁
👾 논문은 여기서 다운받으실 수 있습니다.
👾 ppt는 여기서 다운받으실 수 있습니다
👾 youtube : www.youtube.com/channel/UCDg1jUw5sz4JB0G_4cJmNAg/videos
'영어논문 스터디' 카테고리의 다른 글
MASK RCNN 논문 리뷰 (3) | 2021.02.21 |
---|---|
SSD (0) | 2021.02.01 |
YOLO v1 리뷰 (0) | 2021.01.26 |
Faster RCNN 논문 리뷰 (0) | 2021.01.15 |
Fast RCNN 논문 리뷰 (0) | 2021.01.09 |