🐷

イベントページのサムネはAIに作ってもらおう

2024/01/31に公開

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井 亮です。

私は OpsJAWS というコミュニティを運営しています。
イベント開催時はイベントページを開設して参加者を募集しています。イベントページは参加者の興味を惹くように、刺さりやすいテーマや説得力のある登壇者、長すぎず短すぎない時間割、開催場所を工夫しています。
そして何よりも目を引くサムネイル画像が必要です。必要だと思いながら過去のイベントではサムネイルは無しでした。理由は「絵心がないから」です。
いかんなと思いつつも諦めていました。がしかし、そうです、画像を生成してくれる AI が現代にはいるのです。これは使わない手はないということで直近2回のイベントでは Stability AI の力を借りてサムネイルを作りました。
こちらです。

JAWS なので鮫をモチーフにしています。なかなか良いのではないでしょうか。自画自賛と言いたいところですが、自画ではありませんね。AI画自賛。

やってみた

今回は AWS Bedrock を使いました。事前のセットアップが必要です。下の公式ユーザーガイドを参照にポチポチします。
Set up Amazon Bedrock

python のサンプルコードが Stability.ai Diffusion 1.0 text to image に例示されています。これを使います。

def main(): の下に body でパラメータを定義します。
heightwidth は画像のサイズです。やみくもに指定はできません。Stability.ai Diffusion 1.0 text to image に組み合わせが記載されているので、その中から選びます。
cfg_scale は整数をランダムで取るように変更しました。プロンプトに従うようにするなら cfg_scale は大きい値にすると良いですが、ランダムを楽しみたい気持ちからこうしています。
seed はコメントアウト、こちらもランダムを楽しみます。
style_preset で生成される画像のスタイルを指定します。希望の画像を生成できるよう色々と試してみてください。

    # Create request body.
    body=json.dumps({
        "text_prompts": [
        {
        "text": prompt
        }
    ],
    "height": 640,
    "width": 1536,
    "cfg_scale": random.randint(0, 35),         # 0 to 35. Determines how much the final image portrays the prompt. Use a lower number to increase randomness in the generation.
    #"seed": 0,                                 # 0 to 4294967295. The seed determines the initial noise setting. Use the same seed and the same settings as a previous run to allow inference to create a similar image. If you don't set this value, or the value is 0, it is set as a random number.
    "steps": 30,                                # 10 to 50. Generation step determines how many times the image is sampled. More steps can result in a more accurate result.
    "samples" : 1,
    "style_preset" : "3d-model"                 # 3d-model analog-film anime cinematic comic-book digital-art enhance fantasy-art isometric line-art low-poly modeling-compound neon-punk origami photographic pixel-art tile-texture
    })

body の少し上に prompt があります。ここにプロンプトを入力します。どのような画像を生成するか指示します。

prompt="""Sri lanka tea plantation."""

日本語プロンプトは?

気になったので試してみました。プロンプトで日本語は通るのでしょうか?
「朝日が昇る地平線」を日本語と英語で指示し、生成された画像を比較してみました。

prompt="""朝日が昇る地平線."""

img

prompt="""The horizon with the rising sun."""

img

何度か試してみましたが、日本語だと意図した画像になりませんでした。
若干朝日っぽくこれはこれで良い画像ですが、ちょっと違うような気がします。なので、プロンプトは頑張って英語で書きましょう。

プロンプトの書き方

プロンプトの書き方でアウトプットが変わります。具体的に指示してあげたほうが期待した画像が生成されます。
最初に疑問に思ったのは、文章がいいのか単語がいいのかでした。両方試してみました。

prompt="""The muscular man wears a white tank top and a smlie. He holds his arms in an L-shape in front of his body, bragging about his well-developed biceps, and loudly shouts Power!."""

img

prompt="""A muscular man, smile, white tank top, arms in an L-shape, well-developed biceps, shouts Power!."""

img

結果、違いはありませんでした。具体的であれば文章でも単語でも良さそうです。

困る画像

プロンプトによっては困る画像が生成されることがあります。
公の場で使う画像なので、困る画像は避けたいです。例えば、性的、暴力的、倫理的に問題のある画像などです。

このブログで紹介したプロンプトで何回か画層を生成すると、困る画像が生成されることがありました。それを防ぐためにネガティブワードをプロンプトに含めることにしました。
netaive_promt にネガティブワードを指定します。body で重み付けるように変更しました。weight を0より小さくするとネガティブです。

    prompt="""The muscular man, a white tank top ,smlie, arms in an L-shape, well-developed biceps, shouts Power!"""
    negative_promt="""Not safe for work, missing limb, bad hands, missing fingers, bad anatomy"""

    body=json.dumps({
        "text_prompts": [
        {
            "text": prompt,
            "weight": 1.0
        },
        {
            "text": negative_promt,
            "weight": -1.0
        }
    ],

まとめ

画像生成は簡単にできそうに思えて、思い通りの画像を生成するにはポイントを抑える必要があるということに気が付きました。
AI にも苦手分野があるらしく、公開できない画像が稀に生成されます。ネガティブプロンプトを指定することで困った画像を防ぎました。

やってみて分かったのですが、Bedrock SDK を使って画像を生成すると”相応しくない画像”は出力されないようフィルターされているようです。

参考

Stability.ai Diffusion 1.0 text to image
API Reference

Discussion