0
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?

Google ColabでGPT Image Input fidelityを使った画像の生成と編集

Posted at

このGoogle Colabクックブックでは、画像生成機能を持つ新しい大規模言語モデルであるGPT Imageの使い方を学びます。このノートブックはGoogle Colab環境で動作し、ブラウザ上で直接実行できます。

このモデルは世界に関する知識を持ち、この幅広い世界の理解を活用して画像を生成できます。
また、従来世代の画像モデルであるDall-E 2や3と比較して、指示に従うことやフォトリアリスティックな画像の生成がはるかに優れています。

画像生成について詳しく学ぶには、ガイドを参照してください。

セットアップ

Google Colab環境で必要なライブラリをインストールします。

%pip install pillow openai -U
import base64
import os
from openai import OpenAI
from PIL import Image
from io import BytesIO
from IPython.display import Image as IPImage, display
# Google Colab環境でAPIキーを安全に設定
from google.colab import userdata
os.environ["OPENAI_API_KEY"]= userdata.get('OPENAI_API_KEY')
client = OpenAI()
# APIキーがグローバルに設定されていない場合は設定
#client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", "<環境変数として設定されていない場合のOpenAI APIキー>"))
# imgs/フォルダの作成(Google Colab環境内)
folder_path = "imgs"
os.makedirs(folder_path, exist_ok=True)

画像を生成する

GPT Image 1は指示に従うことが得意で、非常に詳細な指示でモデルに画像を生成させることができます。

prompt1 = """
このキャラクターのリアルな画像をレンダリングしてください:
ブロブ状エイリアンキャラクター仕様
名前:Glorptak(ニックネーム:「Glorp」)
外見
体型:不定形でゼラチン状。全体的なシルエットは涙のしずくや溶けるマシュマロのようで、時間とともにわずかに変化する。感情的になったり驚いたりするとつぶれたり伸びたりできる。
材質・質感:半透明で生体発光するゼリー状で、ゼリーのような揺れがある。コミュニケーションや素早い移動時には表面に波紋が生じることがある。
カラーパレット:
- ベース:虹色のラベンダーまたはシーフォームグリーン
- アクセント:ネオンピンク、エレクトリックブルー、ゴールデンイエローの表面下の光る血管
- 気分による色の変化(怒り=暗い赤、喜び=明るいアクア、恐怖=薄い灰色)
顔の特徴:
- 目:ブロブ内で独立して回転またはまばたきする3〜5個の非対称な浮遊球体
- 口:任意—話したり感情を表現したりするときに表面に現れる波紋のような三日月
- 鼻や耳は見えない;ゼリーに埋め込まれた振動感知受容体を使用
- 手足:デフォルトではなし、しかし相互作用や移動に必要なときは偽足(触手のような手足)を押し出すことができる。一時的な足や手を現すことができる。
動きと行動
移動:
- 滑り、跳ね、転がる。
- 吸盤で壁や天井に張り付くことができる。恐怖を感じると平たくなって素早く流れ去る。
癖:
- 休んでいるときでも常に揺れたり震えたりしている
- 無害な光る粘液の跡を残す
- 好奇心から近くの小さな物体を一時的に吸収する傾向がある
"""

img_path1 = "imgs/glorptak.jpg"
# 画像を生成
result1 = client.images.generate(
    model="gpt-image-1",
    prompt=prompt1,
    size="1024x1024"
)
# ファイルに画像を保存し、より小さなファイルにするためリサイズ/圧縮
image_base64 = result1.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

# 高品質なGlorptakが必要な場合はこれを調整してください
image = Image.open(BytesIO(image_bytes))
image = image.resize((300, 300), Image.LANCZOS)
image.save(img_path1, format="JPEG", quality=80, optimize=True)
# 結果を表示
display(IPImage(img_path1))

出力をカスタマイズする

以下の出力プロパティをカスタマイズできます:

  • 品質はlowmediumhigh、またはauto(デフォルト値)
  • サイズは1024x1024(正方形)、1536x1024(縦向き)、1024x1536(横向き)、またはauto(デフォルト)
  • JPEGおよびWEBP形式では圧縮レベル(0-100%)を調整できます
  • 透明な背景で画像を生成することも選択できます(PNGまたはWEBPでのみ利用可能)
prompt2 = "暗い背景に金髪の女性の格好をした灰色のトラ猫のポートレートをピクセルアートスタイルで生成してください。"
img_path2 = "imgs/cat_portrait_pixel.jpg"
# 画像を生成
result2 = client.images.generate(
    model="gpt-image-1",
    prompt=prompt2,
    quality="low",
    output_compression=50,
    output_format="jpeg",
    size="1024x1536"
)
# ファイルに画像を保存し、より小さなファイルにするためリサイズ/圧縮
image_base64 = result2.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((250, 375), Image.LANCZOS)
image.save(img_path2, format="JPEG", quality=80, optimize=True)
# 結果を表示
display(IPImage(img_path2))

透明な背景

backgroundプロパティを使用して透明な背景をリクエストできますが、プロンプトに透明な背景が必要だと含めると、デフォルトでtransparentに設定されます。

prompt3 = "透明な背景にピンクの羽根が付いた緑のバケットハットのピクセルアートスタイルの絵を生成してください。"
img_path3 = "imgs/hat.png"
result3 = client.images.generate(
    model="gpt-image-1",
    prompt=prompt3,
    quality="low",
    output_format="png",
    size="1024x1024"
)
image_base64 = result3.data[0].b64_json
image_bytes = base64.b64decode(image_base64)
# ファイルに画像を保存し、より小さなファイルにするためリサイズ/圧縮
image_base64 = result3.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((250, 250), Image.LANCZOS)
image.save(img_path3, format="PNG")
# 結果を表示
display(IPImage(img_path3))

画像を編集する

GPT Imageは画像入力も受け入れることができ、それらを使って新しい画像を作成します。また、入力画像の特定の部分を変更したくない場合は、マスクを提供することもできます。

最大10個の入力画像を使用でき、マスクを使用する場合は、image配列で提供される最初の画像に適用されます。

prompt_edit = """
猫と帽子の画像を組み合わせて、猫が帽子をかぶって木にとまっている様子を、ピクセルアートスタイルで表示してください。
"""
img_path_edit = "imgs/cat_with_hat.jpg"
img1 = open(img_path2, "rb")
img2 = open(img_path3, "rb")
# 新しい画像を生成
result_edit = client.images.edit(
    model="gpt-image-1",
    image=[img1,img2],
    prompt=prompt_edit,
    size="1024x1536"
)
# ファイルに画像を保存し、より小さなファイルにするためリサイズ/圧縮
image_base64 = result_edit.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((250, 375), Image.LANCZOS)
image.save(img_path_edit, format="JPEG", quality=80, optimize=True)
# 結果を表示
display(IPImage(img_path_edit))

マスクを使用して画像を編集する

入力画像と一緒にマスクを提供することもできます(複数ある場合は、マスクは最初の画像に適用されます)。これにより、マスクで覆われていない入力画像の部分のみを編集できます。モデルはマスク内の画像の一部を編集することもありますが、それを避けようとします。

重要な注意:マスクにはアルファチャンネルが含まれている必要があります。たとえば画像編集ソフトウェアを使用して手動で生成する場合は、このアルファチャンネルを含めるようにしてください。

マスクの生成

この例では、自動的にマスクを生成するためにモデルを使用します。マスクは正確ではないかもしれませんが、我々の目的には十分です。
正確なマスクが必要な場合は、画像セグメンテーションモデルを使用してください。

img_path_mask = "imgs/mask.png"
prompt_mask = "写真内のキャラクター全体を区切るマスクを生成し、キャラクターがある場所は白、背景は黒を使用してください。入力画像と同じサイズの画像を返してください。"
img_input = open(img_path1, "rb")

# マスクを生成
result_mask = client.images.edit(
    model="gpt-image-1",
    image=img_input,
    prompt=prompt_mask
)
# ファイルに画像を保存し、より小さなファイルにするためリサイズ/圧縮
image_base64 = result_mask.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((300, 300), Image.LANCZOS)
image.save(img_path_mask, format="PNG")
# マスクを表示
display(IPImage(img_path_mask))

アルファチャンネルの作成

このステップはオプションです。白黒画像をImage Edit APIで使用できるアルファチャンネル付きのマスクに変換したい場合に使用します。

# 1. 白黒マスクをグレースケール画像として読み込み
mask = Image.open(img_path_mask).convert("L")

# 2. アルファチャンネル用のスペースがあるようにRGBAに変換
mask_rgba = mask.convert("RGBA")

# 3. マスク自体を使用してそのアルファチャンネルを埋める
mask_rgba.putalpha(mask)

# 4. マスクをバイトに変換
buf = BytesIO()
mask_rgba.save(buf, format="PNG")
mask_bytes = buf.getvalue()
# 結果ファイルを保存
img_path_mask_alpha = "imgs/mask_alpha.png"
with open(img_path_mask_alpha, "wb") as f:
    f.write(mask_bytes)

マスクを使用した編集

マスクを使用する場合でも、マスクされた領域だけでなく、結果画像全体を説明するプロンプトが必要です。

prompt_mask_edit = "カラフルな銀河の背景に、多くの星や惑星がある中で奇妙なキャラクター。"
mask = open(img_path_mask_alpha, "rb")
result_mask_edit = client.images.edit(
    model="gpt-image-1",
    prompt=prompt_mask_edit,
    image=img_input,
    mask=mask,
    size="1024x1024"
)
# 結果を表示

img_path_mask_edit = "imgs/mask_edit.png"

image_base64 = result_mask_edit.data[0].b64_json
image_bytes = base64.b64decode(image_base64)

image = Image.open(BytesIO(image_bytes))
image = image.resize((300, 300), Image.LANCZOS)
image.save(img_path_mask_edit, format="JPEG", quality=80, optimize=True)

display(IPImage(img_path_mask_edit))

まとめ

このクックブックでは、新しい画像生成モデルであるGPT Imageを使用して、ゼロから新しい画像を生成したり、参照画像を使用したりする方法を見てきました。また、アルファチャンネル付きのマスクを作成して入力画像に適用し、画像編集をさらにガイドする方法も説明しました。

これを出発点として他のユースケースを探索してください。インスピレーションを求めている場合は、ドキュメントの画像ギャラリーをチェックしてください。

楽しい開発を!

📒ノートブック

参考サイト

0
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
0
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?