😽

OpenAI Cookbook 画像生成について試してみた

に公開

今回はOpenAI Cookbookで公開されている以下の記事について解説および実験してみました。

https://cookbook.openai.com/examples/generate_images_with_high_input_fidelity

Cookbookの概要

今回取り扱うGenerate images with high input fideltyでは、Image APIおよび画像生成ツールで利用可能なinput_fideltyパラメータを利用して、入力特徴を保持する方法を学ぶことができます。input_fideltyパラメータをhighに設定すると、顔やロゴといった細部を忠実に生成したい編集に有効になります。

実際に使ってみる

環境セットアップ

今回はCookbookの内容を元に、uvを利用して環境を構築しました。

uv init openai_cookbook_image_generation -p 3.12
cd openai_cookbook_image_generation
uv add pillow openai

次に以下のようにして処理をするコードを実装します。なお、gpt-image-1を使うためにはverify organizationを実行する必要があるので、必要に応じて対応してください。

cookbook_image_generation.py
import base64, os
from io import BytesIO
from PIL import Image
from openai import OpenAI

os.environ["OPENAI_API_KEY"] = "<OpenAI API Key>"

client = OpenAI()

def resize_img(image, target_w):
    w, h = image.size
    target_h = int(round(h * (target_w / float(w))))
    resized_image = image.resize((target_w, target_h), Image.LANCZOS)
    return resized_image


def edit_img(input_img, prompt, save_filename=None, output_dir="./claude/log"):
    result = client.images.edit(
        model="gpt-image-1",
        image=input_img,
        prompt=prompt,
        input_fidelity="high",
        quality="high",
        output_format="jpeg"
    )

    image_base64 = result.data[0].b64_json
    image_bytes = base64.b64decode(image_base64)
    image = Image.open(BytesIO(image_bytes))
    
    if save_filename:
        save_image(image, save_filename, output_dir)
    
    return image


def save_image(image, filename, output_dir="./outputs"):
    os.makedirs(output_dir, exist_ok=True)
    output_path = os.path.join(output_dir, filename)
    image.save(output_path)
    print(f"Image saved to: {output_path}")
    return output_path


if __name__ == "__main__":
    edit_input_path = "imgs/desk.png"
    
    with open(edit_input_path, "rb") as edit_input_img:
        prompt = "Make the mug olive green"
        
        edited_image = edit_img(edit_input_img, prompt)
        
        output_filename = "edited_desk.jpg"
        save_image(edited_image, output_filename)
        
        edited_image.show()

画像保存ロジックは修正していますが、基本的にはCookbookのままとなります。手順としては以下になります。

  1. バイナリ形式で画像を読み込む
  2. プロンプトに編集指示を与える
  3. 取得した画像をバイナリとして読み込み保存する

今回利用した画像はCookbookで利用されている画像を利用させていただきました。まずはサンプルと同じようにマグカップの色をオリーブ緑色に編集してみました。

  • 元画像

  • マグカップの色変更後

それでは次にモニタに日本風の風景を表示させてみましょう。プロンプトをChange the monitor display to a Japanese-style landscapeとしてみました。いい感じに背景が日本風になっていました。

顔画像の編集

次に顔画像編集をしてみます。プロンプトはサンプル通りAdd soft neon purple and lime green lighting and glowing backlighting.とし、入力画像も提供されているものを利用します。また今回はinput_fideltylowの場合も試してみます。

  • 元画像

  • input_fidelty=high

  • input_fidelty=low

結果をみると、input_fidelty=lowの時の方がクリアな画像になっています。これはlowに設定すると入力画像が内部的に補正されて利用されるため綺麗になっていると言えます。逆にhighにすると補正せずそのままの画像を利用することになるため、画像のクオリティは一見落ちているように見える場合もあります。

まとめ

今回はinput_fideltyパラメータの変化に伴う出力画像の変化についてCookbookの記事の例を実施してみました。どれだけ元の画像を利用して画像を生成するかを検討するとき、可能な限り元画像をそのまま利用したいときはhighに、補正等を施したい場合はlowに設定してAPI呼び出しをしてもらえたらと思います。皆さんもぜひ画像生成APIを利用してみてください。

Discussion