タイガーラック クリエイティブブログ
2024
October
17

名刺を画像から読み取り、ChatGPTで解析するシステムの構築 その1

はじめに

今回の記事は2回にわたってお届けします。今回はその準備段階として、画像を用いた名刺情報の読み取りがどのように進むかを解説しますが、名刺の情報を完全に読み取る機能はまだ実装しておりません。あくまでも次回の記事が結論となりますので、続編をお楽しみにしていただければと思います。

前回のブログで、ChatGPT APIを使ってAIメール応答システムを構築する方法について紹介しました。その後、この仕組みは名刺の読み取りにも活用できるのではないかと考えました。というのも、私自身が生成AIを使って本に書かれたコードを画像化し、そのコードを書き起こす作業を日常的に行っているからです。しかも、この方法では非常に高い精度でコードを読み取ることができています。これを名刺の情報読み取りに応用できるのではないかと思い、今回の記事を書くことにしました。

特に営業職では、頻繁に名刺を交換する機会があるため、名刺の情報を自動で読み取って、どこかのデータベースに登録・更新し、社内で情報を共有するニーズが高いと思います。このシステムを活用すれば、名刺の整理や情報の社内共有がより効率的に行えるようになるでしょう。

システム概要

システムは以下の手順で動作します。

  • 名刺の画像ファイルを指定し、画像をBase64形式に変換。
  • ChatGPT APIにBase64データを送信。
  • ChatGPTが画像の内容をテキスト化し、解析結果を返却。
  • 解析結果を表示。

Base64形式とは

Base64とは、バイナリデータをテキスト形式で表現するエンコーディング方法です。HTTPやメールなど、テキストベースの通信でバイナリデータを安全に送受信するために利用されます。例えば、画像をBase64形式に変換すると次のような文字列になります。

/9j/4AAQSkZJRgABAQEAAAAAAAD/2wBDAAQDAwQDAwQEBAQFBQUGBwwIBwcHBw...

この変換により、画像データがテキストとして扱えるようになり、後に元の画像に復元できます。

ChatGPT APIの取得方法

ChatGPT APIを使用するには、まずAPIキーが必要です。このAPIキーは、OpenAIの公式サイトから取得できます。APIキーの取得方法に関しては、前回のブログで詳細に説明していますので、そちらもご参照ください。

手順としては以下の通りです:

  • OpenAIの公式サイトにアクセスし、アカウントを作成。
  • ダッシュボードからAPIキーを発行。
  • 取得したAPIキーをコード内に組み込み、ChatGPT APIと連携させる。

APIキーの取得方法や使用方法が初めての方は、ぜひ前回の記事も併せてご覧ください。

システムの実装

画像パスを引数として受け取り、ChatGPTに送信する処理を実装します。

import base64
import requests
import sys
import json

def image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

def send_base64_to_chatgpt(base64_string):
    api_key = "取得したAPIキーを入力してください"
    api_url = "https://api.openai.com/v1/chat/completions"

    prompt = f"以下のBase64形式の名刺画像の内容を読み取り、名刺に記載されている情報をテキスト形式で抽出してください。\nBase64: {base64_string}"

    request_body = {
        "model": "gpt-4o-mini",
        "messages": [
            {"role": "system", "content": "You are a helpful assistant."},
            {"role": "user", "content": prompt}
        ],
        "temperature": 0
    }

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

    response = requests.post(api_url, headers=headers, data=json.dumps(request_body))

    if response.status_code == 200:
        response_content = response.json()
        print("解析結果:")
        print(response_content['choices'][0]['message']['content'])
    else:
        print(f"Error: {response.status_code}")
        print(response.text)

if __name__ == "__main__":
    # 引数で画像パスを受け取る
    if len(sys.argv) < 2:
        print("画像のパスを指定してください。")
        sys.exit(1)

    image_path = sys.argv[1]  # 画像パスを取得
    base64_string = image_to_base64(image_path)
    
    print("Base64形式に変換された名刺のデータ:")
    print(base64_string)

    # ChatGPTに送信
    send_base64_to_chatgpt(base64_string)

コードの説明

  • 引数で画像パスを受け取る: sys.argv[1]で画像パスを取得します。スクリプト実行時にパスを指定してください。
  • image_to_base64: 画像ファイルをBase64形式に変換します。
  • send_base64_to_chatgpt: 変換されたBase64データをChatGPTに送信し、名刺の内容をテキストとして抽出します。

結果

出力結果はうまく行きませんでした泣。

解析結果:
申し訳ありませんが、私は画像を直接解析することができません。Base64形式のデータをテキストに変換して表示することはできませんが、画像を表示するためのツールやライブラリを使用して、Base64データをデコードし、画像を表示することができます。

もし名刺の情報を抽出したい場合は、画像を表示した後に、手動で情報を読み取るか、OCR(光学式文字認識)ソフトウェアを使用し てテキストを抽出することをお勧めします。OCRツールは、画像内のテキストを認識してデジタルテキストに変換することができます 。

具体的な手順やツールについてのアドバイスが必要であれば、お知らせください。

うまくいきませんでした。ためしに”model”: “gpt-4o”,にした場合

Error: 429
{
    "error": {
        "message": "Request too large for gpt-4o in organization org-YDEJjcvZYXkrsYNFXTEeu9jB on tokens per min (TPM): Limit 30000, Requested 40304. The input or output tokens must be reduced in order to run successfully. Visit https://platform.openai.com/account/rate-limits to learn more.",
        "type": "tokens",
        "param": null,
        "code": "rate_limit_exceeded"
    }
}

結果は”gpt-4o-mini”モデルでは、画像解析ができないため、OCRを使うことを勧められました。”gpt-4o”モデルでは、リクエストが大きすぎてエラーが発生しました。

画像解析がうまくいかなかった理由について

今回は、GPT-4 APIを使って画像を解析し、名刺情報を抽出しようと試みました。しかし、実際にリクエストを送信したところ、エラーが発生してうまくいきませんでした。その原因について考察します。

gpt-4o-miniモデルでの問題

まず、軽量版の「gpt-4o-mini」モデルを使った場合、画像を直接解析することができないというメッセージが返ってきました。このモデルでは画像の解析がサポートされていないため、OCR(光学文字認識)ソフトウェアの使用を提案されました。

gpt-4oモデルでの問題

次に、標準の「gpt-4o」モデルを使って試みましたが、こちらでもエラーが発生しました。エラーの内容は「リクエストが大きすぎて処理できない」というものでした。

ここで、問題の原因として考えられるのはBase64エンコードされた画像データのサイズです。例えば、フリー素材サイト「いらすとや」から取得した画像を使って試したところ、

Base64にエンコードした後の文字数が148,180文字にもなりました。これだけの長さになると、ChatGPTのAPI制限に引っかかるのも納得です。

結論

今回、実行したコードではうまくいきませんでした。その理由として、エラーメッセージの中に興味深いポイントがありました。

解析結果:
申し訳ありませんが、私は画像を直接解析することができません。Base64形式のデータをテキストに変換して表示することはできませんが、画像を表示するためのツールやライブラリを使用して、Base64データをデコードし、画像を表示することができます。

もし名刺の情報を抽出したい場合は、画像を表示した後に、手動で情報を読み取るか、OCR(光学式文字認識)ソフトウェアを使用し てテキストを抽出することをお勧めします。OCRツールは、画像内のテキストを認識してデジタルテキストに変換することができます 。

具体的な手順やツールについてのアドバイスが必要であれば、お知らせください。

エラーメッセージでは、画像の内容を解析するにはOCR(光学式文字認識)を使用することが推奨されています。画像データから名刺に記載された情報を正確に取り出すためには、このOCRが鍵となりそうです。ただし、今回はこのOCRについては深く触れません。次回のブログでは、このOCR技術について詳しく紹介し、それを実際にコードに組み込む方法を解説します。名刺の情報を自動的に抽出するための次のステップに進むためにも、ぜひ次回をお楽しみに!

参考文献

Base64とは【用語集詳細】| SOMPO CYBER SECURITY

このカテゴリの最新記事

関連記事

SHOP LIST

タイガーラック株式会社

〒577-0056
大阪府東大阪市長堂1-3-14 TOKUYASU Bld.