2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Gemini の画像生成でガチャ

Last updated at Posted at 2025-03-21

Google AI Studio では、画像生成やプロンプトによる画像編集が行えます。ガチャを自動化するために Python でスクリプトを書きます。

更新履歴

  • 2025/04/01 google-genai 1.9.0 に対応(base64.decodebytes を除去)

Gemini 2.0 Flash (Image Generation) Experimental

Google AI Studio は Gemini API による開発のプロトタイピングを行うサイトです。

機能拡張を重ねて、必ずしも開発者でなくても AI チャットサイトとしても使えるようになっています。

その中でも注目されているのは、Gemini 2.0 Flash (Image Generation) Experimental による画像生成機能です。画像を生成するだけでなく、絵柄を保ったままプロンプトにより画像編集が行えます。

公開当初は人物を含む画像に制限がありましたが、現在は制限が緩和されています。

画像編集の例

入力画像(プロンプト「アニメの絵で、住宅街を女の子と猫が歩いている。」)

Gemini ではなく、Grok で生成した画像です。

プロンプト
少女だけを残して白背景にしてください。

出力画像

左下の青いマークは、Gemini のウォーターマークです。

この画像は足元が見切れています。この後の使用例で Gemini に足を描き加えてもらって、全身画像の生成を試みます。

ガチャの自動化

なかなか思ったような画像が得られないことも多く、何かの拍子に出力がブロックされてしまうこともあるため、スクリプトで自動化するのが効率的です。

Google AI Studio にはスクリプト生成機能があります。まず、やりたいことを手作業で行って、[Get code] とすることで作業を再現するスクリプトが生成されます。

生成されたコードをベースにして、リファレンスを参考に画像の読み書き部分を簡略化しました。

Google AI Studio には無料枠があります。Gemini 2.0 Flash (Image Generation) Experimental は 1 分間に 10 リクエスト、1 日に 1,500 リクエストが上限です。超過してもいきなり課金されるのではなく、429 エラーになります。1 分間の上限に達したときは待って再試行すれば良いので、そのように実装しました。

スクリプトを実行するには、Google AI Studio で API Key を発行して、環境変数 GEMINI_API_KEY にセットする必要があります。

追加ライブラリ
pip install pillow google-genai
gemini.py
import sys, os, time
from pathlib import Path
from PIL import Image
from io import BytesIO
from google import genai
from google.genai import types

model  = "gemini-2.0-flash-exp-image-generation"
client = genai.Client(api_key=os.environ.get("GEMINI_API_KEY"))
config = types.GenerateContentConfig(
    temperature=1,
    top_p=0.95,
    top_k=40,
    max_output_tokens=8192,
    response_modalities=["image", "text"],
    safety_settings=[
        types.SafetySetting(
            category="HARM_CATEGORY_CIVIC_INTEGRITY",
            threshold="OFF",  # Off
        ),
    ],
    response_mime_type="text/plain",
)

def generate_content_retry(*args):
    for _ in range(5):
        try:
            response = client.models.generate_content(
                model=model,
                config=config,
                contents=args,
            )
            if response.candidates and response.candidates[0].content:
                return response
            else:
                print(response.prompt_feedback, file=sys.stderr)
        except genai.errors.APIError as e:
            if hasattr(e, "code") and e.code in [429, 500, 503]:
                print(e, file=sys.stderr)
                for i in range(15, -1, -1):
                    print(f"\rRetrying... {i}s ", end="", file=sys.stderr, flush=True)
                    if i:
                        time.sleep(1)
                print(file=sys.stderr)
                continue
            else:
                raise
    raise RuntimeError("Max retries exceeded.")

dbg = [None]

def generate(repeat, inputs, prompt):
    prompt = prompt.strip()
    print(prompt)
    print("-" * 20)
    imgpath = Path(inputs[0])
    imgs = [Image.open(path) for path in inputs]
    imgnum = 1
    for _ in range(repeat):
        response = generate_content_retry(*imgs, prompt)
        for part in response.candidates[0].content.parts:
            if part.text:
                print(part.text.strip())
            elif d := part.inline_data:
                while True:
                    file_name = f"{imgpath.stem}-{imgnum:03d}.png"
                    imgnum += 1
                    if not os.path.exists(file_name):
                        break
                dbg[0] = d
                img = Image.open(BytesIO(d.data))
                img.save(file_name)
                print("File saved:", file_name)

generateinputs は入力画像のリストです。複数指定できますが、空にすることはできません。出力画像のファイル名は、最初の入力画像のファイル名の後に連番を付加したものとなります。

例: ["foo.png", "bar.png"] → foo-001.png, foo-002.png, ...

再度実行すれば、続きの連番から生成されます。

5 枚程度生成してみて、必要に応じてプロンプトを修正して再度実行するような流れを想定しています。

使用例

入力画像やプロンプトを指定して gemini.generate を呼び出します。

girl.py
repeat = 5  # 試行回数
inputs = ["girl.png"]  # 入力画像
prompt = """
この少女はレディースサンダルを履いて歩いています。
足を描いて、全身が収まるようにしてください。
"""

from gemini import generate
generate(repeat, inputs, prompt)

全身が収まるような縦長の出力画像を期待しているため、それに合わせて手動でリサイズした入力画像を用意します。

入力画像

出力画像(例)

ここでは比較的うまくいった画像を掲載していますが、実際には失敗画像の方が多いです(👉参考)。プロンプトは結果を見ながら随時修正します。

出力画像が並んでいるのを見ると、アニメの設定画集みたいですね。こんなことが個人でも手軽に行えるようになるとは、すごい時代になったものです。

関連記事

同じ画像を使って動画生成を試みる記事です。

もともと単なるテストだったのですが、これだけ使い回しているとキャラクターに愛着が湧いてきます。

理論的には、Gemini により設定画像からポーズを生成して、別途生成した背景を合成することで任意のシーンを描画することが可能です。その手法は紙芝居やマンガの生成にも応用できるでしょう。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?