記事一覧に戻る

Sayak Paul's avatar

Hugging Faceでは、コミュニティとともに人工知能の分野を民主化することを誇りに思っています。その使命の一環として、昨年からコンピュータビジョンへの取り組みを強化し始めました。Vision Transformers (ViT)を🤗 Transformersに導入するPRから始まった取り組みは、今では8つの主要なビジョンタスク、3,000を超えるモデル、Hugging Face Hub上の100を超えるデータセットへと大きく成長しました。

ViTがHubに加わって以来、多くのエキサイティングな出来事がありました。このブログ記事では、🤗エコシステムからコンピュータビジョンの継続的な進展を支えるために起こったことと、これから起こることをまとめます。

以下は、取り上げる内容のリストです:

コミュニティを支える:一度に1つのタスク 👁

Hugging Face Hubには、次単語予測、マスク補完、トークン分類、系列分類など、さまざまなタスクに対応する10万を超える公開モデルがホストされています。今日現在、8つの主要なビジョンタスクをサポートし、多くのモデルチェックポイントを提供しています:

  • 画像分類
  • 画像セグメンテーション
  • (ゼロショット)物体検出
  • 動画分類
  • 深度推定
  • 画像から画像への合成
  • 無条件画像生成
  • ゼロショット画像分類

これらの各タスクには、探索用の少なくとも10個のモデルチェックポイントがHub上に用意されています。さらに、ビジョンと自然言語の交差点にあるタスクもサポートしています:

  • 画像からテキストへ(画像キャプション、OCR)
  • テキストから画像へ
  • ドキュメント質問応答
  • ビジュアル質問応答

これらのタスクには、ViTSwinDETRなどの最先端のTransformerベースのアーキテクチャだけでなく、ConvNeXtResNetRegNetなどの純粋な畳み込みアーキテクチャも含まれています。ResNetのようなアーキテクチャは、さまざまな産業ユースケースで依然として非常に重要であり、🤗 Transformersにおけるこれらの非Transformerアーキテクチャのサポートはそのためです。

また、Hub上のモデルはTransformersライブラリからのものだけではなく、他のサードパーティライブラリからのものも含まれていることに注意することが重要です。例えば、Hub上で無条件画像生成のようなタスクをサポートしていますが、Transformersにはそのタスクをサポートするモデルはまだありません(このようなモデルなど)。Transformerで解決されるかサードパーティライブラリで解決されるかに関わらず、すべてのMLタスクをサポートすることは、協調的なオープンソース機械学習エコシステムを育てるという私たちの使命の一部です。

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"]

depth_estimation_output.png

ビジュアル質問応答のようなタスクでも、インターフェースは同じままです:

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上にあることで、わずか2行のコードで簡単にロードできます:

from datasets import load_dataset

dataset = load_dataset("scene_parse_150")

これらのデータセットに加えて、albumentationsKorniaなどの拡張ライブラリとの統合サポートを提供しています。コミュニティは、Datasetsの柔軟性とパフォーマンス、およびこれらのライブラリが提供する強力な拡張変換を活用できます。さらに、コアビジョンタスク(画像分類、画像セグメンテーション、物体検出、深度推定)向けの専用データロードガイドも提供しています。

🤗 🤝 timm

timmpytorch-image-modelsとしても知られる)は、最先端のPyTorch画像モデル、事前学習済み重み、トレーニング・推論・検証用のユーティリティスクリプトのオープンソースコレクションです。

Hub上にはtimmからの200を超えるモデルがあり、さらに追加予定です。この統合の詳細については、ドキュメントをご覧ください。

🧨 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]

sd_output.png

この種の技術は、新世代のクリエイティブアプリケーションに力を与え、さまざまな背景を持つアーティストを支援することもできます。Diffusersとさまざまなユースケースの詳細については、公式ドキュメントをご覧ください。

拡散モデルに関する文献は急速に発展しているため、Jonathan Whitakerと提携してコースを開発しました。このコースは無料で、こちらからご覧いただけます。

サードパーティライブラリのサポート

Hugging Faceエコシステムの中心にあるのは、Hugging Face Hubであり、人々が機械学習で効果的にコラボレーションできるようにします。先述の通り、Hub上では🤗 Transformersからのモデルだけでなく、他のサードパーティライブラリからのモデルもサポートしています。そのために、独自のライブラリをHubと統合するためのいくつかのユーティリティを提供しています。これを行う主な利点の1つは、モデルやデータセットなどの成果物をコミュニティと簡単に共有できるようになり、ユーザーがモデルを試しやすくなることです。

モデルをHub上でホストしている場合、カスタム推論ウィジェットを追加することもできます。推論ウィジェットにより、ユーザーはモデルを素早く確認できます。これにより、ユーザーエンゲージメントの向上に役立ちます。

task_widget_generation.png

コンピュータビジョンデモ用のSpaces

Spacesを使用すると、機械学習モデルを簡単にデモできます。SpacesはGradioStreamlitDockerとの直接統合をサポートしており、実践者がモデルを紹介する際に大きな柔軟性を持てるようにします。Spacesでデモを構築するために、独自の機械学習フレームワークを持ち込むことができます。

Gradioライブラリは、Spaces上でコンピュータビジョンアプリケーションを構築するためのVideoGalleryModel3Dなどのいくつかのコンポーネントを提供しています。コミュニティは、Spacesを活用した素晴らしいコンピュータビジョンアプリケーションの構築に取り組んでいます:

🤗 AutoTrain

AutoTrainは、テキスト分類、テキスト要約、固有表現認識などのタスク向けに最先端の機械学習モデルをトレーニングするための「ノーコード」ソリューションを提供します。コンピュータビジョンについては、現在画像分類をサポートしていますが、今後さらに多くのタスクに対応する予定です。

AutoTrainは自動モデル評価も可能にします。このアプリケーションを使用すると、Hub上の幅広いデータセットに対して🤗 Transformersのモデルを評価できます。評価結果は公開リーダーボードに表示されます。詳細については、このブログ記事をご覧ください。

技術的哲学

このセクションでは、コミュニティがこの分野特有の設計選択を理解できるように、🤗 Transformersにコンピュータビジョンのサポートを追加する背景にある私たちの哲学を共有したいと思います。

TransformersはNLPから始まりましたが、現在ではビジョン、オーディオ、ビジョン言語、強化学習など、複数のモダリティをサポートしています。これらのすべてのモダリティについて、Transformersの対応するモデルは以下のような共通の利点を享受しています:

  • from_pretrained()による1行のコードでの簡単なモデルダウンロード
  • 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。画像が与えられると、「an image of {}」のような自然言語クエリでCLIPモデルにプロンプトします。クラスラベルを回答として得ることを期待します。
  • 言語条件付きゼロショット物体検出と画像条件付きワンショット物体検出を可能にするOWL-ViT。つまり、基礎となるモデルがトレーニング中に検出を学習していなくても、画像内のオブジェクトを検出できます。詳細については、このノートブックを参照してください。
  • 言語条件付きゼロショット画像セグメンテーションと画像条件付きワンショット画像セグメンテーションをサポートするCLIPSeg。つまり、基礎となるモデルがトレーニング中にセグメンテーションを学習していなくても、画像内のオブジェクトをセグメントできます。このアイデアを説明するこのブログ記事を参照してください。GroupViTもゼロショットセグメンテーションのタスクをサポートしています。
  • 動画へのゼロショット汎化を示すX-CLIP。具体的には、ゼロショット動画分類をサポートします。詳細については、このノートブックをご覧ください。

🤗Transformersからコンピュータビジョン向けのゼロショットモデルのサポートが、今後さらに増える予定です。

デプロイメント

CTOのJulienが言うように、「本物のアーティストは出荷する」🚀

これらのビジョンモデルのデプロイメントを🤗Inference Endpointsを通じてサポートしています。Inference Endpointsは、画像分類、物体検出、画像セグメンテーションに関連する互換性のあるモデルと直接統合されます。その他のタスクについては、カスタムハンドラを使用できます。また、🤗TransformersからTensorFlowで多くのビジョンモデルを提供しているため、カスタムハンドラの使用または以下のリソースのいずれかを推奨します:

結論

この記事では、次世代のコンピュータビジョンアプリケーションを強化するために、Hugging Faceエコシステムから現在サポートされているものをまとめました。これらの提供物を活用して、信頼性が高く責任ある方法で構築を楽しんでいただければ幸いです。

まだやるべきことはたくさんあります。以下は、今後ご覧いただける予定のものです:

  • 🤗 Datasetsからの動画の直接サポート
  • 画像類似度のような業界関連タスクのさらなるサポート
  • 画像データセットのTensorFlowとの相互運用性
  • 🤗コミュニティによるコンピュータビジョンコース

いつものように、パッチ、PR、モデルチェックポイント、データセット、その他の貢献を歓迎します!🤗

謝辞:ブログドラフトの厳格でタイムリーなレビューをしてくれたOmar Sanseviero、Nate Raw、Niels Rogge、Alara Dirik、Amy Roberts、Maria Khalusova、Lysandre Debutに感謝します。ブログのサムネイルを作成してくれたChunte Leeに感謝します。