国立国会図書館 – matoken's blog https://matoken.org/blog Is there no plan B? Sat, 30 Nov 2024 08:55:28 +0000 ja hourly 1 https://wordpress.org/?v=6.9.1 https://matoken.org/blog/wp-content/uploads/2025/03/cropped-1865f695c4eecc844385acef2f078255036adccd42c254580ea3844543ab56d9-32x32.jpeg 国立国会図書館 – matoken's blog https://matoken.org/blog 32 32 NDL古典籍OCR-LiteをLinux laptopで試す https://matoken.org/blog/2024/11/29/try-ndlkotenocr-lite-on-linux-laptop/ https://matoken.org/blog/2024/11/29/try-ndlkotenocr-lite-on-linux-laptop/#respond Thu, 28 Nov 2024 22:39:39 +0000 https://matoken.org/blog/?p=4264

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
]]>
https://matoken.org/blog/2024/11/29/try-ndlkotenocr-lite-on-linux-laptop/feed/ 0
国立国会図書館デジタルコレクションの蔵書の画像の余白を削除して読みやすくする https://matoken.org/blog/2024/05/02/remove-image-margins/ https://matoken.org/blog/2024/05/02/remove-image-margins/#comments Thu, 02 May 2024 10:04:08 +0000 https://matoken.org/blog/?p=4014

国立国会図書館デジタルコレクションの蔵書をダウンロードしてローカルで読む際余白が邪魔なので消しました.

まず,十全に国立国会図書館デジタルコレクションを利用するためには国立国会図書館の利用者登録(個人)の本登録をしておきましょう.

現在は現地に行かずとも遠隔で本登録まで可能です.便利になりましたね.

国立国会図書館デジタルコレクション で読みたい本を検索,ログイン( 登録利用者ID,パスワード )
右下の印刷で印刷範囲を指定して「印刷ファイルを開く」で該当範囲の pdf ファイルを作成,
上部に 「ファイルを作成しています…」 のメッセージが表示され,しばらく待つと 「印刷用ファイルを作成しました。右のリンクからPDFファイルを表示できます。」に変わるので 「PDFファイルを開く」 からダウンロードします.

Note

50コマを超えている場合は「範囲を指定」で 1-50 のように範囲指定できる.
> 入力値が資料のコマ数を超過しています。
となったとき最大コマ数を調べて指定しなくても 150- のように指定して最後までダウンロードできるよう.

ダウンロードした PDF ファイルは下部に 登録利用者ID, 利用者名,生成年月日時分秒 が画像に埋め込まれています.

宇宙船ビーグル号の冒険

PDF ファイルはこんな感じでした.2481 x 1732.5 pts 50コマ(100ページ分)で37MB程.

$ pdfinfo digidepo_2530201_0001-001-050.pdf
Title:           宇宙船ビーグル号の冒険
Keywords:        A.E.ヴァン・ヴォークト 著 ほか『宇宙船ビーグル号の冒険』,東京創元社,1964.2(43刷:1999.10). 国立国会図書館デジタルコレクション https://dl.ndl.go.jp/pid/2530201 (参照 2024-05-02)
Author:          A.E.ヴァン・ヴォークト 著
Producer:        PyPDF2
CreationDate:    Thu May  2 00:30:21 2024 JST
ModDate:         Thu May  2 00:30:21 2024 JST
Custom Metadata: no
Metadata Stream: no
Tagged:          no
UserProperties:  no
Suspects:        no
Form:            none
JavaScript:      no
Pages:           50
Encrypted:       yes (print:yes copy:no change:no addNotes:no algorithm:AES-256)
Page size:       2481 x 1732.5 pts
Page rot:        0
File size:       36676525 bytes
Optimized:       no
PDF version:     1.7

Encrypted で print:yes copy:no change:no addNotes:no でパスワードもわからないので,tdftk は使えません.

Error: Invalid PDF: unknown.encryption.type.r
Error: Failed to open input PDF file:

print は出来るので mcomix でも読めます.ということで pdfimages で中の画像の取り出しは出来ました.

$ pdfimages -all digidepo_2530201_0001-001-050.pdf 2530201/2530201
$ ls 2530201/
2530201-000.jpg  2530201-004.jpg  2530201-008.jpg  2530201-012.jpg  2530201-016.jpg  2530201-020.jpg  2530201-024.jpg  2530201-028.jpg  2530201-032.jpg  2530201-036.jpg  2530201-040.jpg  2530201-044.jpg  2530201-048.jpg
2530201-001.jpg  2530201-005.jpg  2530201-009.jpg  2530201-013.jpg  2530201-017.jpg  2530201-021.jpg  2530201-025.jpg  2530201-029.jpg  2530201-033.jpg  2530201-037.jpg  2530201-041.jpg  2530201-045.jpg  2530201-049.jpg
2530201-002.jpg  2530201-006.jpg  2530201-010.jpg  2530201-014.jpg  2530201-018.jpg  2530201-022.jpg  2530201-026.jpg  2530201-030.jpg  2530201-034.jpg  2530201-038.jpg  2530201-042.jpg  2530201-046.jpg
2530201-003.jpg  2530201-007.jpg  2530201-011.jpg  2530201-015.jpg  2530201-019.jpg  2530201-023.jpg  2530201-027.jpg  2530201-031.jpg  2530201-035.jpg  2530201-039.jpg  2530201-043.jpg  2530201-047.jpg
$ file 2530201/2530201-001.jpg
2530201/2530201-001.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 3308x2310, components 3

余白が気になるので Imagemagick の trim でカットします.正攻法だと座標を指定しますが,今回は fuzz で Imagemagick に頑張ってもらいます.
fuzz の % は画像により丁度いい値を探す必要があります.今回は 60% で良さそう.

$ convert 2530201/2530201-001.jpg -fuzz 60% -trim 2530201-001-trim.jpg

宇宙船ビーグル号の冒険 trim

余白がカットされ,3308×2310 → 2831×2099 になりました.いい感じそうなので mogrify で全画像に反映して1つのアーカイブにまとめました.

$ mogrify -fuzz 60% -trim 2530201/*
$ find 2530201 | sort -V | zip -@0 ./宇宙船ビーグル号の冒険.zip

50コマ以上の資料で,2つ以上のアーカイブの場合は2つ目以降の PDF を同様に変換を繰り返してアーカイブに追加します.ただ, pdfimages で生成されるファイル名が被ってしまうので rename コマンドなどでファイル名を変更します.

$ rm 2530201/* (1)
$ pdfimages -all ./digidepo_2530201_0001-051-100.pdf 2530201/2530201 (2)
$ rename 's/(\d+)-(\d+)/sprintf "$1-%03d",$2 + 50/e' 2530201/* (3)
$ mogrify -fuzz 60% -trim 2530201/* (4)
$ find 2530201 -print | sort -V | zip -@0 ./宇宙船ビーグル号の冒険.zip (5)
  1. 古いデータを削除
  2. PDF 画像を取り出し
  3. 連番部分を 50 加算したファイル名に改名
  4. 余白削除
  5. 非圧縮で zip アーカイブに追加

タブレット端末で MComix で閲覧するといい感じそうです.ちょっとサイズが大きいので縮小したり,互換性のために PDF 形式にしたりしても良さそうです.
スマホなどで読む場合はさらに真ん中から2分割したら良さそうですが,ざっと見た感じのどが中央に揃っているわけではないので少し面倒そうです.

環境
$ dpkg-query -W imagemagick zip poppler-utils rename
imagemagick     8:6.9.12.98+dfsg1-5.2
poppler-utils   22.12.0-2.2+b1
rename  2.02-1
zip     3.0-13
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux trixie/sid
Release:        n/a
Codename:       trixie
$ arch
x86_64
]]>
https://matoken.org/blog/2024/05/02/remove-image-margins/feed/ 2