데보션앱 소개페이지 바로가기
로그인 선택

신고하기

CLOSE
신고사유 (대표 사유 1개)
상세내용 (선택)
0/200
  • 신고한 게시글은 더 이상 보이지 않습니다.
  • 이용약관과 운영정책에 따라 신고사유에 해당하는지 검토 후 조치됩니다.
  • 허위 신고인 경우, 신고자의 서비스 이용이 제한될 수 있으니 유의하시어 신중하게 신고해 주세요.
(이 회원이 작성한 모든 댓글과 커뮤니티 게시물이 보이지 않고, 알림도 오지 않습니다.)

미리보기

커뮤니티

      1,234

      badge 23.06.15

      글 등록

      카테고리를 선택해주세요.

      DEVOTEE를 활성화 시키면
      지금 작성한 커뮤니티 글에 대해 1개의 댓글을 달아줍니다.

      버튼을 누르면 글 수정 시 ChatGPT가 작성한 댓글이 수정됩니다.

      임시저장함에 저장되었습니다. 저장일시 : 2022.5.17 14:29:08

      임시저장함

      제목을 선택하시면 이어서 작성이 가능하며,
      최대 20건까지 저장합니다.
      컨텐츠 유형, 제목, 저장일시, 삭제로 이뤄진 임시저장 목록
      컨텐츠 유형 제목 저장일 삭제

      데보션 블로그 게재 요청

      CLOSE
      • *
      • *

      본인인증

      효율적인 데보션 서비스 이용 및
      고객님의 소중한 개인정보보호를 위해
      본인인증을 진행해주세요. 본인인증 미 진행 시 로그인이 제한됩니다.
      본인인증 실패

      본인인증 로그인에 실패하였습니다.
      회원이 아니시거나 본인인증 등록이
      완료되지 않은 사용자입니다.

      회원정보 연결

      CLIP과 BLIP를 활용한 이미지-텍스트 유사도 계산

      xipert 25.08.18
      4,697 3 1
      DEVOTEE 요약
      BLIP과 CLIP은 이미지와 텍스트를 연결하는 멀티모달 AI 모델로, CLIP은 텍스트와 이미지를 같은 벡터 공간에 매핑해 빠르고 효율적인 검색 및 매칭 작업에 적합하며, BLIP은 이미지 캡셔닝 및 질문 응답 등 텍스트 생성 작업에 특화되었습니다. CLIP은 대조 학습을 통해 코사인 유사도로 텍스트와 이미지 간 관계를 계산하고, BLIP은 이미지로부터 캡션을 생성해 후보 텍스트와 비교하는 방식을 사용합니다. 두 모델은 이미지 검색, 설명 생성, 질문 응답 등 멀티모달 활용 분야에서 각기 다른 장점을 제공합니다.
      DEVOTEE 추천 블로그

      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)모델을 활용하여

      이미지와 여러 텍스트 간의 의미적 유사도를 계산하는 과정을 간단하게 만들어보았습니다.

      1. CLIP

      1-1. 모델 및 프로세서 불러오기

      CLIPModel과 CLIPProcessor를 불러와 사전학습된 모델과 전처리기를 준비합니다.

      openai/clip-vit-base-patch32는 이미지와 텍스트를 같은 임베딩 공간에 매핑할 수 있는 멀티모달 모델입니다.


      1-2. 이미지 불러오기 및 전처리

      지정된 경로 또는 URL 에서 이미지 파일을 불러옵니다.

      이미지는 RGB 형식으로 변환되어 모델 입력에 맞게 준비됩니다.


      1-3. 텍스트 리스트 정의

      이미지와 비교할 텍스트 목록을 정의합니다.

      예시로 "고양이", "강아지", "자전거 타는 사람"을 사용하였습니다.


      1-4. 모델을 사용하기 위한 입력 준비

      이미지와 텍스트를 모델 입력 형식에 맞게 전처리합니다.

      이미지와 텍스트는 배치 형태의 텐서로 변환되고, 패딩이 적용합니다.


      1-5. 모델 추론 및 유사도 계산

      torch.no_grad() 컨텍스트 내에서 모델에 입력을 넣어 추론을 수행합니다.

      이미지와 각 텍스트 간의 유사도 점수(logits)를 계산합니다.

      소프트맥스 함수를 적용해 각 텍스트에 대한 확률로 변환합니다.


      1-6. 결과 출력

      각 텍스트와 이미지 간의 유사도 확률을 출력합니다.

      가장 유사도가 높은 텍스트를 찾아 출력합니다.

      예를 들어, 이 이미지는 '자전거 타는 사람'이 가장 유사합니다. (확률: 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)

      image.png


      2. BLIP

      BLIP는 CLIP처럼 이미지 vs 여러 텍스트의 대조 유사도 계산을 직접적으로 하진 않고, 주로 이미지 캡션 생성이나 질문에 대한 답변(VQA) 같은 형태로 사용합니다.

      그래서 CLIP에서 하던 "고양이", "강아지", "자전거 타는 사람" 중 가장 유사한 항목을 찾는 방식은 BLIP에서는 이미지 캡션을 생성한 후, 후보 텍스트와 비교합니다.


      2-1. BLIP-이미지 캡셔닝 모델을 불러와서, 이미지에 대해 자동 캡션 생성


      2-2.생성된 캡션과 후보 텍스트들을 간단한 문자열 유사도(코사인)로 비교하였습니다.

      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)

      image.png

      위의 이미지의 유사도는 비슷하게 나왔습니다.(CLIP : 0.68, BLIP : 0.62)

      BLIP 에서는 이미지 캡션 생성 기능이 추가되어 의미적 유사도를 계산하였습니다.

      멀티모달 분야에서 BLIP 과 CLIP 은 각 자의 구조와 특성에 따라 다양하게 활용하면 좋을 것 같습니다.

      댓글 0

      DEVOTEE를 활성화 시키면
      지금 작성한 댓글에 AI가 댓글을 달아줍니다.

      xipert 님의 최신 블로그

      더보기

      DEVOTEE 추천 블로그

      동영상 기고하기