【UPDATE】GPT-4V に入門してみる+α

※追記：本記事執筆後に ChatGPTは Image-to-Image に対応してしまったので本記事の内容はあまり意味がなくなってしまいましたが、こんな時期もあったという記録として残しておきます。ご了承下さい。


# 1. 今回の記事内容

 ChatGPT4がマルチモーダルに対応し、画像を認識できるようになりました。またOpenAIの画像生成AIであるDALL･E3 とも連動するようになりました。と言うニュースがもう結構前(2023年10月)に流れていたように思いますが、実際にどういうものなのか触ってみたという人はまだ意外と少ないようなので、ちょっと触ってみましたというのが今回の記事になります。
 LangChain や LlamaIndex といったLLMプログラミング寄りの話はまた別途稿を改めてさせていただきたいと思います。

## ※2023.11.9 追記
 OpenAI から新たな発表が行われ、画像の認識や生成（さらに音声処理など）についてもAPIが公開され、使えるようになりましたのでそれらについての関連情報も付記します。本記事の最後でAPI呼出しもやってみました。

 https://www.gizmodo.jp/2023/11/openai-devday-keynote.html

# 2.さっそくGPT-4V を使ってみる
　実はGPT-4V使うのはとても簡単です。画像をアップロードしてチャットすればいいだけです。

## (1) 画像内の日本語は読めるのか
　日本語の文字が含まれている画像を見せてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/22551731-9d8e-a2c3-f53e-a1586f8c3ab7.png)

この回答を見ると以下のことがわかります。
* 描かれている絵がヘルメットをかぶった猫であることを認識している
* 笑顔であることを認識している。全体的に元気があると認識している
* 画像内の日本語は読めないらしい
* ただし画像内の数字だけは認識できているらしい
* この絵が表している全体的な主題は理解できていない（これはセリフが読めなければ難しいでしょう）


本当に日本語が読めないのか？についてもう少し突っ込んで聞いてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/39dffdfa-f1d1-371c-110e-1018d2503736.png)

「だろうから」を「ぎゅうぎゅう」、「ヨシ！」を「ラミー！」などと読み間違えていますが、ある程度は読めている模様です。
もう少し追加の情報を与えてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/f7a36120-53e9-a1e0-0531-4e1c41ed6d53.png)

なかなかいい線行っているように見えます。


## (2) アートを見せてみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/7ae8e87a-e4fe-a550-e7d5-7f18e6734efc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/866849ff-a1e0-7ebe-5375-77124268feb0.png)

"Sorry, I cannot help that." はChatGPTの決まり文句で、著作権的にまずい内容を生成させようとしたり、版権のあるキャラクターの絵を見せたりするとよくこの答えが返ってくるようです。ChatGPTが誰の作品かわかっていても敢えてこの回答を返している可能性があります。様式を訪ねてみると印象派であると認識したようです。

実はこの絵は最初ルノワールかと思ったのですが、よく調べてみると[フランク・ブラムリー](https://ja.wikipedia.org/wiki/%E3%83%95%E3%83%A9%E3%83%B3%E3%82%AF%E3%83%BB%E3%83%96%E3%83%A9%E3%83%A0%E3%83%AA%E3%83%BC)という後期印象派の画家による"Delicious Solitude" という作品のようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/1986f668-169c-8b37-d269-0263911efda7.png)

ChatGPTもルノワールに似ているという認識をしているようです。人間の私もそう思ったくらいなので、なかなかの認識能力ではないかと思います。

# 3. DALL･E3 との連動を試してみる
　このチャットの流れで、画像生成AIである DALL･E3 とChatGPTとの連動を試してみたいと思います。

## (1) いきなり無茶ぶり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/454073bb-c0af-9621-4725-64089292bcd3.png)

チャットの途中からいきなりDALL･E3を使うことはできないようです。

よく調べると、DALL･E3を使う場合は、通常のチャットとは別の扱いで、チャット開始時にDALL･E3を使うことを指定しておかないといけないようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/c60dec9e-2f07-4994-f184-33f78b3d48bf.png)

　　　↑こんな感じで指定する必要がある。

## (2) それならプロンプトでお願い
　直接 image to image で変換するのはさすがに無理なようなので、生成用のプロンプトを作れるかお願いしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/db99e6e7-c3d3-1a1d-f039-295291729381.png)

　ここでChatGPTは元絵をルノワールの絵だと思ってしまっていますが、そこは本質ではないのでここでは無視します（というか、プロンプトで参照するならむしろ有名な画家の方が効果的なはずですね）。

このプロンプトを使って依頼してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/ef50261b-5b44-57f4-901e-572e1d2e271a.png)

　どちらかと言えば右の方が元絵に近い感じですが、ずいぶん都会的な雰囲気の絵になってしまいました。
 
 ## (3) ChatGPT自身に評価してもらう
 　この生成された絵をChatGPTに見せてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/4aa53b06-a434-fae7-a292-e9ab074d8f9a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/6ad27c5d-78bb-d6ca-b158-4943ef246847.png)

２つの絵の違いを認識しているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/514e73f0-c95d-98ae-f66f-29bd06735877.png)

## (3) 修正したプロンプトで再生成してみる
　ChatGPT自身が直したプロンプトでもう一度生成を掛けてみます。（ただし Using the provided painting の下りは、絵を提供しているわけではなく意味が通じなくなるので修正しました）

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/00b42855-6760-6231-5370-d32a0e94857b.png)

今度は少し元絵に近づいたようです。
この回答にある通り、生成された絵はダウンロードすることができます。画像のピクセルサイズは 1024 x 1024で、結構な解像度です。

## (3) もう一度評価→再生成してみる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/8cef5909-7423-6325-4bf8-dfbb1f8794bc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/26e08de3-f36e-61ba-273b-cc71286c51ae.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/5ff6a3f7-fcb7-f9a3-1c6f-238ff4897be1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/09aaf1b9-8dbf-1031-9d77-09643c0cd505.png)

いきなりプロンプトが css スタイルになりましたが、こういう内容です。

"Create an anime-style illustration inspired by Auguste Renoir's painting. Feature a young woman sitting in a calm forest clearing, reading a book. She should be positioned closer to the foreground, surrounded by lush greenery and blooming flowers, similar to Renoir's composition. Her attire should be a long, flowing white dress reminiscent of the late 19th century. Minimize additional details and accessories, focusing on the serene atmosphere of the scene. The color palette should capture the soft pastel shades of Renoir's original painting."

このプロンプトで再度画像生成してみると、こうなりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/18081dfe-8ac2-b03a-d282-ad2ecc2f6206.png)

違うそうじゃない感が…むしろさっきの絵よりも遠ざかったまである。
もう一度再生成ボタンを押してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/dfb05d48-bf3f-5331-c1c4-0b37512d7f5e.png)

右側に黒人さんをフィーチャーしてくるのはポリティカリーコレクトな面で配慮が働いていると思われます。できあがったものの感想をChatGPTさんに聞いてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/7e3f0be0-d25d-8bee-d78d-9985e83f0857.png)

まさしく文字通り自画自賛しています。

# 4.【※2023.11.9 追記】DALL･E3 をAPIから呼べるようになったので早速やってみる

間の悪いことにこの記事を書いた直後にOpenAIから大幅な機能アップデートの発表が行われ、画像認識や画像生成も含んだAPIも公開されました。下記のように、使用例を載せた記事もいくつか出て来ました。

https://dev.classmethod.jp/articles/dalle3-api-access/

さっそく今回のプロンプトを使ってAPIを呼んでみたいと思います。

``` python: dalle3.py
#
# 前提条件
# ・最新版の openai モジュールをインストールする必要があります。
# ・環境変数 OPEN_API_KEY にAPIキーを設定しておく必要があります。
#
# 注意点：
# あまり頻繁に呼ぶと下記のようなリミットエラーになります。
# openai.RateLimitError: Error code: 429 -
# {'error': {'code': 'rate_limit_exceeded', 'message': 'Rate limit exceeded for images per minute in organization org-xxxxx.
# Limit: 1/1min. Current: 2/1min. Please visit https://help.openai.com/en/articles/6696591 to learn how to increase your rate limit.
# ', 'param': None, 'type': 'requests'}}
#

from openai import OpenAI

client = OpenAI()

# 今回作って貰ったプロンプト
p: str = (
    "Create an anime-style illustration inspired by Auguste Renoir's painting. "
    "Feature a young woman sitting in a calm forest clearing, reading a book."
    "She should be positioned closer to the foreground, surrounded by lush greenery and blooming flowers, "
    "Her attire should be a white dress reminiscent of the late 19th century. "
    "Minimize additional details and accessories, focusing on the serene atmosphere of the scene. "
    "The color palette should capture the soft pastel shades of Renoir's original painting."
)
response = client.images.generate(
    model="dall-e-3",
    prompt=p,
    size="1024x1024",
    quality="standard",
    n=1,
)

image_url = response.data[0].url

# 画像のURLが返ってくる
print(image_url)

```

この通り、ものすごく簡単なプログラムで生成できてしまいます。2枚作成してみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/32834ae3-607b-50ea-a8f3-cc746a0a09da.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/1db07c51-158c-7769-810e-bf93ede95cd4.png)

1枚目はちょっと思ってたのと違う感じですが、2枚目はかなり良い感じです。これを採用しましょう。

# 採用した絵を元絵と並べてみました。

【元絵】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/4aaadabd-0aeb-fa6b-d0c1-79d39bb0b4c6.png)

　　↓

【DALL･E3によるアニメ風の絵＋レタッチ】※色味を合わせるため少しだけレタッチしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/0ead6d94-b091-40bc-e098-9109f4f93f34.png)


# 【2023.11.20 追記】いつの間にかイメージtoイメージもできるようになっていました
できないと思っていたら、いつの間にかできるようになっていました

![img2img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2261111/96b8aed9-6d7a-a711-a486-d7c68a4f92bf.png)

記事でプロンプト作った意味がほぼなくなってしまいました…が、プロンプトで作ったものでもほぼ変わらなかったですね。とはいえイメージtoイメージなら一発でここまで来れるので、その分試行錯誤などの手間が省けるという意味はあると思います。


今回は以上です。ここまでお読みいただきありがとうございました。