🎨

画像からテキストを生成するImagen CaptioningをVertexAIを使って試す

2023/08/15に公開

生成AIにおいてよく利用される分野として、Txt2Imgという分野があります。その名の通りユーザーが入力した文章から画像を生成するというものです。Txt2Imgとは逆で画像からテキスト を生成することができる機能がVertexAIを使って利用ができることを知りました。
この記事では画像からテキストを生成することができるImage to CaptionをGoogle CloudのImagen Captioningを使って試してみたいと思います。

Imagen Captioningとは?

冒頭に掲載したImagen Captioningによると以下のように説明されています。

Imagen captioning generates a caption from an image you provide based on the language that you specify.
Imagen currently supports five languages: English, German, French, Spanish and Italian.

指定した言語で画像に対してのcaption(説明文)を作成してくれるみたいです。まだ日本語は対応していないようなので今回は英語で試してみたいと思います。

Google Cloudを使って試すまでの手順

Google Cloud のTopページからVertexAIへアクセスします。サイドバーに記載のあるModel Gardenから該当するモデル(今回はImage Captioning)を利用します。

Model Gardenへアクセス

Imagen Captioningの選択

Vision Studio(Google Cloudのコンソール上で利用できるサービス)でも利用できるようですが、今回はサービスへの埋め込みなどを想定してAPIを利用します。サンプルコードなどはコチラのページに記載があったので、参考にして試してみたいと思います。

まずは結果から!

以下のきゃわいいねこの画像のCaptionを生成してみました。

生成された説明文は以下のようになりました。

{
  "predictions": [
    "an orange and white cat wearing a blue hat and collar",
    "a cat wearing a blue hat and collar sits on a table",
    "a cat wearing a blue hat and collar is sitting on a table"
  ],
  "deployedModelId": "XXXXXXXXXXXXX"
}

画像の解説としてふさわしい内容になっていますね!
生成にかかった時間は画像1枚(1024 x 1024 1.8MB)を使っておおよそ15秒ぐらい。
Caption生成にかかるコストは1枚の画像あたりで$0.0015とのことでした。

検証に利用したソースコード

検証に利用したソースコードは以下です。 RESPONSE_COUNT は3つまでのCaptionを生成することができるようです。

import base64
import json
import requests
from google.oauth2 import service_account
from google.auth.transport.requests import Request
# サービスアカウントのキーファイルへのパスを指定
credentials = service_account.Credentials.from_service_account_file(
    './your-key.json',
    scopes=["https://www.googleapis.com/auth/cloud-platform"]
)


credentials.refresh(Request())
# アクセストークンを取得
access_token = credentials.token

headers = {
    'Authorization': f"Bearer {access_token}",
    'Content-Type': 'application/json; charset=utf-8'
}
PROJECT_ID = "YOUR-PJ-ID"
B64_IMAGE = base64.b64encode(open("./your/img.png", "rb").read()).decode()
RESPONSE_COUNT = 3  # 生成するCaptionの数
LANGUAGE_CODE = "en"  # サポートされている言語コードのいずれかを選択。今回は英語。

# POSTリクエスト用のURL
url = f"https://us-central1-aiplatform.googleapis.com/v1/projects/{PROJECT_ID}/locations/us-central1/publishers/google/models/imagetext:predict"

# リクエスト用のJSON本体
request_data = {
    "instances": [
        {
            "image": {
                "bytesBase64Encoded": B64_IMAGE
            }
        }
    ],
    "parameters": {
        "sampleCount": RESPONSE_COUNT,
        "language": LANGUAGE_CODE
    }
}

# POSTリクエストを実行
response = requests.post(url, headers=headers, json=request_data)

# レスポンスをJSONとして解析
response_data = response.json()

# 応答を出力
print(json.dumps(response_data, indent=2))


ユースケースとしてどのような活用が期待できるか?

画像をもとに説明文を作成するような業務領域で活用できそうですね。
例えば、

  • ECサイトの商品説明を画像をもとに作成
  • 生成されたCaptionをもとに、画像の分類化

上記のような領域で利用ができるのではないでしょうか。
簡単に試すことができるので是非みなさん試してみてください。

Discussion