최근 AI hub 데이터셋 기반으로 오랜만에 Computer Vision AI 작업할 일이 생겼다.
이전에 한창 Yolo로 CNN이나 기본적인 Detection 할 때 한땀한땀 코딩하던 것과 달리, Agent AI 통해서 우르르 Permission 줘놓고 유튜브 30분 시청하고 보니 .. 대체 무슨 과정을 통해 무슨 결과물을 낸건지 따라잡기가 참 힘들었다.
그래서 다시 기본적인 원리라도 리뷰하고 넘어가보자 한다.
이번 내 프로젝트의 특이한 task는 기본적인 bounding box가 아니라, 면적 단위를 정확하게 measure하는 것이 중요하기 때문에 Segmentation 작업까지 이루어져야한다는 것이다.
Object Detection and Segmentation
Computer Vision의 객체 인식 분야는 데이터가 제공하는 정보의 양과 정밀도에 따라 네 단계로 분류할 수 있다.
1. Classification (분류): 이미지 전체에 대한 클래스 예측으로 이미지에 대한 하나의 클래스명을 output으로 낸다.
2. Localization: 이미지 전체에 대한 클래스 예측 + 객체 위치를 하는 task로 하나의 bounding box를 output으로 낸다.
3. Detection (탐지): 이미지 속 다수 객체의 위치 파악을 하는 task로 다수의 Bounding Box (바운딩 박스)를 output으로 낸다.
4. Segmentation (분할): 이미지 속 객체의 정확한 경계를 파악하는 것이 목적이며, 픽셀 단위로 다수의 Mask 또는 Polygon을 output으로 낸다.
이 중에서도 Segmentation은 크게 두 가지 방식으로 나뉜다.
- Semantic Segmentation (의미론적 분할): 같은 클래스라면 개별 객체를 구분하지 않고 모두 같은 색으로 마스킹하며 개체 수 파악이 불가능
- Instance Segmentation (인스턴스 분할): 같은 클래스라도 개별 객체(인스턴스)를 구분하여 마스킹하여 개체 수 파악이 가능
각 Task에 따른 Data Format
Bounding Box: 출력 형태는 직사각형 바운딩 박스의 4개 좌표
- 대략적인 위치 파악이나 개수 카운팅이 가능한 직사각형 형태
- 객체 바깥의 배경 픽셀이 박스 안에 포함되거나, 복잡한 모양의 객체 윤곽을 정확하게 담아내지 못하는 한계
Polygon / Mask: 객체의 실제 윤곽을 따르는 픽셀 집합(Mask)이나 폴리곤 좌표
- 객체의 정확한 면적, 모양, 경계 측정이 주 목표
- 픽셀 단위로 객체만을 정밀하게 측정 가능
그럼 우리는 정확히 언제 Segmentation을 필요로 할까?
- 객체의 정확한 면적이나 크기를 측정해야 할 때
- 객체의 복잡하거나 불규칙한 모양을 정확히 파악해야 할 때.
- 객체끼리 겹쳐 있을 때 픽셀 단위로 분리해야 할 때.
빠르고 간결한 위치 파악이 목적이라면 객체 탐지를, 객체의 형태 정보와 정밀한 면적 계산이 목적이라면 인스턴스 분할을 선택해야한다.
최신 YOLO 모델 등 Vision model들은 이 두 가지 기능을 하나의 프레임워크 내에서 모두 지원하는 경우가 대다수다.
그래서 폴리곤 좌표가 이미 훈련 데이터셋에 있는 상황이라면, 추론할 때 bbox 와 mask를 모두 반환하더라.
- 최신 Yolov11-seg 의 공식 docs: https://docs.ultralytics.com/ko/tasks/segment/#how-do-i-load-and-validate-a-pretrained-yolo-segmentation-model
Segment
YOLO11을 사용하여 인스턴스 세분화를 마스터하세요. 자세한 가이드와 예제를 통해 이미지에서 객체를 감지, 분할 및 윤곽을 그리는 방법을 배울 수 있습니다.
docs.ultralytics.com
그리고 같은 회사에서 낸 Segment Anything Model (SAM) 이란 모델이 성능이 꽤 좋다고 추천을 받았는데,
fine tuning 에 앞서 Zero shot 도 한번 테스트는 해봐야겠다.
- SAM 공식 docs: https://docs.ultralytics.com/ko/models/sam/
AI Hub에서 제공하는 컴퓨터 비전용 데이터셋을 열어보면 보통 images/와 annotation/ 두 폴더로 구성되어 있었다.
초기에 비전을 공부할 때는 데이터를 준비하는 과정을 통틀어 ‘라벨링’이라고 부르는 경우가 많았지만, 실제로는 라벨링(labeling)과 어노테이션(annotation)이 조금 다른 개념인 걸 이번에 처음 알았다.
Labeling: 데이터를 클래스 이름이나 값으로 태깅하는 작업 전반
Annotation: 데이터를 구체적이고 구조적으로 기술해 놓은 전체 정보 (JSON/XML)
따라서 Annotation은 metadata 전체를 담고 있는거라, yolo training을 위해서는 txt로 다시 변환해야하더라.
대용량의 이미지셋으로 Vision model 개발하는 걸 오픈소스 및 Agent가 잘되어있어서 굉장히 만만하게 봤는데.. 컴퓨팅 자원을 많이 소모하는 일이다보니 정확하게 공부하고 한번에 원기옥 모으듯이 실험을 잘 돌리는 게 좋을 것 같다.
이전엔 항상 모델을 직접 땡겨와서 돌렸는데, 이번엔 드디어 docker image로 받아와서 써볼까 한다.
워낙 파이썬에 익숙해서 굳이? 싶기도 하고 infra structure들 개념이 낯설긴하지만
다음 포스팅에선 꼭 docker 사용 + DVC 관련 후기를 남길 수 있길!!