대외활동/DSC CV Study

week6 - Semantic Segmentation

여니여니_ 2020. 2. 7. 15:21

Semantic Segmentation을 굳이 해석하자면,

 

semantic = '의미의', segmentation = '분할'

 

의미가 있는 분할? 

 

컴퓨터 비전에서 다뤄지는 문제들

  • Classification

  • Localization/Detection

  • Segmentation

 

Semantic Image Segmentation의 목적

이미지 상의 모든 픽셀을 class로 분류하는 것

 

픽셀에 대한 예측을 하는 것이기 때문에 Dense prediction이라고도 한다.

그러나 같은 class의 instance를 구분하지는 않는다.

 

예를 들어, 아래 사진에서 사람은 모두 같은 사람으로 구분하고

사람1, 사람2, 사람3 ... 해서 사람5까지 구분을 못한다는 뜻이다. 

 

 

 

사람 1, 사람2, 사람3 이렇게 Instance(개체)를 구별하는 모델은 Instance segmentation이라 한다.

 

 

 

 

Semantic Segmentation을 어떤 이미지에 시행하면 다음 그림과 같이 픽셀이 어느 클래스에 속하는지 알게된다.

 

아래 그림에서, 3번 클래스는 Plants/Grass이고, 1번 클래스는 Person이다.

 

출력 값은 각 픽셀의 예측된 클래스를 나타내는 Segmentation map이다. 

이 Segmentation map을 얻는 것이 Semantic segmentation의 목적이다.

 

 

적용 분야, 사례

Semantic Segmentation은 로봇 비전이나 로봇이 장면을 이해하는데 사용될 수 있고, 의료 영상, 자율주행에도 적용 가능하다. 궁극적으로 장면 이해(scene understanding)를 위한 기반 기술이 된다.

 

 

 

위 그림에서는 사람, 자동차, 신호등 등으로 이미지가 segmentation된 것을 볼 수 있다. 

 

 

또, 의료분야에서도 적용될 수 있다. 

 

다음과 같은 흉부  X-ray 사진에 수행하여 심장, 폐, 쇄골을 분할해냈다.

그러면 의사가 사진을 분석하는데 도움이 될 것이다.

 

Semantic Segmentation의 대표적 알고리즘, Fully Convolutional Networks (FCN)

FCN은 버클리대학에서 2015년도 CVPR에서 발표한 알고리즘이다. 

 

 

"Fully convolutional networks for semantic segmentation"

 

long_shelhamer_fcn.pdf
2.62MB

 

기존 AlexNet, VGGNet 등의 이미지 분류 CNN 알고리즘들은 일반적으로 컨볼루션 층들과 Fully Connected 층들로 이루어져 있다. 항상 입력 이미지를 네트워크에 맞는 고정된 사이즈로 만들어 입력해주어고 네트워크는 그 이미지가 속할 클래스를 예측한다.

 

 

이러한 분류용 CNN 알고리즘들은 이미지에 있는 물체가 어떤 클래스에 속하는지 예측할 수 있지만,

어디에 위치하는지 예측할 수는 없다. 왜냐면 네트워크의 후반부에 Fully Connected층에 들어서면서 위치 정보가 소실되었기 때문이다.

 

위치 정보가 소실되지 않기 위해 FCN 개발자들은 입력 이미지의 사이즈에 영향을 받지 않도록 알고리즘을 발전시켜 나간다.

 

먼저, 고정된 크기의 인풋만을 허용하는 Fully Connected 층을 1x1 컨볼루션층으로 바꾸어준다. 

 

 

 

 

(1x1 컨볼루션의 의미가 이해되지 않는다면?) - 진짜 이해가 잘 가지 않는다.. 어떻게 차원 감소 효과가 있고 비슷한 성질을 묶어낼 수 있는거지?

 

1번 참고자료2번 참고자료

 

1x1 컨볼루션의 목표는 dimensionality reduction

GoogLeNet 소개 논문에 나오는 것처럼, Hebbian principle에 의해 차원을 줄일 수 있다.

여러개의 피쳐맵으로부터 비슷한 성질을 갖는 것들을 묶어낼 수 있고, 결과적으로 피쳐맵 수를 줄이고 연산량을 줄이게 된다. 

 

 

결과적으로 네트워크 전체가 컨볼루션 층들로 이루어지게 되었다. 

 

Fully Connected 층들이 없어졌으므로 입력 이미지의 크기에 제한을 받지 않게 되었다. 

 

 

 

이제 어떠한 사이즈의 HxW의 이미지도 이 네트워크에 입력될 수 있다. 여러 층의 컨볼루션 층들을 거치고 나면 피처맵의 크기가 H/32xW/32가 되는데, 그 피쳐맵의 한 픽셀이 입력 이미지의 32x32 크기를 대표한다. 즉, 입력 이미지의 위치 정보를 대략적으로 유지하고 있는 것이다.

 

여기서 중요한 것은 이 컨볼루션 층들을 거치고 나서 얻게 된 마지막 피처맵 갯수는 훈련된 클래스의 갯수와 동일하다는 것이다.

 

21개의 클래스로 훈련된 네트워크이면 21개의 피쳐맵을 산출해낸다. 각 특성맵은 하나의 클래스를 대표한다.

 

(고양이, 강아지, 오토바이... 해서 21개의 클래스가 있으면 각 클래스마다의 피쳐맵을 만드는 것이다. 고양이가 있는 부분의 픽셀값의 숫자가 큰 피쳐맵... 이런식으로!)

 

만약 고양이 클래스에 대한 특성맵이라면 고양이가 있는 위치의 픽셀 값들이 높고, 강아지 클래스에 대한 특성 맵이라면 강아지가 위치한 픽셀의 값들이 크다.

 

 

이 대략적인(Coarse) 피쳐맵들의 크기를 원래 이미지로 다시 복원해줄 필요가 있다. 

 

이미지의 모든 픽셀에 대해서 클래스를 예측하는 Dense Prediction을 해주는 것이 Semantic Segmentation의 목적이기 때문이다.

 

이 원래 이미지 크기로 복원하는 과정을 Upsampling이라고 부른다. 업샘플링으로 각 클래스에 해당하는 coarse 피처맵들을 원래 사이즈로 키워준다. 업샘플링된 피쳐맵들을 종합하여 최종적인 segmentation map을 만든다.

 

간단히 말해, 각 픽셀당 확률이 가장 높은 클래스를 선정해 주는 것이다. 예를 들어, (1,1) 픽셀에 해당하는 클래스당 확률 값들이 강아지 0.45, 고양이 0.94, 나무 0.02 이런 식이라면, 이 픽셀은 고양이 클래스로 분류하는 것이다. 

 

그런데 단순히 업샘플링을 시행하면 피쳐맵의 크기는 원래 이미지 크기로 복원되고, 

그것들로부터 원래 이미지 크기의 segmentation map을 얻게되지만 여전히 coarse한, 디테일하지 못한 segmentation map을 얻게된다. 1/32배만큼 줄어든 특성맵들을 단숨에 32배 upsampling 했기 때문에 당연히 coarse할 수 밖에 없다. 이렇게 단숨에 32배 업샘플링 하는 방법을 논문에서는 FCN-32s라고 소개하고 잇다.

 

ground-truth와 비교해 많이 뭉뚱그려있고 디텔일하지 못함을 알 수 있다. 

 

 

FCN 개발자들은 좀 더 디테일한 segmentation map을 얻기 위해 skip combining이라는 기법을 제안한다.

기본적인 생각은 다음과 같다. 컨볼루션과 풀링 단계로 이루어진 이전 단계의 컨볼루션 층들의 특성 맵을 참고하여 업샘플링을 해주면 좀 더 정확도를 높일 수 있지 않겠냐는 것이다. 왜냐면 이전 컨볼루션층들의 피쳐맵들이 해상도면에서 더 낫기 때문이다. 이렇게 바로 전 컨볼루션 층들의 피쳐맵과 현재 층의 특성맵을 2배 업샘플 한 것을 더한다. ~ 이 방법을 FCN-16s라고 한다. 

 

또 더 나아가 전전 컨볼루션 층의 결과를 참고해 피처맵을 얻고 그 특성맵들로 segmentation map을 구할 수 있다. 이 방법을 FCN-8s라고 부른다. 더 구체적으로 얘기하면, 전전 단계의 특성맵과 전 단계의 특성맵을 2배한 것과 현 단계의 피쳐맵을 4배하여 더한 다음 8배 업샘플을 수행하므로 특성맵들을 얻는다.

 

이것들을 모두 종합하여 최종 segmentation map을 산출한다.

 

 

그림을 보며 FCN-32s에서 FCN-8s로 갈수록 더 정교하게 세분화된 것을 알 수 있다.

 

FCN을 그대로 사용하는 대신에 FCN + CRF(Conditional Random Field)를 사용하여 FCN의 결과를 좀 더 정밀하게 튜닝하면 더 정교한 예측도 가능해진다.

 

지금까지 ZFNet 개발자들의 중요한 업적 중 하나인 visualization 기법을 통하여 여러 단의 convolutional layer를 통하여 무엇을 얻을 수 있는 것인지 확인하였고, FCN 개발자들의 연구를 통해 여러 단의 Conv Layer 중 후반부의 convolutional feature들을 결합하면 Semantic segmentation에 필요한 중요한 정보를 얻을 수 있기 때문에 Conv+pooling으로 구성된 CNN 망이 Classification / Detection 뿐만 아니라 Segmentation에도 유용함을 확인하였다.

 

Multi-scale context aggregation by dilated convolution은 FCN에 대한 분석 및 약간의 구조 변경을 통하여 성능을 끌어올렸다.  - Dilated Convolution

 

FCN은 분류용으로 충분히 검증을 받은 망을 픽셀 수준의 조밀한 prediction이 가능한 semantic segmentation에 적용하기 위해 up-sampling 로직을 추가하였고, skip layer 개념을 적용하여 떨어지는 해상도를 보강하였다. 

 

한계점 

1. 사전에 미리 정한 receptive field를 사용하기 때문에 너무 작은 object가 무시되거나 엉뚱하게 인식될 수 있다. 큰 물체를 여러 개의 작은 물체로 인식하거나 일관되지 않은 결과가 나올 수도 있다. 

 

2. 여러 단의 conv+pooling을 거치며 해상도가 줄어들고, 줄어든 해상도를 다시 업샘플링을 통해 복원하는 방식을 사용하기 때문에 detail이 사라지거나 과도하게 smooting 효과에 의해 결과가 아주 정밀하지 못하다. 

 

FCN 문제점 극복을 위한 시도 - 새로운 architecture

FCN에서는 픽셀 단위의 조밀한 예측을 위해 업샘플링과 여러 개의 후반부 layer의 conv feature를 합치는 방식을 사용했는데, 이렇게 되면 앞서 살펴본 것과 같은 문제점이 발생하게 된다. 그래서 convolutional network에 대칭이 되는 deconvolutional network를 추가하였으며, 이를 통해 업샘플링 해상도의 문제를 해결하려고 했다. 

 

 

 

이들이 사용한 기본 망은 VGG16이다. DeConv Network 개념은 ZFNet 개발자들이 내부 layer의 feature를 시각화하는 작업을 할 때 개념이 소개가 되었으며, 맥스풀링의 위치를 기억하여 정 위치를 찾아가기 위한 switch variable 개념을 비슷하게 사용하였다. 

 

단순하게 bilinear interpolation을 이용한 upsampling이 아니라 여러 layer의 unpooling + deconvolution에 기반하기 때문에 훨씬 정교한 복원이 가능해진다. Deconv layer의 필터 계수? 역시 학습을 통해 결정되고, 계층 구조를 갖는 Deconv Layer를 통해 다양한 scale의 detail 정보를 살릴 수 있다.

 

Deconvolutional network의 각 층에서 얻어지는 activation을 시각화시킨 그림이다.

 

후반부로 갈수록 더 정밀한 결과가 얻어지는 것을 알 수 있고, 

배경 부분에 있던 noise성 activation이 후반부로 갈수록 사라지는 것을 확인할 수 있다.

 

 

 

다음은 FCN 방법과 Deconvolutional Network 방법을 비교한 결과이다. 조금 더 정밀한 세그멘테이션이 가능하다는 것을 알 수 있다.

그렇지만 파라미터 갯수가 많은 vgg16에 기반하고 있기 때문에 연산량 측면에서 부담이 있다. 

 

다음은 Fisher Yu의 Dilated Convolution이다.

 

Dilated Convolution이란, 기본적인 Convolution과 유사하지만 빨간색 점의 위치해있는 픽셀들만 이용하여 Convolution을 수행하는 것이 다르다.

 

 

 

https://blog.naver.com/laonple/220985349467

 

 

[Part Ⅶ. Semantic Segmentation] 4. Deconvolutional Network - 라온피플 머신러닝 아카데미 -

Part I. Machine Learning Part V. Best CNN Architecture Part VII. Semantic ...

blog.naver.com

 

https://withseohyeong.home.blog/2019/06/22/a-brief-guide-of-weakly-supervised-semantic-segmentation/

 

A Brief Guide of Weakly-Supervised Semantic Segmentation

최근 weakly-supervised semantic segmentation과 관련된 프로젝트를 맡아 하게 되었다. segmentation 분야는 물론이거니와 weakly-supervised segmentation 분야를 잘 몰라 related work 서치를 하며 관련 내용을 아이디어 위주로 정리해보자 한다. 해당 포스트에서 다룰 주요 페이퍼들은 다…

withseohyeong.home.blog

https://medium.com/nanonets/how-to-do-image-segmentation-using-deep-learning-c673cc5862ef

 

How to do Semantic Segmentation using Deep learning

This article is a comprehensive overview including a step-by-step guide to implement a deep learning image segmentation model.

medium.com

https://heartbeat.fritz.ai/a-2019-guide-to-semantic-segmentation-ca8242f5a7fc

 

A 2019 Guide to Semantic Segmentation

A review of state-of-the-art approaches

heartbeat.fritz.ai

https://bskyvision.com/491

 

semantic segmentation의 목적과 대표 알고리즘 FCN의 원리

요즘 semantic segmentation을 활용하는 연구를 하나 진행하고 있다. semantic segmentation, 이름만 봐서는 이것이 무엇인지 감이 안오는 분들이 있을 것이다. 구지 번역하자면 '의미적 분할' 정도로 번역이 가능..

bskyvision.com

 

 

semantic_segmentation.pdf
1.06MB

 

cs231n_2017_lecture11.pdf
7.18MB

 

 

 

 

사례

쏘카

 

 

Semantic Segmentation을 활용한 차량 파손 탐지 딥러닝 모델 개발기 - SOCAR Tech Blog

쏘카에서 2019년 하반기에 딥러닝 기반의 차량 파손 탐지 모델을 개발했습니다. 이 포스트를 통해 왜 차량 파손 탐지 모델을 만들게 되었는지, 어떤 고민들을 거쳐 요구사항을 설정하였는지, 어떤 기술들이 사용되었는지 등 프로젝트의 전반적인 내용을 소개하는 글입니다. 목차 차량 파손 탐지 모델을 만들게 된 배경 먼저 사용자가 쏘카 앱을 통해 쏘카를 대여하고 운행하는 과정을 알아보겠습니다. 1) 사용자가 차량을 이용할 쏘카존을 선택합니다. 2) 원하는 시간을

tech.socarcorp.kr

 

 

 

Kaggle 실습

https://www.kaggle.com/yooyeon96/severstal-simple-keras-u-net-boilerplate/edit

불러오는 중입니다...

U-Net 에 대한 포스팅이 있었다.

https://my-coding-footprints.tistory.com/80