Hugging Face 計算機視覺的現狀 🤗

釋出日期:2023 年 1 月 30 日
在 GitHub 上更新

在 Hugging Face,我們為與社群一起實現人工智慧民主化而自豪。作為這項使命的一部分,我們在過去一年中開始將精力集中在計算機視覺上。從 在 🤗 Transformers 中引入 Vision Transformers (ViT) 的 PR 開始,現已發展成為一項更大的事業——在 Hugging Face Hub 上擁有 8 項核心視覺任務、3000 多個模型和 100 多個數據集。

自 ViT 加入 Hub 以來,許多激動人心的事情已經發生。在這篇部落格文章中,我們將總結所發生的事情以及未來將如何支援 🤗 生態系統中計算機視覺的持續發展。

以下是我們將介紹的內容列表:

賦能社群:一次一個任務 👁

Hugging Face Hub 擁有超過 100,000 個用於不同任務的公共模型,例如下一詞預測、掩碼填充、標記分類、序列分類等等。截至今天,我們支援 8 項核心視覺任務,提供許多模型檢查點:

  • 影像分類
  • 影像分割
  • (零樣本)目標檢測
  • 影片分類
  • 深度估計
  • 影像到影像合成
  • 無條件影像生成
  • 零樣本影像分類

Hub 上每個任務都至少有 10 個模型檢查點供您探索。此外,我們還支援視覺與語言交叉領域的 任務,例如:

  • 影像到文字(影像字幕、OCR)
  • 文字到影像
  • 文件問答
  • 視覺問答

這些任務不僅包括最先進的基於 Transformer 的架構,例如 ViTSwinDETR,還包括純卷積架構,例如 ConvNeXtResNetRegNet 等等!像 ResNet 這樣的架構對於無數工業用例仍然非常重要,因此 🤗 Transformers 支援這些非 Transformer 架構。

同樣重要的是要注意,Hub 上的模型不僅來自 Transformers 庫,還來自其他第三方庫。例如,儘管我們在 Hub 上支援無條件影像生成等任務,但 Transformers 中還沒有任何模型支援該任務(例如這個)。支援所有機器學習任務,無論它們是透過 Transformers 還是第三方庫解決,都是我們促進協作式開源機器學習生態系統使命的一部分。

對 Pipelines 的支援

我們開發了 Pipelines,旨在為實踐者提供所需的工具,以便他們輕鬆地將機器學習融入其工具箱。它們提供了一種簡單的方法,可以針對給定輸入執行推理。我們在 Pipelines 中支援 七項視覺任務。以下是使用 Pipelines 進行深度估計的示例:

from transformers import pipeline

depth_estimator = pipeline(task="depth-estimation", model="Intel/dpt-large")
output = depth_estimator("http://images.cocodataset.org/val2017/000000039769.jpg")

# This is a tensor with the values being the depth expressed
# in meters for each pixel
output["depth"]

即使是視覺問答等任務,介面也保持不變

from transformers import pipeline

oracle = pipeline(model="dandelin/vilt-b32-finetuned-vqa")
image_url = "https://huggingface.co/datasets/mishig/sample_images/resolve/main/tiger.jpg"

oracle(question="What's the animal doing?", image=image_url, top_k=1)
# [{'score': 0.778620, 'answer': 'laying down'}]

訓練您自己的模型

雖然能夠直接使用模型進行推理是一個很好的開始,但微調才是社群獲得最大收益的地方。當您的資料集是自定義的,並且預訓練模型無法提供良好的效能時,這一點尤其正確。

Transformers 為所有與訓練相關的內容提供了 Trainer API。目前,Trainer 無縫支援以下任務:影像分類、影像分割、影片分類、目標檢測和深度估計。其他視覺任務的模型微調也受支援,但不是透過 Trainer

只要 Transformers 中的模型包含給定任務的損失計算,它就應該符合該任務的微調條件。如果您發現問題,請在 GitHub 上 報告

我在哪裡可以找到程式碼?

Hugging Face 示例指令碼包括不同的 自監督預訓練策略,如 MAE,以及 對比影像-文字預訓練策略,如 CLIP。這些指令碼對於研究社群以及希望從頭開始在自定義資料語料庫上執行預訓練的實踐者來說是寶貴的資源。

不過,有些任務並非天生適合微調。示例包括零樣本影像分類(例如 CLIP)、零樣本目標檢測(例如 OWL-ViT)和零樣本分割(例如 CLIPSeg)。我們將在本文中重新討論這些模型。

與 Datasets 的整合

Datasets 提供對數千個不同模態資料集的輕鬆訪問。如前所述,Hub 擁有超過 100 個計算機視覺資料集。這裡值得注意的一些示例:ImageNet-1kScene ParsingNYU Depth V2COYO-700MLAION-400M。透過將這些資料集放在 Hub 上,只需兩行程式碼即可輕鬆載入它們:

from datasets import load_dataset

dataset = load_dataset("scene_parse_150")

除了這些資料集,我們還提供與 AlbumentationsKornia 等增強庫的整合支援。社群可以利用 Datasets 的靈活性和效能以及這些庫提供的強大增強轉換。此外,我們還為核心視覺任務(影像分類、影像分割、目標檢測和深度估計)提供了 專門的資料載入指南

🤗 🤝 timm

timm,也稱為 pytorch-image-models,是一個最先進的 PyTorch 影像模型、預訓練權重以及用於訓練、推理和驗證的實用指令碼的開源集合。

我們已經在 Hub 上擁有超過 200 個來自 timm 的模型,並且還有更多模型正在開發中。檢視文件以瞭解更多關於此整合的資訊。

🧨 Diffusers

Diffusers 提供預訓練的視覺和音訊擴散模型,並作為推理和訓練的模組化工具箱。透過這個庫,您可以從自然語言輸入中生成合理的影像,以及其他創意用例。以下是一個示例:

from diffusers import DiffusionPipeline

generator = DiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
generator.to(“cuda”)

image = generator("An image of a squirrel in Picasso style").images[0]

這種技術可以賦能新一代創意應用,並幫助來自不同背景的藝術家。要了解更多關於 Diffusers 和不同用例的資訊,請檢視官方文件

基於擴散模型的文獻發展迅速,這就是我們與 Jonathan Whitaker 合作開發相關課程的原因。該課程免費,您可以在此處檢視。

對第三方庫的支援

Hugging Face 生態系統的核心是 Hugging Face Hub,它讓人們能夠有效地協作進行機器學習。如前所述,我們不僅在 Hub 上支援 🤗 Transformers 的模型,還支援其他第三方庫的模型。為此,我們提供了 多種實用工具,以便您可以將自己的庫與 Hub 整合。這樣做的一個主要優勢是,可以非常容易地與社群共享工件(例如模型和資料集),從而使使用者更容易試用您的模型。

當您的模型託管在 Hub 上時,您還可以為它們新增自定義推理小部件。推理小部件允許使用者快速檢視模型。這有助於提高使用者參與度。

用於計算機視覺演示的 Spaces

透過 Spaces,可以輕鬆地展示您的機器學習模型。Spaces 直接與 GradioStreamlitDocker 整合,使實踐者在展示模型時擁有極大的靈活性。您可以使用自己的機器學習框架來構建 Spaces 演示。

Gradio 庫提供了幾個用於在 Spaces 上構建計算機視覺應用程式的元件,例如 影片畫廊3D 模型。社群一直在努力構建一些由 Spaces 提供支援的令人驚歎的計算機視覺應用程式:

🤗 AutoTrain

AutoTrain 提供“無程式碼”解決方案,用於訓練最先進的機器學習模型,例如文字分類、文字摘要、命名實體識別等。對於計算機視覺,我們目前支援影像分類,但可以期待覆蓋更多工。

AutoTrain 還支援自動模型評估。此應用程式允許您評估 Hugging Face Hub 上各種資料集上的 🤗 Transformers 模型。您的評估結果將顯示在公共排行榜上。您可以檢視這篇部落格文章瞭解更多詳情。

技術理念

在本節中,我們想分享我們在 🤗 Transformers 中新增計算機視覺支援的理念,以便社群瞭解該領域的特定設計選擇。

儘管 Transformers 最初是針對 NLP,但我們今天支援多種模態,例如——視覺、音訊、視覺-語言和強化學習。對於所有這些模態,Transformers 中的所有相應模型都享有一些共同的優勢:

  • 使用 from_pretrained() 一行程式碼即可輕鬆下載模型
  • 使用 push_to_hub() 輕鬆上傳模型
  • 支援使用高效檢查點分片技術載入大型檢查點
  • 最佳化支援(使用 Optimum 等工具)
  • 從模型配置初始化
  • 支援 PyTorch 和 TensorFlow(不完全列舉)
  • 以及更多

與分詞器不同,我們有預處理器(例如這個)負責為視覺模型準備資料。我們一直在努力確保使用視覺模型的使用者體驗仍然輕鬆且相似

from transformers import ViTImageProcessor, ViTForImageClassification
import torch
from datasets import load_dataset

dataset = load_dataset("huggingface/cats-image")
image = dataset["test"]["image"][0]

image_processor  = ViTImageProcessor.from_pretrained("google/vit-base-patch16-224")
model = ViTForImageClassification.from_pretrained("google/vit-base-patch16-224")
inputs = image_processor(image, return_tensors="pt")

with torch.no_grad():
    logits = model(**inputs).logits

# model predicts one of the 1000 ImageNet classes
predicted_label = logits.argmax(-1).item()
print(model.config.id2label[predicted_label])
# Egyptian cat

即使對於目標檢測等困難任務,使用者體驗也沒有太大變化

from transformers import AutoImageProcessor, AutoModelForObjectDetection
from PIL import Image
import requests

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

image_processor = AutoImageProcessor.from_pretrained("microsoft/conditional-detr-resnet-50")
model = AutoModelForObjectDetection.from_pretrained("microsoft/conditional-detr-resnet-50")
inputs = image_processor(images=image, return_tensors="pt")

outputs = model(**inputs)

# convert outputs (bounding boxes and class logits) to COCO API
target_sizes = torch.tensor([image.size[::-1]])
results = image_processor.post_process_object_detection(
    outputs, threshold=0.5, target_sizes=target_sizes
)[0]

for score, label, box in zip(results["scores"], results["labels"], results["boxes"]):
    box = [round(i, 2) for i in box.tolist()]
    print(
        f"Detected {model.config.id2label[label.item()]} with confidence "
        f"{round(score.item(), 3)} at location {box}"
    )

導致

Detected remote with confidence 0.833 at location [38.31, 72.1, 177.63, 118.45]
Detected cat with confidence 0.831 at location [9.2, 51.38, 321.13, 469.0]
Detected cat with confidence 0.804 at location [340.3, 16.85, 642.93, 370.95]
Detected remote with confidence 0.683 at location [334.48, 73.49, 366.37, 190.01]
Detected couch with confidence 0.535 at location [0.52, 1.19, 640.35, 475.1]

用於視覺的零樣本模型

零樣本模型大量湧現,它們以有趣的方式重新定義了核心視覺任務(如分割和檢測),並引入了更大的靈活性。我們支援 Transformers 中的一些零樣本模型:

  • CLIP 允許使用提示進行零樣本影像分類。給定一張影像,您會用“一張 {} 的影像”這樣的自然語言查詢提示 CLIP 模型。我們期望得到類別標籤作為答案。
  • OWL-ViT 允許語言條件零樣本目標檢測和影像條件單樣本目標檢測。這意味著即使底層模型在訓練期間沒有學會檢測這些物件,您也可以檢測影像中的物件!您可以參考此筆記本瞭解更多資訊。
  • CLIPSeg 支援語言條件零樣本影像分割和影像條件單樣本影像分割。這意味著即使底層模型在訓練期間沒有學會分割這些物件,您也可以分割影像中的物件!您可以參考這篇部落格文章,它闡釋了這一思想。GroupViT 也支援零樣本分割任務。
  • X-CLIP 展示了對影片的零樣本泛化能力。準確地說,它支援零樣本影片分類。檢視此筆記本瞭解更多詳情。

社群可以期待在未來幾天看到 🤗Transformers 支援更多計算機視覺零樣本模型。

部署

正如我們的 CTO Julien 所說——“真正的藝術家會交付”🚀

我們透過 🤗Inference Endpoints 支援這些視覺模型的部署。Inference Endpoints 直接與相容的影像分類、目標檢測和影像分割模型整合。對於其他任務,您可以使用 自定義處理程式。由於我們還提供了許多 TensorFlow 視覺模型用於部署 🤗Transformers,我們建議使用自定義處理程式或遵循以下資源:

結論

在這篇文章中,我們向您介紹了 Hugging Face 生態系統目前支援的內容,以賦能下一代計算機視覺應用程式。我們希望您能喜歡使用這些產品來可靠、負責任地進行構建。

然而,還有很多工作要做。以下是一些您可以期待看到的東西:

  • 直接支援 🤗 Datasets 中的影片
  • 支援更多與行業相關的任務,如影像相似性
  • 影像資料集與 TensorFlow 的互操作性
  • 🤗 社群的計算機視覺課程

一如既往,我們歡迎您的補丁、PR、模型檢查點、資料集及其他貢獻!🤗

鳴謝:感謝 Omar Sanseviero、Nate Raw、Niels Rogge、Alara Dirik、Amy Roberts、Maria Khalusova 和 Lysandre Debut 對部落格草稿的嚴謹及時審閱。感謝 Chunte Lee 創作了部落格縮圖。

社群

註冊登入發表評論

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