Azure OpenAIのDALL·E 2とDALL·E 3を実行してみた

本記事は [OpenAI活用法 Advent Calendar 2023 by ナレコム](https://qiita.com/advent-calendar/2023/openai-knowledgecommunication) の12日目の記事です。

OpenAI活用法 Advent Calendar 2023 by ナレコム ではGPTsを含めた最新のOpenAIの活用法について紹介します。

### はじめに

2023年12月現在、人工知能の分野では、画像生成技術が注目を集めています。特に、OpenAIが開発したDALL-Eシリーズは、その進化と応用範囲の広さで多くの関心を引いています。この記事では、Microsoft Azureプラットフォーム上で利用可能な2つのバージョン、DALL-E 2とDALL-E 3の比較を行います。

DALL-E 2とDALL-E 3は、それぞれ異なるAPIバージョン、ライブラリの要件、さらには異なるAzureリージョンでの展開によって特徴づけられています。このような違いが実際の使用にどのような影響を与えるのか、同じプロンプト「A painting of a dog」（犬の絵）を用いて両者を比較し、それぞれの特徴と利用方法の違いを探ります。

2023年12月現在、Azure上ではDALL·E 2とDALL·E 3の両方を実行することができます。ただし、以下のように大きく異なります。

#### 主な違い

項目|DALL·E 2|DALL·E 3
-|-|-
API Version|2023-06-01-preview|2023-12-01-preview
OpenAI Pythonライブラリ|0.28.1のみ|1.x系
Azureリージョン|East US|Sweden Central

上記の違いから同一環境で動作させることができません。この2つに対して同一のプロンプトで実行して比較してみました。

#### 事前準備
下図を参考に、それぞれのリージョンの **エンドポイント** と **キー** を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/15b3c539-c8c9-56ad-238f-d320d287d26a.png)

### DALL·E 2を動かす

まず、OpenAI Pythonライブラリのバージョンを下げる必要があります。

```python
pip install openai==0.28.1
```

```python
import openai
import os
import requests
from PIL import Image

# 環境変数からエンドポイントとキーを取得
openai.api_base = <EastUSのエンドポイント>
openai.api_key = <EastUSのキー>     

# APIバージョンを指定 (DALL-Eは現在 '2023-06-01-preview' のAPIバージョンのみサポート)
openai.api_version = '2023-06-01-preview'
openai.api_type = 'azure'

# 画像生成APIを使用して画像を作成
generation_response = openai.Image.create(
    prompt='A painting of a dog',    # ここにプロンプトのテキストを入力
    size='1024x1024',
    n=2
)

# 保存用のディレクトリを設定
image_dir = os.path.join(os.curdir, 'images')

# ディレクトリが存在しない場合は作成
if not os.path.isdir(image_dir):
    os.mkdir(image_dir)

# 画像パスを初期化 (ファイルタイプはpngであるべきです)
image_path = os.path.join(image_dir, 'generated_image.png')

# 生成された画像を取得
image_url = generation_response["data"][0]["url"]  # レスポンスから画像URLを抽出
generated_image = requests.get(image_url).content  # 画像をダウンロード
with open(image_path, "wb") as image_file:
    image_file.write(generated_image)

# デフォルトの画像ビューアで画像を表示
image = Image.open(image_path)
image.show()
```

:::note warn
**レスポンス**
![d2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/636071ca-f010-4fe8-5dcf-ac0068a71ea2.png)
:::

### DALL·E 3を動かす

今度は、OpenAI Pythonライブラリのバージョンを上げる必要があります。

```python
pip install openai>1.0
```

```python
from openai import AzureOpenAI
import os
import requests
from PIL import Image
import json

client = AzureOpenAI(
    api_version="2023-12-01-preview",  
    api_key=<SwedenCentralのエンドポイント>,  
    azure_endpoint=<SwedenCentralのエンドポイント>
)

result = client.images.generate(
    model=<DALL-E 3デプロイ名>, # あなたのDALL-E 3デプロイメントの名前
    prompt="A painting of a dog",
    n=1
)

json_response = json.loads(result.model_dump_json())

# 保存する画像のディレクトリを設定
image_dir = os.path.join(os.curdir, 'images')

# ディレクトリが存在しない場合は作成
if not os.path.isdir(image_dir):
    os.mkdir(image_dir)

# 画像パスを初期化 (ファイルタイプはpngであるべきです)
image_path = os.path.join(image_dir, 'generated_image.png')

# 生成された画像を取得
image_url = json_response["data"][0]["url"]  # レスポンスから画像URLを抽出
generated_image = requests.get(image_url).content  # 画像をダウンロード
with open(image_path, "wb") as image_file:
    image_file.write(generated_image)

# デフォルトの画像ビューアで画像を表示
image = Image.open(image_path)
image.show()

```

:::note warn
**レスポンス**
![d3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61189/583e05c4-cb70-54a3-d32d-ac8721f5e2c7.png)
:::


### まとめ

この記事では、Azure上で利用可能なDALL-E 2とDALL-E 3の主な違いとそれぞれの特性について詳しく見てきました。重要なポイントを振り返ると、以下のようになります。

1. **APIバージョンとライブラリ**: DALL-E 2は「2023-06-01-preview」APIバージョンとOpenAI Pythonライブラリのバージョン0.28.1を使用します。一方、DALL-E 3では「2023-12-01-preview」APIバージョンと1.x系のライブラリが必要です。

2. **Azureリージョンの違い**: DALL-E 2はEast USリージョンでのみ利用可能ですが、DALL-E 3はSweden Centralリージョンで展開されています。

3. **画像生成の結果**: 同じプロンプト「A painting of a dog」を使用した際、DALL-E 2とDALL-E 3はそれぞれ異なる視覚的特性とスタイルを示しました。これは、両バージョンの技術的進歩とアプローチの違いを反映しています。

この比較を通じて、DALL-E 2とDALL-E 3の使い方、それぞれのユニークな特徴、そして最新の画像生成AI技術の可能性についての理解を深めることができたと思います。

---

また、ナレッジコミュニケーションでは  **「[Musubite](https://recruiting.musubite-job.com/features/company/knowledge-communication)」** というエンジニア同士のカジュアルトークサービスを利用しています！この記事にあるような生成AI 技術を使ったプロジェクトに携わるメンバーと直接話せるサービスですので興味がある方は是非利用を検討してください！

https://recruiting.musubite-job.com/features/company/knowledge-communication