🤖 AI/ML

세그멘테이션

Image Segmentation

이미지를 의미 있는 영역으로 분할. 자율주행, 의료영상.

📖 상세 설명

세그멘테이션(Image Segmentation)은 이미지를 픽셀 단위로 분류하여 의미 있는 영역으로 분할하는 컴퓨터 비전 기술입니다. 단순히 이미지에 객체가 있는지 분류하거나(Classification), 바운딩 박스로 위치를 찾는(Detection) 것을 넘어, 객체의 정확한 경계를 픽셀 수준으로 구분합니다.

세그멘테이션은 세 가지 유형으로 나뉩니다. Semantic Segmentation은 같은 클래스의 모든 객체를 동일하게 분류합니다(예: 모든 자동차는 같은 색). Instance Segmentation은 같은 클래스라도 개별 객체를 구분합니다(예: 자동차1, 자동차2). Panoptic Segmentation은 두 방식을 결합하여 배경과 객체를 모두 구분합니다.

대표적인 세그멘테이션 모델들이 있습니다. U-Net은 의료 영상에서 시작되어 인코더-디코더 구조와 Skip Connection으로 유명합니다. DeepLab 시리즈는 Atrous Convolution과 ASPP를 도입했습니다. Mask R-CNN은 객체 탐지에 세그멘테이션 브랜치를 추가한 대표적인 Instance Segmentation 모델입니다. 최근에는 SAM(Segment Anything Model)이 프롬프트 기반 세그멘테이션을 선보였습니다.

실제 응용 분야가 매우 넓습니다. 자율주행에서는 도로, 차선, 보행자, 차량을 실시간으로 구분합니다. 의료영상에서는 CT/MRI에서 종양, 장기를 정밀하게 분리합니다. 위성영상에서는 건물, 도로, 녹지를 분석합니다. 영상 편집에서는 배경 제거나 객체 분리에 활용됩니다.

코드 예제

PyTorch와 Segmentation Models 라이브러리를 사용한 U-Net 예제입니다.

import torch
import segmentation_models_pytorch as smp
import albumentations as A
from albumentations.pytorch import ToTensorV2

# U-Net 모델 정의 (ResNet34 백본)
model = smp.Unet(
    encoder_name="resnet34",
    encoder_weights="imagenet",
    in_channels=3,
    classes=21  # PASCAL VOC 클래스 수
)

# 데이터 증강 파이프라인
transform = A.Compose([
    A.Resize(256, 256),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.Normalize(mean=[0.485, 0.456, 0.406],
                std=[0.229, 0.224, 0.225]),
    ToTensorV2()
])

# 손실 함수: Dice Loss + Cross Entropy
dice_loss = smp.losses.DiceLoss(mode='multiclass')
ce_loss = torch.nn.CrossEntropyLoss()

def combined_loss(pred, target):
    return 0.5 * dice_loss(pred, target) + 0.5 * ce_loss(pred, target)

# 추론
model.eval()
with torch.no_grad():
    output = model(image_tensor)  # (B, C, H, W)
    pred_mask = output.argmax(dim=1)  # (B, H, W)

# IoU 계산
def iou_score(pred, target, num_classes):
    ious = []
    for cls in range(num_classes):
        pred_cls = (pred == cls)
        target_cls = (target == cls)
        intersection = (pred_cls & target_cls).sum()
        union = (pred_cls | target_cls).sum()
        if union > 0:
            ious.append(intersection / union)
    return torch.tensor(ious).mean()

성능 & 비용

모델 mIoU (PASCAL VOC) 파라미터 추론 속도
U-Net (ResNet34) ~75% 24M ~30 FPS (GPU)
DeepLabV3+ ~82% 41M ~15 FPS (GPU)
Mask R-CNN ~79% (Instance) 44M ~5 FPS (GPU)
SegFormer-B4 ~84% 64M ~10 FPS (GPU)
SAM (ViT-H) Zero-shot 우수 636M ~1 FPS (GPU)

🗣️ 실무에서 이렇게 말하세요

"의료 영상 분석에서 mIoU 0.85 이상 달성한 세그멘테이션 모델을 배포했어요. Dice Loss와 Data Augmentation으로 성능을 끌어올렸습니다."

영어로는 "We deployed a segmentation model achieving mIoU above 0.85 for medical imaging"이라고 표현합니다. "pixel-wise classification", "instance segmentation", "semantic parsing" 등의 용어도 자주 사용됩니다. 평가 지표로는 mIoU(mean Intersection over Union), Dice Score, Pixel Accuracy를 언급하세요.

⚠️ 흔한 실수 & 주의사항

  • 1. 클래스 불균형: 배경이 대부분인 데이터에서 Dice Loss나 Focal Loss를 사용하세요. Cross Entropy만 쓰면 소수 클래스를 못 찾습니다.
  • 2. 해상도 손실: 다운샘플링이 심하면 작은 객체나 경계가 뭉개집니다. Skip Connection이나 Multi-scale 처리를 활용하세요.
  • 3. 라벨링 품질: 세그멘테이션 라벨은 픽셀 단위라 라벨링 비용이 높습니다. 라벨 노이즈가 성능에 큰 영향을 미칩니다.
  • 4. 실시간 처리: 자율주행 등에서는 정확도보다 속도가 중요할 수 있습니다. 경량화 모델(BiSeNet, ENet)을 고려하세요.
  • 5. 평가 지표 오해: Pixel Accuracy는 클래스 불균형에서 오해를 주기 쉽습니다. mIoU를 주요 지표로 사용하세요.

🔗 관련 용어

📚 더 배우기