📝

NDLOCRおよびNDL古典籍OCRのver.2を用いたノートブックを作成しました。

2023/09/20に公開11

概要

NDLOCRおよびNDL古典籍OCRのver.2を用いたノートブックを作成しました。

それぞれ以下のリンクからお試しいただけます。

  • NDL OCR

https://colab.research.google.com/github/nakamura196/000_tools/blob/main/NDLOCR_v2の実行例.ipynb

  • NDL古典籍OCR

https://colab.research.google.com/github/nakamura196/000_tools/blob/main/NDL古典籍OCR_v2の実行例.ipynb

最新のノートブックとは異なりますが、ノートブックの使い方については以下の動画をご確認ください。

https://youtu.be/46p7ZZSul0o

以下、詳細について説明します。

背景

NDLOCRとNDL古典籍OCRについて、2023年にver.2が公開されました。ver.1とver.2の違いについては、以下のサイトを参考にしていただきたいですが、特に行単位で認識した文字列の読み順の付与性能が向上しています。

https://lab.ndl.go.jp/data_set/r4ocr/r4_software/

https://lab.ndl.go.jp/data_set/r4_koten/

今回作成したノートブックでは、これらver.2のOCR処理プログラムを採用しています。

入力方法

これまでのノートブックと同様、以下のオプションを提供します。

  • 画像
    • 単一の画像ファイルのURLを指定する場合
    • 単一の画像ファイルをアップロードする場合
    • 複数の既にダウンロード済みの画像ファイルを対象にする場合
  • PDF
    • 単一のPDFファイルのURLを指定する場合
    • 単一のPDFファイルをアップロードする場合
    • 単一の既にダウンロード済みのPDFファイルを対象にする場合
  • IIIF
    • IIIFマニフェストファイルのURLを指定する場合(本記事執筆時点ではPresentation API v2のみ)

実行結果

上記の各オプションを実行後、以下のような画面が表示されます。

具体的には、以下の2種類です。

  • Googleドライブへのリンク(「以下に出力しました。」の部分)
  • 認識結果を確認するビューアへのリンク(「認識結果は以下です。」の部分)

それぞれについて説明します。

Googleドライブへのリンク

以下のように、4つのフォルダが作成されます。

txtおよびxmlはNDLOCRおよびNDL古典籍OCRの一部で出力されるデータです。

pdfは認識結果を透明テキスト付きPDFで出力します。末尾に_textがあるものとないものの2種類が出力されます。_textがついているPDFは、以下のように、確認用にテキストを赤字で表示します。

iiifは後述するビューアで使用するデータです。jsonやxmlファイルが格納されていますが、主に開発者向けの情報になります。

認識結果を確認するビューアへのリンク

以下のようなビューアが表示されます。認識結果のテキストを画像に重ね合わせることで、OCRの精度などを確認できます。

本ビューアについて、技術的な情報については別の記事で紹介できればと思います。

まとめ

ノートブックについて、不具合や不足機能があるかと思いますので、随時ご連絡いただけますと幸いです。

NDLOCRおよびNDL古典籍OCRの活用にあたり、お役に立ちましたら幸いです。

Discussion

AdachiAdachi

初めまして、
本NDLOCRノートブックは大変助かりました。いつもありがとうございます。
昨日から、「単一のPDFファイルをアップロードする場合」は以下のエラーが発生します。

ImportError: /usr/local/lib/python3.10/dist-packages/mmcv/_ext.cpython-310-x86_64-linux-gnu.so: undefined symbol: _ZNK3c106SymIntltEl

FileNotFoundError Traceback (most recent call last)
<ipython-input-4-e385819590aa> in <cell line: 13>()
11
12 task.prepare_pdf(pdf_path)
---> 13 task.run_common_pipeline()

3 frames
/usr/local/lib/python3.10/dist-packages/ldas/iiif.py in convert_ndl_ocr_xml_to_iiif_manifest(xml_path, >base_manifest_path, output_manifest_path)
197
198 # Load XML content
--> 199 with open(xml_path, "r") as file:
200 content = file.read()
201

FileNotFoundError: [Errno 2] No such file or directory: >'/content/drive/MyDrive/ndlocr_v2/output/pdf_local_2023-10-23T06:17:57.095664+09:00/78944c98-7120-11ee-9990-0242ac1c000c/xml/78944c98-7120-11ee-9990-0242ac1c000c.xml'

宜しくお願い致します。

nakamura196nakamura196

ご不便をおかけして申し訳ありません。対応いたします。

nakamura196nakamura196

不具合を修正しました。お手数をおかけしますが、ご確認のほどよろしくお願いいたします。

lucanidlucanid

Colabの実行例を使わせていただきました。便利なのですが、処理対象がたくさんあると負荷をかけすぎるのもどうかという気になっております。
出来ればローカルで動かしたいのですが、Colabの例とGithubのndlocr_cliを比較すると、ndlocr_cliにはPDF関係の処理が含まれていないようでした。恐らくocr_iiif_toolsのあたりが該当するのだと思うのですが、入出力形式や引数がよくわからないので、そのあたりを解説いただけないでしょうか。
素人質問で恐縮ですがよろしくお願いします。

nakamura196nakamura196

ご連絡ありがとうございます。また返信が遅くなってしまい申し訳ありません。
PDF関係の処理の部分は独立したライブラリとしてご利用いただけるようにドキュメンテーションなどを準備したいと思いますので、少々お時間をいただけますと幸いです。

TakahashiTakahashi

突然申し訳ありません。
本ノートブックをぜひ利用したいと思い、セットアップは無事に終わったのですが、「単一のPDFファイルをアップロードする場合」などで実行しようとすると、下記のようなエラーが出てきてしまいました。
もし不具合でなく、当方の設定に問題がある場合は、もう少し自分で調べてみようと思います。
念のため、ご報告させていただきました。


FileNotFoundError Traceback (most recent call last)
<ipython-input-12-e385819590aa> in <cell line: 13>()
11
12 task.prepare_pdf(pdf_path)
---> 13 task.run_common_pipeline()

3 frames
/usr/local/lib/python3.10/dist-packages/ldas/iiif.py in convert_ndl_ocr_xml_to_iiif_manifest(xml_path, base_manifest_path, output_manifest_path)
197
198 # Load XML content
--> 199 with open(xml_path, "r") as file:
200 content = file.read()
201

FileNotFoundError: [Errno 2] No such file or directory: '/content/drive/MyDrive/ndlocr_v2/output/pdf_local_2024-03-19T12:08:39.596531+09:00/fc062596-e59d-11ee-9cbc-0242ac1c000c/xml/fc062596-e59d-11ee-9cbc-0242ac1c000c.xml'

nakamura196nakamura196

ご連絡ありがとうございます。また不具合申し訳ございません。
不具合を修正しましたので、ご確認いただけますと幸いです。

TakahashiTakahashi

早々にご対応いただき、誠にありがとうございました。
修正していただいあとも、やはり同様のエラーが起こってしまうようで、おそらく私の知識不足によるものと思われます。
もう少し、調べてみます。

非常に有益なノートブックを公開していただき、ありがとうございます。

nakamura196nakamura196

ご連絡ありがとうございます。改めてノートブックを修正しました。

PDFを処理する際、展開後の画像が大きい場合に、ご連絡いただいたエラーが生じるようでした。

リサイズする設定を加えましたので、改めてお試しいただけますと幸いです。

data-insightdata-insight

こんにちは、
便利な古書OCRを作成頂き、大変便利に使わせて頂いております。ありがとうございます。

1点確認ですが、本OCRでは手書き文字には対応していないのでしょうか?
古書の手書き文字、現代文の手書き文字などを試してみたのですが、精度が悪いため、そもそも対応していないのではないか?と気になった次第です。
ReadMeなど、しっかりと読めていなければ申し訳ないですが、対応可否について教えて頂ければ幸いです。

よろしくお願いします。

takmintakmin

NDL OCRの性能を調べるため、自分で環境を作ろうかと考えていたところ、こちらのノートブックを見つけました。大変ありがとうございます。

セットアップ終了後、”複数の既にダウンロード済みの画像ファイルを対象にする場合”を実行したところ、以下のエラーが出ました。

start inference !
input_root : /content/docs/files/b9047f1e-5dfb-11ef-a4f3-0242ac1c000c
output_root : /content/output/b9047f1e-5dfb-11ef-a4f3-0242ac1c000c
config_file : config.yml
INFO:albumentations.check_version:A new version of Albumentations is available: 1.4.14 (you have 1.4.13). Upgrade using: pip install -U albumentations. To disable automatic update checks, set the environment variable NO_ALBUMENTATIONS_UPDATE to 1.
load from config=submodules/ndl_layout/models/cascade_mask_rcnn_convnext-t_p4_w7_fpn_giou_4conv1f_fp16_ms-crop_3x_coco.py, checkpoint=submodules/ndl_layout/models/ndl_retrainmodel.pth
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/dist-packages/mmengine/utils/misc.py", line 77, in import_modules_from_strings
    imported_tmp = import_module(imp)
  File "/usr/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 992, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1004, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'mmpretrain'