Transformers 文件

ColPali

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

PyTorch

ColPali

ColPali 是一種旨在透過分析文件的視覺特徵來檢索文件的模型。與傳統上嚴重依賴文字提取和 OCR 的系統不同,ColPali 將每個頁面視為影像。它使用 Paligemma-3B 不僅捕獲文字,還捕獲佈局、表格、圖表和其他視覺元素,以建立詳細的多向量嵌入,透過計算成對的後期互動相似性分數來進行檢索。這提供了對文件更全面的理解,並能夠實現更高效和準確的檢索。

該模型由 @tonywu71 (ILLUIN Technology) 和 @yonigozlan (HuggingFace) 貢獻。

您可以在 Vidore 的 Hf-native ColVision Models 集合中找到所有原始的 ColPali 檢查點。

點選右側邊欄中的 ColPali 模型,檢視更多關於如何使用 ColPali 進行影像檢索的示例。

影像檢索
import requests
import torch
from PIL import Image

from transformers import ColPaliForRetrieval, ColPaliProcessor


# Load the model and the processor
model_name = "vidore/colpali-v1.3-hf"

model = ColPaliForRetrieval.from_pretrained(
    model_name,
    torch_dtype=torch.bfloat16,
    device_map="auto",  # "cpu", "cuda", or "mps" for Apple Silicon
)
processor = ColPaliProcessor.from_pretrained(model_name)

# The document page screenshots from your corpus
url1 = "https://upload.wikimedia.org/wikipedia/commons/8/89/US-original-Declaration-1776.jpg"
url2 = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Romeoandjuliet1597.jpg/500px-Romeoandjuliet1597.jpg"

images = [
    Image.open(requests.get(url1, stream=True).raw),
    Image.open(requests.get(url2, stream=True).raw),
]

# The queries you want to retrieve documents for
queries = [
    "When was the United States Declaration of Independence proclaimed?",
    "Who printed the edition of Romeo and Juliet?",
]

# Process the inputs
inputs_images = processor(images=images).to(model.device)
inputs_text = processor(text=queries).to(model.device)

# Forward pass
with torch.no_grad():
    image_embeddings = model(**inputs_images).embeddings
    query_embeddings = model(**inputs_text).embeddings

# Score the queries against the images
scores = processor.score_retrieval(query_embeddings, image_embeddings)

print("Retrieval scores (query x image):")
print(scores)

如果在使用 PIL 載入影像時遇到問題,可以使用以下程式碼建立虛擬影像:

images = [
    Image.new("RGB", (128, 128), color="white"),
    Image.new("RGB", (64, 32), color="black"),
]

量化透過以較低精度表示權重來減少大型模型的記憶體負擔。有關更多可用量化後端,請參閱量化概述。

以下示例使用 bitsandbytes 將權重量化為 int4。

import requests
import torch
from PIL import Image

from transformers import BitsAndBytesConfig, ColPaliForRetrieval, ColPaliProcessor


model_name = "vidore/colpali-v1.3-hf"

# 4-bit quantization configuration
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_use_double_quant=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
)

model = ColPaliForRetrieval.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="cuda",
)

processor = ColPaliProcessor.from_pretrained(model_name)

url1 = "https://upload.wikimedia.org/wikipedia/commons/8/89/US-original-Declaration-1776.jpg"
url2 = "https://upload.wikimedia.org/wikipedia/commons/thumb/4/4c/Romeoandjuliet1597.jpg/500px-Romeoandjuliet1597.jpg"

images = [
    Image.open(requests.get(url1, stream=True).raw),
    Image.open(requests.get(url2, stream=True).raw),
]

queries = [
    "When was the United States Declaration of Independence proclaimed?",
    "Who printed the edition of Romeo and Juliet?",
]

# Process the inputs
inputs_images = processor(images=images, return_tensors="pt").to(model.device)
inputs_text = processor(text=queries, return_tensors="pt").to(model.device)

# Forward pass
with torch.no_grad():
    image_embeddings = model(**inputs_images).embeddings
    query_embeddings = model(**inputs_text).embeddings

# Score the queries against the images
scores = processor.score_retrieval(query_embeddings, image_embeddings)

print("Retrieval scores (query x image):")
print(scores)

注意事項

  • score_retrieval() 返回一個 2D 張量,其中第一個維度是查詢的數量,第二個維度是影像的數量。分數越高表示查詢與影像之間的相似性越高。

ColPaliConfig

class transformers.ColPaliConfig

< >

( vlm_config = None text_config = None embedding_dim: int = 128 **kwargs )

引數

  • vlm_config (PretrainedConfig, 可選) — VLM 主幹模型的配置。
  • text_config (PretrainedConfig, 可選) — 文字主幹模型的配置。如果提供,將覆蓋 vlm_configtext_config 屬性。
  • embedding_dim (int, 可選, 預設為 128) — 模型生成的多向量嵌入的維度。

配置類,用於儲存 ColPaliForRetrieval 的配置。它用於根據指定的引數例項化 ColPaliForRetrieval 例項,按照“ColPali:使用視覺語言模型高效檢索文件”論文中的方法定義模型架構。

使用預設設定建立配置將導致 VLM 主幹設定為預設 PaliGemma 配置,即來自 vidore/colpali-v1.2 的配置。

請注意,與類名所暗示的(實際上該名稱是指 ColPali 方法論)相反,您可以透過將相應的 VLM 配置傳遞給類建構函式來使用 PaliGemma 之外的不同 VLM 主幹模型。

配置物件繼承自 PretrainedConfig,可用於控制模型輸出。有關更多資訊,請參閱 PretrainedConfig 的文件。

示例

from transformers.models.colpali import ColPaliConfig, ColPaliForRetrieval

config = ColPaliConfig()
model = ColPaliForRetrieval(config)

ColPaliProcessor

class transformers.ColPaliProcessor

< >

( image_processor = None tokenizer = None chat_template = None visual_prompt_prefix: str = 'Describe the image.' query_prefix: str = 'Question: ' )

引數

  • image_processor (SiglipImageProcessor, 可選) — 影像處理器是必需輸入。
  • tokenizer (LlamaTokenizerFast, 可選) — 分詞器是必需輸入。
  • chat_template (str, 可選) — 一個 Jinja 模板,用於將聊天中的訊息列表轉換為可分詞的字串。
  • visual_prompt_prefix (str, 可選, 預設為 "Describe the image.") — 一個字串,它將被分詞並新增到影像 token 的前面。
  • query_prefix (str, 可選, 預設為 "Question -- "): 查詢字首。

構建一個 ColPali 處理器,它封裝了一個 PaliGemmaProcessor 和處理影像和查詢的特殊方法,以及計算後期互動檢索分數的方法。

ColPaliProcessor 提供了 PaliGemmaProcessor 的所有功能。有關更多資訊,請參閱 __call__()

batch_decode

< >

( *args **kwargs )

此方法將其所有引數轉發給 GemmaTokenizerFast 的 batch_decode()。有關更多資訊,請參閱此方法的文件字串。

decode

< >

( *args **kwargs )

此方法將其所有引數轉發給 GemmaTokenizerFast 的 decode()。有關更多資訊,請參閱此方法的文件字串。

process_images

< >

( images: typing.Union[ForwardRef('PIL.Image.Image'), numpy.ndarray, ForwardRef('torch.Tensor'), list['PIL.Image.Image'], list[numpy.ndarray], list['torch.Tensor']] = None **kwargs: typing_extensions.Unpack[transformers.models.colpali.processing_colpali.ColPaliProcessorKwargs] ) BatchFeature

引數

  • images (PIL.Image.Image, np.ndarray, torch.Tensor, list[PIL.Image.Image], list[np.ndarray], list[torch.Tensor]) — 要準備的影像或影像批次。每個影像可以是 PIL 影像、NumPy 陣列或 PyTorch 張量。如果是 NumPy 陣列/PyTorch 張量,每個影像的形狀應為 (C, H, W),其中 C 是通道數,H 和 W 是影像高和寬。
  • return_tensors (strTensorType, 可選) — 如果設定,將返回特定框架的張量。可接受的值為:

    • 'tf': 返回 TensorFlow tf.constant 物件。
    • 'pt': 返回 PyTorch torch.Tensor 物件。
    • 'np': 返回 NumPy np.ndarray 物件。
    • 'jax': 返回 JAX jnp.ndarray 物件。

返回

批次特徵

一個具有以下欄位的 BatchFeature

  • input_ids — 要輸入到模型中的標記 ID 列表。
  • attention_mask — 指定模型應關注哪些 token 的索引列表(當 return_attention_mask=True"attention_mask"self.model_input_names 中且 text 不為 None 時)。
  • pixel_values — 要輸入到模型的畫素值。當 images 不為 None 時返回。

為模型準備一個或多個影像。此方法是 ColPaliProcessor 的 ColPaliProcessor.__call__() 方法的包裝器。

此方法將 imageskwargs 引數轉發給影像處理器。

process_queries

< >

( text: typing.Union[str, list[str]] **kwargs: typing_extensions.Unpack[transformers.models.colpali.processing_colpali.ColPaliProcessorKwargs] ) BatchFeature

引數

  • text (str, list[str], list[list[str]]) — 要編碼的序列或序列批次。每個序列可以是字串或字串列表(預分詞字串)。如果序列以字串列表(預分詞)形式提供,則必須設定 is_split_into_words=True(以消除與批次序列的歧義)。
  • return_tensors (strTensorType, 可選) — 如果設定,將返回特定框架的張量。可接受的值為:

    • 'tf': 返回 TensorFlow tf.constant 物件。
    • 'pt': 返回 PyTorch torch.Tensor 物件。
    • 'np': 返回 NumPy np.ndarray 物件。
    • 'jax': 返回 JAX jnp.ndarray 物件。

返回

批次特徵

一個具有以下欄位的 BatchFeature

  • input_ids — 要輸入到模型中的標記 ID 列表。
  • attention_mask — 指定模型應關注哪些 token 的索引列表(當 return_attention_mask=True"attention_mask"self.model_input_names 中且 text 不為 None 時)。

為模型準備一個或多個文字。此方法是 ColPaliProcessor 的 ColPaliProcessor.__call__() 方法的包裝器。

此方法將 textkwargs 引數轉發給分詞器。

score_retrieval

< >

( query_embeddings: typing.Union[ForwardRef('torch.Tensor'), list['torch.Tensor']] passage_embeddings: typing.Union[ForwardRef('torch.Tensor'), list['torch.Tensor']] batch_size: int = 128 output_dtype: typing.Optional[ForwardRef('torch.dtype')] = None output_device: typing.Union[ForwardRef('torch.device'), str] = 'cpu' ) torch.Tensor

引數

  • query_embeddings (Union[torch.Tensor, list[torch.Tensor]) — 查詢嵌入。
  • passage_embeddings (Union[torch.Tensor, list[torch.Tensor]) — 段落嵌入。
  • batch_size (int, 可選, 預設為 128) — 計算分數的批次大小。
  • output_dtype (torch.dtype, 可選, 預設為 torch.float32) — 輸出張量的資料型別。如果為 None,則使用輸入嵌入的資料型別。
  • output_device (torch.devicestr, 可選, 預設為“cpu”) — 輸出張量的裝置。

返回

torch.Tensor

一個形狀為 (n_queries, n_passages) 的張量,包含分數。分數張量儲存在“cpu”裝置上。

計算給定多向量查詢嵌入 (qs) 和段落嵌入 (ps) 的後期互動/MaxSim 分數(ColBERT-like)。對於 ColPali,段落是文件頁面的影像。

由於嵌入張量是多向量的,因此可以具有不同的形狀,它們應以以下形式提供:(1)張量列表,其中第 i 個張量的形狀為(sequence_length_i,embedding_dim)(2)形狀為(n_passages,max_sequence_length,embedding_dim)的單個張量 -> 通常透過填充張量列表獲得。

ColPaliForRetrieval

class transformers.ColPaliForRetrieval

< >

( config: ColPaliConfig )

引數

  • config (ColPaliConfig) — 包含模型所有引數的模型配置類。使用配置檔案初始化不會載入與模型相關的權重,僅載入配置。請檢視 from_pretrained() 方法載入模型權重。

ColPali 架構利用 VLM 直接從文件影像(“截圖”)構建高效的多向量嵌入,用於文件檢索。該模型經過訓練,旨在最大化這些文件嵌入與相應查詢嵌入之間的相似性,使用 ColBERT 中引入的後期互動方法。

使用 ColPali 消除了對可能複雜且脆弱的佈局識別和 OCR 管道的需求,而是透過一個單一模型來考慮文件的文字和視覺內容(佈局、圖表等)。

ColPali 是 ColVision 模型系列的一部分,該系列首次在以下論文中介紹:ColPali:使用視覺語言模型高效檢索文件

該模型繼承自 PreTrainedModel。請檢視超類文件,瞭解庫為其所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭部等)。

該模型也是 PyTorch torch.nn.Module 子類。將其用作常規 PyTorch Module,並參閱 PyTorch 文件以瞭解所有與一般用法和行為相關的事項。

forward

< >

( input_ids: typing.Optional[torch.LongTensor] = None pixel_values: typing.Optional[torch.FloatTensor] = None attention_mask: typing.Optional[torch.Tensor] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None **kwargs ) transformers.models.colpali.modeling_colpali.ColPaliForRetrievalOutput or tuple(torch.FloatTensor)

引數

  • input_ids (形狀為 (batch_size, sequence_length)torch.LongTensor, 可選) — 詞彙表中輸入序列 token 的索引。預設情況下會忽略填充。

    可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參見 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什麼是輸入 ID?

  • pixel_values (形狀為 (batch_size, num_channels, image_size, image_size)torch.FloatTensor, 可選) — 對應於輸入影像的張量。畫素值可以使用 {image_processor_class} 獲取。有關詳細資訊,請參見 {image_processor_class}.__call__{processor_class} 使用 {image_processor_class} 處理影像)。
  • attention_mask (形狀為 (batch_size, sequence_length)torch.Tensor, 可選) — 避免對填充 token 索引執行注意力操作的掩碼。掩碼值選擇在 [0, 1] 中:

    • 1 表示 未被掩蓋 的 token,
    • 0 表示 被掩蓋 的 token。

    什麼是注意力掩碼?

  • output_attentions (bool, 可選) — 是否返回所有注意力層的注意力張量。有關更多詳細資訊,請參閱返回張量下的 attentions
  • output_hidden_states (bool, 可選) — 是否返回所有層的隱藏狀態。有關更多詳細資訊,請參閱返回張量下的 hidden_states
  • return_dict (bool, 可選) — 是否返回 ModelOutput 物件而不是純元組。

返回

transformers.models.colpali.modeling_colpali.ColPaliForRetrievalOutputtuple(torch.FloatTensor)

一個 transformers.models.colpali.modeling_colpali.ColPaliForRetrievalOutput 或一個 torch.FloatTensor 元組(如果傳入 return_dict=Falseconfig.return_dict=False),包含根據配置(ColPaliConfig)和輸入而定的各種元素。

  • loss (torch.FloatTensor 形狀為 (1,)可選,當提供 labels 時返回) — 語言建模損失(用於下一個 token 預測)。

  • embeddings (torch.FloatTensor,形狀為 (batch_size, sequence_length, hidden_size)) — 模型的嵌入。

  • past_key_values (tuple(tuple(torch.FloatTensor)), 可選, 在傳入 use_cache=Trueconfig.use_cache=True 時返回) — 長度為 config.n_layerstuple(torch.FloatTensor) 元組,每個元組包含兩個形狀為 (batch_size, num_heads, sequence_length, embed_size_per_head) 的張量)

    包含預計算的隱藏狀態(自注意力塊中的鍵和值),可用於(參見 past_key_values 輸入)加速順序解碼。

  • hidden_states (tuple[torch.FloatTensor], 可選, 在傳入 output_hidden_states=Trueconfig.output_hidden_states=True 時返回) — torch.FloatTensor 元組(一個用於嵌入層輸出,如果模型有嵌入層,+ 每個層的輸出一個),形狀為 (batch_size, sequence_length, hidden_size)

    模型在每個層輸出的隱藏狀態以及可選的初始嵌入輸出。

  • attentions (tuple[torch.FloatTensor], 可選, 在傳入 output_attentions=Trueconfig.output_attentions=True 時返回) — torch.FloatTensor 元組(每個層一個),形狀為 (batch_size, num_heads, sequence_length, sequence_length)

    注意力 softmax 後的注意力權重,用於計算自注意力頭中的加權平均值。

  • image_hidden_states (torch.FloatTensor, 可選) — 一個大小為 (batch_size, num_images, sequence_length, hidden_size)torch.FloatTensor。由視覺編碼器在投影最後隱藏狀態後生成的模型 image_hidden_states。

ColPaliForRetrieval 的 forward 方法,它覆蓋了 __call__ 特殊方法。

儘管前向傳遞的實現需要在該函式中定義,但在此之後應呼叫 Module 例項而不是此函式,因為前者負責執行預處理和後處理步驟,而後者則默默地忽略它們。

示例

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.