お問い合わせ

ブログ

これまでに経験してきたプロジェクトで気になる技術の情報を紹介していきます。

画像から表を自動で抽出!PaddleOCR × Pandas で簡単データ化

Kitaru Kitaru 1 month
画像から表を自動で抽出!PaddleOCR × Pandas で簡単データ化

はじめに

スキャンした請求書、帳票、領収書など「画像として保存された表データ」を、手作業で Excel に入力していませんか?

本記事では、Python ライブラリ PaddleOCR の中のドキュメント構造解析機能である PP-StructureV3 を使って、画像内の表を自動で読み取り、pandasDataFrame 形式で取り出す方法 を解説します。

なぜ PaddleOCR を選んだのか?

OCR ライブラリには Tesseract OCREasyOCR などもありますが、これらを試した結果、PaddleOCR が最も文字認識の精度が高く、文字列検出能力に優れていました。

また、表構造を自動で認識し HTML 形式で出力できる機能(PP-StructureV3)は、他の OCR ライブラリにはなく、表データの自動抽出に最適だったため、PaddleOCR を採用しています。

使用パッケージ

パッケージ 用途・説明
paddleocr OCR 処理を行うツール群。文字認識や文書構造解析(PP-StructureV3)により表やレイアウト検出も可能
paddlepaddle PaddleOCR の動作に必要な深層学習フレームワーク。PaddleOCR の演算エンジンとして機能する
setuptools Python のモジュールを構築・配布するための支援ツール。未インストール時は PaddleOCR 実行時にエラーが発生
pandas 表形式データの操作や変換を行うためのデータ分析ライブラリ。HTML テーブルの読み込みなどに利用
jupyter コードの実行や可視化を対話的に行える開発環境。実験や検証、デバッグに便利

環境構築(Windows + CPU 版の例)

Python バージョンの確認

まず、Python のバージョン 3.9~3.13 がインストールされていることを確認してください。
ターミナル(PowerShell)で以下のコマンドを実行します。

PS> python --version
Python 3.13.3

仮想環境の作成と有効化

他のプロジェクトと依存関係が混ざらないよう、仮想環境を作成します。

# 仮想環境の作成
PS> python -m venv .venv

# 仮想環境の有効化
PS> .\.venv\Scripts\activate
(.venv) PS> 

必要なパッケージのインストール

以下の順番で必要なパッケージをインストールしていきます。

pip のアップグレード

(.venv) PS> python -m pip install --upgrade pip

PaddlePaddle(CPU 版)

(.venv) PS> python -m pip install paddlepaddle==3.0.0 -i https://www.paddlepaddle.org.cn/packages/stable/cpu/

ℹ️ GPU 版や他の OS でのインストール方法は、以下の公式ページを参照してください:
https://www.paddlepaddle.org.cn/en/install/quick?docurl=/documentation/docs/en/develop/install/pip/windows-pip_en.html

PaddleOCR

(.venv) PS> python -m pip install paddleocr

setuptools

(.venv) PS> python -m pip install setuptools

開発補助ツール(任意)のインストール

以下は PaddleOCR の実行に必須ではありませんが、作業効率を上げるためにインストールしておくと便利です。

Jupyter Notebook(ノート形式での実行・デバッグ用)

(.venv) PS> python -m pip install notebook

pandas(OCR 結果を DataFrame として扱いたい場合)

(.venv) PS> python -m pip install pandas

検証画像

以下は勤怠の画像ファイルです。
この画像を解析して DataFrame に変換します。

勤怠画像(表形式)

表抽出の実行コード(最小構成)

以下のコードで、画像内の表を自動的に抽出・解析し、DataFrame に変換できます。

from paddleocr import PPStructureV3
import pandas as pd

# 表構造認識用の OCR エンジンを初期化
engine = PPStructureV3()

# 処理対象の画像パスを指定(表が写っている画像)
img_path = 'kintai.png'

# 画像から表構造を解析(表があると判断された領域ごとに結果が返る)
results = engine.predict(img_path)

# 最初の表領域の情報を取り出す(通常1画像に1表のケースが多いため)
res = results[0]

# 表の HTML 構造を取得(PPStructureV3 が出力する推定結果)
table_res_list = res.get('table_res_list', [])

# 表構造 HTML を取得(予測結果があれば1つ目を使用)
html = table_res_list[0].get('pred_html', '') if table_res_list else ''

# HTML 構造が取得できていれば、それを pandas で DataFrame に変換
if html:
    try:
        # pandas.read_html は HTMLの table タグを自動で解析して DataFrame に変換する
        dfs = pd.read_html(html)
        df = dfs[0]  # 最初のテーブルだけ取り出す(通常1つ)
        display(df)  # JupyterでDataFrameをきれいに表示
    except Exception as e:
        print("HTML 解析中にエラーが発生しました:")
        print(e)
else:
    print("表のHTML構造が取得できませんでした。")

実行結果

display により DataFrame の内容が下記のように出力されます。

表の抽出結果DataFrame

解説のポイント

PPStructureV3 とは?

  • PaddleOCR が提供する表構造解析用の OCR エンジン
  • 画像内のテキストだけでなく、セル・行・列といった表の構造も認識
  • 認識結果を HTML 形式で出力可能

table_res_list とは?

  • PPStructureV3 の predict() が返す結果に含まれるキー
  • 画像内に存在する各表の解析結果を格納したリスト

table_res_list の構造

'table_res_list': [
    {
        'cell_box_list': [ ... ],        # 各セルの座標(矩形)
        'neighbor_texts': '',            # 周辺テキスト(未使用/空)
        'pred_html': '...', # 表のHTML構造(DataFrame化に使用)
        'table_ocr_pred': {
            'rec_boxes': [ ... ],        # 各テキストのバウンディングボックス
            'rec_polys': [ ... ],        # テキストの多角形領域
            'rec_scores': [ ... ],       # テキストごとの信頼度(0〜1)
            'rec_texts': [ ... ],        # 認識された文字列
        },
        'table_region_id': 1             # 複数表がある場合の識別ID
    }
]

各フィールドの補足説明

  • cell_box_list
    各セルの 矩形領域(座標)情報 が含まれています。
    表の物理的なレイアウト(セルの位置・サイズ)を再構築する際に利用できます。
  • pred_html
    予測された HTML 形式の表構造です。
    pandas.read_html() にそのまま渡して、DataFrame に変換できます。
  • table_ocr_pred
    OCR の生出力が格納されています。
    各セル内の文字について、位置情報・内容・信頼度 などの詳細な情報を取得可能です。

pandas.read_html の強み

  • HTML の table タグを自動的に解析して、DataFrame に変換できます。
  • rowspancolspan による結合セルにも対応しています。
  • Jupyter Notebook 上で、表形式として簡単に表示・操作が可能です。

注意点

  • GPU が搭載されていない低スペックな PC では、画像解析に数分かかる場合があります。
  • pandas.read_html() を使用すると、HTML テーブル内で rowspancolspan によって結合されているセルも、自動的に分割されます。そのため、DataFrame 上では通常の行・列として扱われる形になります。
  • 結合セルの構造を正確に再現したい場合や、細かく制御したい場合には、
    BeautifulSoup
    などを用いて手動で処理する必要があります。
  • PaddleOCR が出力する HTML は、あくまで予測結果です。読み取り精度には限界があります(手動補正も必要になることがあります)
  • 表や文字列がうまく検出されない場合は、画像の前処理(解像度の向上やノイズ除去など)を行うことで、精度が改善することがあります。

応用:DataFrame を Excel に保存

認識された表は、以下のようにして Excel ファイルとして保存できます。

df.to_excel('output.xlsx', index=False)

おわりに

PaddleOCR の表構造解析機能(PPStructureV3)を活用することで、次のような処理が可能になります:

  • 画像内の表を自動的に検出・解析
  • 表構造を HTML 形式で取得
  • HTML を pandas で読み取り、Excel や CSV 形式に変換

これにより、帳票処理やレポート集計といった業務の自動化・効率化が実現できます。

画像から表を自動で抽出!PaddleOCR × Pandas で簡単データ化 2025-07-18 15:47:04

コメントはありません。

4831

お気軽に
お問い合わせください。

お問い合わせ
gomibako@aska-ltd.jp