'데이터 엔지니어'로 성장하기

정리하는 걸 좋아하고, 남이 읽으면 더 좋아함

AI/Vision

AI-Vision) 데이터 엔지니어 AI 도전기 (1)_Semantic Segmentation #Unet #Instance와 차이

MightyTedKim 2024. 4. 14. 23:51
728x90
반응형

 

처음 Vision Model을 공부하다가, Yolo를 보면서 쉬워 보여 무시했는데

Unet을 하면서 당황했던 경험을 정리했습니다


( 이 글은 모델의 원리보다는 사용에 초점을 맞춥니다. )
 .
예상 독자는 아래와 같습니다.

  1. YOLO 말고 다른 Vision Model을 쓰시려는 분
  2. Semantic Segmentation을 처음 시작하는 분
  3. Unet을 처음부터 떠먹여 줄 글을 찾는 분

.

목차는 아래와 같습니다

  1. Semantic이란 무엇인가요? (Instance와 비교)
  2. 데이터셋 구조는 어떻게 되나요? (Original & mask)
  3. Prediction은 어떻게 나오나요? (Binary vs Multi-class)

.

제 목표는 아래와 같습니다.

  1. 이 글을 끝까지 읽으면, 아래 그림이 무엇을 뜻하는지 이해할 수 있다.

 

5분만 투자하면, 이게 뭔지 이해할 수 있을거에요!

 

1. Semantic이란 무엇인가요? (Instance와 비교)

segmentation에는 Instance와 Semantic이 있어요. 

1-1. Instance & Semantic 차이

Instance는 객체 하나씩을 탐지하고, Semantic은 여러 객체를 하나로 묶어서 보여줘요

https://medium.com/hyunjulie/1%ED%8E%B8-semantic-segmentation-%EC%B2%AB%EA%B1%B8%EC%9D%8C-4180367ec9cb

 
잉??????  응????  

instance가 무조건 좋은 거 아니야?
 

꼭 그렇지만은 않아요. 목적에 따라 좀 달라지거든요.

번역하면 객체별로 분리하냐, 영역을 표시하느냐로 볼 수 있어요

1-2. Instance & Semantic - 목적

Q: 몇 명의 사람이 있는지, 그리고 그들 중 몇 명이 가방을 메고 있는지 궁금해요.
A: 네, Instance Segmentation을 이용해 사람 8명과 가방 2개를 탐지할게요.

 
Q. 자율주행하려 하는데, 사람자동차가 어느 구역에 있는지 알려줘
A: 네, Semantic Segmentation으로 탐지할게요. 빨간색은 사람이고 파란색은 자동차입니다

 
semantic은 범위를 본다면, instance는 객체를 찾는 거에요,
학습에 필요한 이미지 설명하면서, 예시 몇 가지를 더 이야기할게요
 

2. 데이터셋 구조는 어떻게 되나요? (Original & mask)

2-1. Vision Model의 input

저와 같은 개발자 출신에게는 모델은, 입력을 받아 출력을 내놓는 라이브러리와 같습니다.

 
Vision AI 쪽에서의 학습 데이터셋은 크게 2가지가 필요해요.

  1. 원본 이미지
  2. 어노테이션

원본 이미지는 그대로 원본이므로 모두 같습니다. 일반적으로 jpg나 png 형식이죠
하지만 어노테이션은 각기 다릅니다

2-2. Vision Model의 input - 예시

COCOJSON을 사용하고, Pascal VOC는 XML을 사용합니다.

Object Detection , Panoptic Segmentation  https://cocodataset.org/#format-data

COCO는 JSON을 사용하고, Pascal VOC는 XML을 사용합니다.
YOLO는 txt 파일로 저장하고요

Unet을 사용한 Semantic Segmentation은 이미지를 기반으로 합니다

 
 

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
`이미지` 입니다.

 

2-3. Vision Model의 input - Unet

인터넷에서 데이터셋을 다운로드할 때 데이터셋이 검은색인 경우가 있을거에요.
하지만 자세히 보면 pixel 별로 색이 약간 다른 grayscale을 띄고 있는 경우입니다.

https://github.com/alexgkendall/SegNet-Tutorial

 
다시 처음으로 돌아오면, model은 결국 input을 넣으면 output이 나오는 라이브러리와 비슷하다고 했죠?
 

Unet에는 다음의 두 가지가 필요합니다

  1. 원본 이미지
  2. 마스크 이미지

https://github.com/alexgkendall/SegNet-Tutorial

다른 형식의 데이터셋들을 보여드릴게요


* CamVid Dataset (gray scale, class  N)

 
 
제가 테스트하며 사용한 Dataset
블랙박스 영상을 생각하면 되요

(검은색 그림이 보이도록 만들엇어요)
https://github.com/alexgkendall/SegNet-Tutorial
  


 * Drone Dataset (rgb, class N개)

 
 
 
Semantic 계의 IRIS인 드론 
https://www.kaggle.com/datasets/awsaf49/semantic-drone-dataset
 
 
 

 


* Brain Tumor Dataset (binary, class 1개)

 
 
 
 의료계통에서 많이 사용하는 MRI
 
https://www.kaggle.com/code/abdallahwagih/brain-tumor-segmentation-unet-dice-coef-89-6
 
 
 
 
이제 학습을 위해 필요한 데이터셋에 대해서 알아봤어요.
다음에는 예측값이 어떻게 나오는지 알아볼게요


3. Prediction은 어떻게 나오나요? (Binary vs Multi-class)

예측값은 input의 형식에 따라 달라져요

3-1. Multi-class - Class가 2개 이상인 경우

* CamVid Dataset (gray scale, class  N)

원래 grayscale인데 제가 헷갈릴까 봐 색을 넣었어요(GT Mask)

 
*  Drone Dataset (rgb, class N개)

 
grayscale이나 rgb는 표현 방식의 차이지 결국 같다고 보면돼요
학습할 때 색을 빼고 진행하니까요

3-2. Binary - Class가 1개인 경우

* Brain Tumor Dataset (binary, class 1개)

 
1개인 경우는 색상이 필요없으니까 0과 1로만 표현해요

3-3. Multi-class, Binary - 간단히

coco datat를 이용해서 2가지 mask를 만들어볼게요
* multi-class면 2번째 사진처럼, binary면 3번째 사진처럼

https://github.com/virafpatrawala/COCO-Semantic-Segmentation

실제로 model의 로직도 이렇게 달라져요

# define network parameters
n_classes = 1 if len(CLASSES) == 1 else (len(CLASSES) + 1)
# case for binary and multiclass segmentation
activation = 'sigmoid' if n_classes == 1 else 'softmax'
# create model
model = sm.Unet(BACKBONE, classes=n_classes, activation=activation)

3-4. Multi-class, Binary - 조금 깊게 (사례)

아주 조금만 더 깊게 들어가서 설명하고 마무리할게요.
multi-class인 경우 원본과 mask는 아래와 같아요.

원본과 mask (grayscale, rgb 크게 상관 없음)

 
Mask를 세분화해보면 아래처럼 class 별로 구분이되요

 
mask를 numpy로 출력하면 아래처럼, 채널(class)별로 나와요

mask 단순 출력

 
근데 이렇게 보면 보기 힘드니까 하나로 합쳐줄 수 있어요
class가 12개니까 0부터 11까지 있겠죠

mask 1개로 표현하기

 
그럼 예측값은 어떻게 나올까요?
integer가 아닌 값으로 나와서, 수채화 번진 것처럼 나옵니다.

 
이걸 한 장으로 합쳐주면, 아래처럼 나와요

 
위에 말한 내용들을 다 합치면 아래 그림이 나와요

 
위의 그림을 보고 이해하셨으면, 제가 이 글을 쓴 목적은 달성되었습니다.
궁금하신 점은 댓글로 남겨주세요 :) 
 
다음 글은 기회가 된다면, 실제 실행하는 거에 대해서 적어볼게요
 

참고

https://github.com/qubvel/segmentation_models
https://www.kaggle.com/datasets/awsaf49/semantic-drone-dataset
https://www.kaggle.com/code/abdallahwagih/brain-tumor-segmentation-unet-dice-coef-89-6
https://www.researchgate.net/publication/362901203_Using_U-et_network_for_efficient_brain_tumor_segmentation_in_MRI_images
https://medium.com/@rehman.aimal/aerial-semantic-segmentation-using-u-net-deep-learning-model-3356a53c915f
https://medium.com/comet-app/review-of-deep-learning-algorithms-for-object-detection-c1f3d437b852
https://www.sciencedirect.com/science/article/pii/S2772442522000429
https://towardsdatascience.com/understanding-semantic-segmentation-with-unet-6be4f42d4b47  

 

+ 글또 피드백

2024.04.25 - 정상완님

  • 피드백: Unet 설명할 것 처럼 빌드업하고 갑자기 Semantic Segmentation의 개념을 설명해서 당황함
  • 적용: Unet을 제목에서 빼고, Semantic Segmentation으로 교체

 

 

728x90
반응형