AI への転身を目指すエンジニアの皆さん、機械学習 AI アルゴリズムエンジニアリングをフォローしてください。
皆さんは毎日、PDF に記載された表の手入力にどれだけの時間を費やしていますか?
先週、30 ページの財務レポートを処理した際、表を Excel に打ち込むだけで丸一日を費やしてしまいました。さらに厄介なことに、手書きのメモや複雑な数式も混在していたのです。
従来の OCR はどうでしょうか?Tesseract で表を認識させると列が揃わず、手書き文字は文字化けし、数式にいたっては惨憺たる有様です。かといって GPT-4o Vision を使うと、精度は十分でも処理速度が遅すぎて呆れ返り、さらにデータセキュリティの懸念もあります。
そこで私が発見したのがChandra OCR 2です。
これは完全オープンソースの OCR モデルで、公式テストベンチマークで85.9 点を記録し、GPT-4o の 69.9 点を圧倒しました。さらに驚くべきは、数式認識(80.3 点)、表認識(88 点)、長文の小さな文字(92.3 点)という 3 つの次元ですべてトップを獲得している点です。
最も魅力的なのは、わずか4GB の VRAMでローカル動作可能であり、機密文書をクラウドにアップロードする必要がまったくないことです。
本稿では、GPT-4o も冷や汗をかくこの OCR ツールを、ゼロから使いこなすまでを詳しく解説します。
1. Chandra OCR 2 とは?
端的に言えば、Chandra OCR 2 はレイアウト認識型の OCR モデルです。
従来の OCR は「文字通り」の認識しかできず、各文字は読めてもページ上の位置関係は理解できません。その結果、段組みは 1 列として読まれ、表はぐちゃぐちゃになり、数式は悲惨な結果になります。
一方、Chandra は「版組を理解する」ことができます。文字を認識するだけでなく、文書構造(見出し階層、段組み、ネストされた表、数式、手書き注釈、フォームのチェックボックスなど)を理解し、セマンティックな Markdown、HTML、構造化 JSON としてそのまま出力します。
この能力により、複雑な文書処理において圧倒的な優位性を発揮します。
技術的ブレークスルー:
- レイアウト理解: 段組み、ネストされた表、テキストと画像の混在など複雑なレイアウトを認識可能
- 数式: LaTeX レベルでの数式再現。手書き数式も認識可能
- 表の再構築: セルの結合をサポートし、元の表構造を維持
- フォーム認識: チェックボックスやラジオボタン、その選択状態を認識
- 多言語対応: 中国語、アラビア語、日本語など 90 以上の言語をカバー
- 画像・グラフ抽出: 画像やグラフを自動抽出し、キャプションを追加
パフォーマンスデータ:
- olmOCR ベンチマーク:85.9 点(総合 1 位)
- 数式認識:80.3 点(1 位)
- 表認識:88 点(1 位)
- 小さな文字:92.3 点(1 位)
- 手書きメモ認識:90.8 点(2 位)
ビジネスフレンドリー:
- コードは Apache 2.0 ライセンス
- モデル重みは修正版 OpenRAIL-M ライセンス
- 研究、個人利用、年収 200 万ドル以下のスタートアップは無料
- ローカル展開可能で、データセキュリティが保証される
2. なぜ Chandra OCR 2 を選ぶのか?
実例をお話ししましょう。
先月、私たちのチームは 100 冊の古いスキャン版中国語数学教科書を処理する必要がありました。これらの PDF は非常に複雑で、2 段組み、複雑な数式、手書きの解答プロセス、さまざまな注釈が含まれていました。
Tesseract を試しましたが、数式は全滅、表の列は乱れ、手書き文字はほぼ読めませんでした。
GPT-4o Vision を試すと、精度は十分でしたが、1 ドキュメントあたり 15 秒、100 冊で 25 分もかかり、データプライバシーの懸念もありました。
そこで Chandra OCR 2 に切り替えたところ、1 ドキュメントあたり平均 3 秒、精度 95% 以上、数式は完璧に再現され、手書き注釈は引用ブロックとして個別にマークされ、構造化された Markdown を直接出力できました。
しかし、Chandra の真骨頂は速度ではなく構造化出力にあります。
従来の OCR は単なるテキストの塊を返すだけで、後から整理や組版、調整に時間を取られます。Chandra はそのまま使える構造化ドキュメントを提供します。見出しは#で、表は Markdown 形式で、数式は LaTeX で、手書き注釈は>の引用ブロックで、ヘッダーやフッターは文末の注釈として出力されます。
これは何を意味するのでしょうか?
PDF をブログ記事に変換したい場合、Chandra の出力を Markdown エディタにコピペするだけで、ほぼ修正不要です。
表データを処理したい場合、Chandra が出力する JSON には完全な座標と構造情報が含まれているため、Python スクリプトで直接表を抽出し、Pandas にインポートできます。
知識ベースを構築したい場合、Chandra の出力形式は RAG システムに直接投入するのに最適で、検索や参照が極めて容易です。
3. システム要件と準備
インストールを始める前に、環境が要件を満たしているか確認してください。
最小構成:
- OS: Windows(WSL2 が必要)、macOS(Apple Silicon 対応)、Linux(Ubuntu 20.04 以上を推奨)
- Python バージョン: 3.9 以上(3.10/3.11 が最も安定)
- VRAM: 4GB(RTX 3060 など)
- メモリ: 8GB(大きな PDF 処理には 16GB 以上を推奨)
- ディスク容量: 最低 10GB の空き容量
推奨構成:
- GPU: RTX 3060/4060 以上(VRAM 12GB)
- メモリ: 16GB 以上
- ストレージ: SSD(モデル読み込みが高速化)
重要なお知らせ:
- Windows ユーザーは WSL2 の使用を推奨(ネイティブ Windows はサポートが限定的)
- GPU 高速化には NVIDIA 製 GPU と CUDA ドライバ(バージョン 535 以上を推奨)が必要
- GPU がない場合、CPU でも動作可能だが、速度は 10 倍以上遅くなる
- PDF レンダリングライブラリのインストールが必要(macOS は Homebrew で poppler、Linux は apt-get でインストール)
CUDA バージョンの確認:
nvidia-smi
Python バージョンの確認:
python --version
4. インストールガイド
Chandra OCR 2 には 3 つのインストール方法があります。推奨順に紹介します。
方法 1: pip でのインストール(最も簡単・初心者推奨)
最も手軽な方法で、すぐに試したい方や開発テストに最適です。
ステップ 1: 仮想環境の作成(強く推奨)
# Linux/macOS
python -m venv chandra-env
source chandra-env/bin/activate
# Windows
python -m venv chandra-env
chandra-env\Scripts\activate
# または conda を使用
conda create -n chandra python=3.10
conda activate chandra
仮想環境を使うとパッケージの競合を防げるため、強く推奨します。
ステップ 2: Chandra OCR のインストール
# 基本インストール(vLLM バックエンド・推奨)
pip install chandra-ocr
# HuggingFace バックエンドを使用する場合
pip install chandra-ocr[hf]
# 完全インストール(全依存関係を含む)
pip install chandra-ocr[all]
インストールには約 2〜3 分かかり、約 2.1GB のモデル重みが~/.cache/chandra/に自動的にダウンロードされます。
ステップ 3: インストールの確認
chandra --version
バージョン番号が表示されれば成功です!
方法 2: Docker でのデプロイ(最も安定・本番環境向け)
環境を分離したい場合や、サーバーへのデプロイには Docker が最適です。
ステップ 1: Docker と NVIDIA Container Toolkit のインストール(GPU 使用時)
# NVIDIA Container Toolkit のインストール(Linux)
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
ステップ 2: Docker イメージの取得
docker pull datalabto/chandra-ocr:latest
ステップ 3: コンテナの実行
# GPU を使用して実行
docker run --gpus all -p 8501:8501 -v $(pwd)/data:/app/data datalabto/chandra-ocr:latest
# GPU を使用しない(速度は大幅に低下)
docker run -p 8501:8501 -v $(pwd)/data:/app/data datalabto/chandra-ocr:latest
# Windows ユーザーは $(pwd) を %cd% に置き換えてください
パラメータの説明:
--gpus all: 全 GPU を使用-p 8501:8501: ポートのマッピング-v $(pwd)/data:/app/data: データディレクトリのマウント
実行後、ブラウザでhttp://localhost:8501を開くと Web インターフェースが表示されます。
方法 3: ソースコードからのインストール(最新機能・開発者向け)
最新機能を使いたい場合や、コードを修正したい場合はソースコードからインストールします。
# リポジトリのクローン
git clone https://github.com/datalab-to/chandra.git
cd chandra
# 仮想環境の作成
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# インストール
uv sync
# または pip を使用
pip install -e .
pip install ".[pdf,accelerate]"
5. 使い方チュートリアル
Chandra には、CLI コマンド、Streamlit Web インターフェース、Python API の 3 つの利用方法があります。
方法 1: CLI コマンド(バッチ処理に最適)
単一ファイルの処理:
# vLLM バックエンドを使用(推奨・高速)
chandra input.pdf ./output --method vllm
# HuggingFace バックエンドを使用
chandra input.pdf ./output --method hf
# ページ範囲の指定
chandra input.pdf ./output --method vllm --page-range "1-5,7,9-12"
# 画像の抽出を含む
chandra input.pdf ./output --method vllm --include-images
# ヘッダー・フッターを含む
chandra input.pdf ./output --method vllm --include-headers-footers
ディレクトリの一括処理:
# ディレクトリ全体の処理
chandra ./documents ./output --method hf
# 並列処理(ワーカー数の指定)
chandra ./scans ./output --method vllm --max-workers 4
主なパラメータの説明:
--method [hf|vllm]: 推論方法(デフォルトは vllm)--page-range TEXT: ページ範囲(例:"1-5,7,9-12")--max-output-tokens INTEGER: 1 ページあたりの最大トークン数--max-workers INTEGER: 並列ワーカー数--include-images/--no-images: 画像を抽出するかどうか--include-headers-footers/--no-headers-footers: ヘッダー・フッターを含むかどうか--batch-size INTEGER: バッチ処理あたりのページ数(vllm はデフォルト 28、hf は 1)
出力構造:
処理が完了すると、各ファイルごとにディレクトリが生成されます。
output/
└── report.pdf/
├── report.pdf.md # Markdown 形式
├── report.pdf.html # HTML 形式(座標情報付き)
├── report.pdf_metadata.json # メタデータ(ページ情報、トークン数など)
└── images/ # 抽出された画像
方法 2: Streamlit Web インターフェース(単一ファイル処理向け)
Web インターフェースの起動は簡単です。
chandra_app
ブラウザが自動的にhttp://localhost:8501を開きます。
インターフェースの機能:
- 画像や PDF のドラッグ&ドロップ
- 認識結果のリアルタイムプレビュー
- 左側に元画像、右側に Markdown プレビューを表示
- HTML/JSON 形式への切り替え対応
- 文字をクリックして元の画像座標を確認可能
- 全形式(.md/.html/.json)の一括エクスポート
デバッグやクイックプレビューに最適です。
方法 3: Python API(自社アプリへの統合用)
基本使用法:
from chandra.model import InferenceManager
from chandra.model.schema import BatchInputItem
from PIL import Image
# 推論マネージャーの作成(vLLM バックエンド)
manager = InferenceManager(method="vllm")
# 入力の準備
batch = [
BatchInputItem(
image=Image.open("document.jpg"),
prompt_type="ocr_layout"
)
]
# 推論の実行
result = manager.generate(batch)[0]
# Markdown 結果の取得
print(result.markdown)
# HTML 結果の取得
print(result.html)
# JSON 結果の取得
print(result.json)
PDF の処理:
from chandra.input import load_pdf_images
# PDF 全ページの読み込み
images = load_pdf_images("document.pdf")
# バッチ処理
batch = [BatchInputItem(image=img, prompt_type="ocr_layout") for img in images]
results = manager.generate(batch)
# 各ページの結果をイテレート
for i, result in enumerate(results):
print(f"Page {i+1}:")
print(result.markdown)
print("-" * 50)
設定オプション:
# HuggingFace バックエンドの使用
manager = InferenceManager(method="hf")
# カスタム vLLM サーバーの設定
import os
os.environ["VLLM_API_BASE"] = "http://localhost:8000/v1"
os.environ["VLLM_MODEL_NAME"] = "chandra"
os.environ["VLLM_GPUS"] = "0"
manager = InferenceManager(method="vllm")
vLLM サーバーのデプロイ(高性能・本番環境)
大量の文書を処理する場合や、低遅延が求められる場合は vLLM サーバーのデプロイを推奨します。
vLLM サーバーの起動:
chandra_vllm
これにより、構成済みの vLLM サーバーを含む Docker コンテナが起動します。
または手動で vLLM を起動:
# vLLM サーバーの起動(2 枚の GPU を使用)
python -m vllm.entrypoints.openai.api_server \
--model datalab-to/chandra \
--tensor-parallel-size 2 \
--gpu-memory-utilization 0.9 \
--port 8000
設定の説明:
--model: モデル名--tensor-parallel-size: GPU 並列数(デフォルト 1)--gpu-memory-utilization: GPU メモリ使用率--port: サーバーポート
OpenAI 互換 API の使用:
import openai
client = openai.OpenAI(
base_url="http://localhost:8000/v1",
api_key="token-abc123"
)
# OCR 認識の呼び出し
response = client.chat.completions.create(
model="chandra-ocr",
messages=[
{"role": "user", "content": "この画像を認識してください"}
],
image="base64 エンコードされた画像データ"
)
print(response.choices[0].message.content)
6. 実践ケーススタディ
実際のシナリオに基づいた 3 つのケーススタディを紹介します。
ケース 1: 財務諸表の一括処理
シナリオ: 経理部門では毎月 50 件の仕入先からの請求書(スキャン PDF)を処理します。表、金額、日付、税番号などの主要情報を抽出し、対帳用に Excel へ取り込む必要があります。
手順:
ステップ 1: 請求書ファイルの準備
mkdir invoices
cp ~/Downloads/*.pdf invoices/
ステップ 2: 一括処理
chandra ./invoices ./output --method vllm --max-workers 4
ステップ 3: Python での表データ抽出
import json
import pandas as pd
# JSON 出力の読み込み
with open("output/invoice001.pdf/invoice001.pdf_metadata.json", "r") as f:
metadata = json.load(f)
# 表データの抽出
tables = []
for page in metadata["pages"]:
for block in page["blocks"]:
if block["type"] == "table":
tables.append(block["table"])
# DataFrame への変換
df = pd.DataFrame(tables[0])
df.to_excel("invoice001.xlsx", index=False)
結果:
- 50 件の PDF 処理にわずか 3 分(1 件あたり約 3.6 秒)
- 表認識精度 95% 以上
- セルの結合も正確に認識
- 金額、日付などの重要項目を正確に抽出
- 手書きメモは引用ブロックとして分離され、表に混入しない
ケース 2: 学術論文の数式抽出
シナリオ: 研究者が arXiv の論文から数式を抽出し、文献レビューや数式データベースの構築に活用します。論文には複雑な数式、2 段組み、図表の混在が含まれます。
手順:
ステップ 1: CLI での論文処理
chandra "paper.pdf" ./papers_output --method vllm --include-images
ステップ 2: LaTeX 数式の抽出
import re
with open("papers_output/paper.pdf/paper.pdf.md", "r") as f:
markdown = f.read()
# LaTeX 数式の抽出($...$および $$...$$ 形式)
inline_formulas = re.findall(r'\$([^$]+)\$', markdown)
block_formulas = re.findall(r'\$\$([^$]+)\$\$', markdown)
print(f"行内数式を{len(inline_formulas)}個発見")
print(f"ブロック数式を{len(block_formulas)}個発見")
# 数式ライブラリの保存
with open("formulas.txt", "w") as f:
for i, formula in enumerate(block_formulas, 1):
f.write(f"数式{i}:\n{formula}\n\n")
ステップ 3: キャプション付き画像の抽出
import shutil
# 抽出した画像を専用ディレクトリへ移動
shutil.copytree(
"papers_output/paper.pdf/images",
"paper_images"
)
# メタデータに画像キャプションが含まれている
with open("papers_output/paper.pdf/paper.pdf_metadata.json", "r") as f:
metadata = json.load(f)
for page in metadata["pages"]:
for block in page["blocks"]:
if block["type"] == "image":
print(f"画像:{block['image']['caption']}")
結果:
- 数式認識精度 93%
- LaTeX 形式が完全に維持される
- 2 段組みを正確に認識
- 画像やグラフを自動抽出
- 図表のキャプションを正確に抽出
- 参考文献形式も正確に認識
ケース 3: 多言語文書の処理
シナリオ: 多国籍企業が、中国語、英語、アラビア語、日本語など多言語の契約書を処理します。フォーム、署名、ハンコ、手書き条項が含まれます。
手順:
ステップ 1: 多言語ファイルの一括処理
chandra ./contracts ./contracts_output --method vllm --max-workers 4
ステップ 2: 言語検出と分類
import langdetect
import os
contracts_dir = "contracts_output"
languages = {}
for contract_file in os.listdir(contracts_dir):
if contract_file.endswith(".md"):
# Markdown 内容の読み込み
with open(os.path.join(contracts_dir, contract_file), "r") as f:
content = f.read()
# 言語の検出(先頭 1000 文字)
language = langdetect.detect(content[:1000])
# 分類と集計
if language not in languages:
languages[language] = []
languages[language].append(contract_file)
# 統計の出力
for lang, files in languages.items():
print(f"{lang}: {len(files)}件")
ステップ 3: 署名とハンコの抽出
import json
# 全ファイルの JSON メタデータを確認
for contract_file in os.listdir(contracts_dir):
if contract_file.endswith("_metadata.json"):
with open(os.path.join(contracts_dir, contract_file), "r") as f:
metadata = json.load(f)
# 署名エリアの検索(通常は下部)
for page in metadata["pages"]:
for block in page["blocks"]:
if block["type"] == "text":
# 署名キーワードを含むか確認
text = block["text"].lower()
if "signature" in text or "签署" in text or "签字" in text:
print(f"署名エリアを発見:{contract_file}")
print(f"座標:{block['bbox']}")
if block["type"] == "image":
# 画像はハンコの可能性がある
print(f"画像を発見(ハンコの可能性):{contract_file}")
print(f"座標:{block['bbox']}")
結果:
- 中国語認識精度:94.8%
- 英語認識精度:95.2%
- アラビア語認識精度:68.4%(低リソース言語)
- 日本語認識精度:85.3%
- フォームのチェックボックス認識精度:90%
- 手書き署名認識精度:82%
7. 上級者向け機能とテクニック
1. GPU 加速の設定
NVIDIA 製 GPU をお持ちの場合は、必ず GPU 加速を有効にしてください。速度が 3〜5 倍向上します。
CUDA バージョンの確認:
nvcc --version
nvidia-smi
対応する PyTorch のインストール:
# CUDA 12.1 の例
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
GPU の指定:
# 0 番目の GPU のみ使用
CUDA_VISIBLE_DEVICES=0 chandra input.pdf ./output
# 1 番目の GPU を使用
CUDA_VISIBLE_DEVICES=1 chandra input.pdf ./output
2. バッチ処理の最適化
大量のファイルを処理する際は、パラメータを調整して速度を向上させます。
# ワーカー数の増加(CPU コア数に応じて調整)
chandra ./docs ./output --max-workers 8
# バッチサイズの増加(GPU メモリに応じて調整)
chandra ./docs ./output --batch-size 4
# 特定のページ範囲のみ処理
chandra large.pdf ./output --page-range "1-10,20-30"
3. 出力形式の選択
用途に応じて適切な出力形式を選択します。
Markdown:
- 用途:ブログ記事、ドキュメント編集、知識ベース
- 利点:可読性が高く、編集が容易
- コマンド:
chandra input.pdf output/
HTML:
- 用途:Web 表示、システムへの埋め込み
- 利点:座標情報付きで注釈に便利
- コマンド:
chandra input.pdf output/(デフォルトで生成)
JSON:
- 用途:データ処理、自動化ワークフロー
- 利点:構造化されておりプログラミングに最適
- コマンド:
.metadata.jsonファイルを読み込む
4. エラー処理とデバッグ
よくある問題:
問題 1: CUDA バージョンの不一致
# 解決策:対応する PyTorch を再インストール
pip uninstall torch
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
問題 2: VRAM 不足
# 解決策:バッチサイズを減らすか、CPU を使用
chandra input.pdf output/ --batch-size 1
# または
chandra input.pdf output/ --method hf
問題 3: PDF レンダリングエラー
# 解決策:poppler をインストール
# macOS
brew install poppler
# Ubuntu/Debian
sudo apt-get install -y poppler-utils
8. パフォーマンス比較と優位性
Chandra OCR 2 の利点を直感的に理解していただくため、詳細なパフォーマンス比較データをまとめました。
主要 OCR ツールとの比較
| 項目 | Chandra OCR 2 | GPT-4o | Tesseract | PaddleOCR |
|---|---|---|---|---|
| 総合精度 | 85.9% | 69.9% | 65% | 72% |
| 表認識 | 88% | 70% | 55% | 68% |
| 数式 | 80.3% | 74.5% | 非対応 | 基礎対応 |
| 手書き文字 | 90.8% | 93.8% | 70% | 75% |
| 小さな文字 | 92.3% | 69.3% | 75% | 78% |
| 処理速度(1 ページ) | 0.9 秒 | 1.4 秒 | 0.18 秒 | 0.5 秒 |
| 対応言語数 | 90+ | 100+ | 100+ | 80+ |
| ローカル展開 | 可能 | 不可 | 可能 | 可能 |
| データセキュリティ | 高 | 低 | 高 | 高 |
| 商用ライセンス | フレンドリー | 有料 | オープンソース | オープンソース |
ハードウェア要件の比較
| 構成 | Chandra OCR 2 | GPT-4o (API) | Tesseract |
|---|---|---|---|
| 最小 VRAM | 4GB | N/A | 0GB (CPU) |
| 推奨 VRAM | 8-12GB | N/A | N/A |
| 処理速度 (GPU) | 0.9 秒/ページ | 1.4 秒/ページ | 0.18 秒/ページ |
| 処理速度 (CPU) | 1.2 秒/ページ | 1.4 秒/ページ | 0.18 秒/ページ |
| 並行処理能力 | 高 | 中 | 低 |
実シナリオでのテスト結果
5 種類の文書で実測を実施(各 10 ページ、計 50 ページ):
| 文書タイプ | サンプル例 | Markdown 実用率 | 数式再現精度 | 表構造の忠実度 | 手書き認識可読率 |
|---|---|---|---|---|---|
| 大学のカリキュラム要綱 | 目次、表、ヘッダーあり | 100% | 96% | 100% | - |
| 生徒の手書き課題 | 手書き回答+数式 | 92% | 89% | 85% | 88% |
| エンジニアリング図面 | 段組み+技術記号 | 98% | 91% | 94% | - |
| 研究論文 | 2 段組み+複雑な数式 | 95% | 93% | 97% | - |
| フォーム契約書 | チェックボックス+署名 | 89% | 84% | 90% | 82% |
実用率の定義: 出力された Markdown を Obsidian/Notion/Typora にそのまま貼り付け、大幅な修正なしで閲覧・引用できるかどうか。
中核的な優位性の要約
1. レイアウト理解能力
- 文書構造を真に理解できる唯一のオープンソース OCR
- 段組み、ネストされた表、テキストと画像の混在を完璧に処理
- 出力はそのまま使用可能で、再組版が不要
2. 構造化出力
- Markdown、HTML、JSON の 3 形式に対応
- 完全な座標とメタデータを保持
- 自動化ワークフローへの統合に最適
3. ビジネスフレンドリー
- Apache 2.0 オープンソースライセンス
- モデル重みは中小企業に無料提供
- ローカル展開可能で、データセキュリティを管理可能
4. コストパフォーマンスの高さ
- GPT-4o を上回る精度
- ローカル動作で有料 API が不要
- 4GB の VRAM で動作可能
5. 使いやすさ
pip install chandra-ocrの 1 行でインストール- CLI、Web インターフェース、Python API の 3 通りの利用法
- ドキュメントが充実し、コミュニティも活発
9. ベストプラクティスと推奨事項
実際の使用経験に基づき、いくつかのベストプラクティスをまとめました。
1. 適切なバックエンドの選択
vLLM バックエンド(推奨):
- 用途:本番環境、バッチ処理、高性能要件
- 利点:高速(0.9 秒/ページ)、バッチ処理対応
- 欠点:初回起動に時間がかかる、GPU が必要
HuggingFace バックエンド:
- 用途:デバッグ、小規模バッチ、GPU なし環境
- 利点:起動が速い、デバッグが容易
- 欠点:速度が遅い(3〜5 秒/ページ)
2. ファイルの前処理
最高の結果を得るためには、前処理を推奨します。
from PIL import Image
import cv2
import numpy as np
# コントラストの向上
def enhance_contrast(image_path):
img = cv2.imread(image_path)
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
l = clahe.apply(l)
enhanced = cv2.merge([l, a, b])
enhanced = cv2.cvtColor(enhanced, cv2.COLOR_LAB2BGR)
cv2.imwrite("enhanced_"+image_path, enhanced)
# ノイズ除去
def denoise(image_path):
img = cv2.imread(image_path)
denoised = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
cv2.imwrite("denoised_"+image_path, denoised)
# 自動回転
def auto_rotate(image_path):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 50, 150, apertureSize=3)
lines = cv2.HoughLines(edges, 1, np.pi/180, 100)
if lines is not None:
for rho, theta in lines[:1]:
angle = theta * 180/np.pi - 90
if abs(angle) > 45:
angle = 90 - angle
M = cv2.getRotationMatrix2D((img.shape[1]/2, img.shape[0]/2), angle, 1)
rotated = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))
cv2.imwrite("rotated_"+image_path, rotated)
3. 出力後の処理
ニーズに応じて後処理を行います。
import re
# 冗長な空白のクリーンアップ
def clean_whitespace(markdown):
# 複数の空行を 1 つに統合
markdown = re.sub(r'\n{3}', '\n\n', markdown)
# 行末の空白を削除
markdown = re.sub(r' +$', '', markdown, flags=re.MULTILINE)
return markdown
# 特定情報の抽出
def extract_info(markdown):
# メールアドレスの抽出
emails = re.findall(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2}', markdown)
# 電話番号の抽出
phones = re.findall(r'\d{3,4}[-.\s]?\d{7,8}', markdown)
# 日付の抽出
dates = re.findall(r'\d{4}[-/年]\d{1,2}[-/月]\d{1,2}[日]?', markdown)
return {
"emails": emails,
"phones": phones,
"dates": dates
}
# 形式の変換
def md_to_html(markdown):
import markdown
html = markdown.markdown(markdown, extensions=['tables', 'fenced_code'])
return html
4. エラーリカバリ
エラーリカバリメカニズムを構築します。
import logging
# ロギングの設定
logging.basicConfig(filename='ocr_errors.log', level=logging.ERROR)
def safe_process(input_path, output_path):
try:
result = chandra.process(input_path)
result.save(output_path)
return True
except Exception as e:
logging.error(f"処理失敗:{input_path}, エラー:{str(e)}")
# バックアップ案を試す
try:
result = chandra.process(input_path, method="hf")
result.save(output_path)
return True
except Exception as e2:
logging.error(f"バックアップ案も失敗:{input_path}, エラー:{str(e2)}")
return False
# バッチ処理
for file in files:
if not safe_process(file, output_dir):
print(f"処理失敗:{file}")
10. よくある質問 (FAQ)
Q1: Chandra OCR 2 は無料ですか?
A: コードは Apache 2.0 ライセンスで完全無料のオープンソースです。モデル重みは修正版 OpenRAIL-M ライセンスで、研究、個人利用、年収 200 万ドル以下のスタートアップには完全無料です。より大規模な商用利用にはライセンス契約が必要です。
Q2: どのようなハードウェア構成が必要ですか?
A: 最小で 4GB の VRAM(RTX 3060 など)が必要です。推奨は 8-12GB です。GPU がない場合、CPU でも動作しますが、速度は 10 倍以上遅くなります。メモリは 16GB 以上を推奨します。特に大きな PDF を処理する際は安定性が増します。
Q3: どの言語に対応していますか?
A: 公式には 90 以上の言語に対応しており、中国語(簡体字・繁体字)、英語、アラビア語、日本語、韓国語、フランス語、ドイツ語などが含まれます。テストデータによると、中国語の認識精度は 94.8%、英語は 95.2%、アラビア語は 68.4%、日本語は 85.3% です。
Q4: GPT-4o Vision と比較してどうですか?
A: 総合精度では Chandra OCR 2(85.9%)が GPT-4o(69.9%)を上回り、表認識でも Chandra(88%)が GPT-4o(70%)を凌駕しています。数式でも Chandra(80.3%)が GPT-4o(74.5%)より優れています。Chandra は構造化出力とローカル展開の点で有利です。
Q5: 手書き文字も処理できますか?
A: はい、手書き文字の認識精度は 90.8% です。手書きの注釈、署名、数式などをサポートしています。ただし、極めて崩れた連筆文字の場合は精度が低下する可能性があります。
Q6: 処理速度はどのくらいですか?
A: RTX 3060 GPU を使用した場合、1 ページあたり平均 0.9 秒です。A100 GPU なら約 0.09 秒、16 コア CPU なら約 1.2 秒です。バッチ処理時は vLLM バックエンドが並列処理をサポートするため、さらに高速になります。
Q7: 出力形式には何がありますか?
A: Markdown、HTML、JSON の 3 形式に対応しています。Markdown はドキュメント編集に、HTML は Web 表示に、JSON はデータ処理に適しています。いずれの形式も完全なレイアウト情報を保持しています。
Q8: 自社のアプリケーションに統合するにはどうすればよいですか?
A: Python API を提供しており、OpenAI 互換の vLLM API もサポートしています。Python アプリケーション、Web サービス、自動化ワークフローへ簡単に統合できます。
Q9: Web インターフェースはありますか?
A: はい、chandra_appコマンドで Streamlit Web インターフェースを起動できます。ドラッグ&ドロップアップロード、リアルタイムプレビュー、形式の切り替え、ワンクリックエクスポートなどの機能を備えています。
Q10: 問題が発生した場合はどうすればよいですか?
A: GitHub Issues を確認するか、Discord コミュニティに参加し、公式ドキュメントを参照してください。主な問題の多くは解決策が提示されており、CUDA バージョンの不一致、VRAM 不足、PDF レンダリングエラーなどが一般的です。
機械学習アルゴリズム・AI ビッグデータ技術
公式アカウントを検索して追加:datanlp
画像を長押しして QR コードをスキャン
この記事を読んだ方は、こちらの記事も読んでいます:
- 最先端の OCR アルゴリズムには何がある?
- 最強のワンクリック背景削除ツール、19K スターの Rembg オープンソース神器
- リアルタイムセマンティックセグメンテーション ENet アルゴリズム、書籍/領収書のエッジ抽出
- 整理された中国語大規模言語モデル、規模が小さくプライベート展開可能で学習コストが低いモデルが中心
- 『大規模言語モデル』PDF ダウンロード
- ハンズオン・ディープラーニング(李沐)PyTorch 版
- YOLOv9 電動ヘルメット着用検出、モデル訓練の詳細解説
- TensorFlow 2.0 ディープラーニング実践ケーススタディ
- 40 万件の表データセット TableBank を用いた MaskRCNN による表検出
- 『ディープラーニングによる自然言語処理』中/英 PDF
- Deep Learning 中文版初版 - 周志華チーム
- 【完全動画講座】最も包括的な物体検出アルゴリズムシリーズ解説、わかりやすい!
- 『美団機械学習実践』_美団アルゴリズムチーム.pdf
- 『ディープラーニング入門:Python の理論と実装』高解像度中文 PDF+ ソースコード
- 『ディープラーニング:Keras を使った Python 実践』PDF とコード
- 特徴抽出と画像処理 (第 2 版).pdf
- Python 就職向け講座動画、入門から実践プロジェクトまで
- 2019 年版最新『PyTorch 自然言語処理』英・中 PDF+ ソースコード
- 『21 のプロジェクトで遊ぶディープラーニング:TensorFlow 実践詳解』完全版 PDF+ 書籍コード付き
- 『ディープラーニングの PyTorch』pdf+ 書籍ソースコード付き
- PyTorch ディープラーニング高速実践入門『pytorch-handbook』
- 【ダウンロード】豆弁評価 8.1、『機械学習実践:Scikit-Learn と TensorFlow ベース』
- 『Python データ分析とマイニング実践』PDF+ 完全ソースコード
- 自動車産業向け完全知識グラフプロジェクト実践動画(全 23 回)
- 李沐大神オープンソース『ハンズオン・ディープラーニング』、カリフォルニア大学バークレー校ディープラーニング(2019 春)教材
- ノート・コードが明確でわかりやすい!李航『統計的学習方法』最新リソース完全セット!
- 『ニューラルネットワークとディープラーニング』最新 2018 版 中/英 PDF+ ソースコード
- 機械学習モデルを REST API としてデプロイ
- FashionAI 衣類属性タグ画像認識 Top1-5 方案共有
- 重要オープンソース!CNN-RNN-CTC による手書き漢字認識
- yolo3 による画像中の不規則な漢字の検出
- 同じ機械学習アルゴリズムエンジニアでも、なぜあなたの面接は通らないのか?
- 前海保険ビッグデータアルゴリズム:リスク確率予測
- 【Keras】「交通標識」分類、「領収書」分類の 2 プロジェクト完全実装で、ディープラーニング画像分類をマスター
- VGG16 転移学習による医用画像認識分類プロジェクト実装
- 特徴工学 (その 1)
- 特徴工学 (その 2): テキストデータの展開、フィルタリング、ブロック化
- 特徴工学 (その 3): 特徴スケーリング、Bag of Words から TF-IDF へ
- 特徴工学 (その 4): カテゴリカル特徴
- 特徴工学 (その 5): PCA による次元削減
- 特徴工学 (その 6): 非線形特徴抽出とモデルスタッキング
- 特徴工学 (その 7): 画像特徴抽出とディープラーニング
- 新しい決定木統合カスケード構造 gcForest を使って特徴工学とスコアリングを行うには?
- Machine Learning Yearning 中文翻訳稿
リソースを随時更新中
ディープラーニング、機械学習、データ分析、Python
公式アカウントを検索して追加:datayx