[Computer Vision] Image Segmentation이란?
새롭게 준비할 연구 주제로, 차량 부분 영상에서 파손 부위를 인식 및 표시할 수 있는 시스템을 구현해보려고 한다.
조금 찾아보니 쏘카에서 개발한 내용이 있던데, U-Net을 이용한 Image Segmentation 기법을 사용했다고하여
Image Segmentation에 대한 정리를 해본다.
Image Segmentation은 영상에서 인간이 직관적으로 분류할 수 있는 개체별로 Class나 Label을 나누는 것을 말한다.
Segmentation은 Classification처럼 영상 자체를 하나의 범주로 분류하는 것이 아니라,
영상의 픽셀 하나하나에
Label을 나누어 하나의 픽셀이 어떤 레이블에 속할지 분류하는 것을 뜻한다.
위와 같은 영상에서 자전거 선수의 손 부분을 확대해보면 수 많은 픽셀들로 이루어져 있을 것이다.
이러한 픽셀 하나하나가 Person / Bicycle / Background 중 어느 Label에 속할지 각 픽셀의 확률분포 중
가장 큰 확률값을 보이는 레이블을 선택해 해당 범주로 분류되는 것으로 판단한다.
이렇게 픽셀별로 Label 분류를 하면, 영상 내부에 인간이 직관적으로 분류할 수 있는 사람 / 자전거 / 배경 범주별로
기계가 구분할 수 있도록 학습시킬 수 있다.
Image Segmentation에는 크게 2가지 방법론이 있다.
1. Semantic Segmentation
2. Instance Segmentation
Semantic Segmentation은 객체별로 픽셀을 분류하지는 않고,
아래 그림처럼 Road / Sheep / Grass와 같이 클래스를 두어 각 클래스에 맞게 영상의 객체들을 구분한다.
예를 들면, 해당 영상속에서는 Sheep이 3마리 있을 것으로 추정되는데,
각 Sheep을 각기 다른 개체로 분류하지는 않고 셋 다 같은 Sheep이므로 같은 클래스로 묶어서 분류하는 것이다.
Instance Segmentation은 Semantic Segmentation과는 반대로 클래스로 분류하지 않고,
영상 속의 각 객체별로 픽셀을 분류한다.
아래 그림처럼 같은 Sheep이더라도, Sheep 1, 2, 3이 다르게 인식된다.
Semantic Segmentation에서 Sheep의 형태가 겹칠때 구분을 하지 못하는 문제를
Instance Segmentation에서 해결할 수 있다.
Semantic Segmentation에서는 Class 별로 One-Hot Encoding을 통해 Class 개수만큼의 출력 채널을 만든다.
따라서 같은 Class로 겹치게 되면 구분할 수 없게 된다.
반면, Instance Segmentation에서는 Class별로 Localization을 한 다음, 그 Local 안에서
Focus된 객체의 값을 뽑아내기 때문에, 같은 Class로 겹치더라도 구분할 수 있게 된다.
즉, 일단 각 객체별로 위 사진과 같이 Bounding Box에 객체를 Focus하고(Localization) 그 상자(Local) 안에서
Focus하고 있는 객체의 값들만 뽑아내기 때문에 (c) 처럼 서로 다른 차들이 겹치지 않는 것이다.
결과적으로 Semantic Segmentation과 Instance Segmentation의 동작 원리가 다르고,
도출하는 결과의 방향이 다르기 때문에 상황과 목적에 맞게 잘 사용해야겠다는 생각이 든다.
다음엔 Semantic Segmentation을 위한 대표적인 딥러닝 모델인
U-Net에 대해 공부해보는 시간을 가져봐야겠다.