XGen-MM (BLIP3): 自動キャプションモデルのインストールと動作検証

XGen-MM (BLIP3): 自動キャプションモデルのインストールと動作検証 AI

BLIPと言えば、画像から自動でキャプションを生成する技術で有名です。
そのBLIPにおいて、新しいバージョンとなるBLIP-3がリリースされました。

Googleがクロールした時点では、BLIP-3という表記だったということでしょう。
しかし、BLIP-3という名前はすぐに変更されました。

BLIPという名前は廃止され、XGen-MMという名前に変更されています。
今後は、XGen-MMブランドとなるようです。

本記事では、XGen-MMの概要を説明し、モデルのインストール方法と動作検証の手順を詳しく解説します。

本記事の内容

  • XGen-MMの概要
  • XGen-MMのインストール
  • XGen-MMの動作検証

それでは、上記に沿って解説していきます。

XGen-MMの概要

XGen-MMは、Salesforce AI Researchが開発した最新の大規模マルチモーダル基盤モデルシリーズです。
このシリーズは、以前のBLIPシリーズの設計を発展させ、より堅牢で高性能なマルチモーダルモデルを提供します。
XGen-MMモデルは、大規模な画像キャプションデータセットとインターリーブされた画像テキストデータを使って学習されています。

XGen-MMには、以下のモデルが存在しています。

  • xgen-mm-phi3-mini-base-r-v1
  • xgen-mm-phi3-mini-instruct-r-v1

xgen-mm-phi3-mini-base-r-v1は事前学習済みの基盤モデルになります。
5b未満のパラメータで最先端の性能を達成し、強力なコンテキスト内学習能力を示しています。

xgen-mm-phi3-mini-instruct-r-v1は、指示によりファインチューニングされたモデルです。
やはり5b未満のパラメータでオープンソースおよびクローズドソースのVLMの中で最先端の性能を達成しています。
また、このモデルは効率的な視覚トークンサンプリングにより、柔軟な高解像度の画像エンコーディングをサポートしています。

XGen-MMモデルは、次のようなマルチモーダルタスクで優れた性能を発揮します。

  • 画像キャプション生成
  • 視覚的質問応答
  • 画像-テキスト整合性判定

特に、自動キャプション生成においては、高い精度と自然な言語表現を実現しています。

XGen-MMのインストール

Salesforce/xgen-mm-phi3-mini-instruct-r-v1 · Hugging Face
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

ここでは、ファインチューニングされたxgen-mm-phi3-mini-instruct-r-v1をインストールします。
導入方法は、以下を実行するだけです。

pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu121
pip install open_clip_torch==2.24.0
pip install einops
pip install einops-exts
pip install git+https://github.com/huggingface/transformers

PyTorchはGPU版が前提となります。

XGen-MMの動作検証

公開されているコードをそのまま利用します。

from transformers import AutoModelForVision2Seq, AutoTokenizer, AutoImageProcessor, StoppingCriteria
import torch
import requests
from PIL import Image

# define the prompt template
def apply_prompt_template(prompt):
    s = (
            '<|system|>\nA chat between a curious user and an artificial intelligence assistant. '
            "The assistant gives helpful, detailed, and polite answers to the user's questions.<|end|>\n"
            f'<|user|>\n<image>\n{prompt}<|end|>\n<|assistant|>\n'
        )
    return s 
class EosListStoppingCriteria(StoppingCriteria):
    def __init__(self, eos_sequence = [32007]):
        self.eos_sequence = eos_sequence

    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor, **kwargs) -> bool:
        last_ids = input_ids[:,-len(self.eos_sequence):].tolist()
        return self.eos_sequence in last_ids      

# load models
model_name_or_path = "Salesforce/xgen-mm-phi3-mini-instruct-r-v1"
model = AutoModelForVision2Seq.from_pretrained(model_name_or_path, trust_remote_code=True)
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True, use_fast=False, legacy=False)
image_processor = AutoImageProcessor.from_pretrained(model_name_or_path, trust_remote_code=True)
tokenizer = model.update_special_tokens(tokenizer)

# craft a test sample
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')
query = "how many dogs are in the picture?"

model = model.cuda()
inputs = image_processor([raw_image], return_tensors="pt", image_aspect_ratio='anyres')
prompt = apply_prompt_template(query)
language_inputs = tokenizer([prompt], return_tensors="pt")
inputs.update(language_inputs)
inputs = {name: tensor.cuda() for name, tensor in inputs.items()}
generated_text = model.generate(**inputs, image_size=[raw_image.size],
                                pad_token_id=tokenizer.pad_token_id,
                                do_sample=False, max_new_tokens=768, top_p=None, num_beams=1,
                                stopping_criteria = [EosListStoppingCriteria()],
                                )
prediction = tokenizer.decode(generated_text[0], skip_special_tokens=True).split("<|end|>")[0]
print("==> prediction: ", prediction)
# output: ==> prediction: There is one dog in the picture.

初回時に上記を実行するとモデルのダウンロードが始まります。
環境や時間帯によりますが、私の場合は20分以上待たされました。

モデルのサイズは20GB程度ですが、かなり待たされたように感じます。
おそらく長いので、しばらく放置しましょう。

ダウンロードが完了したら、コンソールに次のように表示されているはずです。

==> prediction:  There is one dog in the picture.

これは、次の画像における犬の頭数を回答している結果となります。

コード内に次のプロンプトを確認できます。

query = "how many dogs are in the picture?"

次のURLを変更して、他の画像を試してみました。

img_url = 'https://storage.googleapis.com/sfr-vision-language-research/BLIP/demo.jpg'

結果は、すべて正解です。
犬と寄り添っている画像は、かなり難易度が高いはずなんですけどね。

プロンプトを変更すれば、画像の説明をしてくれます。

query = "describe the picture"

XGen-MMによる説明は、以下(DeepLにより翻訳済み)

画像では、明るい茶色の猫と明るい褐色の犬が緑の葉のベッドの上で穏やかな時間を共有している。
薄茶色の毛並みの猫は仰向けに寝ており、頭を地面につけている。
薄い褐色の毛並みの犬は横向きに寝ており、頭は猫の背中にそっと預けられている。
2匹はリラックスした状態で、お互いを楽しんでいるように見える。
背景は緑の葉と茶色の土の混じったぼかしで、2匹が屋外の自然の中にいることを示唆している。
この画像は、2つの異なる種が調和した美しい瞬間をとらえている。

同じ画像をChatGPTとClaudeに認識させた結果は以下。

ChatGPT 4

この画像は、仲良く遊んでいる猫と犬を捉えたものです。
犬は背中に寝そべり、猫はその上に顔を乗せています。
猫の表情はリラックスしており、目を細めています。
二匹は草むらの中にいて、陽光が彼らを照らしています。
このシーンは動物たちの友情と心地よさを感じさせ、とても穏やかな雰囲気を醸し出しています。

Claude 3 Opus

この画像には、芝生の上で横になっている猫と犬が写っています。
猫は明るい茶色と白の毛並みで、犬はより濃い茶色と白の毛並みをしています。
二匹の動物は互いに寄り添っており、リラックスしているように見えます。
周囲には緑の植物が生い茂っています。
この画像からは、種を超えた友情と平和な共存を感じ取ることができます。
ペットが自然の中でくつろぐ心温まる一枚です。

もっとも正確な解釈は、ChatGPT 4です。
この画像をもっとも複雑にしている要素を以下のように表現しています。

犬は背中に寝そべり、猫はその上に顔を乗せています。

それに対して、XGen-MMは次のようにおかしな表現となっています。

薄茶色の毛並みの猫は仰向けに寝ており、頭を地面につけている。
薄い褐色の毛並みの犬は横向きに寝ており、頭は猫の背中にそっと預けられている。

Claude 3 Opusは、その点を無視しています。
ある意味、賢いです。

そうは言っても、XGen-MMはオープンソースですからね。
無料でここまでできることは、かなりスゴイことだと言えます。

ChatGPT 4やClaude 3 Opusと勝負できている時点で素晴らしいです。

タイトルとURLをコピーしました