ChatGPTで生成した画像を用いてモデル作成/推論 〜画像生成編〜

# 初めに
初めて投稿します。
自分の備忘録程度での内容ですが、何かお役に立てれば幸いです。

# 目的
まず、最近話題のChatGPTを使いたいと思い、本記事のようなことを実施しました。
ただ、既に多くの「ChatGPTのapiを用いて何かを行う」方法が共有されており、apiを使用しての画像生成自体はすぐに達成してしまいました。
そこで、画像生成を用いてデータセットの作成と画像認識モデル作成を行い、実際の対象の画像(例えば、猿の画像を生成したのであれば、推論データは本物の猿の画像)を推論してみようと思いました。
正直、精度は高いと思われるため面白味が無いかもしれません。
(本記事作成時は、モデルの訓練や評価は未実施です)

# 動作環境
※本記事は画像生成までのため、Google Colaboratoryで実施しております。
　学習/推論時は環境が変わります。

・Google Colaboratory
・python 3.10.11
・openai 0.27.8
・cv2(opencv) 4.7.0

# ChatGPTのapiについて
下記参考にさせて頂きました！
https://zenn.dev/umi_mori/books/chatbot-chatgpt/viewer/how_to_use_openai_api

基本的には、参考記事に分かりやすくまとめて頂いているため特筆するようなことは無いですが、折角なのでChatGPTに聞いてみました。

まずは、APIとは何か聞くと

:::note
API（Application Programming Interface）は、アプリケーション間やシステム間で情報や機能を共有するためのインタフェースです。APIは、ソフトウェア開発者が既存のソフトウェアやサービスの機能を利用するための手段を提供します。

APIは、異なるプログラムやサービス間でデータの送受信や操作を行うための規約やルールを定義します。APIを使用することで、開発者は別のアプリケーションやサービスの機能を呼び出したり、データを送受信したりすることができます。

APIは、Web APIやソフトウェアライブラリなどの形で提供されることがあります。Web APIは、HTTPプロトコルを使用して通信するため、異なるプログラムやプラットフォーム間で利用できます。ソフトウェアライブラリは、特定のプログラミング言語に依存しており、その言語で開発されたアプリケーションからのみ利用できます。

APIは、さまざまな用途に使用されます。例えば、ソーシャルメディアのAPIを使用して、他のアプリケーションやウェブサイトからユーザーの情報を取得したり、データを投稿したりすることができます。また、決済サービスのAPIを使用して、オンラインショップなどでの支払い処理を行ったりもします。

APIは、プログラムやサービスの機能を利用するための便利な手段であり、ソフトウェア開発やシステム統合において広く活用されています。
:::

とても詳しく答えてくれますね。
(私自身、詳細まで把握していないので細かい部分の正当性は分かりませんが。。。)
因みに、一時期はgoogleのapiを用いて画像を収集するなど流行っていましたね。
このように、apiは自動化かつ繰り返し処理を行う上でとても便利な機能です。

また、ChatGPTのAPI使用方法についても順序立てて説明してくれています。

:::note
ChatGPTのAPIを使用するには、以下の手順を実行する必要があります。

1.OpenAIにアクセス: OpenAIのウェブサイト（https://openai.com/）にアクセスし、開発者用のアカウントを作成します。アカウント作成後、OpenAI APIにアクセスするためのAPIキーを取得します。

2.APIエンドポイントのドキュメントを参照: OpenAIのAPIエンドポイントのドキュメントを参照して、APIの利用方法やエンドポイントの詳細について理解します。ドキュメントには、APIエンドポイントのURL、リクエストの形式、パラメータ、およびレスポンスの形式などが記載されています。

3.APIリクエストを作成: APIを使用してChatGPTに対してリクエストを送信するためのHTTPリクエストを作成します。通常、リクエストはJSON形式で送信されます。リクエストには、チャットの履歴や生成したいテキストの指定などが含まれます。

4.APIキーを使用してリクエストを送信: 作成したAPIリクエストをAPIエンドポイントに送信します。リクエストヘッダーにAPIキーを含める必要があります。APIエンドポイントは、ドキュメントに示されたURLを使用します。

5.レスポンスの受け取りと処理: APIからのレスポンスを受け取り、必要に応じて処理します。レスポンスは通常、JSON形式で提供されます。生成されたテキストやその他の情報が含まれている場合があります。

以上の手順を実行することで、ChatGPTのAPIを使用してテキスト生成や対話を行うことができます。ただし、具体的な実装方法や制限事項は、OpenAIのドキュメントやリファレンスガイドを参照することをおすすめします。
:::

# ChatGPTの画像生成apiと料金について
下記に参考になる記事がありました！
https://auto-worker.com/blog/?p=7005

画像生成apiは、画像サイズと枚数毎に料金が設定されていますね。
因みに、私は512×512で550枚ほど生成したので9.84ドル請求されました。
(512×512サイズは1枚あたり0.018ドル/550*0.018≒10ドル)
画像生成でデータセット作成が楽にできるのでは？と思って興奮しましたが、それなりの対価が必要になってきますね。。。

# 画像生成apiを用いたコードについて
こちらの記事内のコードをほぼそのまま用いています。
https://di-acc2.com/programming/python/25019/

```
# chatgptのapiを用いて画像生成を実施
# コードはhttps://di-acc2.com/programming/python/25019/を参照

import openai
import requests
import json
import cv2
import datetime
import os
import time

# 画像に日付を入れたい場合に使用
dt_now = datetime.datetime.now()
print(str(dt_now).split(" ")[0])

openai.organization = "<Organization IDをここに入力>"
openai.api_key      = "<APIシークレットキーをここに入力>"

# ================================================
# 画像生成
# ================================================

def create_image_from_text(i, text):
    os.makedirs(path, exist_ok=True)
    # 応答設定 
    response = openai.Image.create(
                  prompt = text,          # 画像生成に用いる説明文章
                  n = 1,                  # 何枚の画像を生成するか(一度に1~10枚の生成が可能らしい)
                  size = '512x512',       # 画像サイズ
                  response_format = "url" # API応答のフォーマット
                )

    # API応答から画像URLを指定
    image_url = response['data'][0]['url']
    
    # 画像をローカルに保存
    image_data = requests.get(image_url).content
    with open("保存したいpath/" + text + "/" + \
              text + "_" + str(i) + ".jpg", "wb") as f:
        f.write(image_data)
        
    return image_data


# ================================================
# 関数実行
# ================================================

# 生成するイメージを文章で定義
# 本例はイルカ
text = "dolphin"
path = "/content/drive/MyDrive/Colab Notebooks/train/chatgpt+make_img/" + text + "/"
# 時間測定開始
# 100枚生成するのにかかる時間を測定
time_sta = time.time()

# range()の数は生成したい画像の枚数を指定
for i in range(100):
  # 画像生成
  img = create_image_from_text(i, text)

# 時間計測終了
time_end = time.time()
# 経過時間（秒）
tim = time_end- time_sta
print(tim/60, "m")
```

これだけで画像が生成されるなんて驚きですね。
生成時間測定をすると、100枚で13分、1枚あたり8s程でした。(速いですね！)
ただ、画像保存場所がgoogle-driveだったため、ローカル環境等であればもっと早いかもしれません。

「APIシークレットキー」は最初に紹介した下記記事の「APIの発行方法」を参考にして下さい。
https://zenn.dev/umi_mori/books/chatbot-chatgpt/viewer/how_to_use_openai_api

「Organization ID」は、OpenAIのAPI公式サイト(https://openai.com/product) の「Settings」から確認できます。

<img width="200" alt="スクリーンショット 2023-06-08 22.08.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469775/e65e7fcf-ef0d-5b4e-9d54-bf2db3372b4e.png">

# 生成した画像について
イルカ(text=dolphin)と鹿(text=deer)の生成した画像例を記載します。

まずイルカですが、目が不気味ですね。。。
<img width="400" alt="Dolphin_52.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469775/41928551-5f35-7ab7-fd57-51b3ced0dc1f.jpeg">
と思いましたが、実物も目は不気味ですね。
下図は(恐らく)実際のイルカの写真です。
目がほぼ黒目だからでしょうか？
<img width="400" alt="publicdomainq-0049754ysw.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469775/5f406721-4bb8-0776-8cc5-4e61b1c96a90.jpeg">
下記参照:https://publicdomainq.net/dolphin-animal-0049754/

やはり生成したイルカ画像は肌の質感が人工物感がありますね。
ただ、99%の人がイルカと判断できると思います。

イルカの生成画像に関しては全身が写っているものが少なく、本例のように水の中から上半身を出している画像ばかりでした。これは、イルカの写真としてよく出回っているものが、水中から身を乗り出しているが写真が多いからでしょうか？
確かに、イルカショー等では水中から上半身を出しているイメージがあります。ジャンプするイメージもありますが、うまく撮ることが難しいため画像総数が少ないから等でしょうか？

次は鹿の例です。
<img width="400" alt="deer_2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469775/900a48b8-7be1-f97d-fc5c-decba316f65a.jpeg">

鹿もちゃんと分かりますね！
肌の質感の違和感と、草を食べているはずなのに地面の土が多いなど突っ込みどころはありますが笑

因みに下図のような画像も生成されました。
<img width="400" alt="deer_39.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3469775/9bcda0e0-f5b7-1e4a-b3ac-45fa043d8960.jpeg">
CDのジャケットなどでしょうか？
一応鹿らしきものが複数映り込んでいますが、生成AIの学習データが気になりますね。

# 終わりに
如何でしたでしょうか？
簡単にChatGPTの画像生成が行えることがお伝えできたと思います。
生成される画像も、ほぼ分かる(鹿は難しいものもありましたが)ものが生成されました。
DALLE2(https://openai.com/dall-e-2) の方が高度な生成が可能なようなので、より良い画像が作れるかもしれませんね。
私も生成AI周りをもっと調べて使ってみたいと思います。

次は、生成した画像を使ってモデルの作成と推論を行いたいと思います。
初めての投稿のため、読みにくい、分かりにくい等あるかもしれませんが、何かお役に立てば幸いです。