DALL·E APIで実在しないポケモンを創る

# はじめに
昨日の記事「[Chat Completions APIで京都旅行プランを考える](https://qiita.com/Isaka-code/items/96b3ae49616d6f467856)」に引き続き、OpenAI APIを扱います。
本日のお題は、「**DALL·E APIで実在しないポケモンを創る**」です。

**DALL·E API**

https://platform.openai.com/docs/guides/images?context=node

ChatGPTのDALL・Eで試してみたところ下記のように本家のポケモンと見間違うクオリティーで生成されました！

https://twitter.com/AInebosuke/status/1726920275990839579

# DALL·E APIの使い方

Step2までは[OpenAI APIの使い方講座【公式Quickstart】](https://qiita.com/Isaka-code/items/b50983796636503b44c5)と同じです。
続きのStep3から始めます。

https://platform.openai.com/docs/quickstart?lang=Images

ソースコードの右上のプルダウンで`Images`を選ぶとサンプルコードが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/d5d2fd96-35d5-7404-293e-4f3390daae52.png)

```python
from openai import OpenAI
client = OpenAI()

response = client.images.generate(
  prompt="A cute baby sea otter",
  n=2,
  size="1024x1024"
)

print(response)
```

**出力結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/5494d488-1ea3-f734-c3d3-9352b52adf26.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/aa45579c-d5b8-bbed-62a8-24ac8bb7543a.png)


プロンプト`A cute baby sea otter`の通り、`かわいいラッコの赤ちゃん`が生成されました。

以上で公式ドキュメントの内容は終了です。

# 本日のお題：実在しないポケモンをつくる
**出来上がったソースコード**
```image_generation.py
from openai import OpenAI

def generate_image(prompt):
    client = OpenAI()

    response = client.images.generate(
    prompt=prompt,
    n=2,
    size="1024x1024"
    )

    return response

if __name__ == "__main__":
    prompt="A Pokemon resembling a cute baby sea otter"

    response = generate_image(prompt)

    print(response)
```

公式ドキュメントのサンプルコードをベースにしていますが、下記の変更を行いました。
- 関数化し、入力を汎用的に変更できるようにしました。
- 課題を達成するために、`A Pokemon resembling a cute baby sea otter`を`prompt`として与えています。
- `completion.choices[0].message`を`completion.choices[0].message.content`に変更し、中身の文字列を取り出しています。

**実行結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/b2d75aec-b2ea-b134-b586-31691dbc0990.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/e349ad25-da79-09e1-27cb-3a4c4252f62b.png)

あれ？ChatGPTのDALL・Eと比べてクオリティーが低い、、、

## 画像生成のクオリティー向上

どうやら`model`はデフォルトでDALL·E 2みたいです。ChatGPTのDALL・Eと同じDALL·E 3に変更します。
また、[DALL·E 3は同時に1つの画像しか生成できない](https://platform.openai.com/docs/guides/images/usage)みたいなので、`n`=1にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/10e5c22e-e30f-ad9e-aeba-229670157181.png)


**出来上がったソースコード**
```image_generation.py
from openai import OpenAI

def generate_image(model, prompt):
    client = OpenAI()

    response = client.images.generate(
        model=model,
        prompt=prompt,
        n=1,
        size="1024x1024"
        )

    return response

if __name__ == "__main__":
    model="dall-e-3"
    prompt="A Pokemon resembling a cute baby sea otter"

    response = generate_image(model, prompt)

    print(response)
```
**実行結果**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/efbb9f88-be2a-5226-651c-66a14a762b1d.png)

先程と比べて、画像生成のクオリティーが飛躍的に向上しました。

# おわりに

先行事例を調べていたところ下記の記事を見つけました。

https://qiita.com/tuna27/items/7eb4e53c37f19bf4250d

5年前ということもあって、GANを用いて生成されていました。
当時は「からあげGAN」が話題になっていたと記憶しています。

https://karaage.hatenadiary.jp/entry/2019/01/30/073000

GAN、Pix2Pix、拡散モデル、DALL・Eと画像生成AIの歴史を辿ると、発展がいかに目覚ましいかを実感できました。



### ソースコード

本記事で使用したソースコードは、下記のGitHubレポジトリに格納しています。

https://github.com/Isaka-code/openai-api-hands-on