티스토리 친구하기

본문 바로가기

논문 Review

ICNet: Real-time Semantic Segmentation on High Resolution Images

728x90

  오늘 제가 리뷰할 논문은 ICNet for Real-time Semantic Segmentation on High-Resolution Images 입니다. ICNet은 Real-time이라는 말이 제목에 들어가는 것처럼, 빠르게 Semantic Segmentation할 수 있는 방법을 소개하고 있습니다.

 

Introduction

  ICNet은 image cascade network의 약자로 ECCV 2018에서 발표된 Semantic Segmentation 알고리즘입니다. 이 논문의 저자들은 실제로 Semantic Segmentation 알고리즘이 Automatic ~ 과 같은 많은 practical한 task에서 활용될 수 있도록 속도를 빠르게 하면서 quality를 희생시키지 않는 것이 중요하다고 생각했습니다.

  아래의 표는 Cityscapes dataset에 대해서 frameworks들의 accuracy와 inference time을 나타낸 것입니다. ICNet은 Nvidia TitanX GPU card를 이용해서 1024x2048의 high-resolution image를 real-time이라고 간주할 수 있는 약 30FPS의 inference time으로 prediction하는 것을 확인할 수 있습니다. 추후에 다시 설명드리겠지만, 본 논문에서는 multi-resolution branches를 이용해서 accuracy를 희생시키지 않으면서 inference 속도를 증가시키는 방법을 제안하고 있습니다.

 

  아래의 영상은 유튜브에서 Cityscapes dataset을 prediction한 결과를 보여줍니다. 아마 한장 한장 prediction한 후에 각 사진을 영상으로 만든 것 같습니다. 많은 알고리즘들의 결과를 보면 자동차, 도로, 건물, 사람 등 대부분의 object들을 잘 Segmentation하는 것을 알 수 있습니다. 그럼에도 불구하고 각 알고리즘의 accuracy가 차이가 나는 이유는 신호등, 가로등, 의자처럼 작아서 Segmentation하기 어려운 object나 각 object들 사이의 경계에서 발생하는 오차처럼, detail한 부분의 오차가 쌓여서 발생하는 것입니다. 본 논문은 이러한 detail한 부분을 놓치지 않으면서 accuracy를 유지할 수 있는 방법을 제안하고 있습니다.

 

1. Speed Analysis

  본 논문에서는 accuracy를 희생시키지 않으면서 inference 속도를 높이는 것이 목표이기 때문에, 속도를 증가시키는 요인이 무엇인지 알아내는게 중요할 것 같습니다. V는 Input feature map, K는 Kernel spatial size, 그리고 U는 Output map을 의미합니다. 어떤 이미지가 주어졌을 때, Convolution연산을 수행하는데 필요한 계산은 다음과 같습니다. 즉, 크기가 w,h,c인 input image를 크기가 k,k,c인 필터 c’개로 Convolution 하는 연산의 수는 아래의 보이는 식이 됩니다. 그럼 연산량을 줄이기 위해서는 커널의 크기를 줄이든가 / 아니면 input image의 크기를 줄여야 합니다. 그런데 커널의 크기가 3 by 3 이라면 더 이상 줄일수가 없기 때문에 input image의 크기를 줄여야 합니다.

  왼쪽의 그래프는 PSPNet50에서 이미지의 크기를 줄였을 때의, 계산시간을 비교한 것입니다. 예상한 것처럼 이미지의 크기를 1/4로 줄였을 때, 계산량도 1/4로 줄어든 것을 확인할 수 있습니다. 여기서 input image의 크기를 줄이면 계산량이 줄어든다는 것을 알게 되었는데, input image의 크기를 줄이면 detail이 사라지기 때문에 accuracy가 떨어지게 됩니다. 본 논문에서는 이렇게 떨어진 accuracy를 계산량을 덜 증가시키면서 높일 수 있는 방법을 제안하고 있습니다.

 

2. Network Architecture

  그 방법은 아래의 Architecture와 같이 multi-branch를 이용하는 것입니다. Red, 주황, green 순서로 top, medium, bottom branch를 의미합니다. Top branch에서는 원본의 1/4크기의 이미지를 input 이미지로 사용합니다. 줄어든 이미지는 PSPNet50의 입력으로 사용되어 1/32 resolution의 feature map을 만듭니다. Top branch에서 input image의 크기가 줄어들기 때문에 details를 놓치고 boundaries가 blurry되지만, 대부분의 semantic parts을 얻을 수 있습니다.Medium, Bottom branches에서 이렇게 잃어버린 detatil을 recover(복구)하는 것을 도와줍니다. 대부분의 semantic parts는 Top branch에서 얻었기 때문에 medium, bottom branches는 안전하게 parameters의 수를 제한할 수 있습니다.

 

  정리하면, 비록 top branch는 full segmentation backbone을 사용하지만 input으로 low-resolution image를 사용하기 때문에 computation cost를 줄일 수 있고, low-resolution image 사용하기 때문에 top branch에서 놓친 detail한 부분은 medium, bottom branch에서 상대적으로 shallow 한 신경망으로 refine(복구) 해주었기 때문에, 전체적으로 computation cost는 줄이면서(즉, prediction 속도를 높이면서) accuracy를 유지할 수 있었다.. 라고 정리할 수 있습니다.

 

Image Cascade Network

1. Cascade Feature Fusion

  다른 resolution inputs로부터 cascade feature들를 합치기 위해서, 본 논문에서는 왼쪽의 red box로 표시한 것처럼 cascade feature fusion(CFF) unit을 제안했습니다. F1은 top branch의 feature map, F2는 medium branch의 feature map을 나타냅니다. Feature map의 크기를 맞추기 위해 F1을 upsampling 합니다. 그리고 upsampled feature map을 refine하기 위해 dilated convolution을 적용합니다.이 dilated convolution은 원래 인접한(upsample하기 전에는 인접했던) 여러 픽셀의 feature information을 결합합니다. F2에 대해서, channel의 수를 F1과 맞추기 위해서 1 by 1 kernel사용해서 projection convolution을 합니다. 그 다음에 각각 batch normalization 한 후에 element-wise ‘sum’하고 ‘ReLU’ layer를 통과시켜 최종적으로 F2’ feature map을 얻었습니다.

 

2. Cascade Label Guidance

  각 branch의 learning procedure를 강화하기 위해, cascade label guidance 전략을 사용했습니다. 즉, loss를 최종단에서만 계산하는게 아니라 왼쪽의 그림에서 처럼 중간중간에 loss를 구하고 / 각 loss에 loss weight (가중치)를 곱해서 어느 loss를 더 줄일지 결정합니다. (예를 들어, loss1에 상대적으로 큰 weight 곱하면 loss1을 다른 loss들보다 더 많이 줄여야 전체 loss가 줄어들기 때문에 detail한 부분보다는 전체적인 segmentation 성능을 높일 수 있을 것이고, loss2나 loss3에 큰 weight를 곱하면 detail한 부분을 segmentation 하기 위해 학습을 진행하게 될겁니다.)

 

3. Append weighted softmax cross entropy loss in each branch with related loss weight

  다음은 앞서 말씀드린 loss를 계산하는 식입니다. Index들은 아래의 그림을 참조해주세요. 각 category의 pixel값에 대한 softmax cross entropy loss를 계산하고, 그 값의 평균을 계산하기 위해 모든 픽셀들을 더하고 면적으로 나눠줍니다. 그리고 각 branch마다 loss weight를 곱해줍니다.

 

4. Difference of ICNet from existing cascade architectures

  ICNet의 framework는 기존의 Semantic Segmentation framework와는 차이가 있습니다. (a)는 FCN처럼 skip connection을 사용하는 framework, (b)는 SegNet, UNet, ENet 등에서 사용하는 Encoder-decoder structure입니다. (c)는 PSPNet, DeepLab 등에서 사용한 Multi-scale prediction ensemble이 적용된 structure이고,  (d)에서는 오직 low-resolution input만 heavy한 CNN에 입력됩니다. Higher-resolution inputs은 blurred boundaries와 missing details를 recover하고 refine하기 위해서 shallow한 신경망의 input으로 사용됩니다.

 

 

Experimental Evaluation

1. Implementation Details

  다음은 Implementation Detail를 나타냅니다. 자세한 내용은 한번 읽어보시면 될 것 같습니다. 저는 드론에서 Inference해야하기 때문에 임베디드 보드에서 작동할 수 있어야 합니다. ICNet논문에서는 TiTAN X GPU로 학습을 하고 저는 RTX2080으로 학습을 하였습니다. TiTAN X에서 inference 속도가 30FPS이기 때문에 성능이 1/12인 Jetson TX2에서는 이미지의 크기를 1/4로 줄이면 7~8FPS 속도로 inference 할 수 있다는 계산이 나오는데, 실제로 테스트 했을 때에도 7~8FPS정도 나오는 것을 확인했습니다.

 

2. Cityscapes Dataset and Intuitive speed-up

  Cityscapes는 1024x2048의 high-resolution image를 있으며, 2975, 500, 1525개의 training, validation and testing sets으로 구성됩니다. 본 논문에서 Training과 testing은 road, person, car 등 19개의 classes로 이루어졌습니다. 본 논문에서는 inference 속도를 증가시키기 위해 다음과 같이 3가지를 고려했습니다. 첫 번째는 Input image를 down-sampling 하는 것, 두 번째는 Feature map을 down-sampling 하는 것, 세 번째는 model을 compression 하는 것입니다. 

 

<Down-sampling input>

  본 논문에서는 image의 크기를 1/2과 1/4로 down-sampling 해서 PSPNet50에 feeding했습니다. Inference time이 줄어든 만큼 accuracy가 떨어진것을 확인할 수 있습니다. Scaling ratio 가 0.5인 경우는 accuracy가 낮아진 정도가 적지만 real-time이라고 하기엔 running time이 아직 길다는 것을 확인할 수 있습니다.

 

<Down-sampling feature>

  본 논문에서는 feature에 대한 down-sampling ratio를 1:8, 1:16, 1:32 조절하여 테스트했습니다. Test  결과는 table1의 왼쪽 표와 같습니다. Sample size가 작아질수록 inference 속도는 증가하지만 accuracy가 떨어지는 것을 확인할 수 있습니다.

 

<Model Compression>

  아래의 표는 model compression에 따른 성능을 나타냅니다. Model compression은 filter를 제거하여 그에 상응하는 feature map을 제거하는 방식으로 진행했습니다. Kernel keeping rate가 작을수록 속도는 빨라지지만 accuracy는 상당히 떨어지는 것을 확인할 수 있습니다.

 

 

3. Ablation Study

<Cascade Branches>

  다음 table2는 본 논문에서 진행한 Ablation study의 결과를 나타냅니다. Baseline으로는 half-compressed PSPNet50이 사용되었고, 성능은 외쪽의 표와 같습니다. Sub4는 low-resolution image를 사용하는 top branch만 사용한 것이고, Sub24는 top, medium branch, 그리고 Sub124는 top, medium, 그리고 bottom branches를 모두 사용한 것입니다. 실험결과 모두 사용했을 때, accuracy가 Baseline과 거의 일치하지만 inference속도와 memory consumption이 크게 감소한 것을 확인할 수 있습니다.

 

<Cascade Structure>

  아래의 표는 cascade feature fusion unit(CFF)과 cascade label guidance에 대한 ablation study 결과를 보여줍니다. Deconvolution을 한 것보다 CFF unit을 사용한 것이 performance와 inference time 측면에서 더 좋다는 것을 확인할 수 있습니다. 7 by 7 Deconvolution을 사용한 것이 accuracy는 더 좋지만 속도면에서는 CFF가 더 빠른 것을 확인할 수 있습니다.

 

4. Method Comparison

  다음은 다른 Semantic Segmentation 알고리즘과의 performance를 비교한 table입니다. 이 실험은 TitanX GPU로 이루어졌습니다. ICNet은 Cityscapes dataset에 대해 약 90,000번 iterations을 통해 학습되었습니다. 제안한 ICNet은 1024x2048의 high-resolution input image에 대해 69.5% 의 accuracy 를 보이고, 33ms, 약 30.3 FPS의 inference time을 기록했습니다. Fine and coarse data는 accuracy 를 70.6%까지 향상시켰습니다.

 

<Visual Improvement>

  이전까지는 숫자로 performance improvement 를 나타냈었는데, 다음은 performance improvement를 visually 나타낸 것입니다. 흥미롭게도, 비록 top branch만을 사용했을 때에도 대부분의 semantically meaningful objects는 capture하는 것을 볼 수 있습니다.  그러나 오른쪽 상단에서처럼 pole이나 traffic sign 등과 같은 small-size의 object을 놓치거나 blurry된 object의 boundary가 발견되는 것을 확인할 수 있습니다. Sub124 branch는 이러한 detail을 refine하는데 도움을 주는 것을 확인할 수 있습니다.

 

  Diff1과 diff2는 각각 sub24와 sub4와의 차이와 sub24와 sub124와의 차이를 나타낸 것입니다. Diff2가 diff1보다 white가 더 얇게 나타나는 것을 보면 좀 더 detail한 inference가 가미되었다는 것을 유추할 수 있습니다.

 

 

<Quantitative Analysis>

  아래의 표는 정량적으로 분석할 결과를 보여줍니다. 가로축인 Bin index는 연결된 region의 크기를 나타내는데, 1은 30 pixel, 2는 60 pixel, 이런식으로 왼쪽은 작은 region, 오른쪽으로 갈수록 큰 region을 의미합니다. 세로축인 accuracy는 각 연결된 region에서 정확하게 prediction한 pixel의 수를 counting해서 연결된 region으로 나눈것을 의미합니다. 즉, 정확히 prediction한 만큼 segmentation accuracy 가 증가했다는 것을 의미합니다. histogram에서 상대적으로 더 작은 region을 나타내는 왼쪽부분에서 accuracy가 높다는 것은 detail한 부분에서 더 많은 개선이 일어났다는 것을 의미합니다.

 

<CamVid and COCO-Stuff>

  마지막으로 다른 데이터셋으로도 평가해보았습니다. Cityscapes dataset과 마찬가지로 높은 accuracy를 보이면서 동시에 빠른 inference 속도를 보여줍니다.

 

 

Reference

  논문을 이해하기 위해 많은 사람들의 도움을 받았습니다. 아래는 제가 블로그를 작성하면서 참조했던 논문과 블로그, 유튜브 주소입니다. 자신의 지식을 기꺼이 나누어주시는 고마운 분들 덕분에 보다 쉽게 공부할 수 있었습니다. 블로그를 읽으시면서 부족했던 부분은 아래의 Reference를 참고하시면 큰 도움을 받을 수 있을거라고 생각합니다. 혹시 포스팅을 하면서 궁금하신 점이나 코멘트 또는 틀린 부분을 지적해주시면 감사히 수정하도록 하겠습니다. 감사합니다.

 

1. Paper URL

http://openaccess.thecvf.com/content_ECCV_2018/html/Hengshuang_Zhao_ICNet_for_Real-Time_ECCV_2018_paper.html

 

2. Blog, Youtube, etc.

https://intuitive-robotics.tistory.com/

https://www.youtube.com/watch?v=qWl9idsCuLQ

https://www.slideshare.net/ssuser6135a1/ss-106656779

https://fuzer.github.io/Compressing-and-regularizing-deep-neural-networks/

https://zzsza.github.io/data/2018/02/23/introduction-convolution/

https://www.jeremyjordan.me/semantic-segmentation/

http://www.birc.co.kr/2018/01/08/softmax-classification/

https://www.techpowerup.com/gpu-specs/tegra-x2.c3231

http://mi.eng.cam.ac.uk/research/projects/VideoRec/CamVid/

http://cocodataset.org/#home

 

 

반응형