PythonでOpenAIを使用して画像を生成することについて解説します。
今回はOpenAIが開発した「DALL – E」を用います。テキストから画像を生成できるようにする GPT-3モデルの修正バージョンに基づいています。またディープラーニングと生成モデルの技術を組み合わせています。DALL–Eは35 億のパラメータでトレーニングされており、画像に対して幅広いタスクを実行できます。
なお、OpenAIを使用して画像を生成しますが、OpenAI アカウントを作成しAPIキーを事前に取得しておく必要があります。
■今回の環境(Python)
今回のPythonは、バージョン3.9.16を用いる。(なお、Google Colaboratory(Google Colab)を使用。)
■OpenAI API用のPythonクライアント「openai」をインストールする
まずは、PythonにOpenAI API用のPythonクライアント「openai」をインストールします。
今回はpipを経由してインストールを行うので、Google Colab(https://colab.research.google.com/)にアクセスします。アクセス後、お持ちのGoogleアカウントでログインされているか確認しておきましょう。
確認後、Google Colab上部の「ファイル」から「ノートブックを新規作成」をクリックします。
クリックすると「ノートブック」が作成されます。
!pip install -q openai
作成後、上記のコマンドを入力し、コードセルの実行ボタンをクリックします。なお、今回は「-q」コマンドを用います。これは「–quiet」の短縮形です。このオプションを使用すると、pipコマンドの出力が非表示になり、必要な情報だけが表示されます。主にスクリプトや自動化された処理で使用され、冗長な情報を省略して出力をすっきりさせることができます。
クリックするとインストールが開始され実行ボタンの隣に緑のチェックマークが表示されます。これでインストールは完了となります。
■OpenAIを使用して画像を生成する
完了後、openaiライブラリ等を使用し画像を生成するスクリプトを書いていきます。
■コード
- import openai
- import requests
- from PIL import Image
- openai.api_key = ‘API_KEY’
- def generate(text):
- res = openai.Image.create(
- #生成された画像を説明するテキスト
- prompt=text,
- #生成する画像数
- n=1,
- #生成された各画像のサイズ
- size=”256×256″,
- )
- # 1枚の画像のURLを返す。
- return res[“data”][0][“url”]
- text = “青空”
- #generateメソッドを呼び出し、出力をurl1変数に保存
- url1 = generate(text)
- #requestsライブラリで画像をバイト単位で取得
- response = requests.get(url1)
- #PNG形式での画像保存
- with open(“test-image.png”, “wb”) as f:
- f.write(response.content)
- # 保存した画像を開き”RGBA “形式に変換する
- # 変換された画像は結果に保存
- result = Image.open(‘test-image.png.png’).convert(‘RGBA’)
- # 新しい画像をPNGフォーマットで保存する
- result.save(‘test-image_rgba.png’,’PNG’)
■処理手順等
importステートメント:
openai:OpenAIのライブラリをインポートします。
requests:HTTPリクエストを行うためのライブラリをインポートします。(今回の場合は、GoogleColabを利用しているので事前にインストールしなくても良い)
PIL:Python Imaging Library(PIL)をインポートします。画像の読み込みや変換を行うために使用します。(今回の場合は、GoogleColabを利用しているので事前にインストールしなくても良い)
openai.api_keyの設定:
OpenAIのAPIキーを設定します。これにより、OpenAIのAPIを使用して画像を生成できます。’API_KEY’は実際のAPIキーに置き換える必要があります。
generateメソッドの定義:
テキストを入力として受け取り、OpenAIのAPIを使用して画像を生成します。
openai.Image.createメソッドを呼び出して、画像生成のリクエストを送信します。promptには生成する画像の説明テキストを指定します。
レスポンスから生成された画像のURLを取得して返します。なお、return res[“data”][0][“url”]のコードについては、下記の内容となります。
res[“data”]: resは、OpenAIのAPIからのレスポンスを表す変数です。このレスポンスはJSON形式のデータであり、”data”キーを使用してアクセスできます。
[0]: “data”キーに対応する値はリストです。この行は、リストの最初の要素にアクセスしています。
[“url”]: リストの最初の要素には、生成された画像に関する情報が含まれています。この行は、その情報の中から画像のURLを取得しています。
メインの処理:
text変数に生成する画像の説明テキスト(この場合は「青空」)を設定します。
generateメソッドを呼び出して、指定したテキストに基づいて画像を生成します。生成された画像のURLはurl1変数に格納されます。
requests.getメソッドを使用して、生成された画像のURLから画像データをバイト単位で取得します。
with openブロックを使用して、取得した画像データを「test-image.png」という名前のファイルに保存します。
Image.openメソッドを使用して、保存した画像ファイルを開きます。その後、convertメソッドを使用して画像を「RGBA」形式に変換します。なお、DALL–Eは、サイズが4MB以下でRGBA形式の正方形のPNG画像しか受け付けない(https://platform.openai.com/docs/guides/images/usage)。変換された画像はresultに格納されます。
result.saveメソッドを使用して、変換された画像を「test-image_rgba.png」という名前のPNGファイルとして保存します。
■実行・検証
記述した後にコードセルを保存し実行・検証を行います。
実行してみると「test-image_rgba.png」という画像ファイルが生成されていることが確認できました。
このファイルをダウンロードし画像ファイルを開いてみると生成する画像の説明テキスト(プロンプト)の内容が伝わり生成されていることが確認できました。
コメント