watsonxを使用したPythonでのマルチモーダルAIクエリーにLlama 3.2-90b-vision-instructを使用

このチュートリアルでは、現在watsonx.ai で利用可能なMeta Llama 3.2-90b-vision-instructモデルを、画像キャプション作成や視覚的な質問応答などのコンピューター・ビジョン作業に応用する方法を学べます。

マルチモーダルAIの概要

マルチモーダルAIモデルとユニモーダルAIモデルの比較

私たちの多くは、ユニモーダルAIアプリケーションに馴染みがあります。人気のあるユニモーダルAIツールはChatGPTです。ChatGPTのようなチャットボットは、自然言語処理(NLP)を使用してユーザーの質問を理解し、リアルタイムで自動応答します。これらのユニモーダル大規模言語モデル(LLM)が適用できるインプットの種類は、テキストに制限されています。

マルチモーダル人工知能(AI)は、ニューラル・ネットワークで構築された機械学習モデルに依存しています。これらのニューラル・ネットワークは、複雑なディープラーニング技術を使用して、複数のデータ型からの情報を処理し、統合することができます。生成AIモデル(Gen AIモデルとも呼ばれる)によって生成されるこれらのさまざまなモダリティーには、テキスト、画像、動画、音声入力などがあります。

マルチモーダルAIシステムには、コンピューター・ビジョンを使用した医療現場での医療画像診断から翻訳アプリケーションでの音声認識まで、多くの実際のユースケースがあります。これらのAIテクノロジーの進歩により、さまざまな領域を最適化できます。マルチモーダル・アーキテクチャーの主な利点は、さまざまな種類のデータを処理できることです。

マルチモーダルAI:その仕組み

マルチモーダルAIには、次の3つの要素が必要です。

インプット・モジュール

インプット・モジュールは、さまざまなデータ型を前処理するために複数のユニモーダル・ニューラル・ネットワーク上に構築されています。ここでは、Fusionモジュールで実行される機械学習アルゴリズム用にデータを準備します。

フュージョン・モジュール

データの結合、調整、処理はこのモジュールで行われます。フュージョン・プロセスは、データ・モダリティーごとに行われます。このモジュールでは、いくつかの手法が一般的に使用されます。一例として、すべてのインプットタイプの未加工データを組み合わせるアーリー・フュージョンが挙げられます。さらに、ミッド・フュージョンとは、異なるモダリティーのデータが異なる前処理段階でエンコードされることです。最後に、レイト・フュージョンでは、各モダリティーに対応するさまざまなモデルによってインプット・モジュールで最初に処理された後に、データを統合します。

アウトプット・モジュール

アウトプット・モジュールは、フュージョン・モジュールで生成されたデータを理解することにより、目的のアウトプット形式で成果を生成します。これらのアウトプットは、テキスト、画像、またはフォーマットの組み合わせなど、さまざまな形式になります。

手順

このIBM TechnologyのYouTube動画では、次のセットアップ手順についてステップ1および2で説明しています。

ステップ1. 環境を設定する

いくつかのツールから選択することもできますが、このチュートリアルはJupyter Notebookに最適化されています。Jupyter Notebookは、コードをテキスト、画像、データの可視化などのさまざまなデータ・ソースと組み合わせるためにデータサイエンスの分野で広く使用されています。

このチュートリアルでは、Jupyter Notebookを使用するためのIBMアカウントの設定方法について説明します。

  1. IBM Cloudアカウントを使用して、watsonx.aiにIBM Cloudアカウントを使用します。

  2. watsonx.aiプロジェクトを作成します。

    プロジェクトIDはプロジェクト内から取得できます。[管理]タブをクリックし、[一般]ページの[詳細]セクションからプロジェクトIDをコピーしてください。このチュートリアルではこのIDが必要になります。

  3. Jupyter Notebookを作成します。

    このステップでは、このチュートリアルからコードをコピーして自分でプロンプト・チューニングを実施できるノートブック環境が開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。このJupyter Notebookと使用されるデータセットはGitHubにあります。

    Pythonパッケージの依存関係の衝突を避けるために、仮想環境をセットアップすることをお勧めします。

ステップ2. watsonx.ai RuntimeのインスタンスとAPIキーを設定する

チュートリアルでは、同様の成果を得るため、Meta 3.2-90b-vision-instructモデルとwatsonx.aiの使用を推奨します。マルチモーダル学習をサポートするAIモデルは自由に選択できます。OpenAI社のGPT-4 V(ision)DALL-E 3Google社のGeminiなど、いくつかのマルチモーダルAIモデルから選べます。このチュートリアルはwatsonx.ai用に設計されているため、他のモデルを操作する場合は、適切なAPIを使用していることを確認してください。

  1. watsonx.aiランタイム・サービス・インスタンスを作成します(適切なリージョンを選択し、無料インスタンスであるLiteプランを選択)。

  2. APIキーを生成します。

  3. watsonx.aiランタイム・サービス・インスタンスを、watsonx.aiで作成したプロジェクトに関連付けます。

ステップ3. 関連ライブラリーをインストールしてインポートし、認証情報を設定する

このチュートリアルには、いくつかのライブラリーとモジュールが必要です。以下を必ずインポートしてください。それらがインストールされていない場合は、pipをクイックインストールすることで問題が解決されます。

#installations
%pip install image | tail -n 1
%pip install -U "ibm_watsonx_ai>=1.1.14" | tail -n 1
%pip install python-dotenv | tail -n 1 #imports
import requests
import base64
import os

from PIL import Image
from ibm_watsonx_ai import Credentials
from ibm_watsonx_ai.foundation_models import ModelInference
from dotenv import load_dotenv
load_dotenv(os.getcwd()+"/.env", override=True)

認証情報を設定するには、ステップ1で生成したWATSONX_APIKEYおよびWATSONX_PROJECT_IDが必要です。それらはディレクトリー内の.envファイルに保管するか、またはプレースホルダー・テキストを置き換えることができます。また、APIのエンドポイントとして機能するURLも設定します。

WATSONX_APIKEY = os.getenv('WATSONX_APIKEY', "<YOUR_WATSONX_APIKEY_HERE>")
WATSONX_PROJECT_ID = os.getenv('WATSONX_PROJECT_ID', "<YOUR_WATSONX_PROJECT_ID_HERE>")
URL = "https://us-south.ml.cloud.ibm.com"

Credentialsクラスを使用して、渡した認証情報をカプセル化できます。

credentials = Credentials(
    url=URL,
    api_key=WATSONX_APIKEY
)

ステップ4. 画像をエンコードする

このチュートリアルでは、画像キャプションやオブジェクト検出などのマルチモーダルAIアプリケーション用のいくつかの画像を使用します。使用する画像は、次のURLからアクセスできます。これらのURLをリストに保管して、繰り返しエンコードできます。

url_image_1 = 'https://assets.ibm.com/jp-ja/is/image/ibm/hv6b0935?$original$'
url_image_2 = 'https://assets.ibm.com/jp-ja/is/image/ibm/c30a2d57-a62b-4bb3-818895bfe2fc7bf8?$original$'
url_image_3 = 'https://assets.ibm.com/jp-ja/is/image/ibm/nt170969?$original$'
url_image_4 = 'https://assets.ibm.com/jp-ja/is/image/ibm/fb123b45-6530-4dd9-a758-10a7ec234d9d?$original$'

image_urls = [url_image_1, url_image_2, url_image_3, url_image_4]

データ・インプットをより深く理解するために、画像を表示してみましょう。

for idx, url in enumerate(image_urls):
    print(f'url_image_{idx}')
    display(Image.open(requests.get(url, stream=True).raw))

アウトプット

url_image_0

ニューヨークの写真

url_image_1

走っている女性

url_image_2

ミシシッピ川の洪水で浸水した農場

url_image_3

一枚の栄養ラベル

LLMで理解しやすい方法でこれらの画像をエンコードするには、画像をバイトにエンコードしてからUTF-8表現にデコードします。

encoded_images = []

for url in image_urls:
    encoded_images.append(base64.b64encode(requests.get(url).content).decode("utf-8"))

ステップ5. APIリクエストとLLMを設定する

イメージをLLMに渡すことができるようになったので、watsonx API呼び出し用の関数を設定しましょう。augment_api_Request_body関数は、ユーザーのクエリと画像をパラメーターとして受け取り、APIリクエストの本文を追加します。この機能は各イテレーションで使用されます。

def augment_api_request_body(user_query, image):
    messages = [
        {
            "role": "user",
            "content": [{
                "type": "text",
                "text": 'あなたは親切なアシスタントです。次のユーザーの質問に1つまたは2つの文で答えてください:' + user_query
            },
            {
                "type": "image_url",
                "image_url": {
                "url": f"data:image/jpeg;base64,{image}",
                }
            }]
        }
    ]

    return messages

ModelInferenceクラスを使用して、モデル・インターフェイスをインスタンス化しましょう。このチュートリアルでは、meta-llama/llama-3-2-90b-vision-instructモデルを使用します。

model = ModelInference(
    model_id="meta-llama/llama-3-2-90b-vision-instruct",
    credentials=credentials,
    project_id=WATSONX_PROJECT_ID,
    params={
        "max_tokens": 200
    }
)

ステップ6. 画像にキャプションを付ける

これで、画像をループして、「この画像では何が起こっているのか?」というクエリに応じてモデルが生成したテキストの説明を確認できるようになりました。

for i in range(len(encoded_images)):
    image = encoded_images[i]
    user_query = "What is happening in this image?"
    messages = augment_api_request_body(user_query, image)
    response = model.chat(messages=messages)
    print(response['choices'][0]['message']['content'])

アウトプット: 

この画像は、高層ビルや車、歩道を歩く人々がいるにぎやかな街での様子です。通りには信号や木々、道路標識が溢れ、交差点で道路を横断する人々が何人かいます。
この画像は、アスレチック・ウェアを着た女性が通りを走っているところを描いており、背景には建物と車が見えます。女性は黄色いパーカー、黒いレギンス、スニーカーを履いており、カジュアルなジョギングやランニングをしているように見えます。
この画像は、浸水した地域を表しており、水が地面を覆い、建物を囲んでいます。洪水は深刻で、水位はいくつかの構造物の屋根にまで達しているようです。
**画像の説明**

*画像は栄養成分ラベルのクローズ・アップであり、それを指で指しています。
* ラベルには、次のような特定の食品の栄養成分表示に関する詳細な情報が記載されています:
        + カロリー
        + 脂肪
        + 食塩相当量
        + 炭水化物
        + その他の関連情報
        * ラベルは白い背景に黒いテキストが表示され、読んで理解しやすくなっています。

Llama 3.2-90b-vision-instructモデルでは、各画像に詳細なキャプションを付けることができました。

ステップ7. 物体を検知する

モデルが画像からテキストへの変換を実行する能力について実演したので、物体の検知を必要とするいくつかの質問をモデルに尋ねてみましょう。屋外で走っている女性を描いた2番目の画像について、「この画像には何台の車がありますか?」とモデルに聞きます。

image = encoded_images[1]
user_query = "How many cars are in this image?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

アウトプット:この画像には1台の車がいます。車は建物の右側の路上に駐車されています。

モデルは画像内の単一の車両を正しく識別しました。それでは、洪水の画像に示されている被害状況について質問しましょう。

image = encoded_images[2]
user_query = "How severe is the damage in this image?"
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

アウトプットこの画像の被害は深刻で、洪水が土地のかなりの部分を占めており、構造物や作物に広範な被害をもたらしている可能性があります。水位は少なくとも腰の深さがあると思われ、その地域の不動産所有者や農家に重大な損失をもたらす可能性があります。

この回答は、保険のような分野におけるマルチモーダルAIの価値を浮き彫りにしています。このモデルは、浸水した住宅にもたらされた損害の深刻さを検知することができました。これは、保険請求の処理時間を短縮するための強力なツールとなる可能性があります。

次に、栄養成分表示の画像に含まれる食塩相当量をモデルに尋ねてみましょう。

image = encoded_images[3]
user_query = "How much sodium is in this product?"
request_body = augment_api_request_body(user_query, image)
messages = augment_api_request_body(user_query, image)
response = model.chat(messages=messages)
print(response['choices'][0]['message']['content'])

アウトプット:**食塩相当量:** 640ミリグラム(mg)

素晴らしいですね。このモデルは、ユーザーのクエリーに従って、画像内のオブジェクトを識別することができました。モデルの性能をさらに実証するために、より多くのクエリを試すことをお勧めします。

まとめ

このチュートリアルでは、Llama 3.2-90b-vision-instructモデルを使用して、画像のキャプションや視覚的な質問への回答を含むマルチモーダル・オペレーションを実行しました。このモデルのその他のユースケースについては、公式のドキュメンテーション・ページを確認することをお勧めします。そこでは、モデルのパラメーターと機能についての詳細情報が確認できます。Pythonのアウトプットは、マルチモーダル・システムがマルチモーダル・データから情報を抽出する能力を示すため重要です。

関連ソリューション
IBM watsonx.ai

AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。

watsonx.aiをご覧ください。
人工知能ソリューション

業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。

AIソリューションはこちら
AIサービス

AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。

AIサービスはこちら
次のステップ

AI開発ライフサイクル全体にわたる機能にワンストップでアクセスできます。使いやすいインターフェース、ワークフロー、業界標準のAPIやSDKを利用して、強力なAIソリューションを構築できます。

watsonx.aiの詳細はこちら デモを予約