CLIP
Contrastive Language-Image Pre-training
OpenAI의 텍스트-이미지 연결 모델. 이미지 검색, 분류에 활용.
Contrastive Language-Image Pre-training
OpenAI의 텍스트-이미지 연결 모델. 이미지 검색, 분류에 활용.
CLIP(Contrastive Language-Image Pre-training)은 OpenAI가 2021년 1월에 발표한 멀티모달 AI 모델로, 텍스트와 이미지를 동일한 임베딩 공간에서 이해할 수 있도록 학습된 신경망입니다. 4억 개의 이미지-텍스트 쌍으로 학습되어 자연어 설명만으로 이미지를 분류하고 검색할 수 있습니다.
CLIP의 핵심 아이디어는 대조 학습(Contrastive Learning)입니다. 올바른 이미지-텍스트 쌍은 임베딩 공간에서 가깝게, 잘못된 쌍은 멀리 배치되도록 학습합니다. 이를 통해 별도의 라벨링 없이도 웹에서 수집한 대규모 데이터로 학습이 가능해졌습니다.
기존의 이미지 분류 모델들은 ImageNet의 1,000개 클래스처럼 미리 정의된 카테고리에서만 동작했습니다. 하지만 CLIP은 zero-shot 분류가 가능하여, 학습 시 보지 못한 새로운 카테고리도 자연어 설명만으로 인식할 수 있습니다.
실무에서 CLIP은 이미지 검색 엔진, 콘텐츠 모더레이션, DALL-E와 같은 이미지 생성 모델의 핵심 구성요소로 활용됩니다. 특히 상품 검색, 유사 이미지 추천, 이미지 기반 질의응답 시스템 구축에 널리 사용되고 있습니다.
# CLIP을 사용한 이미지-텍스트 유사도 계산
import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
# 모델 및 프로세서 로드
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 이미지 로드 (URL 또는 로컬 파일)
image = Image.open("sample_image.jpg")
# 비교할 텍스트 후보들
texts = ["고양이 사진", "강아지 사진", "자동차 사진", "음식 사진"]
# 입력 전처리
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)
# 임베딩 추출 및 유사도 계산
with torch.no_grad():
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image
probs = logits_per_image.softmax(dim=1)
# 결과 출력
for text, prob in zip(texts, probs[0]):
print(f"{text}: {prob.item():.2%}")
"상품 검색 기능을 개선하려면 CLIP 기반으로 텍스트 쿼리와 상품 이미지 간의 임베딩 유사도를 계산하는 방식을 도입해야 합니다. 기존 키워드 매칭보다 의미적 검색이 가능해집니다."
"CLIP의 대조 학습 방식은 배치 내의 모든 이미지-텍스트 쌍에 대해 코사인 유사도를 계산하고, 대각선 요소(올바른 쌍)의 유사도는 높이고 나머지(잘못된 쌍)는 낮추는 방향으로 학습합니다."
"CLIP 임베딩을 캐싱하지 않고 매번 계산하면 latency가 너무 높아요. 상품 이미지 임베딩은 미리 추출해서 벡터 DB에 저장하고, 쿼리 시에는 텍스트 임베딩만 실시간으로 계산하는 게 좋겠습니다."
CLIP은 일반적인 개념은 잘 구분하지만, 특정 도메인의 세밀한 분류(예: 특정 품종 구분, 의료 영상)에서는 fine-tuning된 전문 모델보다 정확도가 낮을 수 있습니다.
Vision Transformer 기반이라 추론 비용이 상당합니다. 대규모 이미지 처리 시에는 배치 처리, GPU 최적화, 또는 ViT-B/32 같은 경량 버전 사용을 고려하세요.
"a photo of a [object]" 형태의 프롬프트 템플릿을 사용하면 성능이 크게 향상됩니다. 단순 명사보다 문장 형태의 프롬프트가 더 효과적입니다.