NDL古典籍OCR-LiteをLinux laptopで試す

YomiToku 🏛️という日本語に特化したAI 文章画像解析エンジンを知りました.OCRだけでなく,レイアウト解析機能を持っていて複雑なレイアウトの画像でも解析してOCRしてくれるようです.(CPUでも動きそうなのでこれも試したいところです.)

国立国会図書館でも似たようなのがあったけどGPU専用だったよなとリポジトリを見に行くとやはりCUDA対応のNVIDIA GPUが必要そうです.

やはり駄目かと思いながらなんとはなしにndl-labを眺めてみるとndl-kotenocr-liteという新しいリポジトリが出来ていました.
GPUがなくても動作する古典籍資料のOCRが出来るツールのようです.古典は読まないのですが面白そうと思い試してみました.

NDL古典籍OCR-Liteは、江戸期以前の和古書、清代以前の漢籍といった古典籍資料のデジタル化画像からテキストデータを作成するOCRです。
GPUを必要としないOCR処理に特徴があり、ノートパソコン等の一般的な家庭用コンピュータやOS環境において高速に実行可能です。
Windows(Windows 10)、Intel Mac(macOS Sequoia)及びLinux(Ubuntu 22.04)環境において動作確認しています。

GUI版の利用

Windows, macOS,Linux(amd64のみ)のGUI版バイナリがreleases 🏛️にあるので最新版を入手しましょう.今回はLinux版の
ndlkotenocr-lite_v1.0.1_linux.tar.gzを利用しました.

Note
README.mdにはIntel Mac(macOS Sequoia)とありますが,ndlkotenocr-lite_v1.0.1_macos_m1.tar.gzというものもあるのでarm版macOSでも動くのかもしれません.(未確認)
$ wget2 -v -c https://github.com/ndl-lab/ndlkotenocr-lite/releases/download/1.0.1/ndlkotenocr-lite_v1.0.1_linux.tar.gz (1)
$ tar tvf ndlkotenocr-lite_v1.0.1_linux.tar.gz
$ tar xf ndlkotenocr-lite_v1.0.1_linux.tar.gz (2)
$ file linux/ndlkotenocr_lite
linux/ndlkotenocr_lite: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=dbd9936c296625a7a1083220c253758069687d53, for GNU/Linux 3.2.0, not stripped
$ linux/ndlkotenocr_lite (3)
  1. Linux版をreleasesからダウンロード

  2. 展開

  3. ndlkotenocr_liteの起動

画面はシンプルです.対象の画像もしくはディレクトリと,結果の出力ディレクトリを指定してOCRボタンを押すだけです.

元画像では全然読めませんが,OCR結果を見るとなんとなくわかるので面白いです.

ndlkotenocr lite

今回10コマ(20ページほど)を処理しましたがThinkPad L13(CPU Intel® Core™ i7-10510U/RAM DDR4 16GB)で30秒ほどで完了しました.出力結果として対象画像毎にOCRの処理結果のテキストファイル,JSONファイル,XMLファイルが作られます.また,「認識箇所の可視化画像を保存する」にチェックを付けているとどの部分を認識したかの画像ファイルも保存されます.

認識箇所が青枠で囲まれている

ndlkotenocr lite viz

シンプルな画像だとテキストファイルだけで良さそうですが,複雑な順番がわからないようなものはOCRされたテキストがどの部分のものか分かりづらいので,座標情報の含まれるJSONファイルやXMLファイルを参照したほうが良いかもしれません.とはいえ分かりづらいので文字部分にマウスカーソルを移動するとポップアップするようなビュワーを作ると便利かもしれません.

cli版

コマンドラインからも操作できます.Python 3.10以降が必要です.
sourceをcloneしてPythonの依存パッケージを導入する必要があります.

$ git clone https://github.com/ndl-lab/ndlkotenocr-lite (1)
$ cd ndlkotenocr-lite
$ python3 -m venv venv (2)
$ source venv/bin/activate (3)
$ pip install -r requirements.txt (4)
$ cd src
  1. sourceのclone

  2. venvでPython仮想環境を設定

  3. venvの環境に入る

  4. 依存パッケージを導入

Note
このときのclone時にMNVOのモバイル回線だとpostバッファサイズを増やしていても失敗を繰り返しました.結局リモートのVPSでcloneしてそのディレクトリをrsyncしてきました.
Note
Raspberry Pi OS bookworm armhfでも試したところonnxruntimeのarmhf版が無いようで導入に失敗しました.自分でbuildすれば動かせるかもしれません.
コマンドライのプション確認
$ python3 ./ocr.py --help
usage: ocr.py [-h] [--sourcedir SOURCEDIR] [--sourceimg SOURCEIMG] --output OUTPUT [--viz VIZ] [--det-weights DET_WEIGHTS]
              [--det-classes DET_CLASSES] [--det-score-threshold DET_SCORE_THRESHOLD] [--det-conf-threshold DET_CONF_THRESHOLD]
              [--det-iou-threshold DET_IOU_THRESHOLD] [--rec-weights REC_WEIGHTS] [--rec-classes REC_CLASSES] [--device {cpu,cuda}]

Arguments for NDLkotenOCR-Lite

options:
  -h, --help            show this help message and exit
  --sourcedir SOURCEDIR
                        Path to image directory
  --sourceimg SOURCEIMG
                        Path to image directory
  --output OUTPUT       Path to output directory
  --viz VIZ             Save visualized image
  --det-weights DET_WEIGHTS
                        Path to rtmdet onnx file
  --det-classes DET_CLASSES
                        Path to list of class in yaml file
  --det-score-threshold DET_SCORE_THRESHOLD
  --det-conf-threshold DET_CONF_THRESHOLD
  --det-iou-threshold DET_IOU_THRESHOLD
  --rec-weights REC_WEIGHTS
                        Path to parseq-tiny onnx file
  --rec-classes REC_CLASSES
                        Path to list of class in yaml file
  --device {cpu,cuda}   Device use (cpu or cuda)

早速利用してみます.–sourcedirか—​sourceimgで処理対象ディレクトリか処理対象ファイルを指定,–outputで結果の出力先を指定,–viz Trueで可視化画像を有効にして実行します.

ベータですが,もしCUDAに対応したGPUの利用できる環境であれば—​deviceでcudaを指定すると速くなると思います.(未確認)

$ python3 ./ocr.py --sourceimg ./digidepo_12282447_0001-000.png --output . --viz True
['./digidepo_12282447_0001-000.png']
[INFO] Intialize Model
[INFO] Inference Image
[INFO] Saving result on ./viz_digidepo_12282447_0001-000.png
$ ls -ltrA
合計 21964
drwxr-xr-x 2 matoken matoken     4096 11月 29 05:40 config
drwxr-xr-x 2 matoken matoken     4096 11月 29 05:40 model
-rw-r--r-- 1 matoken matoken    35776 11月 29 05:40 ndl_parser.py
-rw-r--r-- 1 matoken matoken     2988 11月 29 05:40 parseq.py
-rw-r--r-- 1 matoken matoken     8911 11月 29 05:40 ocr.py
-rw-r--r-- 1 matoken matoken     5744 11月 29 05:40 rtmdet.py
drwxr-xr-x 6 matoken matoken     4096 11月 29 06:10 reading_order
drwxrwxr-x 2 matoken matoken     4096 11月 29 06:10 __pycache__
-rw-rw-r-- 1 matoken matoken 11209450 11月 29 06:12 digidepo_12282447_0001-000.png
-rw-rw-r-- 1 matoken matoken 11131912 11月 29 06:13 viz_digidepo_12282447_0001-000.png
-rw-rw-r-- 1 matoken matoken    13917 11月 29 06:13 digidepo_12282447_0001-000.xml
-rw-rw-r-- 1 matoken matoken     3635 11月 29 06:13 digidepo_12282447_0001-000.txt
-rw-rw-r-- 1 matoken matoken    46375 11月 29 06:13 digidepo_12282447_0001-000.json

普通に動作します.
GUI版と速度を比較してみようと同じものを処理してみると,10コマでGUI版30秒,CLI版32秒あまり変わらないので恐らく誤差だと思います.

GUI版のほうがダウンロードして展開するだけで使えて容量も小さいので試しに使うにはGUI版のほうが良さそうです.CLI版はCUDA対応環境だったり,プログラムから呼んで一括処理や前処理後処理などをしたいときに便利そうです.

Note
GUI版の容量は展開時で258MB程,CLI版の容量は依存パッケージ導入後で520MB程でした.

参考URL

国立国会図書館デジタルコレクションの蔵書の入手方法は以下が参考になると思います.

国立国会図書館デジタルコレクションの蔵書は大抵pdfでダウンロードしますが,pdfは今回のNDL古典籍OCR-Liteに対応していないので画像に変換する必要があります.pdfから画像に変換するのには以下の記事が参考になると思います.

環境

$ dpkg-query -W python3 python3-venv wget git poppler-utils
git     1:2.45.2-1.2
poppler-utils   24.08.0-3
python3 3.12.7-1
python3-venv    3.12.7-1
wget    1.24.5-2+b1
 lsb_release -dr
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
$ arch
x86_64
$ grep -m1 ^model\ name /proc/cpuinfo
model name      : Intel(R) Core(TM) i7-10510U CPU @ 1.80GHz
$ head -1 /proc/meminfo
MemTotal:       15992648 kB

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

To respond on your own website, enter the URL of your response which should contain a link to this post's permalink URL. Your response will then appear (possibly after moderation) on this page. Want to update or remove your response? Update or delete your post and re-enter your post's URL again. (Find out more about Webmentions.)