처음 Vision Model을 공부하다가, Yolo를 보면서 쉬워 보여 무시했는데
Unet을 하면서 당황했던 경험을 정리했습니다
( 이 글은 모델의 원리보다는 사용에 초점을 맞춥니다. )
.
예상 독자는 아래와 같습니다.
- YOLO 말고 다른 Vision Model을 쓰시려는 분
- Semantic Segmentation을 처음 시작하는 분
- Unet을 처음부터 떠먹여 줄 글을 찾는 분
.
목차는 아래와 같습니다
- Semantic이란 무엇인가요? (Instance와 비교)
- 데이터셋 구조는 어떻게 되나요? (Original & mask)
- Prediction은 어떻게 나오나요? (Binary vs Multi-class)
.
제 목표는 아래와 같습니다.
- 이 글을 끝까지 읽으면, 아래 그림이 무엇을 뜻하는지 이해할 수 있다.
1. Semantic이란 무엇인가요? (Instance와 비교)
segmentation에는 Instance와 Semantic이 있어요.
1-1. Instance & Semantic 차이
Instance는 객체 하나씩을 탐지하고, Semantic은 여러 객체를 하나로 묶어서 보여줘요
잉?????? 응????
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가지가 필요해요.
- 원본 이미지
- 어노테이션
원본 이미지는 그대로 원본이므로 모두 같습니다. 일반적으로 jpg나 png 형식이죠
하지만 어노테이션은 각기 다릅니다
2-2. Vision Model의 input - 예시
COCO는 JSON을 사용하고, Pascal VOC는 XML을 사용합니다.
COCO는 JSON을 사용하고, Pascal VOC는 XML을 사용합니다.
YOLO는 txt 파일로 저장하고요
Unet을 사용한 Semantic Segmentation은 이미지를 기반으로 합니다
ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
`이미지` 입니다.
2-3. Vision Model의 input - Unet
인터넷에서 데이터셋을 다운로드할 때 데이터셋이 검은색인 경우가 있을거에요.
하지만 자세히 보면 pixel 별로 색이 약간 다른 grayscale을 띄고 있는 경우입니다.
다시 처음으로 돌아오면, model은 결국 input을 넣으면 output이 나오는 라이브러리와 비슷하다고 했죠?
Unet에는 다음의 두 가지가 필요합니다
- 원본 이미지
- 마스크 이미지
다른 형식의 데이터셋들을 보여드릴게요
* 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)
* 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번째 사진처럼
실제로 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를 세분화해보면 아래처럼 class 별로 구분이되요
mask를 numpy로 출력하면 아래처럼, 채널(class)별로 나와요
근데 이렇게 보면 보기 힘드니까 하나로 합쳐줄 수 있어요
class가 12개니까 0부터 11까지 있겠죠
그럼 예측값은 어떻게 나올까요?
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으로 교체
'AI > Vision' 카테고리의 다른 글
Vision-AI) coco dataset을 mask로 변환하기_coco2mask (0) | 2024.05.08 |
---|---|
Vision-AI) mask 이미지 coco datset으로 변환하기_mask2coco (0) | 2024.05.08 |
Vision-AI) prediction mask 시각화하기 (train용 mask와 class별로 비교) (0) | 2024.05.08 |
Vision-AI) Mask 정리해서 시각화하기(one-hot, show_channel) (0) | 2024.05.08 |
Vision-AI) coco dataset 시각화 하기 (코드 포함) (0) | 2024.05.08 |