確定申告用の医療費領収書をOCRで読み取り、CSVに集計するStreamlitアプリケーションです。
- PDFからの画像展開(300DPI)
- レイアウト類似度による領収書の自動グループ分け
- グループごとに読取位置を矩形で指定
- YomiToku OCRによる文字認識
- 日付の自動正規化(和暦・西暦対応)
- CSV出力
- Docker & Docker Compose(推奨)
- または Python 3.10+ & CUDA対応GPU
docker compose up --buildブラウザで http://localhost:8501 にアクセス
OCRサーバーとフロントエンドを別々に起動する必要があります。
ターミナル1(OCRサーバー / GPU必要):
cd server
pip install -r requirements.txt
uvicorn ocr_server:app --host 0.0.0.0 --port 8000ターミナル2(フロントエンド):
cd frontend
pip install -r requirements.txt
streamlit run app.pyOCRサーバーが別ホストにある場合は、環境変数で接続先を指定できます:
export OCR_SERVER_URL=http://192.168.1.100:8000
streamlit run app.py├── frontend/ # Streamlitフロントエンド
│ ├── app.py
│ ├── step1_upload.py
│ ├── step2_classify.py
│ ├── step3_wizard.py
│ ├── step4_ocr.py
│ ├── utils.py
│ ├── ocr_client.py
│ ├── components/
│ ├── requirements.txt
│ └── Dockerfile
├── server/ # OCRサーバー
│ ├── ocr_server.py
│ ├── requirements.txt
│ └── Dockerfile
├── docker-compose.yml
└── README.md
-
様式の確認: 自動グループ分けを確認・修正
-
読取位置の指定(手動 or LLM自動検出): 各グループで領収金額・日付などの位置を矩形で囲むか、LLM(Vision対応モデル)に自動検出させることができます。自動検出は代表画像をモデルに送信し、各フィールドのバウンディングボックス(x,y,w,h)をJSONで受け取ってテンプレートに反映します。自動検出が失敗した場合は手動入力にフォールバックします。
-
有効化方法(環境変数):
-
AI_DETECTOR_PROVIDER=ollama|openai|disabled(デフォルト) -
Ollama の場合:
-
OLLAMA_BASE_URL=http://<ollama-host>:11434 -
OLLAMA_MODEL=llava:7b-v1.6-mistral-q4_K_M(RTX 3050 6GB に推奨の量子化モデル) -
初回はモデルを pull する必要があります(Ollama コンテナ内または Ollama サーバ上で実行):
ollama pull llava:7b-v1.6-mistral-q4_K_M
-
-
OpenAI の場合:
OPENAI_API_KEYを設定し、OPENAI_MODELに対応モデルを指定します(例:gpt-4o等)。
-
-
動作の流れ:
- 各グループの代表画像に対して一度自動検出を試行します。
- 検出結果がある場合はテンプレートにプリセットされ、ユーザーは確認・微調整できます。
- 検出が失敗した場合は警告を表示し、従来通り手動で矩形を指定します。
-
-
OCR実行・出力: 結果を確認してCSVダウンロード
令和7年1月2日R7.1.22025/01/022025年1月2日2025-01-02
MIT License
- YomiTokuは非商用利用のみ無償です。商用利用には別途ライセンスが必要です。
- OCR精度は画像品質に依存します。300DPI以上でのスキャンを推奨します。