🧠

画像から俳句を詠むAIを作る

2024/07/10に公開

はじめに

気温が高くなり、初夏が始まったので涼を感じる俳句でも詠んで欲しいですね。そこでOpenAIのCLIPとOpenAIのAPIを使って画像から俳句を詠むAIを作りました。

よかったところ

  • 想像以上に良い句を詠んでくれた
  • GPU環境が必要ない
  • 俳句を生成するのにかかるトークンが少ないので、費用が安い

悪かったところ

  • 自然言語処理は単語をベクトル化しているため、音が正確にわからず字余りや字足らずが多い

出力


緑のアイス
手に持ちし錐
夏の兆し


水面映す
夜の都会
春の月

1枚目は京都の清水の抹茶アイスの画像、2枚目は3月に行った上海の夜景です。
特に二句目の俳句が味わい深いです。水面に映る夜の都会の灯の様子を春の月に比喩しています。

解説

仕様

OpenAIのCLIP(Contrastive Language–Image Pre-training)を使って画像の情報をキャプションすることで自然言語に変換し、そのキャプション情報を元にGPT-4で俳句を生成しました。
CLIPとは画像とテキスト間の変換(キャプション)を行うモデルです。
画像エンコーダーとテキストエンコーダーを事前学習で、データセット内のどの画像とどのテキストがペアになるかを学習します。そしてCLIPをゼロショットの分類機とすることで、画像がどのテキストとペアになっているかを予測することができます。
モデルの詳細を知りたい方は論文, Githubを参照してください。
https://openai.com/index/clip/
https://arxiv.org/abs/2103.00020
https://github.com/OpenAI/CLIP?tab=readme-ov-file
CLIPはオープンソースライブラリーとなっていて、無料で使用できます。またCPU環境でも十分に動きます。(Macbook Air M2チップ環境の場合)
OpenAIのAPIは有料ですが、大したトークン数を使用しないのでかなり安いです。
GPT-4は2024年7月10日現在は以下の料金がかかります。

そのため、今回紹介するプログラムの場合は
一句目:入力:153トークン, 出力:20, 費用:$0.001065
二句目:入力:157トークン, 出力:14, 費用:$0.000995
となり、一句0.1円程度で読むことができます。

プログラム

import open_clip
import torch
from PIL import Image
from openai import OpenAI
import os

def load_image_captioning_model(device):
    return open_clip.create_model_and_transforms(
        "coca_ViT-L-14",
        pretrained="mscoco_finetuned_laion2B-s13B-b90k",
        device=device
    )

def generate_caption(model, transform, image_path, device):
    img = Image.open(image_path).convert("RGB")
    im = transform(img).unsqueeze(0).to(device)
    with torch.no_grad():
        generated = model.generate(im, seq_len=20)
    
    caption = (
        open_clip.decode(generated[0].detach())
        .split("<end_of_text>")[0]
        .replace("<start_of_text>", "")
    )
    return caption.strip()

def generate_haiku(client, caption):
    prompt = f"""
    以下の画像キャプションを着想として、日本語で俳句を作成してください。
    俳句は5-7-5の音節で構成し、季語を含めてください。音節は重要視してください。

    キャプション: {caption}

    俳句:

    response = client.chat.completions.create(
        model="gpt-4",
        messages=[
            {"role": "system", "content": "system", "content": "あなたは俳句の達人です。与えられたキャプションを着想として、美しく印象的な俳句を作成します。"},
            {"role": "user", "content": prompt}
        ],
        max_tokens=100,
        n=1,
        temperature=0.7,
    )

    return response.choices[0].message.content.strip()

def main():
    # デバイスの設定
    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    
    # モデルの読み込み
    model, _, transform = load_image_captioning_model(device)
    
    # 画像からキャプションを生成
    image_path = "your_image_path"
    caption = generate_caption(model, transform, image_path, device)
    print(f"生成されたキャプション: {caption}")

    # OpenAI APIの設定
    api_key = os.environ.get("OPENAI_API_KEY", "YOUR_API_KEY")
    client = OpenAI(api_key=api_key)

    # 俳句の生成
    haiku = generate_haiku(client, caption)

    print(f"生成された俳句:\n{haiku}")

if __name__ == "__main__":
    main()

まとめ

CLIPとGPT-4を使って画像から俳句を詠むAIを作成することができました。LLMの特性上、字余り・字足らずは発生してしまうもののかなり面白い俳句を詠んでくれます。

質問などございましたら、Xアカウントまでお願いします!

Discussion