🤖

Google Cloud で生成 AI アプリケーションを作ろう!パート 9:Visual QA で AI にファッションを褒めてもらう

2023/09/08に公開

はじめに

本シリーズのこれまでの記事では、PaLM API を利用したアプリケーションのサンプルを中心に紹介してきました。PaLM API は、テキストデータを扱う LLM(大規模言語モデル)なので、当然ながら、自然言語テキストを処理するアプリケーションが中心になります。

それでは、画像データを扱うアプリケーションに PaLM API を活用することはできないのでしょうか? —— Google Cloud の Vertex AI では、画像イメージから情報を抽出する Visual Question Answering(Visual QA)のサービスを提供しており、これを PaLM API と組み合わせるアイデアが考えられます。

ここでは、一例として、人物の画像イメージからファッションに関する情報を取り出して、「AI にファッションを褒めてもらう」アプリケーションを作ってみます。自分のファッションを褒められると、日々の活動のモチベーションも上がりますね。

Visual QA と PaLM API を組み合わせたアプリケーション

事前準備

まずは、「パート 1 : 生成 AI ソリューションを使うための基本的なセットアップ」の手順を参考にして、Workbench の環境で新しいノートブックを開きます。

この後は、ノートブック上で順番にコードを実行していきます。すでにコードを書き込んだノートブックが GitHub で公開されていますので、そちらも参考にしてください。

テスト画像の準備

はじめに、テストに使用する画像をダウンロードしておきます。

!wget -q -O image.jpg \
https://upload.wikimedia.org/wikipedia/commons/e/ec/Larry_Page_in_the_European_Parliament%2C_17.06.2009_%28cropped%29.jpg

from IPython.display import Image as display_image
display_image(filename='image.jpg', width=200)

このコードを実行すると、次の画像[1]が表示されます。

画像の内容をテキストに変換

Image captioning の機能を使うと、画像の内容を説明したテキストが生成できます。具体的には、次のようなコードが利用できます。

from vertexai.preview.vision_models import ImageCaptioningModel
image_captioning_model = ImageCaptioningModel.from_pretrained('imagetext@001')

def get_image_description(image):
    results = image_captioning_model.get_captions(
        image=image,
        number_of_results=3)
    results.sort(key=len)
    return results[-1]

この機能では、画像から読み取った情報を LLM でテキストに変換しており、生成されるテキストは実行ごとに変動することがあります。ここでは、オプション number_of_results=3 を指定して 3 種類の結果を取得した後、最も長いテキストを採用しています。

次は、先ほどダウンロードしたイメージからテキストを生成するコードです。

from vertexai.preview.vision_models import Image
image = Image.load_from_file('image.jpg')

get_image_description(image)

次のような結果が表示されます。

'a man in a suit is holding a microphone in his hand'

画像からファッションアイテムを抽出

Image captioning では画像全体の様子を記述したテキストが得られますが、画像に写っているファッションアイテムなど、特定の情報だけを取り出したい場合もあります。ここで利用できるのが Visual QA です。次は、ファッションアイテムの情報を取り出すコードの例です。

from vertexai.preview.vision_models import ImageQnAModel
image_qna_model = ImageQnAModel.from_pretrained('imagetext@001')

def get_fashion_items(image):
    results = image_qna_model.ask_question(
      image=image,
      question='details of the fashion items in this picture.',
      number_of_results=3)
    results.sort(key=len)
    return results[-1]

オプション question の部分に、入力画像についての質問を与えると、その答えがテキストで返ります。ここでは、「details of the fashion items in this picture.(この写真の中のファッションアイテムの詳細)」という質問を入力することで、ファッションアイテムの情報を取り出しています。先ほどと同様に、オプション number_of_results=3 を指定して 3 種類の結果を取得した後、最も長いテキストを採用しています。

先ほどのイメージを入力してみます。

get_fashion_items(image)

次のような結果が得られます。

'suit, white shirt'

得られた情報から「ファッションを褒めるメッセージ」を生成

これで、画像データから「画像の内容を説明したテキスト」と「画像に含まれるファッションアイテム」の情報をテキストデータとして取り出すことができました。

この後は、PaLM API を用いて、これらの情報から「ファッションを褒めるメッセージ」を生成するように LLM に依頼すれば、当初の目的が達成できます。次は、一連の処理をまとめて実行するコードの例です。

from vertexai.preview.language_models import TextGenerationModel
generation_model = TextGenerationModel.from_pretrained('text-bison@001')

def get_compliment_message(image_file):
    prompt = '''\
ファッションアドバイザーの立場で、以下の様に記述される人物を褒め称える文章を作ってください。
その人物に語りかける様に、数行の文章を作ってください。
個人を特定する名前は使用しないでください。

記述:{}

ファッションアイテム:{}
'''

    image = Image.load_from_file(image_file)
    description = get_image_description(image)
    items = get_fashion_items(image)
    answer = generation_model.predict(
        prompt.format(description, items),
        temperature=0.2, max_output_tokens=1024,
        top_k=40, top_p=0.8).text
    return answer 

変数 prompt が LLM に対する依頼内容を表しており、記述:、および、ファッションアイテム:{} の部分に先ほど取得した情報が埋め込まれます。

それでは、先ほどのイメージを入力してみましょう。

get_compliment_message('image.jpg')

次のように、Visual QA で取り出した suit, white shirt の情報を含んだ、素敵なメッセージが得られました。

'あなたは今日とてもかっこいいです。スーツと白いシャツの組み合わせがとてもよく似合っています。また、マイクを手に持っている姿もとても印象的です。自信に満ち溢れたあなたの姿は、誰もが目を奪われることでしょう。'

Image captioning と Visual QA で取り出したテキストは英語で記述されていますが、PaLM API に入力するプロンプトでは、メッセージの作成を日本語で依頼しています。そのため、これらの情報は、「スーツ」「白いシャツ」のようにきちんと日本語に翻訳されています。

その他の実行例

その他の画像でも試してみましょう。

!wget -q -O image.jpg \
https://raw.githubusercontent.com/google-cloud-japan/sa-ml-workshop/main/blog/sns_profile_image.jpg

display_image(filename='image.jpg', width=200)

このコードを実行すると、次の画像が表示されます。これは、本ブログ記事の執筆陣の一人です。

さっそく、AI に褒めてもらいましょう。

get_compliment_message('image.jpg')

'あなたは、プレゼンテーションで自信に満ちていて、見ている人々を魅了しています。あなたのブルーのセーターとシャツの組み合わせは、あなたの自信をさらに引き立てています。素晴らしいプレゼンテーションでした!'

プレゼンテーション中の画像だということを正しく理解しているようです!

次の例はどうでしょうか?

!wget -q -O image.jpg \
https://upload.wikimedia.org/wikipedia/commons/thumb/5/5a/Lady_Gaga_JWT_Toronto%2C_2017-09-06_%28cropped2%29.jpg/800px-Lady_Gaga_JWT_Toronto%2C_2017-09-06_%28cropped2%29.jpg

display_image(filename='image.jpg', width=200)

このコードを実行すると、次の画像[2]が表示されます。

AI はどのような褒め言葉を見つけるでしょうか。

get_compliment_message('image.jpg')

'あなたは、エピフォンのギターを持ちながらマイクに歌う、とても才能のある歌手です。あなたのファッションは、あなたの音楽の才能と同じくらい素晴らしいです。あなたは、あなたの個性とスタイルを表現する素晴らしい方法を見つけました。あなたは、他の人にインスピレーションを与えるファッションアイコンです。'

画像の人物が世界的なアーティストであることを正しく理解していることがわかります。

まとめ

今回は、Vertex AI の Image captioning と Visual QA で画像データから情報を取り出す処理と PaLM API を組み合わせた利用例を紹介しました。Visual QA では画像から取り出す情報を自由に指定できるので、さまざまな応用例が考えられそうです。この記事を参考に、ぜひ、オリジナルアプリケーションの作成に挑戦してください。

なお、今回作成した機能をチャットボット風の Web アプリケーションとして実装したものが、こちらに用意してあります。「パート 4 : LLM を活用した Web アプリを英語学習に役立てる」と同様に、Firebase HostingCloud Run を用いてデプロイすることができます。Web アプリケーションの実装例として、参考にしてください。

脚注
  1. This file is licensed under the Creative Commons Attribution-Share Alike 3.0 Unported license. ↩︎

  2. This file is licensed under the Creative Commons Attribution-Share Alike 2.0 Generic license. ↩︎

Google Cloud Japan

Discussion