Chandra OCR 2 がオープンソース化!公式ベンチマークで 85.9 点を獲得し、GPT-4o の 69.9 点を圧倒

Chandra OCR 2 のデモ画像

AI への転身を目指すエンジニアの皆さん、機械学習 AI アルゴリズムエンジニアリングをフォローしてください。

Chandra OCR 2 ロゴ

皆さんは毎日、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 の構造図

端的に言えば、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 2GPT-4oTesseractPaddleOCR
総合精度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 2GPT-4o (API)Tesseract
最小 VRAM4GBN/A0GB (CPU)
推奨 VRAM8-12GBN/AN/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 コード

画像を長押しして QR コードをスキャン

この記事を読んだ方は、こちらの記事も読んでいます:

リソースを随時更新中

ディープラーニング、機械学習、データ分析、Python

公式アカウントを検索して追加:datayx

QR コード 2

関連記事

分享網址
AINews·AI 新聞聚合平台
© 2026 AINews. All rights reserved.