CLIPSeg을 이용한 제로샷 이미지 분할

TL;DR

CLIPSeg는 제로샷 이미지 분할 모델로, 사용자가 특정 카테고리에 대해 모델을 학습시킬 필요 없이 텍스트 설명이나 예시 이미지(시각적 프롬프트)를 사용해 이미지 내 객체를 분할할 수 있게 합니다. 거친 저해상도 마스크를 제공하지만, 로봇 인식, 이미지 인페인팅, 그리고 보다 정밀한 분할 모델을 미세 조정하기 위한 사전 라벨 생성 등에 매우 다양하게 활용될 수 있습니다.

CLIPSeg 작동 방식: CLIP 임베딩 활용

CLIPSeg는 OpenAI가 개발한 모델인 CLIP(Contrastive Language–Image Pre-training)를 기반으로 제로샷 분할을 구현합니다. CLIP은 이미지와 텍스트를 공유 고차원 공간에 추상적인 표현(임베딩)으로 매핑하여, 유사한 개념들이 서로 가깝게 배치됩니다.

분할을 가능하게 하기 위해, CLIPSeg는 34만 개 이상의 구문과 해당 마스크를 포함하는 PhraseCut 데이터셋으로 학습된 Transformer 기반 디코더를 사용합니다. 기술 아키텍처는 다음과 같습니다:

  • Frozen CLIP Backbone: 기본 CLIP 모델은 학습 중에 동결된 상태를 유지합니다.
  • Decoder Integration: 디코더는 대상 이미지의 CLIP 표현과 프롬프트(텍스트 또는 이미지)의 CLIP 표현을 입력으로 받습니다.
  • Layer Utilization: 디코더는 최종 CLIP 표현뿐만 아니라 여러 중간 CLIP 레이어의 출력도 활용하여 이진 분할 마스크를 생성합니다.

주요 기능: 텍스트 및 시각적 프롬프트

CLIPSeg는 객체를 식별하기 위해 두 종류의 프롬프트를 처리할 수 있는 능력으로 구별됩니다:

텍스트 프롬프트

사용자는 텍스트 문자열(예: "pancakes" 또는 "blueberries")을 프롬프트로 제공할 수 있습니다. 모델은 해당 단어들의 CLIP 텍스트 임베딩을 사용해 이미지 내 해당 객체를 찾아 마스크합니다.

시각적 프롬프트

CLIPSeg는 텍스트 대신 예시 이미지를 프롬프트로 사용할 수 있게 합니다. 이는 옷에 있는 특정 로고와 같이 말로 설명하기 어려운 객체에 특히 유용합니다. 시각적 프롬프트를 최적화하기 위해 연구에서는 다음을 제안합니다:

  • Cropping: 프롬프트 이미지는 관심 객체만 포함하도록 잘라야 합니다.
  • Background Modification: 프롬프트 이미지의 배경을 흐리게 하거나 어둡게 하면 결과가 약간 개선될 수 있습니다.

기술적 제한 사항 및 실용적 적용

유연성은 뛰어나지만, CLIPSeg는 몇 가지 기술적 제약이 있습니다:

  • Resolution: 모델은 352 x 352 픽셀 크기의 이미지에서 동작하며, 저해상도이고 "흐릿한" 출력 마스크를 생성해 픽셀 단위의 정확도는 보장되지 않습니다.
  • Use Case: 해상도 제한으로 인해 거친 위치 파악이나 추가 정제 작업을 위한 시작점으로 활용하는 것이 가장 적합합니다.

고정밀 분할을 위한 워크플로우

CLIPSeg가 거친 라벨을 제공하므로 고품질 데이터셋 생성 속도를 높이는 데 활용될 수 있습니다. 권장 워크플로우는 CLIPSeg를 사용해 초기 사전 라벨을 생성하고, Segments.ai와 같은 라벨링 도구로 마스크를 정제한 뒤, 정제된 데이터를 기반으로 최신 분할 모델(예: SegFormer)을 미세 조정하는 것입니다.

Hugging Face Transformers를 이용한 구현

CLIPSeg는 ‹‹transformers‹‹ 라이브러리에 통합되어 있습니다. 구현에는 CLIPSegProcessorCLIPSegForImageSegmentation 클래스가 필요합니다.

텍스트 프롬프트의 경우, 프로세서는 텍스트와 이미지를 모두 처리합니다. 시각적 프롬프트의 경우, 프로세서는 대상 이미지와 프롬프트 이미지에 대한 별도 임베딩을 생성하고 이를 conditional_pixel_values 형태로 모델에 전달합니다.

Sources