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)
-
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
国立国会図書館デジタルコレクションの蔵書の入手方法は以下が参考になると思います.
国立国会図書館デジタルコレクションの蔵書は大抵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