3
4

解熱消六鎮閣剤→理解不能なOCRのテキスト誤認識を赤ペン先生GPT-4oが直します!

Last updated at Posted at 2024-09-03

お薬手帳持って行ってますか?

皆さん病院に行くとき、必ずお薬手帳を持って行ってますか?
私は最近病院に行ったとき完全に頭から抜けていました...

お薬手帳を持っていったときのメリット

  1. 飲み合わせや重複などを確認できる
  2. 転居や災害時でも処方してもらえる
  3. 管理指導料が安くなる場合がある

お薬手帳には、上記のようなメリットがありますが、正直病院へ行く際に忘れてしまう人は多いのではないかと思います。

今回は、お薬手帳を持たなくても済むように、お薬手帳に貼る薬の情報が書かれたシールの画像から、薬の情報をデータ化してみました。

元の画像

スマホで撮った画像です。
IMG_3190.jpg

最終的な出力

JSON形式で、「薬の種類」、「効能」、「一日何錠」、「一回何錠」を出力しました。
必要な情報をかなり精度良く抽出できているのではないかと思います。

[
    {
        "薬": "ロキソプロフェンナトリウム錠60mg「CH」",
        "効能": "解熱鎮痛剤",
        "一日何錠": 3,
        "一回何錠": 1
    },
    {
        "薬": "トランサミン錠250mg",
        "効能": [
            "抗アレルギー剤",
            "止血剤",
            "消炎剤"
        ],
        "一日何錠": 3,
        "一回何錠": 1
    }
]

実装

ライブラリの読み込み

import pyocr
from google.colab import files
from PIL import Image, ImageEnhance
import pytesseract
import openai

pyocrツールの確認

選択されたOCRツールの名前を表示し、Tesseract (sh)と表示されればOKです。

# pyocrが使えることを確認する
tools = pyocr.get_available_tools()
# tesseractのみダウンロードしたため0番目を指定
tool = tools[0]
print(tool.get_name())

ファイルのアップロードと画像の読み込み

ユーザーが画像ファイルを選択し、Google Colab上でローカルファイルをアップロードします。

# ローカルファイルをアップロードする
uploaded = files.upload()

# アップロードされたファイル名を取得
img1_path = list(uploaded.keys())[0]

# 画像を開く
img = Image.open(img1_path)

画像から文字を抽出(OCR)

pytesseractを使用して、指定した画像(img)から文字列を抽出します。
ここでは日本語の文字認識を指定しています。

# OCRを使用して画像から文字を抽出
text = pytesseract.image_to_string(img, lang="jpn")

# 結果を表示
print(text)

ここでの出力結果が以下になります。
「解熱消六鎮閣剤」 → 全く意味がわかりません。
OCRだけだと、所々変な日本語になっている箇所があります。

# output
[11ロキリプ ロフェッナトリウム錠60mgCH 1 3錠1回1錠)
効能) 解熱消六鎮閣剤
一般: ロキソブロフェンNa錠60mg

[2]トランサミン錠2250    1 3(1回1錠)
効能) 抗アレルキー剤
効能) 止血剤
効能) 消炎剤
一般 トラネキサム酸錠 250mg         
1日3回 毎食後服用      xx 邊眉人

OpenAI APIを用いたテキスト処理

OCRでの出力結果をプロンプトに入れて、変だった個所を修正し、JSON形式で薬の種類ごとに情報をまとめてみました。

# OpenAI APIキーを設定
openai.api_key = "YOUR OPENAI API"  # APIキーをここに入力してください

# プロンプトを定義
prompt = f"""
以下のテキストはOCRで画像から抽出した文字列である。
正しくないと思う個所は修正し、薬の種類ごとに、効能、一日何錠、一回何錠、をjson形式でjsonの情報のみ答えなさい。

テキスト:{text}
"""

# APIリクエストを送信
response = openai.ChatCompletion.create(
    model="gpt-4o",  # GPT-4モデルを指定
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": prompt}
    ],
)

# 結果を出力
print(response['choices'][0]['message']['content'].strip())

出力結果としては、以下のようになりました。
抜き出したい情報を間違いなく抽出することができました。

[
    {
        "薬": "ロキソプロフェンナトリウム錠60mg「CH」",
        "効能": "解熱鎮痛剤",
        "一日何錠": 3,
        "一回何錠": 1
    },
    {
        "薬": "トランサミン錠250mg",
        "効能": [
            "抗アレルギー剤",
            "止血剤",
            "消炎剤"
        ],
        "一日何錠": 3,
        "一回何錠": 1
    }
]

まとめ

今回はお薬手帳をデータ化したいということで、OCRを試してみました。
OCRの課題である文字の誤認識をGPT-4oで改善することができたのではないかと思います。

お薬手帳をデータ化しましたが、実際に薬の情報を管理するようなアプリはあるので、試してみようと思いました。

3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4