ChatGPTでAIデータセットのアノテーションをする

# アノテーションは大事だけど、コストがかかる
AIをビジネスや社会に活かすには、データセットが重要である。
データセットは競争力であり、またAI活用の壁でもある。
AIモデル自体は広くフリーで公開されていて、使い方も難しくない。
では何がビジネスの競争力の差や社会導入の壁となるかというと、計算力（GPU）とデータセットである。
一般公開されているデータセットはそれほど多くなく、実際にAIをビジネスや社会の特定のタスクに使おうとすると、そのためのデータセットを作ることが必須となる。
しかしデータセットのアノテーション（集められたデータをAIに教える用にラベルをつけたり、オブジェクトの位置を数値化したりする作業）は多くの場合、地味で時間とコストのかかる人力作業である。
人間の判断によってデータを分別する（そしてその結果をAIに教えて同様の能力を与える）のだから、人間の手がかかるのは当然のことではある。
（これをうまく行えている事例はあまり公開されていないように思える。）
しかし、ある特定のinput-outputにおいては人間並に目的に適合できる**ChatGPTによって、例えば画像判別データセットのアノテーションが可能である。**


# ChatGPTによる画像判別データセットのアノテーション　ケース・スタディ

今回は、画像がパリの風景か京都の風景かを仕分けてもらう。
![pexels-amy-chandra-1020777.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9b6e8cb7-aafa-7ec5-791f-428bc1e7e150.jpeg)
![pexels-margerretta-548077.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/cf3aa197-3bb6-8b83-683b-60996fb7f6eb.jpeg)
![pexels-belle-co-402028.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3f3b4b06-f5c1-e697-1c1b-445be8440836.jpeg)
![pexels-matt-hardy-2272939.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/9ef87829-1b73-bb78-4756-bc4a7e4bca1f.jpeg)

まあこれぐらいなら人間がやっても簡単でしょ。と思うかもしれないが、例えばこれが２万枚とかになってくると流石に仕分けがめんどくさい。それにこれは例で、実際は十クラス以上に分類しないといけないこともあるだろう。

ということでめんどくさいことはChatGPTにやってもらおう。

# やり方

openaiライブラリのインストール。

```shell
pip install openai
```

### とりあえず1枚仕分けてもらう。
![pexels-shvets-anna-2574631.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/6e4ead4e-80e7-1a09-6b71-3baa8196bdc7.jpeg)
>この画像の風景は次のどちらの都市のものですか?　Paris, Kyoto, 都市名のみ英語一言で答えてください。どちらにも分類されない場合は、otherと答えてください。都市名の先頭は大文字にして、ピリオドは含めないでください。

というメッセージを**gpt-4-vision**のAPIに送ります。

```python
import base64
import requests

text = "この画像の風景は次のどちらの都市のものですか?　Paris, Kyoto, 都市名のみ英語一言で答えてください。どちらにも分類されない場合は、otherと答えてください。都市名の先頭は大文字にして、ピリオドは含めないでください。"
# OpenAI API Key
api_key = "Your_API_Key"

# Path to your image
image_path = "paris0.jpg"

def ask_gpt(text, image_path, api_key):
  
  with open(image_path, "rb") as image_file:
    base64_image = base64.b64encode(image_file.read()).decode('utf-8')

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

  payload = {
    "model": "gpt-4-vision-preview",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": text
          },
          {
            "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)
  city = response.json()["choices"][0]["message"]["content"]
  
  return city

city = ask_gpt(text, image_path, api_key)
print(city)
```

>Paris

「どこの都市ですか？」などとざっくり聞いても返してくれますが、画像分類タスクのラベル分けに使いたいので、選択肢から一言で返してもらいます。

### たくさん仕分けてもらう

画像ディレクトリの中身に対してgptへの質問をループし、結果に応じて画像をフォルダ分けします。

```python
import os
import shutil

image_dir = "images"
image_list = os.listdir(image_dir)

for image_file in image_list:
  image_path = os.path.join(image_dir, image_file)
  city = ask_gpt(text, image_path, api_key)
  
  dest_dir = city
  dest_path = os.path.join(dest_dir, image_file)
  shutil.move(image_path, dest_path)
```

この程度の分類であれば完璧に仕分けてくれます。

Paris
![pexels-pixabay-2344.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/d23d1535-6182-07aa-43f4-eb563eaa37c2.jpeg)
Paris
![pexels-pixabay-2363.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5bd4d814-5c2e-f2e0-1a22-90fd902d7172.jpeg)
Paris
![pexels-timea-kadar-2130616.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/a3898d44-f1d6-9b2a-8aab-6d741f9c2c3b.jpeg)
Paris
![pexels-elina-sazonova-1850619.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5538e994-4f2b-3759-bd05-ae777952d8b3.jpeg)
Paris
![pexels-flo-dahm-699466.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8c03e777-43e4-5345-aa4c-8547dc5ffcd4.jpeg)
Kyoto
![pexels-satoshi-hirayama-1556138.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/c7e17921-1751-33da-44c0-7d3be3a9b5e8.jpeg)
Kyoto
![pexels-satoshi-hirayama-1715547.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/5c731e5d-f28c-8719-10bf-8d093c989afd.jpeg)
Kyoto
![pexels-satoshi-hirayama-16096341.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/fa0f33be-5e86-987b-e6e8-893ae0fdffb3.jpeg)

ただし２０２４年３月の段階では、物体の正確な位置は答えられないので、Object DetectionやSegmentationタスクのアノテーションはできません。

でも画像分類データの仕分けだけでもいざやるとなると超めんどくさい（人にやってもらうとコストがかかる）ものなので、ChatGPTがやってくれるとありがたい。

🐣
****
フリーランスエンジニアです。
AIについて色々記事を書いていますのでよかったらプロフィールを見てみてください。

もし以下のようなご要望をお持ちでしたらお気軽にご相談ください。
AIサービスを開発したい、ビジネスにAIを組み込んで効率化したい、AIを使ったスマホアプリを開発したい、
ARを使ったアプリケーションを作りたい、スマホアプリを作りたいけどどこに相談したらいいかわからない…

いずれも中間コストを省いたリーズナブルな価格でお請けできます。

お仕事のご相談はこちらまで
rockyshikoku@gmail.com

機械学習やAR技術を使ったアプリケーションを作っています。
機械学習／AR関連の情報を発信しています。

[X](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)