반응형
인스턴스 분할(Instance Segmentation)이란?
인스턴스 분할(Instance Segmentation)은 이미지 속의 객체를 픽셀 단위로 구분하되, 객체의 개별 인스턴스마다 다른 마스크를 예측하는 태스크입니다. 즉, 객체 검출(Object Detection)과 의미론적 분할(Semantic Segmentation)을 동시에 수행하는 고급 비전 과제입니다. 이번 시간에는 PyTorch를 이용하여 인스턴스 분할 데이터셋을 만드는 방법에 대해 알아보도록 하겠습니다.
인스턴스 분할 vs 객체 검출 vs 의미론적 분할
- 인스턴스 분할: 픽셀 단위 클래스 + 인스턴스 구분 모두 수행
- 객체 검출 (Object Detection): 물체 위치를 박스로 찾음
- 의미론적 분할 (Semantic): 픽셀 단위 클래스 구분 (개별 인스턴스 구분 X)
PyTorch용 COCO Instance Segmentation Dataset 만들기
CIFAR-10은 딥러닝 입문자들이 가장 많이 사용하는 공개 이미지 분류 데이터셋입니다.
COCO(Common Objects in Context) 데이터셋 특징
- 80개 객체 클래스
- 바운딩 박스 + 마스크 + 클래스 라벨 포함
- 마스크는 RLE(Run-Length Encoding) 또는 binary mask 형식
디렉토리 구조 예시
coco/
images/
train2017/
val2017/
annotations/
instances_train2017.json
instances_val2017.json
PyTorch 코드 예제
from pycocotools.coco import COCO
from PIL import Image
import torch
import os
class COCOInstanceDataset(torch.utils.data.Dataset):
def __init__(self, img_dir, ann_file, transform=None):
self.coco = COCO(ann_file)
self.img_ids = list(self.coco.imgs.keys())
self.img_dir = img_dir
self.transform = transform
def __getitem__(self, idx):
img_id = self.img_ids[idx]
ann_ids = self.coco.getAnnIds(imgIds=img_id)
anns = self.coco.loadAnns(ann_ids)
img_info = self.coco.loadImgs(img_id)[0]
path = img_info['file_name']
image = Image.open(os.path.join(self.img_dir, path)).convert("RGB")
boxes, labels, masks = [], [], []
for ann in anns:
bbox = ann['bbox']
boxes.append([bbox[0], bbox[1], bbox[0]+bbox[2], bbox[1]+bbox[3]])
labels.append(ann['category_id'])
mask = self.coco.annToMask(ann)
masks.append(torch.tensor(mask))
target = {
'boxes': torch.tensor(boxes, dtype=torch.float32),
'labels': torch.tensor(labels, dtype=torch.int64),
'masks': torch.stack(masks) if masks else torch.zeros(0)
}
if self.transform:
image = self.transform(image)
return image, target
def __len__(self):
return len(self.img_ids)
모델 예시: Mask R-CNN (torchvision 제공)
- 입력: 이미지
- 출력: `boxes`, `labels`, `scores`, `masks` 포함된 딕셔너리
- 학습 시 `target`에 `masks`, `labels`, `boxes`가 모두 있어야 함
import torchvision
from torchvision.models.detection import maskrcnn_resnet50_fpn
model = maskrcnn_resnet50_fpn(pretrained=True)
model.eval()
마무리
PyTorch를 이용하여 인스턴스 분할 데이터셋을 어떻게 만드는지 살펴보았습니다. 다음 시간에는 모델 구성 및 학습 방법을 PyTorch로 작성하는 방법을 알아보도록 하겠습니다.
관련 내용
- 준비중
반응형
'실전 예제, 프로젝트' 카테고리의 다른 글
[실전 예제/변화 탐지/PyTorch] 변화 탐지 튜토리얼: LEVIR 데이터셋으로 PyTorch 데이터셋 만들기 (0) | 2025.04.19 |
---|---|
[실전 예제/객체 탐지/PyTorch] 객체 검출 튜토리얼: COCO 데이터셋으로 PyTorch 데이터셋 만들기 (0) | 2025.04.19 |
[실전 예제/이미지 분류/PyTorch] 이미지 분류 튜토리얼: CIFAR-10과 ImageNet으로 PyTorch 데이터셋 만들기 (0) | 2025.04.19 |
[실전 예제/소켓통신/루프백] 컴퓨터 한 대로 가능한 TCP/IP (0) | 2025.01.15 |