ホームページ > バックエンド開発 > Python チュートリアル > クイック アンド ダーティ ドキュメント分析: Python で GOT-OCR と LLama を組み合わせる

クイック アンド ダーティ ドキュメント分析: Python で GOT-OCR と LLama を組み合わせる

DDD
リリース: 2025-01-09 12:14:41
オリジナル
675 人が閲覧しました

画像に対して OCR LLM 分析を行う方法を見てみましょう。これは数十年の経験を持つ専門家によって与えられる最善の方法でしょうか?あまり。しかし、それは実生活でも同様のアプローチを取る人からのものです。これは、本番環境に対応したコードではなく、実用的なスニペットを含む週末のプロジェクト バージョンと考えてください。掘り下げてみましょう!

ここでの私たちの目標は何でしょうか?

画像 (または PDF) を取得し、OCR を使用してそこからテキストを抽出し、LLM を使用してそのテキストを分析して有用なメタデータを取得できる単純なパイプラインを構築します。これは、文書を自動的に分類したり、受信した通信を分析したり、スマートな文書管理システムを構築したりする場合に便利です。私たちはいくつかの人気のあるオープンソース ツールを使用してこれを実行し、物事を比較的簡単に保ちます。

そう、以下の内容はすべて、あなたがすでに HF 変圧器にかなり慣れていることを前提としています。そうでない場合は、https://huggingface.co/docs/transformers/en/quicktour をチェックしてください。始めるには確実な場所だと思われます。私はやったことはなく、例から学んだだけですが。必ずやります...最終的には。

どのようなパッケージが必要ですか?

力仕事にはトーチと変圧器を使用し、さらにユーザーフレンドリーなコンソール出力で作業を楽にするために pymupdf とリッチを使用します (私はリッチなものが好きなので、基本的には楽しみのために使用しています)。

import json
import time
import fitz

import torch
from transformers import AutoModel, AutoTokenizer, pipeline

from rich.console import Console
console = Console()
ログイン後にコピー
ログイン後にコピー

画像を準備する

まず、入力としてどの画像を使用すればよいでしょうか?ここでは主なジョブに Hugging Face を使用しているため、主要な Web ページの最初のページをテスト対象として使用しましょう。これは、テキストと複雑な書式設定の両方を備えた優れた候補であり、OCR のペースを試すのに最適です。

That landing page of HF that was mentioned above

より現実的な解決策として、入力が PDF であると仮定しましょう (現実の世界では、おそらく PDF を扱うことになるでしょう)。モデルが処理できるように、これを PNG 形式に変換する必要があります:

INPUT_PDF_FILE = "./data/ocr_hf_main_page.pdf"
OUTPUT_PNG_FILE = "./data/ocr_hf_main_page.png"

doc = fitz.open(INPUT_PDF_FILE)
page = doc.load_page(0)
pixmap = page.get_pixmap(dpi=300)
img = pixmap.tobytes()

with console.status("Converting PDF to PNG...", spinner="monkey"):
    with open(OUTPUT_PNG_FILE, "wb") as f:
        f.write(img)
ログイン後にコピー
ログイン後にコピー

ここで実際の OCR を実行します

このタスクのためにさまざまな OCR ソリューションを試してきました。確かに、tesseract や他にもたくさんのオプションがあります。ただし、私のテスト ケースでは、GOT-OCR2_0 (https://huggingface.co/stepfun-ai/GOT-OCR2_0) で最良の結果が得られました。それでは、早速本題に入りましょう:

tokenizer = AutoTokenizer.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    device_map="cuda",
    trust_remote_code=True,
)
model = AutoModel.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    trust_remote_code=True,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    pad_token_id=tokenizer.eos_token_id,
)
model = model.eval().cuda()
ログイン後にコピー
ログイン後にコピー

ここで何が起こっているのですか?そうですね、デフォルトの AutoModel と AutoTokenizer ですが、唯一十分に特別な部分は、cuda を使用するようにモデルを設定していることです。そして、これはオプションではありません。モデルを実行するには CUDA サポートが必要です。

モデルを定義したので、実際に保存したファイルで動作させてみましょう。また時間を計測して印刷いたします。さまざまなモデルと比較するだけでなく、自分のユースケースでこれほど長く待機することが可能かどうかを理解するのにも役立ちます (ただし、このケースでは非常に高速です):

import json
import time
import fitz

import torch
from transformers import AutoModel, AutoTokenizer, pipeline

from rich.console import Console
console = Console()
ログイン後にコピー
ログイン後にコピー

元の画像から得られるものは次のとおりです。

INPUT_PDF_FILE = "./data/ocr_hf_main_page.pdf"
OUTPUT_PNG_FILE = "./data/ocr_hf_main_page.png"

doc = fitz.open(INPUT_PDF_FILE)
page = doc.load_page(0)
pixmap = page.get_pixmap(dpi=300)
img = pixmap.tobytes()

with console.status("Converting PDF to PNG...", spinner="monkey"):
    with open(OUTPUT_PNG_FILE, "wb") as f:
        f.write(img)
ログイン後にコピー
ログイン後にコピー

^ すべてのテキスト、書式設定はありませんが、これは意図的です。

GOT-OCR2_0 は非常に柔軟で、HTML などのさまざまな形式で出力できます。他にも次のような使用方法があります:

tokenizer = AutoTokenizer.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    device_map="cuda",
    trust_remote_code=True,
)
model = AutoModel.from_pretrained(
    "ucaslcl/GOT-OCR2_0",
    trust_remote_code=True,
    low_cpu_mem_usage=True,
    use_safetensors=True,
    pad_token_id=tokenizer.eos_token_id,
)
model = model.eval().cuda()
ログイン後にコピー
ログイン後にコピー

最後にLLMを試してみる

ここからは楽しい部分です - LLM を選択します。どれが一番良いかについては終わりのない議論があり、どこを見ても記事があります。しかし、簡単にしてみましょう。誰もが、そして彼らの犬が聞いたことがある LLM とは何でしょうか?ラマ。そこで、Llama-3.2-1B を使用してテキストを処理します。

このテキストから何が得られるでしょうか?テキスト分類、感情分析、言語検出などの基本的なことを考えてください。アップロードされた文書を自動的に分類したり、薬局向けに受信した FAX を分類したりするシステムを構築していると想像してください。

プロンプト エンジニアリングの詳細については省略します (これはまったく別の記事であり、今後も書くつもりはありません) が、基本的な考え方は次のとおりです。

def run_ocr_for_file(func: callable, text: str):
    start_time = time.time()
    res = func()
    final_time = time.time() - start_time

    console.rule(f"[bold red] {text} [/bold red]")
    console.print(res)
    console.rule(f"Time: {final_time} seconds")

    return res

result_text = None
with console.status(
    "Running OCR for the result file...",
    spinner="monkey",
):
    result_text = run_ocr_for_file(
        lambda: model.chat(
            tokenizer,
            OUTPUT_PNG_FILE,
            ocr_type="ocr",
        ),
        "plain texts OCR",
    )
ログイン後にコピー

ところで、私はここでプロンプト/コンテンツに関して何か陽気で愚かなことをしているでしょうか?お知らせ下さい。 「プロンプト エンジニアリング」についてはかなり初心者で、まだ十分に真剣に受け止めていません。

モデルは結果をマークダウン コード ブロックでラップすることがあるので、それを処理する必要があります (誰かがもっときれいな方法を知っているなら、私は全力で耳を傾けます)。

Hugging Face- The Al community building the future.  https: / / hugging face. co/  Search models, datasets, users. . .  Following 0
All Models Datasets Spaces Papers Collections Community Posts Up votes Likes New Follow your favorite Al creators Refresh List black-
forest- labs· Advancing state- of- the- art image generation Follow stability a i· Sharing open- source image generation models
Follow bria a i· Specializing in advanced image editing models Follow Trending last 7 days All Models Datasets Spaces deep see k- a
i/ Deep Seek- V 3 Updated 3 days ago· 40 k· 877 deep see k- a i/ Deep Seek- V 3- Base Updated 3 days ago· 6.34 k· 1.06 k 2.39 k
TRELLIS Q wen/ QV Q- 72 B- Preview 88888888888888888888 888888888888888888 301 Gemini Co der 1 of 3 2025-01-01,9:38 p. m
ログイン後にコピー

そして、通常、出力として得られるものは次のとおりです。

# format texts OCR:
result_text = model.chat(
  tokenizer,
  image_file,
  ocr_type='format',
)

# fine-grained OCR:
result_text = model.chat(
  tokenizer,
  image_file,
  ocr_type='ocr',
  ocr_box='',
)
# ... ocr_type='format', ocr_box='')
# ... ocr_type='ocr', ocr_color='')
# ... ocr_type='format', ocr_color='')

# multi-crop OCR:
# ... ocr_type='ocr')
# ... ocr_type='format')

# render the formatted OCR results:
result_text = model.chat(
  tokenizer,
  image_file,
  ocr_type='format',
  render=True,
  save_render_file = './demo.html',
)
ログイン後にコピー

総括する

私たちは、PDF を取得し、非常に優れた OCR を使用してそのテキストを抽出し、LLM を使用してそのテキストを分析して有用なメタデータを取得できる小さなパイプラインを構築しました。本番環境に対応していますか?おそらくそうではありません。ただし、同様のものを構築したい場合には、これは確実な出発点になります。素晴らしいのは、さまざまなオープンソース ツールを組み合わせて、PDF 処理から OCR、LLM 分析まで、役立つものを作成したことです。

これは簡単に拡張できます。おそらく、より適切なエラー処理、複数ページのサポートを追加するか、別の LLM を試してください。あるいは、文書管理システムに接続することもできます。そう願っています。楽しい作業かもしれません。

これは単なる 1 つの方法であることに注意してください。おそらく、特定の使用例に適した他のアプローチが何十もあるでしょう。ただし、これが独自の実験の良い出発点となることを願っています。または、コメントでその方法を教えてもらうのに最適な場所です。

以上がクイック アンド ダーティ ドキュメント分析: Python で GOT-OCR と LLama を組み合わせるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート