見出し画像

OpenAIのAPI使って簡単な画像認識を実装してみた【Python】

AIVtuberシロハナちゃんの開発プロデュースをしているyukiです。

この記事ではOpenAIのAPIを使って簡単な画像認識を試してみた備忘録となります。

指定した画像ファイルとプロンプトを送信することで、その画像をもとにOpenAIのAPIでテキスト回答してくれるというものとなります。
(環境構築からPythonのサンプルコードの記載あります)

環境はWindows11で言語はPython(3.12.0)です。

公式:https://openai.com/index/openai-api/

※この記事は2024/8/22時点のものなので今後変更があるかもしれないですのでご了承ください


環境構築と前準備

それでは環境構築とコーディング前の準備からしていきます。

  • APIキー取得
    OpenAIの公式サイトからAPIキーを取得します。https://openai.com/index/openai-api/
    ※取得方法は割愛します。

  • 任意場所にディレクトリ作成
    今回はCドライブ直下にimage-demoという名前で作成しました。

  • 作成したディレクトリで仮想環境構築
    python -m venv .venv
    .venv\Scripts\activate.bat

  • 各種ファイルの作成と配置(ディレクトリ直下)
    .env
    vision_chat.pyファイル作成(任意のファイル名でOK)
    shirohana.JPG(任意の画像ファイル)

  • パッケージインストール
    pip install openai
    pip install python-dotenv


APIを使ってPythonコード実装

Visionの公式ドキュメント:
https://platform.openai.com/docs/guides/vision

# .env

OPENAI_API_KEY = "取得したAPIキーを記載"
# vision_chat.py

import dotenv
import os
import base64
from openai import OpenAI

# .envファイルから環境変数を読み込む
dotenv.load_dotenv()

# OpenAI APIクライアントの初期化
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))


# 画像をBase64エンコードする関数
def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode("utf-8")


# APIを使用してチャット応答を生成する関数
def create_vision_chat(question, image_path, temperature=1):
    # 指定された画像ファイルが存在するか確認
    if not os.path.exists(image_path):
        return "指定された画像ファイルが見つかりません。"

    try:
        # 画像をBase64エンコード
        base64_image = encode_image(image_path)

        # APIリクエスト用のメッセージを構築
        messages = [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": question},
                    {
                        "type": "image_url",
                        "image_url": {"url": f"data:image/jpeg;base64,{base64_image}"},
                    },
                ],
            }
        ]

        # OpenAI APIを呼び出してレスポンスを取得
        res = client.chat.completions.create(
            model="gpt-4o",  # 使用するモデル
            messages=messages,
            temperature=temperature,
            max_tokens=300,
        )

        # 応答内容を取得して返す
        response_content = res.choices[0].message.content
        return response_content

    except Exception as e:
        return f"画像の処理中にエラーが発生しました: {str(e)}"


# メイン処理
if __name__ == "__main__":
    # ユーザーから画像ファイル名とプロンプトを入力
    image_path = input("画像ファイル名を入力してください: ")
    question = input("画像について質問してください: ")

    # 応答をターミナル表示
    response = create_vision_chat(question, image_path)
    print("\n回答:")
    print(response)

画像をもとに回答を生成する

先ほどのコードをもとに実行してみましょう。
ターミナルでpython vision_chat.pyとコマンドたたきます。

(.venv) C:\image-demo>python vision_chat.py
画像ファイル名を入力してください: shirohana.JPG
画像について質問してください: この画像について感想を回答してください

回答:
この画像は、アニメ風に描かれたキャラクターの女の子のイラストですね。
ショートカットの灰色の髪が特徴的で、優しい表情をしています。
目が大きく、髪にはリボンの装飾がついていてかわいらしい印象があります。
全体的に柔らかい色使いで、見ていて温かみを感じられるイラストです。

そうすると上記のようになり、画像ファイル名の入力が求められるので、セットしておいた画像ファイル名を記載します。
今回はシロハナちゃんの画像をセットしました。

次にプロンプトを記載して送信するとプロンプト指示と画像をもとに回答を返してくれるという簡単なものになっています。


さいごに

OpenAIのAPIで画像認識を試してみましたが簡単に実装出来るのはもちろん、精度も高いということで良いですね。

どのように活用するかを考えるのが鍵となりそうと感じました。

ちなみに私が開発しているAIVtuberシステムにも画像認識機能を組み込み開発中なのと同時に、その機能に合わせた配信企画を検討しています
→配信しました。

この流れで最後に宣伝ですが、理想のAIヒロインを目指してAIVtuberとして活動するシロハナちゃんの開発と配信、「テクノロジー×キャラクター」に関する動画等を発信をしています。
興味がありましたらぜひ!

以上!それではまた👋

ご支援は活動費に使わせていただきます