画像中のテーブルの行と列をトランスフォーマーを使用して検出する

画像中のテーブルの行と列をトランスフォーマーで検出する

はじめに

非構造化データを扱ったことがあり、ドキュメント内のテーブルの存在を検出する方法を考えたことはありますか?ドキュメントを迅速に処理するための方法を提供しますか?この記事では、トランスフォーマーを使用して、テーブルの存在だけでなく、テーブルの構造を画像から認識する方法を見ていきます。これは、2つの異なるモデルによって実現されます。1つはドキュメント内のテーブルの検出のためのもので、もう1つはテーブル内の個々の行と列を認識するためのものです。

学習目標

  • 画像上のテーブルの行と列を検出する方法
  • Table TransformersとDetection Transformer(DETR)の概要
  • PubTables-1Mデータセットについて
  • Table Transformerでの推論の実行方法

ドキュメント、記事、PDFファイルは、しばしば重要なデータを伝えるテーブルを含む貴重な情報源です。これらのテーブルから情報を効率的に抽出することは、異なるフォーマットや表現の間の課題により複雑になる場合があります。これらのテーブルを手動でコピーまたは再作成するのは時間がかかり、ストレスがかかることがあります。PubTables-1Mデータセットでトレーニングされたテーブルトランスフォーマーは、テーブルの検出、構造の認識、および機能分析の問題に対処します。

この記事はData Science Blogathonの一環として公開されました。

この方法はどのように実現されたのですか?

これは、PubTables-1Mという名前の大規模な注釈付きデータセットを使用して、記事などのドキュメントや画像を検出するためのトランスフォーマーモデルであるTable Transformerによって実現されました。このデータセットには約100万のパラメータが含まれており、いくつかの手法を用いて実装されており、モデルに最先端の感触を与えています。効率性は、不完全な注釈、空間的な整列の問題、およびテーブルの構造の一貫性の課題に取り組むことで達成されました。モデルとともに公開された研究論文では、テーブルの構造認識(TSR)と機能分析(FA)のジョイントモデリングにDetection Transformer(DETR)モデルを活用しています。したがって、DETRモデルは、Microsoft Researchが開発したTable Transformerが実行されるバックボーンです。DETRについてもう少し詳しく見てみましょう。

DEtection TRansformer(DETR)

前述のように、DETRはDEtection TRansformerの略であり、エンコーダーデコーダートランスフォーマーを使用したResNetアーキテクチャなどの畳み込みバックボーンから構成されています。これにより、オブジェクト検出のタスクを実行する潜在能力を持っています。DETRは、領域提案、非最大値抑制、アンカー生成などの複雑なモデル(Faster R-CNNやMask R-CNNなど)を必要としないアプローチを提供します。バイパーティットマッチングロスと呼ばれる損失関数により、エンドツーエンドでトレーニングすることができます。これらすべては、PubTables-1M上の実験を通じて使用され、正準データの重要性がパフォーマンスの向上にどのような影響を与えるかを示しています。

PubTables-1Mデータセット

PubTables-1Mは、表の抽出の分野への貢献です。科学論文から収集された表のコレクションから作成されました。このデータセットは入力形式をサポートし、テーブルモデリング戦略のための詳細なヘッダーと位置情報を含んでおり、非常に優れています。PubTables-1Mの特徴的な特徴は、過剰セグメンテーションから生じるグラウンドトゥルースの不整合性に対処して正確性を向上させることです。

Source: Smock et al. (2021)

PubTables-1MでのTable Transformerのトレーニング実験は、データセットの効果を示しています。前述のように、トランスフォーマーベースのオブジェクト検出、特にDETRモデルは、テーブルの検出、構造の認識、および機能分析のタスクにおいて優れたパフォーマンスを発揮します。その結果は、正準データがモデルの精度と信頼性の向上にどれだけ影響を与えるかを示しています。

PubTables-1Mデータセットの正規化

PubTables-1Mの重要な側面は、革新的な正規化プロセスです。これにより、グラウンドトゥルースの注釈における過剰セグメンテーションに起因する曖昧さが解決されます。正規化アルゴリズムは、テーブルの論理的な構造と整列させるために注釈を修正することで、表の信頼性を向上させます。これは、データセットの信頼性に影響を与え、パフォーマンスにも影響を与えます。

Inference Table Transformerの実装

Table Transformerを使った推論を実装します。まず、Hugging Faceリポジトリからtransformersライブラリをインストールします。この記事の完全なコードはこちらでご覧いただけます。または、こちらのリンクをご覧ください:https://github.com/inuwamobarak/detecting-tables-in-documents

!pip install -q git+https://github.com/huggingface/transformers.git

次に、モデル、トレーニング手順、ユーティリティのための人気のあるライブラリ「timm」をインストールします。

# 'timm'ライブラリをpipを使ってインストールします
!pip install -q timm

次に、推論を実行したい画像を読み込むことができます。ここでは、Huggingfaceのリポジトリからカスタムのデータセットを追加しました。これを使用するか、データに合わせて調整してください。以下にこのコードのGitHubリポジトリへのリンクとその他の元のリンクを提供しています。

# 必要なライブラリをインポートします
from huggingface_hub import hf_hub_download
from PIL import Image

# 指定したHugging Faceリポジトリと場所からファイルをダウンロードします
file_path = hf_hub_download(repo_id="inuwamobarak/random-files", repo_type="dataset", filename="Screenshot from 2023-08-16 22-30-54.png")

# ダウンロードした画像をPILライブラリを使って開き、RGB形式に変換します
image = Image.open(file_path).convert("RGB")

# 画像の元の幅と高さを取得します
width, height = image.size

# 画像のサイズを元の寸法の50%にリサイズします
resized_image = image.resize((int(width * 0.5), int(height * 0.5)))

上記の画像でテーブルを検出し、行と列を認識します。

いくつかの基本的な前処理タスクを実行しましょう。

# TransformersライブラリからDetrFeatureExtractorクラスをインポートします
from transformers import DetrFeatureExtractor

# DetrFeatureExtractorのインスタンスを作成します
feature_extractor = DetrFeatureExtractor()

# 画像をエンコードするために特徴抽出器を使用します
# 'image'は先に取得したPIL画像オブジェクトである必要があります
encoding = feature_extractor(image, return_tensors="pt")

# エンコーディング辞書のキーを取得します
keys = encoding.keys()

次に、Microsoftのテーブルトランスフォーマーをロードします。

# TransformersライブラリからTableTransformerForObjectDetectionクラスをインポートします
from transformers import TableTransformerForObjectDetection

# 事前学習済みのTable Transformerモデルをオブジェクト検出のためにロードします
model = TableTransformerForObjectDetection.from_pretrained("microsoft/table-transformer-detection")

import torch

# 推論では勾配計算を無効にします
with torch.no_grad():
    # エンコードされた画像をモデルに渡して推論を行います
    # 'model'は先にロードしたTableTransformerForObjectDetectionモデルです
    # 'encoding'にはDetrFeatureExtractorを使用して取得したエンコードされた画像特徴が含まれています
    outputs = model(**encoding)

結果をプロットすることができます。

import matplotlib.pyplot as plt

# 可視化のための色を定義します
COLORS = [[0.000, 0.447, 0.741], [0.850, 0.325, 0.098], [0.929, 0.694, 0.125],
          [0.494, 0.184, 0.556], [0.466, 0.674, 0.188], [0.301, 0.745, 0.933]]

def plot_results(pil_img, scores, labels, boxes):
    # 可視化のための図を作成します
    plt.figure(figsize=(16, 10))
    
    # PIL画像を表示します
    plt.imshow(pil_img)
    
    # 現在の軸を取得します
    ax = plt.gca()
    
    # 可視化のためにCOLORSリストを複数回繰り返します
    colors = COLORS * 100
    
    # 可視化のためにスコア、ラベル、ボックス、色をイテレーションします
    for score, label, (xmin, ymin, xmax, ymax), c in zip(scores.tolist(), labels.tolist(), boxes.tolist(), colors):
        # 検出されたオブジェクトのバウンディングボックス用に画像に長方形を追加します
        ax.add_patch(plt.Rectangle((xmin, ymin), xmax - xmin, ymax - ymin,
                                   fill=False, color=c, linewidth=3))
        
        # ラベルとスコアのテキストを準備します
        text = f'{model.config.id2label[label]}: {score:0.2f}'
        
        # ラベルとスコアのテキストを画像に追加します
        ax.text(xmin, ymin, text, fontsize=15,
                bbox=dict(facecolor='yellow', alpha=0.5))
    
    # 軸をオフにします
    plt.axis('off')
    
    # 可視化を表示します
    plt.show()

# 画像の元の幅と高さを取得します
width, height = image.size

# フィーチャー抽出器を使用してオブジェクト検出の出力を後処理します
results = feature_extractor.post_process_object_detection(outputs, threshold=0.7, target_sizes=[(height, width)])[0]

# 結果の可視化をプロットします
plot_results(image, results['scores'], results['labels'], results['boxes'])
テーブルの検出

したがって、テーブルの検出には成功しましたが、行と列の認識はまだできていません。それを行いましょう。この目的のために別の画像をロードします。

# 必要なライブラリをインポートする
from huggingface_hub import hf_hub_download
from PIL import Image

# 指定されたHugging Faceリポジトリと場所から画像ファイルをダウンロードする
# ユースケースに応じて提供された'repo_id'のいずれかの行を使用します
file_path = hf_hub_download(repo_id="nielsr/example-pdf", repo_type="dataset", filename="example_table.png")
# file_path = hf_hub_download(repo_id="inuwamobarak/random-files", repo_type="dataset", filename="Screenshot from 2023-08-16 22-40-10.png")

# PILライブラリを使用してダウンロードした画像を開き、RGB形式に変換する
image = Image.open(file_path).convert("RGB")

# 画像の元の幅と高さを取得する
width, height = image.size

# 画像のサイズを元の寸法の90%にリサイズする
resized_image = image.resize((int(width * 0.9), int(height * 0.9)))
認識用のサンプルテーブル

さて、上記の画像を準備しましょう。

# リサイズされた画像のエンコードに特徴抽出器を使用する
encoding = feature_extractor(image, return_tensors="pt")

# エンコーディング辞書のキーを取得する
keys = encoding.keys()

次に、前述のようにTransformerモデルをロードすることができます。

# transformersライブラリからTableTransformerForObjectDetectionクラスをインポートする
from transformers import TableTransformerForObjectDetection

# テーブルの構造認識のための事前学習済みTable Transformerモデルをロードする
model = TableTransformerForObjectDetection.from_pretrained("microsoft/table-transformer-structure-recognition")

with torch.no_grad():
  outputs = model(**encoding)

結果を視覚化することができます。

# 後処理のためのターゲットサイズのリストを作成する
# 'image.size[::-1]'は幅と高さを入れ替えてターゲットサイズの形式(高さ、幅)に合わせます
target_sizes = [image.size[::-1]]

# 特徴抽出器を使用してオブジェクト検出の出力を後処理する
# 確信度の閾値には0.6を使用する
results = feature_extractor.post_process_object_detection(outputs, threshold=0.6, target_sizes=target_sizes)[0]

# 結果の視覚化をプロットする
plot_results(image, results['scores'], results['labels'], results['boxes'])
認識された行と列

以上です。テーブルを試してみて、どうなるか確認してください。Transformersを使用した興味深いチュートリアルをもっと見るために、GitHubと私のソーシャルメディアをフォローしてください。また、この情報が役立つ場合は、以下にコメントを残してください。

結論

非構造化情報からの洞察を得る可能性は以前よりも明るいものになっています。テーブル検出の主な成功例は、PubTables-1Mデータセットと正準化の導入です。テーブルの抽出とフィールドを再構築した革新的なソリューションを見てきました。正準化を適用することで一貫性のある正解アノテーションを実現し、過剰セグメンテーションに対処しました。アノテーションをテーブルの構造に合わせて整列させることで、データセットの信頼性と精度が向上し、堅牢なモデル性能を実現する道を開拓しました。

主なポイント

  • PubTables-1Mデータセットは、科学論文からのアノテーション付きテーブルの配列を提供し、テーブル抽出を革新しています。
  • 正準化という革新的な概念が正解の不一致の課題に取り組んでいます。
  • Transformerベースのオブジェクト検出モデル、特にDetection Transformer(DETR)は、テーブルの検出、構造認識、機能解析のタスクに優れています。

よくある質問

参考文献

  • GitHubリポジトリ:https://github.com/inuwamobarak/detecting-tables-in-documents
  • Smock, B., Pesala, R., & Abraham, R. (2021). PubTables-1M: 非構造化ドキュメントからの包括的なテーブル抽出に向けて. ArXiv. /abs/2110.00061
  • https://arxiv.org/abs/2110.00061
  • Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. (2020). トランスフォーマーによるエンドツーエンドのオブジェクト検出. ArXiv. /abs/2005.12872
  • https://huggingface.co/docs/transformers/model_doc/detr
  • https://huggingface.co/docs/transformers/model_doc/table-transformer
  • https://huggingface.co/microsoft/table-transformer-detection
  • https://huggingface.co/microsoft/table-transformer-structure-recognition

この記事に掲載されているメディアはAnalytics Vidhyaの所有物ではなく、著者の裁量により使用されています。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more