ABEJA Tech Blog

中の人の興味のある情報を発信していきます

プロンプトの推定をDALL·E 3とGPT-4Vにまかせた!

目次

はじめに

この記事はABEJAアドベントカレンダー2023の2日目の記事です。

こんにちは。データサイエンティストの小林です。12月に入り、クリスマスももうすぐですね。 私は一年中、Spotifyの"Christmas Hits!"を聞くくらいにクリスマスソングが大好きです!

アドベントカレンダー用にクリスマスっぽいサムネを作ろうかなと思い、早速ChatGPTに作ってもらっていたのですが、画像生成のプロンプト調整結構難しいですよね。。 ネットで流れてくる他の人の作った画像、どんなプロンプトで作ったんだろう?とが気になることが結構あります。

そこで今回は、先月公開されたGPT-4 with Vision(GPT-4V)のAPIを用いて、DALL·E 3への画像生成プロンプトを自動で推定・修正する、自動プロンプトエンジニアリングに挑戦してみます。

DALL·E 3とGPT-4Vにまかせる

今回やってみたいことは、想定した画像を生成のするためのDALL·E 3へのプロンプトを自動で調整させると、どこまでその画像のプロンプトに近づけることができるのか?の実験です。 DALL·E 3は、詳細なキャプションを作成し直したデータセットを用いることで、画像生成の性能を上げているようです。*1 そのため、より画像に忠実なプロンプトを作ることで、これを反映することができるのではないか?と考えられます。

これを実現するための代表的なツールとしては、clip-interrogatorがあります。 こちらのツールではまず、画像を入力として、その画像を生成するためのプロンプト候補を生成します。 その後、プロンプト候補から選んだキーワードの言語特徴量が画像特徴量に近くなるようにプロンプトを修正することで、画像に近いプロンプトを生成することができます。

github.com

また、生成画像を入力として、その生成元のプロンプトを推定するkaggleのコンペも開催されています。 こちらのコンペでは、生成画像とプロンプトの大量のペアを用いることが有効なようでした。

www.kaggle.com

このようにプロンプトの推定には様々なアプローチが考えられますが、今回はclip-interrogatorのように画像と文字列を比較するのではなく、 GPT-4Vでプロンプトを推定した後、実際にDALL·E 3で生成してみた画像も含めて比較するアプローチを試してみたいと思います! せっかくGPT-4Vを使えるようになったので、これを活用しちゃいましょう笑

実装

今回用いる機能は3つです。

  1. 初期プロンプト作り(GPT-4V)
  2. 画像作り(DALL·E 3)
  3. プロンプト変更(GPT-4V)

それでは、早速実装していきます。ほとんど公式のコードをそのまま流用しています。

1. 初期プロンプト作り

最初のプロンプト作成時は、作りたい画像をエンコードした文字列とプロンプトを考える指示をGPT-4Vに出します。

# https://platform.openai.com/docs/guides/vision

def encode_image(image_path: str):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


def get_prompt(image_path: str):
    headers = {"Content-Type": "application/json", "Authorization": f"Bearer {api_key}"}

    base64_image = encode_image(image_path)

    payload = {
        "model": "gpt-4-vision-preview",
        "messages": [
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": "Describe the image so that you can restore the image from the description.",
                    },
                    {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"}},
                ],
            }
        ],
        "max_tokens": 500,
    }

    response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)

    return response.json()

2. 画像作り

続いて、作成したプロンプトから画像を作ります。今回はDALL-E 3を使用して、画像の生成を行いました。

# https://platform.openai.com/docs/guides/images

def generate_image(prompt: str):
    client = OpenAI()

    response = client.images.generate(
        model="dall-e-3",
        prompt=prompt,
        size="1024x1024",
        quality="standard",
        n=1,
    )

    image_url = response.data[0].url

    return Image.open(requests.get(image_url, stream=True).raw)

3. プロンプト変更

ステップの最後として、プロンプトの修正を行います。 入力には、生成画像と入力画像と、元の画像の生成に使用したプロンプトを入力とし、プロンプトを修正した結果を出力します。 予備実験として入力の順番をモデルが認識できることを簡単に試した後に、次のような指示を出しています。複数画像を入力できるので、とても便利ですね!

def modify_prompt(prompt, image_path1, image_path2):
    base64_image1 = encode_image(image_path1)
    base64_image2 = encode_image(image_path2)

    client = OpenAI()
    response = client.chat.completions.create(
        model="gpt-4-vision-preview",
        messages=[
            {
                "role": "user",
                "content": [
                    {
                        "type": "text",
                        "text": f"Change the prompt: '{prompt}', which generates the second image so that the next generated image becomes closer to the target image (first image), reflecting the difference between two images. Output only the final prompt.",
                    },
                    {
                        "type": "image_url",
                        "image_url": {
                            "url": f"data:image/jpeg;base64,{base64_image1}",
                        },
                    },
                    {
                        "type": "image_url",
                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image2}"},
                    },
                ],
            }
        ],
        max_tokens=500,
    )

    return response

実験結果

それでは、実際にプロンプトの推定と修正を試してみましょう! 今回は、DALL·E 3でクリスマスをイメージした画像と、抽象的にクリスマスっぽい画像の2種類を用意し、実験してみました。

1枚目の画像

用いたDALL·E 3のプロンプトと画像は以下のとおりです。*2

A cozy Christmas party scene inside a warmly lit living room. The room is decorated with festive garlands, twinkling lights, and a beautifully adorned Christmas tree with gifts underneath. A group of people of diverse descents and genders are enjoying the party, wearing holiday-themed sweaters and hats. They are laughing, holding cups of hot chocolate, and exchanging gifts. The atmosphere is joyful and festive, with a crackling fireplace in the background adding to the warmth of the scene.

修正1回目

それでは最初に、生成した画像を入力して、プロンプトを生成してみましょう。

The image is a warm and festive indoor Christmas scene. It features a group of seven people, presumably friends or family, celebrating together.\n\nIn the background, there is a well-decorated Christmas tree to the right, adorned with lights, ornaments, and topped with a star. Hanging from the mantel of a cozy fireplace are traditional Christmas stockings, and the mantel itself is decorated with greenery and a wreath above it, signifying that it's the holiday season.\n\nThe people are seated and standing in a living room-like space, with some sitting on a sofa and others on chairs or standing. They are all wearing winter or Christmas-themed clothing, such as sweaters and Santa hats. The expressions on their faces are cheerful, and they seem to be enjoying themselves, possibly engaging in conversation, laughter, or singing.\n\nOn a wooden coffee table in the center, there are candles giving off warm light, and some of the individuals are holding what appear to be small candles or cups, contributing to the intimate and joyful atmosphere.\n\nThe color palette is rich with reds, greens, and golden hues—from the clothing to the decorations—giving the setting a traditional Christmas vibe. The room is dimly lit, primarily by the glow from the candles and Christmas lights, enhancing the sense of warmth and togetherness.\n\nGifts are placed around the tree, signifying the tradition of gift-giving. The overall composition of the image exudes warmth, togetherness, and the celebration of the holiday spirit.

英語で実験しましたが、プロンプトには以下のような特徴がありました。

  • 右にクリスマスツリー、プレゼント
  • 真ん中にテーブル

ある程度、いい感じそうですね!そして、このプロンプトを入力した出力がこちらです。

あ、こっち向いてますね笑

修正2回目

それでは先ほどの画像を説明させてみましょう。先程の画像と作りたい画像・プロンプトを入力しています。

The image is a vibrantly cozy Christmas gathering inside a festively decorated room. Seven cheerful individuals, possibly friends or family, are joyfully celebrating the occasion together.\n\nIn the background, a beautifully adorned Christmas tree stands to the right, illuminated with sparkling lights, a variety of ornaments, and crowned by a shining star. A fireplace, with its mantel festooned with greenery and hung with colorful Christmas stockings, adds to the festive ambiance. A green wreath is centered above the mantel, further emphasizing the holiday cheer.\n\nThe group is gathered in a homely living space. Some are comfortably seated on a sofa, while others are relaxed in armchairs or standing. Their attire includes seasonal winter clothing and festive accessories like sweaters and Santa hats. The room is alive with their bright expressions and the conviviality of shared conversation, laughter, and perhaps the occasional carol.\n\nAt the heart of the scene, a wooden coffee table plays host to flickering candles that cast a warm glow across the gathering. Several individuals are cradling small candles or cups in their hands, enhancing the intimate and merry atmosphere.\n\nThe room's color scheme is a rich tapestry of reds, greens, and golds, from the attire to the decor, creating a traditional Yuletide ambiance. Gentle lighting mainly from the candles and the twinkling Christmas lights gives the space a warm and inviting glow.\n\nBeneath the tree, an array of wrapped presents awaits, representing the time-honored tradition of exchanging gifts. The image captures the essence of warmth, unity, and the joyous spirit of celebrating Christmas together.

今回出力されたプロンプトには先程と比較して、次のような特徴がありますね。

  • 和気あいあいとした表現に変わっている
  • 部屋についてdimly(薄暗い)から alive with their bright expressions(明るい)に変更されている

以前と比較して楽しそうな雰囲気に変わりましたね。もう一度やってみましょう。

修正3回目

The image showcases a vibrant and jubilant Christmas gathering inside a cozy room. Nine individuals are intimately involved in the festivities, possibly a mix of friends and family, radiating a spirit of camaraderie.\n\nBehind the revelers is a robust, beautifully trimmed Christmas tree positioned to the left, its branches laden with an array of colorful lights, baubles, and a gleaming star crowning it. A fireplace anchors the scene, with stockings neatly hung and awaiting Santa's gifts. Above the mantel, a wreath adds to the holiday cheer, while the hearth below crackles with a welcoming fire.\n\nAround the room, the attendees are variously perched on couches and comfortably upholstered chairs or choosing to stand as they mingle. Their attire is a kaleidoscope of festive wear—from eclectic Christmas jumpers to bright Santa hats—all contributing to the merry atmosphere. Their faces are alight with mirth, captured in moments of laughter, convivial conversation, and the shared pleasure of holiday songs.\n\nThe central coffee table, crafted from rich wood, is adorned with an intricate Christmas village display, soft candlelight flickering across the scene, adding to the warmth. Several individuals clasp steaming mugs, possibly filled with hot cocoa or mulled wine, enhancing the ambiance of intimacy and festivity.\n\nThe color scheme is a heartwarming tapestry of classic yuletide hues, with reds and greens punctuated by gold accents, all set against the room's ambient light suffused with the soft glow of candles and twinkling tree lights.\n\nBeneath the tree, festively wrapped presents await their moment of unveiling, symbolizing the time-honored exchange of gifts. This composition, with its inviting mix of joy, unity, and traditional holiday essence, perfectly encapsulates the wondrous spirit of Christmas celebration.

気になる変更としては、以下のような差があります。

  • クリスマスツリーの位置を右と伝えている
  • 人数を9人と伝えている
  • 部屋について明るいという表現がなくなっている
  • 静かに会話をしているか、単にお互いの社交を楽しんでいる

会話していることが追加されており、この部分は元の画像に近づいていますね。 意外なことに、クリスマスツリーの位置を誤って左にある指示出ししてしまいました。

ようやく会話してくれましたね! ただ、元の画像とは異なり、クリスマスツリーが左側になっていますね。

それではこの実験はここまでにして、2枚目の画像に移ってみましょう。

2枚目の画像

用いたDALL·E 3のプロンプトと画像は以下のとおりです。

An enhanced abstract painting that more strongly emphasizes the Christmas theme in an Italian context. The artwork should radiate a more pronounced Christmas atmosphere, with an even greater emphasis on the traditional festive colors of red, green, gold, and silver. Imagine more distinct representations of Christmas elements like stars, bells, and perhaps subtle hints of iconic Italian Christmas symbols like the Panettone or the Presepe (Nativity scene). The composition should still maintain its abstract nature but with a clearer connection to the joyous and vibrant celebrations of Christmas in Italy, reflecting the lively, festive spirit and the rich cultural traditions of the holiday season in Italy.

こちらは出力された結果のみを簡単に紹介します。

The image appears to be a digital painting with a complex arrangement of vivid colors and shapes, creating a festive and magical atmosphere that could be interpreted as a stylized Christmas scene. Here's a detailed description that attempts to capture the essence of the image:\n\nAt the center and left of the image, there's a tall, elaborately decorated Christmas tree towering towards the top of the image. The tree is adorned with numerous ornaments including spheres with reflective surfaces showing a variety of colors like red, blue, yellow, and green. Many of these ornaments exhibit a glossy appearance, catching and refracting light. Some ornaments on the tree are patterned with swirls and speckles.\n\nSurrounding the tree, a multitude of similar baubles in various sizes are scattered throughout, giving the impression of a whirlwind of Christmas ornaments dancing in space. Colors transition smoothly from warm to cool tones, suggesting a dynamic light source within the image.\n\nAbove the tree, the scene transitions into a celestial display with golden stars and geometrical shapes that resemble mechanical gears, perhaps hinting at the inner workings of a clock or a fantastical interpretation of a night sky. Bright rays of light emanate from multiple points, predominantly from the upper right corner, casting an ethereal glow over the scene.\n\nIn the bottom right, there's a figure that appears to be Santa Claus, depicted in a flowing red cloak with white trim. The figure is placed as though he's entering the scene, with a subtle suggestion of movement.\n\nIn the bottom left, a motif resembling a bustling village is present, with structures that could be houses or buildings shown in an abstract manner, with rectangles and pointed shapes creating the impression of rooftops and high walls. This seems to evoke a sense of a quaint town or city on a wintry night.\n\nThe overall impression of the picture is one of a dreamlike collage, merging elements of Christmas iconography with abstract art to create an image that is both festive and visually arresting. The use of light and shadow, gradations of color, and flowing forms contribute to the sense of movement and wonder.

Create an image that blends elements from two existing digital paintings to capture a stylized, festive Christmas atmosphere. The composition should be centered around a tall Christmas tree, richly decorated with glossy and reflective ornaments in a variety of colors, such as red, blue, yellow, and green. The ornaments should feature designs with swirls and speckles and should appear as if they are caught in a dance around the tree, with a smooth transition of warm and cool tones suggesting dynamic lighting.\n\nAbove the tree, incorporate a celestial motif with golden stars and geometric shapes resembling mechanical gears to evoke a magical night sky with an ethereal glow, especially emanating from the upper right corner of the image. The celestial elements should blend into the scene, creating a dreamy collage that intertwines Christmas iconography with abstract art.\n\nIn the foreground, introduce a figure reminiscent of Santa Claus in a flowing red cloak with white trim positioned in the bottom right, providing a sense of subtle movement as if entering the scene. In the bottom left corner, create an abstract motif suggestive of a bustling village with structures represented as shapes and rooftops to convey the impression of a quaint town or city on a wintry night.\n\nAim for the final creation to have a dreamlike quality, combining light and shadow, gradations of color, and fluid forms to produce a feeling of wonder and festive rejoicing.

Create a digital painting that combines elements of a festive Christmas scene with abstract art. The image should feature:\n\n1. A tall, ornate Christmas tree centered to the left, rising towards the top, decorated with reflective and glossy ornaments including spheres showing a variety of colors such as red, blue, yellow, and green, with some patterned with swirls and speckles.\n\n2. A collection of Christmas baubles of varying sizes distributed throughout the scene to create the impression of a dynamic whirlwind of decorations in motion. The color scheme should have a smooth transition from warm to cool tones, suggesting an intricate light source within the composition.\n\n3. A celestial display with golden stars and geometric shapes above the tree, resembling mechanical gears, possibly hinting at the inner workings of a clock or presenting a fantastical interpretation of a night sky. Bright shafts of light should radiate from multiple points, especially from the upper right corner.\n\n4. In the bottom right, incorporate a figure reminiscent of Santa Claus in a flowing red cloak with white trim, positioned as if entering the scene, with a suggestion of motion.\n\n5. The bottom left should contain an abstract motif that suggests a bustling village with simplified structures—houses or buildings represented in a stylized manner with rectangles and pointed shapes depicting rooftops and tall walls, to evoke a quaint town or city on a wintry night.\n\n6. The composition should convey a dreamlike collage, blurring the lines between Christmas motifs and abstract design, creating an image that is both festive and visually captivating. Play with light and shadow, gradients of color, and flowing forms to enhance the magical sense of movement and wonder.\n\nPay careful attention to the distribution of light and the placement of the elements to ensure the final image captures the enchanting and vibrant essence of a Christmas celebration with an artistic twist.

クリスマスツリーに丸い玉が付いているなど、部分的には近づいている気がします。 一方で出力されたプロンプトが抽象的なこともあってか、全体的には異なる部分も多そうですね。

定量評価

生成された画像・プロンプトについて定量評価してみましょう。 clip-interrogatorと同様に、clipモデル(ViT-L-14)を用いて、元のプロンプト・画像とそれぞれのステップで生成されたものをコサイン類似度で評価しました。

ステップ 1回目 2回目 3回目
プロンプト(1枚目) 0.691 0.723 0.768
画像(1枚目) 0.884 0.876 0.847
プロンプト(2枚目) 0.586 0.667 0.716
画像(2枚目) 0.892 0.903 0..876

推論を進めることで、プロンプトの類似度が上がっていることは確認できました。 一方で、必ずしも生成画像が近づいているとは言い難そうです。

その他

今回は逐次的に一つ前の画像から変更するアプローチを検証しました。 GPT-4Vには複数枚の画像を入力できるので、複数の画像とプロンプトを入力する実験もしましたが、あまり上手くいきませんでした。 GPT-4Vの性能がより向上すれば、一括で入力するアプローチも有効かもしれません。 また、どの画像からスタートするかの探索や強化学習的なアプローチも考えられるかもしれませんね。

さいごに

今回は、GPT-4VのAPIを用いてDALL·E 3のプロンプトを推論してみました。 推論を重ねるに連れて、ある程度、プロンプトが画像に忠実に近づくことが確認できました。 一方で細分は元の画像と離れる場合があることや、プロンプトが近づいたからといっても生成画像自体が近づくわけではなさそうなことが確認できました。

個人的にクリスマスの画像がたくさん見れて、とても満足です。

We Are Hiring! ABEJAは、テクノロジーの社会実装に取り組んでいます。 技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください! (新卒の方のエントリーもお待ちしております)

careers.abejainc.com

*1:https://cdn.openai.com/papers/dall-e-3.pdf

*2:拡大した画像を載せると、変な部分があり、気分を害す可能性があるため縮小して掲載しています