「OWLv2のご紹介:ゼロショット物体検出におけるGoogleのブレークスルー」

「OWLv2の魅力:Googleのゼロショット物体検出の革新的なブレークスルー」

はじめに

2023年も終わりが近づいていますが、コンピュータビジョンコミュニティにとっての興奮するニュースは、Googleが最近OWLv2のリリースとともにゼロショットオブジェクト検出の世界で大きな進歩を遂げたことです。 この最新モデルは🤗 Transformersで利用可能であり、これまでに存在する中でも最も堅牢なゼロショットオブジェクト検出システムの1つを表しています。 これは昨年に導入されたOWL-ViT v1の基盤を築いています。

この記事では、このモデルの動作とアーキテクチャを紹介し、推論を実行する実用的なアプローチを見ていきます。 さあ、始めましょう。

学習目標

  • コンピュータビジョンにおけるゼロショットオブジェクト検出の概念を理解する。
  • GoogleのOWLv2モデルの背後にある技術とセルフトレーニングのアプローチについて学ぶ。
  • OWLv2の使用に必要な実用的なアプローチ。

この記事はデータサイエンスブログマラソンの一環として公開されました。

OWLv2の技術

OWLv2の印象的な機能は、その革新的なセルフトレーニングのアプローチによるものです。このモデルは、10億以上の例から成るウェブスケールデータセットでトレーニングされました。これを達成するために、著者たちはOWL-ViT v1の強力さを活用し、そのモデルを使用して擬似ラベルを生成し、それを使ってOWLv2をトレーニングしました。

さらに、モデルは検出データ上で微調整され、それによって先行モデルであるOWL-ViT v1に比べて性能が向上しました。セルフトレーニングによってオープンワールドの位置特定のウェブスケールトレーニングが可能になり、オブジェクトの分類や言語モデリングで見られるトレンドに倣っています。

OWLv2のアーキテクチャ

OWLv2のアーキテクチャはOWL-ViTと似ていますが、オブジェクト検出のヘッドに注目すべき追加があります。これにより、予測ボックスがオブジェクトを含む可能性を予測するオブジェクト性の分類器が含まれるようになりました。オブジェクト性スコアは洞察を提供し、テキストクエリに関係なく予測を順位付けやフィルタリングするために使用することができます。

ゼロショットオブジェクト検出

ゼロショット学習は、GenAIのトレンド以来一般的になった新しい用語です。これは、主に大規模言語モデル(LLM)の微調整で見られます。これは、いくつかのデータを使用してベースモデルを微調整し、モデルが新しいカテゴリに対応するようにすることを指します。ゼロショットオブジェクト検出はコンピュータビジョンの分野で画期的なものです。これは、手動で注釈付けされたバウンディングボックスの必要がなくなり、モデルが画像内のオブジェクトを検出する能力を向上させます。これによりプロセスがスピードアップし、手動の注釈が不要になるため、人間にとっては魅力的で、退屈ではありません。

OWLv2の使い方

OWLv2はOWL-ViTと同様のアプローチを採用していますが、更新されたイメージプロセッサOwlv2ImageProcessorを特徴としています。さらに、モデルはテキストのエンコードにCLIPTokenizerを使用しています。Owlv2ProcessorはOwlv2ImageProcessorとCLIPTokenizerを組み合わせた便利なツールであり、テキストのエンコードプロセスを簡素化します。以下に、Owlv2ProcessorとOwlv2ForObjectDetectionを使用してオブジェクト検出を実行する方法の例を示します。

コード全体はこちらで確認できます:https://github.com/inuwamobarak/OWLv2

ステップ1:環境の設定

このステップでは、🤗 TransformersライブラリをGitHubからインストールします。

# GitHubから🤗 Transformersライブラリをインストールします!pip install -q git+https://github.com/huggingface/transformers.git

ステップ2:モデルとプロセッサの読み込み

ここでは、hubからOWLv2チェックポイントをロードします。チェックポイントのオプションが利用可能で、この例ではアンサンブルのチェックポイントをロードします。

# ハブからOWLv2チェックポイントをロードします。

from transformers import Owlv2Processor, Owlv2ForObjectDetection

# プロセッサとモデルをロードします。

processor = Owlv2Processor.from_pretrained(“google/owlv2-base-patch16-ensemble”)

model = Owlv2ForObjectDetection.from_pretrained(“google/owlv2-base-patch16-ensemble”)

# ハブからOWLv2チェックポイントをロードします。from transformers import Owlv2Processor, Owlv2ForObjectDetection# プロセッサとモデルをロードします。processor = Owlv2Processor.from_pretrained("google/owlv2-base-patch16-ensemble")model = Owlv2ForObjectDetection.from_pretrained("google/owlv2-base-patch16-ensemble")

ステップ3:画像のロードと処理

このステップでは、オブジェクトを検出したい画像をロードします。

# 分析したい画像をロードします。from huggingface_hub import hf_hub_downloadfrom PIL import Image# ファイルパスを適切に置き換えてください。filepath = hf_hub_download(repo_id="adirik/OWL-ViT", repo_type="space", filename="assets/astronaut.png")image = Image.open(filepath)

ステップ4:モデル用の画像とクエリの準備

OWLv2は、テキストクエリを使用してオブジェクトを検出することができます。このステップでは、プロセッサを使用してモデル用の画像とテキストクエリを準備します。

# モデルに検出させたいテキストクエリを定義します。texts = [['face', 'bag', 'shoe', 'hair']]# プロセッサを使用してモデル用の画像とテキストを準備します。inputs = processor(text=texts, images=image, return_tensors="pt")# 入力テンソルの形状を出力します。for key, val in inputs.items():    print(f"{key}: {val.shape}")

ステップ5:フォワードパス

このステップでは、モデルに入力を送ります。推論時には勾配が不要なため、torch.no_grad()を使用してメモリ使用量を削減します。

# torchライブラリをインポートします。import torch# モデルを介してフォワードパスを実行します。with torch.no_grad():  outputs = model(**inputs)

ステップ6:結果の可視化

この最終ステップでは、モデルの出力をCOCO API形式に変換し、画像にバウンディングボックスとラベルを描画して結果を可視化します。

# モデルの出力をCOCO API形式に変換します。target_sizes = torch.Tensor([image.size[::-1]])results = processor.post_process_object_detection(outputs=outputs, target_sizes=target_sizes, threshold=0.2)# 最初の画像の予測結果を取得します。i = 0text = texts[i]boxes, scores, labels = results[i]["boxes"], results[i]["scores"], results[i]["labels"]# 画像にバウンディングボックスとラベルを描画します。from PIL import ImageDrawdraw = ImageDraw.Draw(image)for box, score, label in zip(boxes, scores, labels):    box = [round(i, 2) for i in box.tolist()]    x1, y1, x2, y2 = tuple(box)    draw.rectangle(xy=((x1, y1), (x2, y2)), outline="red")    draw.text(xy=(x1, y1), text=text[label])# バウンディングボックスとラベルが描かれた画像を表示します。image

画像ガイド付きワンショットオブジェクト検出

OWLv2を使用して、画像ガイド付きのワンショットオブジェクト検出を行います。これは、例となるクエリ画像に基づいて、新しい画像でオブジェクトを検出することを意味します。

コード: https://github.com/inuwamobarak/OWLv2

# 必要なライブラリのインポート# %matplotlib inline  # Jupyter Notebookを使用している場合はこの行のコメントを外してください。import cv2from PIL import Imageimport requestsimport torchfrom matplotlib import rcParamsimport matplotlib.pyplot as plt# 図のサイズを設定rcParams['figure.figsize'] = 11, 8# 入力画像の読み込みurl = "http://images.cocodataset.org/val2017/000000039769.jpg"image = Image.open(requests.get(url, stream=True).raw)target_sizes = torch.Tensor([image.size[::-1])# クエリ画像の読み込みquery_url = "http://images.cocodataset.org/val2017/000000058111.jpg"query_image = Image.open(requests.get(query_url, stream=True).raw)# 入力画像とクエリ画像を並べて表示fig, ax = plt.subplots(1, 2)ax[0].imshow(image)ax[1].imshow(query_image)

2つの画像を読み込んだ後、入力を前処理して形状を表示します。

# 処理に使用するデバイスを定義device = "cuda" if torch.cuda.is_available() else "cpu"# 入力画像とクエリ画像を前処理processorを使用して処理し、デバイスに変換inputs = processor(images=image, query_images=query_image, return_tensors="pt").to(device)# 入力の名前と形状を表示for key, val in inputs.items():    print(f"{key}: {val.shape}")

以下では、画像に基づいた物体検出を行います。モデルの出力の形状、およびビジョンモデルの出力の形状も表示します。

# モデルを使用して画像に基づいた物体検出を実施with torch.no_grad():  outputs = model.image_guided_detection(**inputs)# モデルの出力の形状を表示for k, val in outputs.items():    if k not in {"text_model_output", "vision_model_output"}:        print(f"{k}:  {val.shape}")print("\nビジョンモデルの出力")for k, val in outputs.vision_model_output.items():    print(f"{k}:  {val.shape}")

最後に、画像に境界ボックスを描画して結果を可視化します。コードでは画像をRGB形式に変換し、検出結果を後処理します。

# 結果の可視化import numpy as np# 画像をRGB形式に変換img = cv2.cvtColor(np.array(image), cv2.COLOR_BGR2RGB)outputs.logits = outputs.logits.cpu()outputs.target_pred_boxes = outputs.target_pred_boxes.cpu()# 物体検出結果の後処理results = processor.post_process_image_guided_detection(outputs=outputs, threshold=0.9, nms_threshold=0.3, target_sizes=target_sizes)boxes, scores = results[0]["boxes"], results[0]["scores"]# 画像に境界ボックスを描画for box, score in zip(boxes, scores):    box = [int(i) for i in box.tolist()]    img = cv2.rectangle(img, box[:2], box[2:], (255, 0, 0), 5)    if box[3] + 25 > 768:        y = box[3] - 10    else:        y = box[3] + 25# 予測された境界ボックスのある画像を表示plt.imshow(img[:, :, ::-1])

オープンボキャブラリーの物体検出のスケーリング

オープンボキャブラリーの物体検出は、事前学習済みのビジョン言語モデルの恩恵を受けています。しかし、物体検出のトレーニングデータの利用可能性に制約があるため、自己トレーニングと既存の検出器を使用して、画像とテキストのペアで疑似ボックス注釈を生成することでこの制約に対処しました。自己トレーニングのスケーリングには、ラベル空間の選択、疑似注釈のフィルタリング、およびトレーニングの効率性などの課題があります。

OWLv2とOWL-STの自己トレーニングレシピは、これらの課題に対処するために開発されました。その結果、OWLv2は約1000万の例を使用した類似のトレーニングスケールで、既存の最先端のオープンボキャブラリー検出器の性能を上回っています。

印象的な性能とスケーリング

OWLv2の性能は非常に優れています。L/14アーキテクチャを使用したOWL-STは、LVISのレアクラスにおける平均適合率(AP)を改善します。これらのレアクラスのヒューマンボックス注釈をモデルが見ていない場合でも、APは31.2%から44.6%に向上します。

OWL-STの1兆以上の例にスケールアップする能力は、オープンワールドのローカリゼーションのためのウェブスケールトレーニングの達成を意味し、オブジェクト分類や言語モデリングと同様のものです。

結論

OWLv2と革新的なOWL-STセルフトレーニングの方法は、ゼロショットのオブジェクト検出において前進を意味します。これらの進歩により、手動で注釈付けされた境界ボックスの必要性をなくし、画像中のオブジェクトを検出するプロセスをより効率的かつ効果的に行うことができます。OWLv2とそのアプリケーションを是非プロジェクトで試してみてください。可能性は非常に興奮しており、コンピュータビジョンコミュニティがこの技術を画期的な解決策にどのように活用するかを楽しみにしています。

重要なポイント

  • OWLv2は、🤗トランスフォーマーズで利用可能なゼロショットオブジェクト検出のためのGoogleの最新モデルであり、以前のバージョンであるOWL-ViT v1を基にしています。
  • ゼロショットオブジェクト検出は、手動で注釈付けされた境界ボックスの必要性をなくし、プロセスをより効率的かつ手間のかからないものにします。
  • OWLv2は、1兆以上の例を使用してのセルフトレーニングを行い、OWL-ViT v1からの擬似ラベルを活用してパフォーマンスを向上させます。

よくある質問

  • https://github.com/inuwamobarak/OWLv2
  • https://huggingface.co/docs/transformers/main/en/model_doc/owlv2
  • https://arxiv.org/abs/2306.09683
  • https://huggingface.co/docs/transformers/main/en/model_doc/owlvit
  • https://arxiv.org/abs/2205.06230
  • Minderer, M., Gritsenko, A., & Houlsby, N. (2023). Scaling Open-Vocabulary Object Detection. ArXiv. /abs/2306.09683

この記事に表示されているメディアはAnalytics Vidhyaの所有ではなく、著者の裁量に基づいて使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

マルチモーダル言語モデルの解説:ビジュアル指示の調整

「LLMは、多くの自然言語タスクでゼロショット学習とフューショット学習の両方で有望な結果を示していますしかし、LLMは視覚...

機械学習

このAI論文では、アマゾンの最新の機械学習に関する情報が大規模言語モデルのバグコードについて明らかにされています

プログラミングは複雑であり、エラーのないコードを書くことは時には難しいです。コードの大規模言語モデル(Code-LLMs)はコ...

機械学習

ヴェクタラは、AI言語モデルの「幻覚」をベンチマーク化し、対処するための画期的なオープンソースモデルを立ち上げます

急速に進化するGenerative AI(GenAI)領域での責任追及を促進する前例のない取り組みとして、Vectaraはオープンソースの幻覚...

コンピュータサイエンス

認知的な燃焼を引き起こす:認知アーキテクチャとLLMの融合による次世代コンピュータの構築

技術はシステムに統合されることで、ブレークスルーとなりますこの記事では、言語モデルを統合する取り組みについて探求し、...

AI研究

「タンパク質設計の革命:ディープラーニングの改良により成功率が10倍に向上したこのAI研究」

タンパク質はほぼすべての疾患を統治するポリマー構造です。主な問題は、どのタンパク質がそれに対応するタンパク質ポリマー...

人工知能

「先延ばしハック:ChatGPTを使ってプロジェクトをビデオゲームに変える」

「あなたのやるべきことリストを、ドーパミンが絶えず放出されるワクワクするビデオゲームに変えましょう」