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

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

YomiToku

YomiToku で漫画のOCRを試す｜npaka

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

ndl-lab/ndlocr_cli: NDLOCRアプリケーションのリポジトリ（ソースコードを含む）

やはり駄目かと思いながらなんとはなしに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)環境において動作確認しています。

— ndl-lab/ndlkotenocr-lite: NDL古典籍OCR-Liteのアプリケーションのリポジトリ（ソースコードを含む）

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)

Linux版をreleasesからダウンロード

展開

ndlkotenocr_liteの起動

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

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

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

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

シンプルな画像だとテキストファイルだけで良さそうですが，複雑な順番がわからないようなものは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

sourceのclone

venvでPython仮想環境を設定

venvの環境に入る

依存パッケージを導入

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

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

国立国会図書館デジタルコレクションの蔵書の画像の余白を削除して読みやすくする – matoken’s meme

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

pdfファイルから画像を抜き出し( pdfimages or LibreOffice ) – matoken’s meme

環境

$ 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