23.06.15
DEVOTEE를 활성화 시키면
지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.
버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.
| 컨텐츠 유형 | 제목 | 저장일 | 삭제 |
|---|
본인인증 로그인에 실패하였습니다.
회원이 아니시거나 본인인증 등록이
완료되지 않은 사용자입니다.
BLIP(Bootstrapping Language-Image Pre-training)과 CLIP(Contrastive Language-Image Pre-training)는 모두 이미지와 텍스트를 연결하여 멀티모달 AI 모델을 만드는 대표적인 방법이지만, 구조 등에 차이가 있습니다.
CLIP | BLIP | |
|---|---|---|
개발 | OpenAI(2021) | Salesforce(2022) |
목적 | 텍스트와 이미지를 같은 벡터 공간에서 매핑하여 둘 사이의 이미적 유사도를 계산 | 이미지-텍스트 이해뿐만 아니라, 텍스트 생성(설명, 질문 응답 등)까지 가능 |
훈련방식 | 대규모 이미지-텍스트 쌍을 사용하여 대조 학습(contrastive learning) | 이미지-텍스트 매칭(ITM) -> CLIP 과 유사한 정렬 학습, 이미지 조건 언어 모델링 - 주어진 이미지로 캡션 생성, 부트스트래핑 - 노이즈 있는 웹 데이터에서 캡션을 정제하며 학습 |
출력 | 이미지 임베딩, 텍스트 임베딩 - 두 벡터의 코사인 유사도 계산 | 자연어 문장(캡션, 대화, 설명 등) |
주요 활용 | 이미지 검색(텍스트<->이미지 매칭), 제로샷 분류(텍스트 프롬프트 기반), 멀티모달 검색 및 정렬 | 이미지 캡셔닝(자동 설명 생성), 비주얼 질문 응답(VQA), 이미지를 보고 문장을 만들어내는 능력에 특화됨. |
CLIP은
인코더 두 개로 이미지와 텍스트를 임베딩하여 매칭하는 구조
이미지와 텍스트를 같은 공간에 올려서 맞는지 확인
BLIP은
종합적인 멀티모달 Encoder-Decoder 구조로, 이미지-텍스트 이해뿐 아니라 자연어 생성까지 지원
이미지를 보고 그에 맞는 문장을 만들어 냄.
정리를 하면, BLIP은 생성 작업이 필요한 복합적인 비전-언어에 적합하고, CLIP은 빠르고 효율적인 매칭 및 검색 작업에 적합합니다.
OpenAI의 CLIP(openai/clip-vit-base-patch32) 과 BLIP(Salesforce/blip-image-captioning-base)모델을 활용하여
이미지와 여러 텍스트 간의 의미적 유사도를 계산하는 과정을 간단하게 만들어보았습니다.
CLIPModel과 CLIPProcessor를 불러와 사전학습된 모델과 전처리기를 준비합니다.
openai/clip-vit-base-patch32는 이미지와 텍스트를 같은 임베딩 공간에 매핑할 수 있는 멀티모달 모델입니다.
지정된 경로 또는 URL 에서 이미지 파일을 불러옵니다.
이미지는 RGB 형식으로 변환되어 모델 입력에 맞게 준비됩니다.
이미지와 비교할 텍스트 목록을 정의합니다.
예시로 "고양이", "강아지", "자전거 타는 사람"을 사용하였습니다.
이미지와 텍스트를 모델 입력 형식에 맞게 전처리합니다.
이미지와 텍스트는 배치 형태의 텐서로 변환되고, 패딩이 적용합니다.
torch.no_grad() 컨텍스트 내에서 모델에 입력을 넣어 추론을 수행합니다.
이미지와 각 텍스트 간의 유사도 점수(logits)를 계산합니다.
소프트맥스 함수를 적용해 각 텍스트에 대한 확률로 변환합니다.
각 텍스트와 이미지 간의 유사도 확률을 출력합니다.
가장 유사도가 높은 텍스트를 찾아 출력합니다.
예를 들어, 이 이미지는 '자전거 타는 사람'이 가장 유사합니다. (확률: 0.68)"와 같이 결과가 나옵니다.
from PIL import Image
import requests
from transformers import CLIPProcessor, CLIPModel
import torch
# 1. CLIP 모델 및 프로세스 불러오기
model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
# 2. 이미지 불러오기
url = "https://images.pexels.com/photos/248547/pexels-photo-248547.jpeg?auto=compress&cs=tinysrgb&w=800"
image = Image.open(requests.get(url, stream=True).raw)
# 3. 텍스트 리스트 정의하기
texts = ["고양이", "강아지", "자전거 타는 사람"]
# 4. 모델을 사용하기 위한 입력 준비
inputs = processor(text=texts, images=image, return_tensors="pt", padding=True)
# 5. 모델 추론 및 유사도 계산
with torch.no_grad():
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # (1, N_texts)
probs = logits_per_image.softmax(dim=1) # (1, N_texts)
# 6. 유사도 추출
logits_per_image = outputs.logits_per_image # shape: [1, number_of_texts]
for text, prob in zip(texts, probs[0]):
print(f"{text}: {prob.item():.2f}")
max_idx = probs.argmax().item()
print(f"이 이미지는 '{texts[max_idx]}'와 가장 유사합니다. (확률: {probs[0][max_idx].item():.2f})")
# 7. 확률 계산
probs = logits_per_image.softmax(dim=1)
print("확률 :", probs)
# 8. 이미지 출력
thumb_size = (400, 500)
image.thumbnail(thumb_size) # 종횡비 유지하며 thumb_size 이내로 축소
display(image)BLIP는 CLIP처럼 이미지 vs 여러 텍스트의 대조 유사도 계산을 직접적으로 하진 않고, 주로 이미지 캡션 생성이나 질문에 대한 답변(VQA) 같은 형태로 사용합니다.
그래서 CLIP에서 하던 "고양이", "강아지", "자전거 타는 사람" 중 가장 유사한 항목을 찾는 방식은 BLIP에서는 이미지 캡션을 생성한 후, 후보 텍스트와 비교합니다.
from PIL import Image
import requests
import torch
from transformers import BlipProcessor, BlipForConditionalGeneration
from sentence_transformers import SentenceTransformer, util
# 1. BLIP 모델 및 프로세서 불러오기 (캡셔닝용)
blip_model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-base")
blip_processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-base")
# 2. 이미지 불러오기
url = "https://images.pexels.com/photos/248547/pexels-photo-248547.jpeg?auto=compress&cs=tinysrgb&w=800"
image = Image.open(requests.get(url, stream=True).raw).convert("RGB")
# 3. 이미지 캡션 생성
inputs = blip_processor(images=image, return_tensors="pt")
with torch.no_grad():
output_ids = blip_model.generate(**inputs, max_length=20)
caption = blip_processor.decode(output_ids[0], skip_special_tokens=True)
print(f"BLIP 생성 캡션: {caption}")
# 4. 비교할 텍스트 리스트 정의
texts = ["고양이", "강아지", "자전거 타는 사람"]
# 5. 텍스트 임베딩 모델 로드 (문장 유사도 계산용)
embedder = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
# 6. 생성된 캡션과 후보 텍스트의 유사도 계산
caption_emb = embedder.encode(caption, convert_to_tensor=True)
texts_emb = embedder.encode(texts, convert_to_tensor=True)
cos_scores = util.pytorch_cos_sim(caption_emb, texts_emb)[0]
# 7. 결과 출력
for text, score in zip(texts, cos_scores):
print(f"{text}: {score.item():.2f}")
max_idx = torch.argmax(cos_scores).item()
print(f"이미지(캡션: '{caption}')는 '{texts[max_idx]}'와 가장 유사합니다. (유사도: {cos_scores[max_idx].item():.2f})")
# 8. 이미지 출력
thumb_size = (400, 500)
image.thumbnail(thumb_size)
display(image)위의 이미지의 유사도는 비슷하게 나왔습니다.(CLIP : 0.68, BLIP : 0.62)
BLIP 에서는 이미지 캡션 생성 기능이 추가되어 의미적 유사도를 계산하였습니다.
멀티모달 분야에서 BLIP 과 CLIP 은 각 자의 구조와 특성에 따라 다양하게 활용하면 좋을 것 같습니다.
DEVOTEE를 활성화 시키면
지금 작성한 댓글에 AI가 댓글을 달아줍니다.