GPT4-V API 使い方 / OpenAI GPT-4V API / GPT-4V API

[OpenAI GPT-4VのAPI](https://platform.openai.com/docs/guides/vision)が利用可能になったとのことなので早速使ってみた。

2023/11/10 : Google colabを利用した動作方法を追記しました
2023/11/10 : requestsのinstallをしていない場合のエラー対応について追記しました
2023/11/07 : 最初の記事を投稿しました

# 入力画像の準備
今回は、ChatGPTのDALLE-3で作成した以下のねこの画像を使用した。
ファイル名: cat.png
<img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515824/72944e6d-92be-2b88-eff7-86566b7f2117.png">

# ソースコード
ソースコード等は、[GitHub](https://github.com/taku-mikan/GPT)にあげました。
フォルダ構成等はこれを参考にしてください!!

コード全容
```python
import argparse

import base64
import requests

from settings.setting import API_KEY


def parse_args():
    parser = argparse.ArgumentParser()

    parser.add_argument('-i', '--image', type=str,)
    parser.add_argument('-p', '--prompt', type=str)
    return parser.parse_args()

# Function to encode the image
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')
    

def main(args: argparse.Namespace):
    # Getting the base64 string
    base64_image = encode_image(args.image)

    headers = {
        "Content-Type": "application/json",
        "Authorization": f"Bearer {API_KEY}"
    }

    payload = {
        "model": "gpt-4-vision-preview",
        "messages": [
          {
            "role": "user",
            "content": [
              {
                "type": "text",
                "text": args.prompt,
              },
              {
                "type": "image_url",
                "image_url": {
                  "url": f"data:image/jpeg;base64,{base64_image}"
                }
              }
            ]
          }
        ],
        "max_tokens": 300
    }

    response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=payload)

    # print(response.json())
    print("*"*50)
    print(response['choices'][0]['message']['content'])
    print("*"*50)

if __name__ == "__main__":
    main(parse_args())
```

実行方法
```bash
python run.py -i Images/cat.png -p "What's in this image?"
```

出力
```bash
The image features a fluffy cat comfortably sleeping, nestled among what appears to be cozy knit blankets or sweaters. The setting suggests a tranquil and warm environment, possibly with sunlight filtering in to add to the peaceful ambiance. The overall composition evokes a sense of comfort and serenity.
```
> The image features a fluffy cat comfortably sleeping, nestled among what appears to be cozy knit blankets or sweaters. The setting suggests a tranquil and warm environment, possibly with sunlight filtering in to add to the peaceful ambiance. The overall composition evokes a sense of comfort and serenity.

(和訳)
```
ふわふわの猫が、肌触りのよさそうなニットの毛布やセーターに囲まれて気持ちよさそうに眠っている。静かで暖かな環境であることがうかがえ、陽の光が差し込んで穏やかな雰囲気が増しているのかもしれない。全体的な構図は、安らぎと静けさを感じさせる。
```
> ふわふわの猫が、肌触りのよさそうなニットの毛布やセーターに囲まれて気持ちよさそうに眠っている。静かで暖かな環境であることがうかがえ、陽の光が差し込んで穏やかな雰囲気が増しているのかもしれない。全体的な構図は、安らぎと静けさを感じさせる。

# 実行方法詳細
(後でGitHubを更新します。。。)
(1) レポジトリのclone
```bash
git clone https://github.com/taku-mikan/GPT
```
    
(2) 好きな画像をImages/ に移す (以下はcat.pngとして進める)


(3) settings/setting.pyのAPI_KEYを自分のAPIに変更する  
```python
API_KEY = "your_api_key"
```
の"your_api_key"の部分を自分のapiに置き換える

(4) 実行
-i の後に画像へのpath, -pの後に好きなプロンプトを入力し、実行
```bash
python run.py -i Images/cat.png -p "What's in this image?"
```


# エラー対応 (1)


[APIアクセス](https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4)に関するサイトによると、（現在は？)1ドル以上の支払いをした人のみが使用可能である。とのこと。
これまでAPIをあまり使ったことない人の場合は、以下のようなエラーが生じる可能性がある。
```bash
{'error': {'message': 'The model `gpt-4-vision-preview` does not exist or you do not have access to it. Learn more: https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4.', 'type': 'invalid_request_error', 'param': None, 'code': 'model_not_found'}}
```

この場合は、[APIアクセス](https://help.openai.com/en/articles/7102672-how-can-i-access-gpt-4)に記載の通り、prepaid請求(使用料の事前購入)を行えば使用可能になるとのこと。

prepaid請求に関する説明は[こちら](https://help.openai.com/en/articles/8264644-what-is-prepaid-billing)
上記記事の手順を簡単に以下に示す。

1. [アカウント設定の請求概要](https://platform.openai.com/account/billing/overview)に移動
以下のようなページが出てくる
![prepaid_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515824/7865c08a-67d7-3f22-67f2-e6ab73781a75.png)

1. 支払いを行う
    1. 画像中の緑色のボタン(Start Payment plan)をクリック
    1. 購入するクレジットの量を確定する。現在は、最低5ドル、最高50ドルまで選択可能
        1. 5ドルでもOK
    1. 購入ドルを確認し、購入

購入後、少し時間が経った後(請求のメールが送られてくるくらい)再度実行するとエラーを生じることなく動かすことができた...!!

※ クレジットは、支払いが生じた際、クレジットが残っていればクレジットから優先に使われるらしい。また、1年後に消えてしまい、返金されない点に注意が必要とのこと。詳細は確認してください。

# エラー対応 (2)
requestsというパッケージをpip installする必要があります。
したがって、実行環境によっては以下のエラーが生じる可能性があります。
```bash
Traceback (most recent call last):
  File "run.py", line 4, in <module>
    import requests
ModuleNotFoundError: No module named 'requests
```
このエラーが生じた場合は、以下を実行してみてください。
```bash
pip install requests
```
これで解消すると思います！！

# Google Colabを利用した使い方
### 前提
API KEYが含まれるため、もしかしたらめんどくさいやり方を書いてるかもしれませんが、  
ご容赦ください....。

### 動かし方
(1) ファイルのダウンロード
[GitHub](https://github.com/taku-mikan/GPT/blob/main/colab/GPT_4V.ipynb)からGPT_4V.ipynbをDownloadしてください(写真右上のボタンからDownload可能です)

<img width="100%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515824/7278d275-83de-a967-5fcb-716331b443ce.png">!

(2) 自身のgoogle driveにDownloadしたファイルをuploadする
[自身のGoogle Drive](https://drive.google.com/drive/my-drive?hl=ja)にDownloadしたファイルをアップロードする。ドライブを開いた後、ドラッグ&ドロップでアップロードできます!!

<img width="80%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515824/40daf33f-3cc1-ebe5-d34d-f255a9a0226e.png">!

(3) uploadしたGPT_4V.ipynbをクリックして開く
自分の環境だと自動でcolabが開かれるのですが、人によっては、「colabで開く」が表示されたり、  そもそもcolabが表示されなくて変な記号の羅列が出るかもしれません。  
「colabで開く」が出た方はそのまま開いてもらえれば大丈夫です。  
変な記号の羅列が出た方は、colabをinstallする必要があります。  
（以下開けたと仮定して進めます)

(4) colabの指示通り上から実行する
途中でAPI KEYを設定する部分があり、これを設定しないとエラーが出るため注意してください。

![colab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2515824/b36f4881-16e6-fcc1-748a-e2870287d0c9.png)


以上！！とりあえず公開されたGPT-4Vに関して使ってみたという内容でした!!

何か間違い等あればお気軽に教えていただけると幸いです😭