[OSS紹介#13] FUNSD:スキャン文書からの情報抽出を実現する強力なデータセット

この記事について

このブログシリーズでは、注目のオープンソースソフトウェア(OSS)を定期的に紹介しており、今回で第3回目となります。前回までの2回では、ドキュメントレイアウト解析に特化した「DocLayNet」と「PubLayNet」を取り上げましたが、今回は「FUNSD」に焦点を当てます。

「FUNSD」は、ノイズの多いスキャンドキュメントの理解を目的としたデータセットで、文書から情報を抽出するタスクに特に有用です。このデータセットは、テキスト検出や光学式文字認識、空間レイアウト解析、フォームの理解など、文書処理における多くの技術に活用されています。私たちの紹介する「FUNSD」は、画像解析や機械学習の研究者にとって欠かせないリソースとなるでしょう。また、異なるバージョンのデータセットも提供されており、それぞれが特定のニーズに応じた情報抽出技術の向上に寄与しています。これを通じて、文書理解に関する基盤技術の発展が期待されます。

リンク:https://github.com/crcresearch/FUNSD


本コンテンツは、弊社AI開発ツール「IXV」を用いたOSSツール紹介です。情報の正確性には努めておりますが、内容に誤りが含まれる可能性がございますのでご了承ください。

1. FUNSDツールでできること

FUNSD (Form Understanding in Noisy Scanned Documents)は、スキャンした文書から情報を抽出し、理解するために使用されるデータセットです。このツールは特に以下のタスクに役立ちます。

  • テキスト検出: 文書内のテキストを正確に見つけ出します。
  • 光学文字認識 (OCR): スキャンした画像からテキストを認識し、デジタル化します。
  • 空間レイアウト分析: 文書内の要素の配置を解析し、関係性を理解します。
  • フォーム理解: フォームの構造を理解し、重要な情報を抽出します。

FUNSDデータセットには、199枚の文書画像が含まれており、これらは低解像度かつノイズが含まれるスキャン文書から構成されています。データセットの各画像には、関連するメタデータが含まれており、文書内の意味的なエンティティがリスト化されています。

2. セットアップ手順

FUNSDデータセットを取得するには、以下の方法があります。

2.1 データセットの取得

  • FUNSDデータセットは、こちらのリンクからダウンロードできます。
  • Azure AI Document Intelligenceサービスを使用して、画像に対するアノテーションを生成することも可能です。以下のコマンドを実行して、DVCを使用してデータセットをダウンロードできます。
# 仮想環境内で実行
pip install dvc[ssh]
dvc get https://github.com/crcresearch/FUNSD datasets/FUNSD

注意: 上記のコマンドを実行すると、CRCクラスターへのSSHパスワードの入力を求められる場合があります。

  • もう一つのダウンロードリンクは、こちらです。

2.2 動作環境およびライセンス

FUNSDデータセットは、非商業目的、研究、教育目的で使用することが許可されています。動作環境としては、PythonとDVCが必要です。

3. 簡単な使い方

FUNSDデータセットを使用するための基本的な手順は以下の通りです。

3.1 データの準備

ダウンロードしたデータセットを解凍し、必要なファイルを整理します。データセットには、画像ファイルとそれに対応するJSON形式のメタデータファイルが含まれています。

3.2 アノテーションの可視化

FUNSDデータセットのアノテーションを可視化するための基本的なPythonコードを以下に示します。

pythonimport os, sys 
sys.path.append('../src')
from utils import funsd_plot_annotations

# ディレクトリパスの設定
DATASET_ROOT = '../datasets/FUNSD'
TRAIN_ANNOT_DIR = os.path.join(DATASET_ROOT, 'training_data/annotations/')
TRAIN_IMG_DIR = os.path.join(DATASET_ROOT, 'training_data/images/')

# 特定のドキュメントの可視化例
doc_name = '00040534'
image_fpath = os.path.join(TRAIN_IMG_DIR, f"{doc_name}.png")
annot_fpath = os.path.join(TRAIN_ANNOT_DIR, f"{doc_name}.json")

# アノテーションの可視化実行
funsd_plot_annotations(image_fpath, annot_fpath)

このコードを実行すると、FUNSDデータセットの特定のドキュメント(この例では00040534.png)に対するアノテーションが可視化されます。

funsd_plot_annotations関数は以下のように実装されています:

pythondef funsd_plot_annotations(image_path, annotations_path):
    # 画像の読み込み
    image = Image.open(image_path)

    # アノテーションの読み込み
    with open(annotations_path, 'r') as f:
        annotations = json.load(f)

    # プロットの作成
    fig, ax = plt.subplots(1, figsize=(15, 20))
    ax.imshow(image)

    # 各アノテーションのプロット
    for annotation in annotations['form']:
        box = annotation['box']
        x, y, w, h = box[0], box[1], box[2] - box[0], box[3] - box[1]
        rect = patches.Rectangle((x, y), w, h, linewidth=2, edgecolor='r', facecolor='none')
        ax.add_patch(rect)
        #plt.text(x, y - 5, annotation['text'], color='red', fontsize=12, weight='bold')

    # 画像に合わせて軸の範囲を設定
    ax.set_xlim([0, image.width])
    ax.set_ylim([image.height, 0])
    ax.axis('off')  # 軸を非表示
    plt.show()

この関数は、画像とそれに対応するアノテーションJSONファイルを読み込み、画像上にアノテーションのバウンディングボックスを赤い矩形で表示します。コメントアウトされている部分を有効にすると、各アノテーションのテキスト内容も表示されます。

このコードはFUNSDノートブックに記載されています。

3.3 追加のデータセット

FUNSDの改訂版や拡張版も利用可能で、これらを使用することでより多様なドキュメント理解タスクに対応できます。これらのデータセットへのアクセス方法も、FUNSDと同様の手順で行えます。

結論

FUNSDは、スキャンした文書の理解と情報抽出のための強力なツールです。テキスト検出や光学文字認識などのタスクに特化しており、研究や教育の分野で幅広く利用されています。データセットの取得とセットアップは比較的容易であり、各種のアノテーションや可視化ツールも提供されているため、実際のプロジェクトに迅速に適用できる点が魅力です。興味のある方は、ぜひ公式リポジトリを訪れてみてください。