이미지 분할 소개

PyTorch로 배우는 이미지 딥러닝

Michal Oleszak

Machine Learning Engineer

이미지 분할

  • 이미지 분할은 픽셀 단위로 이미지를 여러 구역으로 나눕니다
  • 이미지의 각 픽셀은 특정 구역에 할당됩니다
  • 세 가지 분할 유형:
    • 시맨틱 분할
    • 인스턴스 분할
    • 패놉틱 분할
PyTorch로 배우는 이미지 딥러닝

시맨틱 분할

시맨틱 분할

  • 각 픽셀을 클래스에 분류
  • 같은 클래스의 픽셀은 동일하게 처리
PyTorch로 배우는 이미지 딥러닝

인스턴스 분할

인스턴스 분할

  • 같은 클래스의 서로 다른 개체를 구분
  • 배경은 종종 분할하지 않음
PyTorch로 배우는 이미지 딥러닝

패놉틱 분할

패놉틱 분할

  • 시맨틱+인스턴스 분할을 결합
  • 각 객체 인스턴스에 고유 라벨 부여
  • 배경을 픽셀 수준에서 분류
PyTorch로 배우는 이미지 딥러닝

데이터 주석

image = Image.open("images/British_Shorthair_36.jpg")
mask = Image.open("annots/British_Shorthair_36.png")


transform = transforms.Compose([ transforms.ToTensor() ]) image_tensor = transform(image) mask_tensor = transform(mask)
print(f"""Image shape: {image_tensor.shape} Mask shape: {mask_tensor.shape}""")
    Image shape: torch.Size([3, 333, 500])
    Mask shape: torch.Size([1, 333, 500])

브리티시 쇼트헤어 고양이 사진

PyTorch로 배우는 이미지 딥러닝

마스크 이해하기

  • 데이터셋 문서:

    픽셀 주석: 1: 전경 2: 배경 3: 분류 안 됨

  • 마스크 고유 값:

    mask_tensor.unique()
    
    tensor([0.0039, 0.0078, 0.0118])
    
  • 픽셀 값은 255로 나눔:

    • 1 / 255 = 0.0039 - 객체
    • 2 / 255 = 0.0.0078 - 배경
    • 3 / 255 = 0.0118 - 미분류
PyTorch로 배우는 이미지 딥러닝

이진 마스크 생성

binary_mask = torch.where(
    mask_tensor == 1/255, 
    torch.tensor(1.0),
    torch.tensor(0.0),
)


to_pil_image = transforms.ToPILImage() mask = to_pil_image(binary_mask)
plt.imshow(mask)

세그멘테이션 마스크

  • torch.where():
    • 조건
    • 조건이 참일 때 값
    • 그렇지 않을 때 값
  • 마스크를 PIL 이미지로 변환
  • 마스크 이미지 표시
PyTorch로 배우는 이미지 딥러닝

객체 분할하기

object_tensor = image_tensor * binary_mask


to_pil_image = transforms.ToPILImage() object_image = to_pil_image(object_tensor)
plt.imshow(object_image)

분할된 이미지

  • 이미지에 이진 마스크 곱하기
  • 객체를 PIL 이미지로 변환
  • 객체 이미지 표시
PyTorch로 배우는 이미지 딥러닝

연습해 봅시다!

PyTorch로 배우는 이미지 딥러닝

Preparing Video For Download...