跨越文本與圖像的橋樑:深入解析 CLIP 模型

  • CLIP(Contrastive Language–Image Pretraining)是 OpenAI 開發的一種多模態模型,它將圖像和文本嵌入到同一向量空間,從而實現了多樣化的應用場景。CLIP 的核心思想是通過對比學習(contrastive learning)方法,在預訓練階段學習到圖像和文本之間的關聯性。具體來說,CLIP 使用一個文本編碼器(如 Transformer)和一個圖像編碼器(如 Vision Transformer 或 ResNet),分別將文本和圖像轉換為嵌入向量,並通過計算兩者的餘弦相似度進行匹配。


  • CLIP 支持的應用包括圖文檢索、零樣本分類和圖像描述生成等。例如,通過輸入一張圖片和多段文本描述,CLIP 可以識別哪段文字最符合該圖片。與傳統方法不同,CLIP 不需要為特定任務進行訓練,僅依靠預訓練即可實現高效的跨模態理解。這使其成為處理多模態數據的強大工具。


  • transformers 是由 Hugging Face 提供的 Python 庫,專注於自然語言處理(NLP)和多模態處理(如圖文結合)的預訓練模型。該庫支持多種模型架構,如 BERT、GPT、CLIP 等,並提供簡單的接口來下載、使用和微調這些模型。


  • 因此使用方法就是調用 openai 放在Hugging Face上的clip 權重即可執行,第一次執行載入模型會下載clip 主模型,之後就能在本地端直接使用


  • Step1:安裝環境

    • pip install transformers torch
  • Step2:載入模型與處理器

    • .
      from transformers import CLIPProcessor, CLIPModel

      # 載入 CLIP 模型與處理器
      model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
      processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

    • 模型選擇
      • openai/clip-vit-base-patch32
      • openai/clip-vit-large-patch14
      • openai/clip-vit-base-patch16
      • openai/clip-vit-large-patch14–336
      • patrickjohncyh/fashion-clip
      • laion/CLIP-ViT-H-14-laion2B-s32B-b79K
      • laion/CLIP-ViT-B-32-laion2B-s34B-b79K
      • CIDAS/clipseg-rd64-refined
      • flaviagiammarino/pubmed-clip-vit-base-patch32
      • laion/CLIP-ViT-L-14-DataComp.XL-s13B-b90K
    • 模型放置地點
      • ls ~/.cache/huggingface/hub/
  • Step3: 處理數據

    • 數據的形式可以是單個也可以是一個 list 的形式
    • .
      from PIL import Image

      # 加載圖像
      image = Image.open("example.jpg")

      # 定義文字描述
      text = ["A cat on a sofa", "A dog in the park"]

      inputs = processor(images=image, text=text, return_tensors="pt", padding=True)

  • Step4: 輸入模型得到模型輸出

    • .
      outputs = model(**inputs)

    • outputs
      • ‘image_embeds’→輸出是一個N*512的向量,看圖片輸入幾張輸出就有幾維
      • ‘text_embeds’→輸出是一個N*512的向量,看text輸入幾段輸出就有幾維
      • ‘logits_per_image’→分別對應到每一張影像所對應的text的相近程度,矩陣中的每個值 \(\text{logits}[i][j]\) 代表第 \(i\) 張圖片與第 \(j\) 段文字之間的相似性分數
      • ‘logits_per_text’→分別對應到每一段文字所對應的圖片相近程度,矩陣中的每個值 \(\text{logits}[i][j]\) 代表第 \(i\) 段文字與第 \(j\) 張圖片之間的相似性分數
  • 參考資料

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments