社群計算機視覺課程文件

多模態任務與模型

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

多模態任務與模型

在本節中,我們將簡要介紹涉及影像和文字模態的不同多模態任務及其相應的模型。在深入探討之前,讓我們簡要回顧一下“多模態”的含義,這在前面的章節中已經涵蓋。人類世界是多樣感官輸入的交響樂。我們透過視覺、聽覺、觸覺等感知和理解。這種多模態性將我們豐富的理解與傳統單模態AI模型的侷限性區分開來。受人類認知的啟發,多模態模型旨在透過整合來自多個來源(如文字、影像、音訊,甚至感測器資料)的資訊來彌合這一差距。這種模態的融合帶來了對世界更全面和細緻的理解,解鎖了廣泛的任務和應用。

任務示例

在深入研究特定模型之前,瞭解涉及影像和文字的各種任務至關重要。這些任務包括但不限於:

  • 視覺問答(VQA)和視覺推理: 想象一臺機器,它看著一張圖片,並理解你對它的問題。視覺問答(VQA)就是這樣!它訓練計算機從影像中提取意義並回答問題,例如“誰在開車?”而視覺推理則是秘訣,它使機器能夠超越簡單的識別,推斷關係,比較物件,並理解場景上下文以給出準確的答案。這就像請一位偵探來解讀圖片中的線索,只是更快更好!

  • 文件視覺問答(DocVQA): 想象一臺計算機能夠理解文件(如地圖或合同)的文字和佈局,然後直接從影像中回答相關問題。這就是文件視覺問答(DocVQA)的精髓。它結合了計算機視覺處理影像元素和自然語言處理解釋文字,使機器能夠像人類一樣“閱讀”並回答文件相關問題。可以將其視為透過AI增強文件搜尋能力,從而解鎖影像中所有被困的資訊。

  • 影像描述生成: 影像描述生成彌合了視覺和語言之間的鴻溝。它像偵探一樣分析影像,提取細節,理解場景,然後撰寫一兩句話來講述故事——平靜海面上的日落,盪鞦韆時歡笑的孩子,甚至是熙熙攘攘的城市街道。這是計算機視覺和語言的迷人結合,讓計算機一次一張圖片地描述周圍的世界。

  • 影像-文字檢索: 影像-文字檢索就像是影像和其描述的“紅娘”。把它想象成在圖書館裡搜尋一本特定的書,但你可以使用封面上的圖片或簡短的摘要來找到它,而不是瀏覽書名。它就像一個超級強大的搜尋引擎,既能理解圖片又能理解文字,為影像搜尋、自動生成字幕,甚至幫助視障人士透過文字描述“看”世界等激動人心的應用打開了大門。

  • 視覺定位: 視覺定位就像連線我們所見和所說的點。它旨在理解語言如何引用影像的特定部分,從而使AI模型能夠根據自然語言描述精確定位物體或區域。想象一下,你問“水果碗裡的紅蘋果在哪裡?”,AI會立即在圖片中高亮顯示它——這就是視覺定位的作用!

  • 文字到影像生成: 想象一支神奇的畫筆,它能解讀你的文字並使其栩栩如生!文字到影像生成就是這樣;它將你的書面描述轉化為獨特的影像。它是語言理解和影像創作的融合,你的文字開啟了一個視覺世界,從逼真的風景到夢幻般的抽象,所有這些都源於你文字的力量。

視覺問答(VQA)與視覺推理

VQA VQA和視覺推理模型的輸入(影像+文字)和輸出(文字)示例 [1]

視覺問答(VQA)

  • 輸入: 影像-問題對(影像和關於它的問題)。
  • 輸出: 在多項選擇設定中:與預定義選項中的正確答案相對應的標籤。在開放式設定中:基於影像和問題的自由格式自然語言答案。
  • 任務: 回答有關影像的問題。(大多數VQA模型將其視為具有預定義答案的分類問題)。請參閱上述示例以供參考。

視覺推理

  • 輸入: 根據具體的視覺推理任務而異
    • VQA風格任務:影像-問題對。
    • 匹配任務:影像和文字語句。
    • 蘊含任務:影像和文字對(可能包含多個語句)。
    • 子問題任務:影像和主要問題,以及額外的感知相關子問題。
  • 輸出: 依任務而異
    • VQA:回答關於影像的問題。
    • 匹配:文字是否與影像真實匹配,回答真/假。
    • 蘊含:預測影像是否語義蘊含文字。
    • 子問題:回答與感知相關的子問題。
  • 任務: 對影像執行各種推理任務。請參閱上述示例以供參考。

通常,VQA和視覺推理都被視為視覺問答(VQA)任務。一些流行的VQA模型有:

  • BLIP-VQA:Salesforce AI開發的用於視覺問答(VQA)任務的大型預訓練模型。它採用“Bootstrapping Language-Image Pre-training”(BLIP)方法,利用嘈雜的網路資料和字幕生成,在各種視覺語言任務上取得了最先進的效能。你可以在huggingface中按如下方式使用BLIP:
from PIL import Image
from transformers import pipeline

vqa_pipeline = pipeline(
    "visual-question-answering", model="Salesforce/blip-vqa-capfilt-large"
)

image = Image.open("elephant.jpeg")
question = "Is there an elephant?"

vqa_pipeline(image, question, top_k=1)
  • Deplot:它是一種單次視覺語言推理模型,訓練用於將圖表和圖形翻譯成文字摘要。這使其能夠與LLM整合,用於回答關於資料的複雜問題,甚至包括新穎的人工編寫的查詢。DePlot透過標準化圖表到表格的翻譯任務並利用Pix2Struct架構實現這一點,僅透過一個示例和LLM提示就在圖表QA上超越了先前的SOTA。您可以在huggingface中按如下方式使用Deplot:
from transformers import Pix2StructProcessor, Pix2StructForConditionalGeneration
import requests
from PIL import Image

processor = Pix2StructProcessor.from_pretrained("google/deplot")
model = Pix2StructForConditionalGeneration.from_pretrained("google/deplot")

url = "https://raw.githubusercontent.com/vis-nlp/ChartQA/main/ChartQA%20Dataset/val/png/5090.png"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(
    images=image,
    text="Generate underlying data table of the figure below:",
    return_tensors="pt",
)
predictions = model.generate(**inputs, max_new_tokens=512)
print(processor.decode(predictions[0], skip_special_tokens=True))
  • VLIT:它是一個視覺與語言Transformer(ViLT)模型,利用Transformer架構,不含卷積或區域監督,在VQAv2資料集上進行微調,用於回答關於影像的自然語言問題。基礎ViLT模型擁有大型架構(B32大小),並利用影像和文字的聯合訓練,使其在各種視覺語言任務,特別是VQA方面表現出色,達到了有競爭力的效能。您可以在HuggingFace中按如下方式使用VLIT:
from transformers import ViltProcessor, ViltForQuestionAnswering
import requests
from PIL import Image

# prepare image + question
url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
text = "How many cats are there?"

processor = ViltProcessor.from_pretrained("dandelin/vilt-b32-finetuned-vqa")
model = ViltForQuestionAnswering.from_pretrained("dandelin/vilt-b32-finetuned-vqa")

# prepare inputs
encoding = processor(image, text, return_tensors="pt")

# forward pass
outputs = model(**encoding)
logits = outputs.logits
idx = logits.argmax(-1).item()
print("Predicted answer:", model.config.id2label[idx])

瞭解更多關於如何在HuggingFace transformers 庫中訓練和使用VQA模型,請點選此處

文件視覺問答(DocVQA)

DocVQA DocVQA模型的輸入(影像+文字)和輸出(文字)示例。 [2]

  • 輸入

    • 文件影像:文件的掃描或數字影像,包含文字、佈局和視覺元素。
    • 關於文件的問題:以文字形式提出的自然語言問題。
  • 任務

    • 分析和理解:DocVQA模型必須處理文件中的視覺和文字資訊,以充分理解其內容。
    • 推理和推斷:模型需要建立視覺元素、文字和問題之間的關係,以得出相關結論。
    • 生成自然語言答案:模型必須以自然語言文字格式生成清晰、簡潔、準確的問題答案。請參閱上述示例以供參考。
  • 輸出: 問題答案:直接回答查詢並準確反映文件中資訊的文本回復。

現在,讓我們來看看HuggingFace中一些流行的DocVQA模型。

  • LayoutLM: 它是一個預訓練的神經網路,透過聯合分析文字及其佈局來理解文件影像。與傳統的NLP模型不同,它考慮字型大小、位置和鄰近度等因素,以學習單詞與其在文件上下文中的含義之間的關係。這使其在表單理解、收據分析和文件分類等任務中表現出色,成為從掃描文件中提取資訊的強大工具。您可以在HuggingFace中按如下方式使用LayoutLM:
from transformers import pipeline
from PIL import Image

pipe = pipeline("document-question-answering", model="impira/layoutlm-document-qa")

question = "What is the purchase amount?"
image = Image.open("your-document.png")

pipe(image=image, question=question)

## [{'answer': '20,000$'}]
  • Donut: 又稱無OCR文件理解Transformer,是一種最先進的影像處理模型,它繞過了傳統的光學字元識別(OCR),直接分析文件影像以理解其內容。它結合了視覺編碼器(Swin Transformer)和文字解碼器(BART)來提取資訊並生成文字描述,在文件分類、表單理解和視覺問答等任務中表現出色。其獨特的優勢在於其“端到端”的性質,避免了單獨OCR步驟可能引入的潛在錯誤,並透過高效處理實現了令人印象深刻的準確性。您可以在HuggingFace中按如下方式使用Donut模型:
from transformers import pipeline
from PIL import Image

pipe = pipeline(
    "document-question-answering", model="naver-clova-ix/donut-base-finetuned-docvqa"
)

question = "What is the purchase amount?"
image = Image.open("your-document.png")

pipe(image=image, question=question)

## [{'answer': '20,000$'}]
  • Nougat: 它是一個視覺Transformer模型,透過數百萬篇學術論文的訓練,可以直接“閱讀”掃描的PDF檔案,並以結構化標記語言輸出其內容,甚至能理解數學方程和表格等複雜元素。它繞過了傳統的光學字元識別(OCR),在保持語義的同時實現了高精度,使得儲存在PDF中的科學知識更易於訪問和使用。Nougat採用與Donut相同的架構,即一個影像Transformer編碼器和一個自迴歸文字Transformer解碼器,用於將科學PDF轉換為Markdown,從而更方便地訪問它們。您可以在HuggingFace中按如下方式使用Nougat模型:
from huggingface_hub import hf_hub_download
import re
from PIL import Image

from transformers import NougatProcessor, VisionEncoderDecoderModel
from datasets import load_dataset
import torch

processor = NougatProcessor.from_pretrained("facebook/nougat-base")
model = VisionEncoderDecoderModel.from_pretrained("facebook/nougat-base")

device = "cuda" if torch.cuda.is_available() else "cpu"
model.to(device)
# prepare PDF image for the model
filepath = hf_hub_download(
    repo_id="hf-internal-testing/fixtures_docvqa",
    filename="nougat_paper.png",
    repo_type="dataset",
)
image = Image.open(filepath)
pixel_values = processor(image, return_tensors="pt").pixel_values

# generate transcription (here we only generate 30 tokens)
outputs = model.generate(
    pixel_values.to(device),
    min_length=1,
    max_new_tokens=30,
    bad_words_ids=[[processor.tokenizer.unk_token_id]],
)

sequence = processor.batch_decode(outputs, skip_special_tokens=True)[0]
sequence = processor.post_process_generation(sequence, fix_markdown=False)
# note: we're using repr here such for the sake of printing the \n characters, feel free to just print the sequence
print(repr(sequence))

瞭解更多關於如何在HuggingFace transformers 庫中訓練和使用DocVQA模型,請點選此處

影像描述生成

Image Captioning 影像描述生成模型的輸入(影像)和輸出(文字)示例。 [1]

  • 輸入
    • 影像:各種格式的影像(例如,JPEG,PNG)。
    • 預訓練影像特徵提取器(可選):一個預訓練的神經網路,可以從影像中提取有意義的特徵,例如卷積神經網路(CNN)。
  • 輸出: 文字描述:準確描述輸入影像內容的單句或段落,捕捉物體、動作、關係和整體上下文。請參閱上述示例以供參考。
  • 任務: 自動生成影像的自然語言描述。這包括:(1) 理解影像的視覺內容(物體、動作、關係)。(2) 將這些資訊編碼成有意義的表示。(3) 將此表示解碼成連貫、語法正確且資訊豐富的句子或短語。

現在,讓我們來看看HuggingFace中一些流行的影像描述生成模型。

  • ViT-GPT2: 它是一個用於生成影像描述的PyTorch模型,透過結合視覺Transformer(ViT)進行視覺特徵提取和GPT-2進行文字生成構建而成。在COCO資料集上進行訓練,它利用ViT編碼豐富影像細節的能力和GPT-2的語言流暢性來建立準確和描述性的描述。這個開源模型為影像理解和描述生成任務提供了有效的解決方案。您可以在HuggingFace中按如下方式使用ViT-GPT2
from transformers import pipeline

image_to_text = pipeline("image-to-text", model="nlpconnect/vit-gpt2-image-captioning")

image_to_text("https://ankur3107.github.io/assets/images/image-captioning-example.png")

# [{'generated_text': 'a soccer game with a player jumping to catch the ball '}]
  • BLIP-Image-Captioning: 這是一個基於BLIP的最新影像描述生成模型,BLIP是一個預訓練於乾淨和嘈雜網路資料上的框架,用於統一視覺語言理解和生成。它利用自舉過程過濾嘈雜的描述,在影像描述生成、影像-文字檢索和VQA等任務上取得了改進的效能。這個大型版本,以ViT-L為主幹,擅長從影像生成準確詳細的描述。您可以在HuggingFace中按如下方式使用BLIP影像描述生成模型:
import requests
from PIL import Image
from transformers import BlipProcessor, BlipForConditionalGeneration

processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-large")
model = BlipForConditionalGeneration.from_pretrained(
    "Salesforce/blip-image-captioning-large"
)

img_url = "https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg"
raw_image = Image.open(requests.get(img_url, stream=True).raw).convert("RGB")

# conditional image captioning
text = "a photography of"
inputs = processor(raw_image, text, return_tensors="pt")

out = model.generate(**inputs)
print(processor.decode(out[0], skip_special_tokens=True))

# unconditional image captioning
inputs = processor(raw_image, return_tensors="pt")

out = model.generate(**inputs)
print(processor.decode(out[0], skip_special_tokens=True))
  • git-base: microsoft/git-base 是 GIT(GenerativeImage2Text)模型的基本大小版本,GIT是一個Transformer解碼器,用於生成影像的文字描述。它同時接收影像標記和文字標記作為輸入,並根據影像和之前的文字預測下一個文字標記。這使得它適用於影像和影片描述生成等任務。存在針對特定資料集的微調版本,例如 microsoft/git-base-cocomicrosoft/git-base-textcaps,而基礎模型則為進一步自定義提供了起點。您可以在HuggingFace中按如下方式使用git-base模型:
from transformers import AutoProcessor, AutoModelForCausalLM
import requests
from PIL import Image

processor = AutoProcessor.from_pretrained("microsoft/git-base-coco")
model = AutoModelForCausalLM.from_pretrained("microsoft/git-base-coco")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

pixel_values = processor(images=image, return_tensors="pt").pixel_values

generated_ids = model.generate(pixel_values=pixel_values, max_length=50)
generated_caption = processor.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(generated_caption)

瞭解更多關於如何在HuggingFace transformers 庫中訓練和使用影像描述生成模型,請點選此處

影像-文字檢索

Image-Text Retrieval 文字到影像檢索的輸入(文字查詢)和輸出(影像)示例。 [1]

  • 輸入
    • 影像:各種格式的影像(例如,JPEG,PNG)。
    • 文字:自然語言文字,通常以與影像相關的標題、描述或關鍵詞的形式。
  • 輸出
    • 相關影像:當給定文字查詢時,系統返回與文字最相關的影像的排名列表。
    • 相關文字:當給定影像查詢時,系統返回最能描述影像的文字描述或標題的排名列表。
  • 任務
    • 影像到文字檢索:給定影像作為輸入,檢索準確描述其內容的文字描述或標題。
    • 文字到影像檢索:給定文字查詢,檢索與文字中提到的概念和實體在視覺上匹配的影像。

影像-文字檢索最流行的模型之一是CLIP。

  • CLIP(對比語言-影像預訓練): 它透過利用共享嵌入空間在影像-文字檢索方面表現出色。透過對比學習,它在大規模影像和文字資料集上進行預訓練,使模型能夠將不同的概念對映到共同的空間。CLIP在預訓練期間利用對比學習方法,學習將影像和文字對映到共享的嵌入空間。這個共享空間使得兩種模態之間可以直接比較,從而實現高效準確的檢索任務。在影像-文字檢索中,可以透過將影像和文字編碼到共享嵌入空間來應用CLIP,影像與文字查詢之間的相似性透過它們各自嵌入的接近程度來衡量。該模型的多功能性源於其在沒有任務特定微調的情況下理解語義關係的能力,使其在從基於內容的影像檢索到解釋影像的自然語言查詢等應用中高效。您可以在HuggingFace中按如下方式使用CLIP進行影像-文字檢索:
from PIL import Image
import requests

from transformers import CLIPProcessor, CLIPModel

model = CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor = CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)

inputs = processor(
    text=["a photo of a cat", "a photo of a dog"],
    images=image,
    return_tensors="pt",
    padding=True,
)

outputs = model(**inputs)
logits_per_image = outputs.logits_per_image  # this is the image-text similarity score
probs = logits_per_image.softmax(
    dim=1
)  # we can take the softmax to get the label probabilities

瞭解更多關於如何在HuggingFace中將CLIP用於影像-文字檢索的資訊,請點選此處

視覺定位

Visual Grounding 輸入(影像+文字)和輸出(邊界框)示例。(a) 短語定位 (b) 表示式理解。 [1]

  • 輸入

    • 影像:場景或物體的視覺表示。
    • 自然語言查詢:指代影像特定部分的文字描述或問題。
  • 輸出: 邊界框或分割掩碼:影像中與查詢中描述的物件或區域對應的空間區域。這通常表示為座標或突出顯示的區域。

  • 任務: 定位相關物件或區域:模型必須正確識別影像中與查詢匹配的部分。這包括理解影像的視覺內容和查詢的語言含義。

現在,讓我們看看HuggingFace中一些流行的視覺定位(目標檢測)模型。

  • OWL-ViT: OWL-ViT(用於開放世界定位的視覺Transformer)是一個功能強大的目標檢測模型,建立在標準視覺Transformer架構之上,並經過大規模影像-文字對的訓練。它擅長“開放詞彙”檢測,這意味著它可以根據文字描述識別訓練資料中不存在的物件。透過利用對比預訓練和微調,OWL-ViT在零樣本(文字引導)和單樣本(影像引導)檢測任務中都取得了令人印象深刻的效能,使其成為靈活搜尋和影像識別的多功能工具。您可以在HuggingFace中按如下方式使用OWL-ViT:
import requests
from PIL import Image
import torch

from transformers import OwlViTProcessor, OwlViTForObjectDetection

processor = OwlViTProcessor.from_pretrained("google/owlvit-base-patch32")
model = OwlViTForObjectDetection.from_pretrained("google/owlvit-base-patch32")

url = "http://images.cocodataset.org/val2017/000000039769.jpg"
image = Image.open(requests.get(url, stream=True).raw)
texts = [["a photo of a cat", "a photo of a dog"]]
inputs = processor(text=texts, images=image, return_tensors="pt")
outputs = model(**inputs)

# Target image sizes (height, width) to rescale box predictions [batch_size, 2]
target_sizes = torch.Tensor([image.size[::-1]])
# Convert outputs (bounding boxes and class logits) to COCO API
results = processor.post_process_object_detection(
    outputs=outputs, threshold=0.1, target_sizes=target_sizes
)

i = 0  # Retrieve predictions for the first image for the corresponding text queries
text = texts[i]
boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"]

# Print detected objects and rescaled box coordinates
for box, score, label in zip(boxes, scores, labels):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Detected {text[label]} with confidence {round(score.item(), 3)} at location {box}"
    )
  • Grounding DINO[3] 它將基於Transformer的目標檢測器(DINO)與“接地預訓練”相結合,建立了一個最先進的零樣本目標檢測模型。這意味著它能夠識別即使不在其訓練資料中的物件,這得益於其理解影像和人類語言輸入(如類別名稱或描述)的能力。其架構結合了文字和影像骨幹、特徵增強器、語言引導查詢選擇和跨模態解碼器,在COCO和LVIS等基準測試中取得了令人印象深刻的結果。本質上,Grounding DINO接收視覺資訊,將其與文字描述關聯,然後利用這種理解來精確定位物件,即使是全新的類別。您可以在Google Colab中試用Grounding DINO模型,點選此處

文字到影像生成

Text-Image Generation 文字影像生成的自迴歸模型和擴散模型示意圖。[1]

  • 自迴歸模型: 這些模型將任務視為將文字描述翻譯成影像標記序列,類似於語言模型生成句子。就像拼圖塊一樣,這些由影像標記器(如VQ-VAE)建立的標記代表基本的影像特徵。模型使用編碼器-解碼器架構:編碼器從文字提示中提取資訊,解碼器則在此資訊的引導下,一次預測一個影像標記,逐步構建最終影像的畫素。這種方法可以實現高度的控制和細節,但在處理長而複雜的提示時面臨挑戰,並且可能比擴散模型等替代方法慢。生成過程如上圖 (a) 所示。

  • Stable Diffusion 模型: Stable Diffusion 模型採用“潛在擴散”技術,透過在文字提示和凍結的 CLIP 文字編碼器指導下,逐步去噪,從噪聲中構建影像。其輕量級架構(帶有 UNet 主幹和 CLIP 編碼器)支援 GPU 驅動的影像生成,而其對潛在空間的關注則減少了記憶體消耗。這種獨特的設定賦予了多樣的藝術表達能力,將文字輸入轉化為逼真且富有想象力的視覺效果。生成過程如上圖 (b) 所示。

現在,讓我們看看如何在HuggingFace中使用文字-影像生成模型。

安裝 diffusers

pip install diffusers --upgrade

此外,請務必安裝transformers、safetensors、accelerate以及隱形水印

pip install invisible_watermark transformers accelerate safetensors

要僅使用基礎模型,可以執行

from diffusers import DiffusionPipeline
import torch

pipe = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-xl-base-1.0",
    torch_dtype=torch.float16,
    use_safetensors=True,
    variant="fp16",
)
pipe.to("cuda")

prompt = "An astronaut riding a unicorn"

images = pipe(prompt=prompt).images[0]

要了解更多關於文字影像生成模型的資訊,您可以參考HuggingFace的Diffusers課程

現在您已經瞭解了一些流行的涉及影像和文字模態的任務和模型。但是您可能想知道如何訓練或微調上述任務。因此,讓我們來了解一下視覺-語言模型的訓練。

視覺-語言預訓練模型概覽

VLP Framework 基於Transformer的視覺-語言模型的通用框架。 [1]

給定影像-文字對,VL模型首先透過文字編碼器和視覺編碼器分別提取文字特徵和視覺特徵。然後,文字和視覺特徵被輸入多模態融合模組以生成跨模態表示,這些表示可選地再輸入解碼器,最後生成最終輸出。上述圖中展示了這一通用框架的示意圖。在許多情況下,影像/文字骨幹、多模態融合模組和解碼器之間沒有清晰的界限。

恭喜您!您已經堅持到了最後。現在進入下一部分,瞭解更多關於視覺-語言預訓練模型的內容。

參考文獻

  1. 視覺-語言預訓練:基礎、最新進展和未來趨勢
  2. 文件集視覺問答
  3. Grounding DINO:將DINO與接地預訓練相結合,實現開放集目標檢測
< > 在 GitHub 上更新

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