다시 이음

딥러닝(11) - Image Segmentation & Data Augmentation & Object Recognition 본문

AI 일별 공부 정리

딥러닝(11) - Image Segmentation & Data Augmentation & Object Recognition

Taeho(Damon) 2021. 11. 3. 00:06

안녕하세요.

 

오늘은 Image Segmentation(이미지 분할) & Data Augmentation(데이터 증강) & Object Recognition (객체인식) 에 대해서 알아보려고 합니다.

 

어제는 시각적 데이터를 분류할 수 있는 인공신경망 CNN에 대해서 알아보았습니다.

 

오늘은 하나의 이미지에서 하나의 분류를 하는 CNN에서 좀더 발전되어 하나의 이미지에서 여러가지 분류를 하는 방법들을 보겠습니다.

 

 

Image Segmentation(이미지 분할)

 

 

Semantic Segmentation이란, 이미지내의 객체들을 의미있는 단위로 분할하여 픽셀별(pixel-wise)로 분류(Classification)하는 것입니다.

 

Instance Segmentation은 Semantic Segmentation에서 동일한 객체들이여도 개별 Object 별로 Masking을 하는 것입니다.

 

위의 그림을 통해 좀더 쉽게 이해가 가능할 것 같습니다.

 

위의 방식들을 사용하려면 어떤 모델을 사용해야 할까요?

 

 

FCN(Fully Convolutional Network)

FCN은 기존 CNN을 Segmentation에 맞게 변형된 이미지분할의 기초가 되는 모델입니다.

 

FCN은 Semantic Segmentation Encoder-Decoder Model의 종류 중 하나입니다.

 

FCN에 가장 큰 특징은 FC Layer 없이 Convolution Layer로만 구성되었고, Upsampling를 사용했다는 점입니다.

 

FCN은 Convolution과 Pooling이 되는 구간을 Encoder, Upsampling되는 구간을 Decoder로 구분합니다.

 

 

Upsampling

 

Upsampling은 우리가 이전에 배운 Pooling과는 반대가 되는 개념입니다.

 

Pooling할 때의 index를 기록해 두었다가 해당 index를 기반으로 거꾸로 Pooling을 합니다.

 

 

❄️ 그러면 왜 굳이 Feature Map을 줄였다가(Pooling) 다시 크기를 키우는(Upsampling) 작업을 할까?

 

1) Convolutional Layer를 거치면서 Downsampling됨에 따라 feature map의 크기가 줄고 두께는 점점 두꺼워지기 때문입니다.

Segmentation의 목표는 픽셀 단위의 정확하고 세밀한 분류 입니다. 원본 이미지에 대해 Segmentation을 수행해야 하는데 이처럼 Output 이미지의 크기가 줄어들어 정보가 소실되면 안됩니다.

 

2) 픽셀 단위의 예측에 비해 Output의 feature map이 너무 Coarse(거친, 알맹이가 큰)해질 경우 계산량이 너무 커져 효율이 떨어집니다. 따라서 Coarse Map의 해상도를 원본 이미지에 가깝게 올려주고, 원본 이미지 크기에 가까운 Dense Map으로 바꿔주는 작업이 필요합니다.

 

 

U-net

 

FCN의 구조를 보면 Downsampling이 끝나고 나서 급격하게 사이즈를 키워 원본데이터에 비슷하게 크기를 키우고 있습니다.

 

아무리 ResNet에서 사용되는 Skip connection 개념을 차용하여 가져와서 사용한다고는 하지만 그 횟수가 적기 때문에 성능이 그리 뛰어나지 않았습니다.

 

이러한 점을 보완하여 U-Net은 Fully Convolution Network(FCN)를 기반으로 하여 구축하였으며, 적은 데이터를 가지고도 더욱 정확한 Segmentaion을 내기 위해 FCN 구조를 수정하였습니다.

 

Unet의 구조

위의 그림에서 왼쪽에 해당되는 Downsampling 구간을 Contracting Path라고 지칭하고, 오른쪽에 해당하는 Upsampling 구간을 Expansive Path이라고 지칭합니다.

 

Upsampling을 하는 이유는 Contracting Path를 거친 feature map은 Downsampling으로 해상도가 많이 떨어져 있습니다. 해상도를 높이기 위해 Upsampling을 여러 차례 진행합니다.

 

FCN과는 다른 몇가지 특징이 있는데

 

1) Input data size : 입력데이터와 출력데이터의 사이즈가 다른걸 볼 수 있습니다. 분명 FCN에서는 같은 크기로 만든다고 한 것 같은데 왜 U-net에서는 다를까요?

 

왜냐하면 입력데이터가 입력되기전에 Padding을 거쳐 입력되었기 때문입니다. 여기서의 padding은 zero-padding이 아닌 Mirror padding 입니다. Mirror padding을 사용하는 이유로는 zero-padding을 사용하여 주변을 0으로 채워 연산하는 방법보다 주변을 반사시킨 값으로 반영하여 사용하기 때문에 인식률이 높아집니다.

추가적으로 기존에 zero-padding을 사용할때에는 가장자리의 정보가 중요하지 않을때, mirror padding은 가장자리에도 정보가 중요하다고 느낄 경우에 따라 사용자가 정하여 진행을 합니다.

 

2) Skip-connection : 이전의 우리가 배운 Skip-connection의 경우에는 입력데이터의 정보를 출력데이터에 더해주는 것이었지만 U-net에서는 옆에 상호대응되는 Encoder의 데이터를 받아와서 Decoder에 Copy&Crop&Concat을 해줍니다. 여기서 Crop이 붙어있는 이유는 Convolution을 거치면서 대응되는 값들이 정확하게 Encoder와 Decoder의 사이즈가 똑같지 않습니다. 하여 Decoder에 맞게 Crop되어서 사용됩니다.

 

 

Data Augmentation(데이터 증강)

 

데이터 증강은 적은 데이터로 더 많은 학습을 하기위해 사용되는 기법입니다.

 

데이터 증강은 꼭 훈련데이터에만 적용해야 합니다.

 

아래는 데이터 증강의 예시입니다.

 

  • 크기 배율 조절하기
  • 이미지 뒤집기
  • 이미지를 회색조로 만들기
  • 이미지 채도 포화시키기
  • 이미지 밝기 변경하기
  • 이미지 중앙 자르기
  • 이미지 회전하기

 

Object Recognition(객체 인식)

 

객체 탐지(object detection)객체 인식(object recognition)은 물체 식별을 하는데 유사한 기술입니다. 그러나 이 둘은 실행함에 있어 차이점을 갖습니다.

 

객체 탐지는 이미지내의 물체가 있는지를 확인하는 것이고, 객체 인식은 이미지내의 물체가 어떤 것인지 까지 파악하는 것입니다.

 

객체 인식의 방법에는 두가지가 있습니다.

 

1) 이미지를 Crop하여 나누어진 이미지를 각각 CNN을 사용하여 특징을 추출하고 각각 이미지 분류(FC)과정을 거치는 방법

2) 이미지를 CNN을 사용하여 특징을 추출한 뒤에 Crop하여 이미지 분류를 하는 방법입니다.

 

1번의 경우 CNN과 이미지 분류 과정이 이미지가 Crop하여 나뉘어진 개수만큼 진행이 되어야 하기에 연산량이 큽니다. 하지만 성능이 좋습니다.

 

2번의 경우 CNN 1번과 이미지 분류 n번을 사용하면 되기에 위의 과정보다는 연산량이 적습니다.

 

 

 

 

 

 

참고 : https://m.blog.naver.com/9709193/221974662268

https://medium.com/@msmapark2/u-net-%EB%85%BC%EB%AC%B8-%EB%A6%AC%EB%B7%B0-u-net-convolutional-networks-for-biomedical-image-segmentation-456d6901b28a

https://m.blog.naver.com/9709193/221979612209

https://kuklife.tistory.com/119

https://techblog-history-younghunjo1.tistory.com/193