画像認識とテキスト生成が同時に学べる記事【OpenAI API】

# はじめに
この記事は、下記のOpenAI APIについての記事の発展的な内容を取り扱います。
- [OpenAI APIの使い方講座【公式Quickstart】](https://qiita.com/Isaka-code/items/b50983796636503b44c5)
- [柿ピーで学ぶGPT-4V(OpenAI Vison API)](https://qiita.com/Isaka-code/items/b584627d4d2a55d15df1)
- [Chat Completions APIで京都旅行プランを考える](https://qiita.com/Isaka-code/items/96b3ae49616d6f467856)


本日のお題は、「**画像認識により（架空の）ポケモンのタイプ分類⇒弱点を見つける**」です。

前提として、[OpenAI APIの使い方講座【公式Quickstart】](https://qiita.com/Isaka-code/items/b50983796636503b44c5)のStep2まで完了している必要があります。

架空のポケモンの画像は、[DALL·E APIで実在しないポケモンを創る](https://qiita.com/Isaka-code/items/7eba1881931dd646baed)で生成した`ライトニュメラ`を用います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/2dd9102d-bf6f-6474-36fb-b591ffa8d87c.png)



# 本日のお題：画像認識により（架空の）ポケモンのタイプ分類⇒弱点を見つける
**出来上がったソースコード**
```image_recognition_text_generation.py
from image_recognition import image_recognition
from text_generation import text_generation

def recognize_and_generate_text(image_url, prompt, text_model_name, system_message, user_message_template):
    # 画像認識を行い、結果を取得
    recognition_result = image_recognition.recognize_image(image_url, prompt)
    print(f"Recognition result: {recognition_result.message.content}")

    # ユーザーメッセージの作成
    user_message = user_message_template.format(recognition_result.message.content)

    # テキストを生成する
    generated_text = text_generation.generate_text(text_model_name, system_message, user_message)
    return generated_text

if __name__ == "__main__":
    # 画像認識のパラメータ
    image_url = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/ee531ce6-6e85-4cbd-66e4-4fcb5870af4c.png"
    recognition_prompt = "ポケモンのタイプを分類して"

    # テキスト生成のパラメータ
    text_model_name = "gpt-4"
    system_message = "あなたはポケモンバトルの専門家です。"
    user_message_template = "下記の特徴を持つポケモンの弱点を見つけてください。\n{}"

    # 画像認識とテキスト生成を行う
    generated_text = recognize_and_generate_text(
        image_url, recognition_prompt, text_model_name, system_message, user_message_template
    )

    print(generated_text)
```
「[柿ピーで学ぶGPT-4V(OpenAI Vison API)](https://qiita.com/Isaka-code/items/b584627d4d2a55d15df1)」の`image_recognition.py`と「[Chat Completions APIで京都旅行プランを考える](https://qiita.com/Isaka-code/items/96b3ae49616d6f467856)」の`text_generation.py`をimportし、実装しています。
前半の`GPT-4V(OpenAI Vison API)`を用いた画像認識関数で（架空の）ポケモンのタイプを分類し、後半の`Chat Completions API`を用いたテキスト生成関数に引数として渡すことで、弱点を見つけるプロンプトを生成しています。

**実行結果（生成されたテキスト）**

>Recognition result: 画像に写っているのはポケモンではなく、ポケモンを連想させる架空の生物のイラストのようです。しかし、ポケモンにおけるタイプ分類に基づいてこの生物を分類するならば、その特徴から「エレクトリック」（でんき）タイプや「フ
ェアリー」（フェアリー）タイプに該当する可能性が高そうです。白く輝く神秘的な外観と、周囲に浮かぶ光の輪がこのような推測に至らせます。

>エレクトリック（でんき）タイプの弱点は「地面」タイプの技です。エレクトリックタイプのポケモンは地面の技から全くダメージを受けません。
フェアリータイプのポケモンは「ポイズン」タイプと「スチール」タイプの技に弱いです。
そのため、このポケモンがエレクトリックタイプやフェアリータイプであると仮定すると、地面、ポイズン、スチールタイプの技を持つポケモンが有効な対策となる可能性が高いです。

たとえ架空のポケモンであっても、仮説を立てながら弱点を見つける意思決定ができていますね。




# おわりに

この記事を通して、OpenAIのAPIを活用した画像認識とテキスト生成を組み合わせる応用について学びました。架空のポケモン「ライトニュメラ」のタイプを画像から推測し、さらにその弱点をテキスト生成で探るという、技術の融合を行いました。GPT-4VとChatGPTを組み合わせることで、よりリアルな世界の情報を考慮したAIの開発ができると考えています。
（リアルワールドのデータはなんぼあっても良いですからね）

カレンダーの購読や、QiitaとTwitterをフォローしてくださると励みになります。

https://qiita.com/advent-calendar/2023/nebosuke-ai

https://twitter.com/AInebosuke



### ソースコード

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

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