Hugging Face 中計算機視覺的現狀

HuggingFace發表於2023-03-28

在 Hugging Face 上,我們為與社群一起推動人工智慧領域的民主化而感到自豪。作為這個使命的一部分,我們從去年開始專注於計算機視覺。開始只是 ? Transformers 中 Vision Transformers (ViT) 的一個 PR,現在已經發展壯大: 8 個核心視覺任務,超過 3000 個模型,在 Hugging Face Hub 上有超過 1000 個資料集。

自從 ViTs 加入 Hub 後,已經發生了大量激動人心的事情。在這篇部落格文章中,我們將從 ?Hugging Face 生態系統中總結已經發生的和將要發生的進展,以支援計算機視覺的持續發展。

下面是我們要覆蓋的內容:

啟動社群: 一次一個任務

Hugging Face Hub 擁有超過 10 萬個用於不同任務的公共模型,例如: 下一詞預測、掩碼填充、詞符分類、序列分類等。截止今天,我們支援 8 個核心視覺任務,提供許多模型的 checkpoints:

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

每個任務在 Hub 上至少有 10 個模型等待你去探索。此外,我們支援視覺和語言的交叉任務,比如:

  • 影像到文字 (影像說明,光學字元識別)
  • 文字到影像
  • 文件問答
  • 視覺問答

這些任務不僅需要最先進的基於 Transformer 的架構,如 ViTSwinDETR,還需要 純卷積 的架構,如 ConvNeXtResNetRegNet,甚至更多!像 ResNets 這樣的架構仍然與無數的工業用例非常相關,因此在 ? Transformers 中也支援這些非 Transformers 的架構。

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

對 Pipelines 的支援

我們開發了 Pipelines 來為從業者提供他們需要的工具,以便輕鬆地將機器學習整合到他們的工具箱中。對於給定與任務相關的輸入,他們提供了一種簡單的方法來執行推理。我們在 Pipelines 裡支援 7 種視覺任務。下面是一個使用 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/Narsil/image_dummy/raw/main/lena.png"

oracle(question="What is she wearing?", image=image_url, top_k=1)
# [{'score': 0.948, 'answer': 'hat'}]

訓練你自己的模型

雖然能夠使用現成推理模型是一個很好的入門方式,但微調是社群獲得最大收益的地方。當你的資料集是自定義的、並且預訓練模型的效能不佳時,這一點尤其正確。

Transformers 為一切與訓練相關的東西提供了 訓練器 API。當前, Trainer無縫地支援以下任務: 影像分類、影像分割、影片分類、目標檢測和深度估計。微調其他視覺任務的模型也是支援的,只是並不透過 Trainer

只要損失計算包含在 Transformers 計算給定任務損失的模型中,它就應該有資格對該任務進行微調。如果你發現問題,請在 GitHub 上 報告

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

Hugging Face 示例指令碼 包括不同的 自監督預訓練策略MAE,和 對比影像到文字預訓練策略CLIP。這些指令碼對於研究社群和願意在預訓練模型上從頭訓練自定義資料語料的從業者來說是非常寶貴的資源。

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

與 Datasets 整合

Datasets 提供了對數千個不同模態資料集的輕鬆訪問。如前所述,Hub 有超過 1000 個計算機視覺的資料集。一些例子值得關注: 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 影像模型、預訓練權重和用於訓練、推理、驗證的實用指令碼的開源集合。

pytorch-image-models 專案倉庫:
<url>https://github.com/rwightman/pytorch-image-models</url>

我們在 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 和不同用例的資訊。

基於擴散模型的文獻正在快速發展,這就是為什麼我們與 喬納森·惠特克 合作開發一門課程。這門課程是免費的,你可以點選 這裡 檢視。

對第三方庫的支援

Hugging Face 生態系統的核心是 Hugging Face Hub,它讓人們在機器學習上有效合作。正如前面所提到的,我們在 Hub 上不僅支援來自 ? Transformers 的模型,還支援來自其他第三方包的模型。為此,我們提供了幾個 實用程式,以便你可以將自己的庫與 Hub 整合。這樣做的主要優點之一是,與社群共享工件 (如模型和資料集) 變得非常容易,從而使你的使用者可以更容易地嘗試你的模型。

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

計算機視覺演示空間

使用 Hugging Hub Spaces 應用,人們可以輕鬆地演示他們的機器學習模型。空間支援與 GradioStreamlitDocker 的直接整合,使從業者在展示他們的模型時有很大的靈活性。你可以用 Spaces 引入自己的機器學習框架來構建演示。

在 Spaces 裡,Gradio 庫提供幾個部件來構建計算機視覺應用,比如 VideoGalleryModel3D。社群一直在努力構建一些由 Spaces 提供支援的令人驚歎的計算機視覺應用:

? AutoTrain

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

AutoTrain 還支援 自動模型評估。此應用程式允許你用在 Hub 上的各種 資料集 評估 ? Transformers 模型。你的評估結果將會顯示在 公共排行榜 上。你可以檢視 下列部落格 以獲得更多細節。

技術理念

在此部分,我們像向你分享在 ? Transformers 裡新增計算機視覺背後的理念,以便社群知道針對該領域的設計選擇。

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

  • 使用一行程式碼 from_pretrained() 即可輕鬆下載模型
  • push_to_hub() 輕鬆上傳模型
  • 支援使用 checkpoint 分片技術載入大型的 checkpoints
  • 最佳化支援 (使用 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 說:”真正的藝術家能將產品上市“?

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

結論

在這篇文章中,我們向你簡要介紹了 Hugging Face 生態系統目前為下一代計算機視覺應用提供的支援。我們希望你會喜歡使用這些產品來可靠地構建應用。

不過還有很多工作要做。 以下是您可以期待看到的一些內容:

  • ? Datasets 對影片的直接支援
  • 支援更多和工業界相關的任務,比如影像相似性
  • 影像資料集與 TensorFlow 的互動
  • 來自 ?Hugging Face 社群關於計算機視覺的課程
    像往常一樣,我們歡迎你的補丁、PR、模型 checkpoints、資料集和其他貢獻!?

感謝 Omar Sanseviero, Nate Raw, Niels Rogge, Alara Dirik, Amy Roberts, Maria Khalusova, and Lysandre Debut for their 精心審閱和校對這篇文章,感謝 Chunte Lee 創作的博文縮圖

原文: https://hf.co/blog/cv_state

作者: Sayak Paul

譯者: AIboy1993 (李旭東)

譯者: zhongdongy (阿東)

相關文章