허깅페이스 트렌스포머 활용강좌, CLIP 추론에서 로짓 추출

딥러닝과 자연어 처리, 컴퓨터 비전 분야가 발전함에 따라 다양한 모델들이 등장하였습니다. 그 중에서도 OpenAI의 CLIP(Contrastive Language-Image Pretraining)은 텍스트와 이미지를 동시에 이해하고 활용할 수 있는 강력한 모델입니다. 이 강좌에서는 Hugging Face Transformers 라이브러리를 사용하여 CLIP 모델을 활용하고, 그로부터 로짓(logits)을 추출하는 과정을 자세히 설명하겠습니다.

1. CLIP 모델 개요

CLIP은 다양한 이미지와 텍스트 쌍으로 사전 훈련된 모델입니다. 이 모델은 주어진 텍스트 설명에 가장 잘 맞는 이미지를 찾거나, 주어진 이미지에 대해 가장 적합한 텍스트 설명을 생성할 수 있습니다. CLIP 모델은 주로 두 가지 입력을 사용합니다: 이미지와 텍스트.

1.1 CLIP의 구조

CLIP은 이미지 인코더와 텍스트 인코더로 구성됩니다. 이미지 인코더는 CNN(Convolutional Neural Network) 또는 Vision Transformer를 사용하여 이미지를 피처 벡터로 변환합니다. 반면 텍스트 인코더는 Transformer 아키텍처를 사용하여 텍스트를 피처 벡터로 변환합니다. 이 두 인코더의 출력은 같은 벡터 공간에 위치하도록 교육되어, 두 도메인 간의 유사도 측정이 가능하도록 합니다.

2. 환경 설정

CLIP 모델을 사용하기 위해서는 먼저 Hugging Face Transformers와 필요한 라이브러리들을 설치해야 합니다. 다음과 같은 패키지들이 필요합니다:

  • transformers
  • torch
  • PIL (Python Imaging Library)

다음과 같이 필요한 라이브러리를 설치할 수 있습니다:

pip install torch torchvision transformers pillow

3. CLIP 모델 로드 및 이미지/텍스트 전처리

이제 Hugging Face의 Transformers 라이브러리를 사용하여 CLIP 모델을 로드하고, 이미지와 텍스트를 전처리하는 방법을 살펴보겠습니다.

import torch
from transformers import CLIPProcessor, CLIPModel
from PIL import Image

# CLIP 모델과 프로세서 로드하기
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch16")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch16")

# 이미지를 로드하고 전처리하기
image = Image.open("path/to/your/image.jpg")

# 텍스트를 준비하기
texts = ["a photo of a cat", "a photo of a dog", "a photo of a bird"]

# 텍스트와 이미지를 CLIP 프로세서로 전처리하기
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)

3.1 텍스트와 이미지 전처리 설명

위 코드에서는 이미지를 로드하고, 주어진 텍스트 리스트에 대해 CLIP 프로세서로 전처리를 진행합니다. 이 단계에서 텍스트와 이미지가 CLIP 모델에 맞는 형식으로 변환됩니다.

4. CLIP 모델 추론 및 로짓 추출

모델을 준비한 후, 우리는 이미지를 모델에 입력하고 로짓(logits)을 추출하는 과정을 수행합니다.

# 모델을 추론 모드로 전환하기
model.eval()

# 모델에 입력하여 출력 로짓을 얻기
with torch.no_grad():
    outputs = model(**inputs)

# 로짓 추출하기
logits_per_image = outputs.logits_per_image  # Image to Text Logits
logits_per_text = outputs.logits_per_text      # Text to Image Logits

4.1 로짓 설명

위 코드에서 로짓은 이미지와 텍스트 간의 유사도를 나타내는 점수입니다. 로짓 값이 높을수록 해당 이미지와 텍스트가 잘 일치한다고 볼 수 있습니다. logits_per_image는 이미지가 각 텍스트와 얼마나 잘 매치되는지를 나타내고, logits_per_text는 텍스트가 각 이미지와 얼마나 잘 매치되는지를 나타냅니다.

5. 결과 해석

이제 추출한 로짓을 해석해보겠습니다. 로짓 값은 소프트맥스 함수를 통과시켜 각 쌍의 확률로 변환할 수 있습니다. 이를 통해 각 텍스트에 대한 이미지의 매칭 확률을 시각화 할 수 있습니다.

import torch.nn.functional as F

# 소프트맥스를 이용한 확률 계산
probs = F.softmax(logits_per_image, dim=1)

# 각 텍스트에 대한 이미지의 확률 출력하기
for i, text in enumerate(texts):
    print(f"'{text}': {probs[0][i].item():.4f}") # 확률 출력

5.1 확률 해석

확률 값은 각 텍스트 설명이 제공된 이미지와 얼마나 유사한지에 대한 척도를 제공합니다. 확률이 1에 가까울수록 해당 텍스트가 이미지와 잘 어울린다고 할 수 있습니다. 이를 통해 CLIP 모델의 성능을 평가할 수 있습니다.

6. CLIP의 활용 예시

CLIP을 이용해 여러 다양한 애플리케이션을 만들 수 있습니다. 예를 들어:

  • 이미지 태깅: 이미지에 대한 적절한 태그를 생성.
  • 이미지 검색: 텍스트 쿼리를 기반으로한 이미지 검색.
  • 콘텐츠 기반 추천 시스템: 사용자 선호도에 맞춘 이미지 추천.

7. 결론

이 강좌에서는 Hugging Face Transformers 라이브러리를 사용하여 CLIP 모델을 로드하고, 이미지와 텍스트를 처리 후 로짓을 추출하는 과정을 배웠습니다. CLIP 모델은 다양한 이미지와 텍스트 데이터 쌍 기반의 문제를 해결하는 데 매우 유용한 도구입니다. 앞으로도 CLIP 모델을 활용한 다양한 더 나아간 예제를 시도해보시길 바랍니다!

8. 참고자료

끝!