資料画像に含まれる表の構造を認識するプログラムを公開しています。
座標付きのOCRテキストデータと組み合わせることで表中に含まれるテキストデータを構造化する用途に利用できます。
参考(外部リンク):次世代デジタルライブラリーへの新機能(表の構造化)の追加及び新機能のソースコード及びデータセットの公開について
本プログラムにより、国立国会図書館が公開しているNDLTableSetを学習した機械学習モデルによる表構造の推論を行えるほか、LORE-TSR(外部リンク)と同様の方法により別途利用者が用意したデータセットによる再学習を行うことが可能です。
注意
本プログラムが推論できるのは、表の構造情報(各セルの矩形座標及びセル間の関係性を表す数値情報)であるので、プログラム単体でOCR処理プログラムとして利用することはできません。
次世代デジタルライブラリーの機能と同様の処理を行うためには、別途座標付きテキストデータを出力するOCR処理プログラムが必要です。
git clone https://github.com/ndl-lab/ndltsr
コンテナ内でCUDA 11.8を利用します。
ホストマシンのNVIDIA Driverが
Linuxの場合: 450.80.02以上
Windowsの場合:452.39以上
のバージョンを満たさない場合は、ご利用のGPUに対応するドライバの更新を行ってください。
(参考情報)
以下のホストマシン環境(AWS g5g.xlargeインスタンス)上で動作確認を行っています。
OS: 20.04.3 LTS
GPU: NVIDIA T4G
NVIDIA Driver: 470.82.01
Docker version: 20.10.11
https://docs.docker.com/engine/install/ に従って、OS及びディストリビューションにあった方法でdockerをインストールしてください。
ndltsrディレクトリ下で次のように実行するとコンテナが起動します。
sh docker/dockerbuild.sh
sh docker/run_docker.sh
コンテナ起動後、http://127.0.0.1:8080/invocations に次のように画像をPOSTすることで推定された表構造の情報を得ることができます。
import urllib.request
import msgpack
data = {}
with open("tableimg.jpg", "rb") as fp:
data["img"] = fp.read()
payload = msgpack.packb(data, use_bin_type=True)
headers = {
"Content-Type": "application/x-msgpack",
}
req = urllib.request.Request(
"http://127.0.0.1:8080/invocations",
payload, headers
)
with urllib.request.urlopen(req) as res:
print(res.read())
返戻の形式
次のjson形式です。
{ "logi":logi_list,
"center":center_list}
- center_list:セル毎に推定した矩形座標を記述した4つの要素(x座標の最小値, y座標の最小値, x座標の最大値, y座標の最大値)を検出したセル数分持つリスト
- logi_list:セル毎に推定したセル間の関係情報を記述した4つの要素(列の開始位置, 列の終了位置, 行の開始位置, 行の終了位置)を検出したセル数分持つリスト
画像をPOSTして得た返戻と座標付きOCRテキストデータを組み合わせてHTMLやTSVのテーブルを得るサンプルコードについてはmerge_sample.pyをご覧ください。
国立国会図書館が新規に追加したソースコードについてはCC BY 4.0ライセンスとします。
なお、本プログラムはApache 2.0ライセンスで公開されているLORE-TSR(外部リンク)を部分的に利用します。
src/lib以下のディレクトリ、src/_init_paths.py及びsrc/main.pyについて、原則的にLORE-TSRのオリジナルのソースコードを複製していますが、 src/lib/detectors/base_detector.py及びsrc/lib/opts.pyについては、一部ソースコードの修正を行いました。
オリジナルのLORE-TSRのライセンス等の情報はLICENSE_original.md、NOTICE_original及びREADME_original.mdを参照してください。