👋

Google Colabを用いたNDL"古典籍"OCRアプリのチュートリアルを作成しました。

に公開1

概要

Google Colabを用いたNDL"古典籍"OCRアプリを作成しました。以下のURLからお試しいただけます。

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

NDL古典籍OCRの説明は以下です。

https://github.com/ndl-lab/ndlkotenocr_cli

また、ノートブックの作成にあたっては、@blue0620さんのノートブックを参考にしています。ありがとうございます!

https://twitter.com/blue0620/status/1617888733323485184

今回作成したノートブックでは、入力フォーマットの追加や、Googleドライブへの保存機能などを追加しています。

使い方

NDLOCRアプリの使い方とほぼ同様です。以下の動画を参考にしてください。

https://youtu.be/46p7ZZSul0o

工夫

工夫した点として、認識結果をIIIFマニフェストの形に変換し、Miradorビューアで閲覧できるようにしました。具体的には、以下のような出力が得られます。

後者のリンクをクリックすることで、以下のようなMiradorビューアが表示され、認識結果を確認することができます。

このIIIFマニフェストファイルも、Googleドライブに格納しています。

参考

NDLOCRのチュートリアルについては、以下を参考にしてください。

https://zenn.dev/nakamura196/articles/b6712981af3384

Discussion

gyudonumaigyudonumai

はじめまして。こちらのノートブックですが、以下のようなエラーが出て利用できないようです。通常のNDLOCR Ver2の方も同様です。ご確認のほどよろしくお願いします。

複数画像ファイルの場合

/content/ndlkotenocr_cli
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<ipython-input-3-87e74d4e8e26> in <cell line: 0>()
     17   get_ipython().system('cp "{input_file}" {output_file}')
     18 
---> 19 task.run_common_pipeline()

<ipython-input-2-d19d668e1384> in run_common_pipeline(self, services)
    158 
    159     if result.returncode != 0:
--> 160         raise Exception(f"Error: {result.stderr}")
    161 
    162     Task.convert_json_to_xml(self.task_id, self.img_dir_path, self.output_dir_path)

Exception: Error: 
A module that was compiled using NumPy 1.x cannot be run in
NumPy 2.0.2 as it may crash. To support both 1.x and 2.x
versions of NumPy, modules must be compiled with NumPy 2.0.
Some module may need to rebuild instead e.g. with 'pybind11>=2.12'.

If you are a user of the module, the easiest solution will be to
downgrade to 'numpy<2' or try to upgrade the affected module.
We expect that some modules will need time to support NumPy 2.

Traceback (most recent call last):  File "/content/ndlkotenocr_cli/main.py", line 85, in <module>
    main()
  File "/content/ndlkotenocr_cli/main.py", line 81, in main
    cmd(obj={})
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1161, in __call__
    return self.main(*args, **kwargs)
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1082, in main
    rv = self.invoke(ctx)
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1697, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1443, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 788, in invoke
    return __callback(*args, **kwargs)
  File "/usr/local/lib/python3.11/dist-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/content/ndlkotenocr_cli/main.py", line 77, in infer
    inferencer = OcrInferencer(infer_cfg)
  File "/content/ndlkotenocr_cli/ocrcli/core/inference.py", line 58, in __init__
    self.proc_list = self._create_proc_list(cfg)
  File "/content/ndlkotenocr_cli/ocrcli/core/inference.py", line 325, in _create_proc_list
    proc_list.append(self.full_proc_list[i](cfg, i))
  File "/content/ndlkotenocr_cli/ocrcli/procs/layout_extraction.py", line 28, in __init__
    from src.ndl_kotenseki_layout.tools.process import InferencerWithCLI
  File "/content/ndlkotenocr_cli/src/ndl_kotenseki_layout/tools/process.py", line 14, in <module>
    import mmcv
  File "/usr/local/lib/python3.11/dist-packages/mmcv/__init__.py", line 4, in <module>
    from .image import *
  File "/usr/local/lib/python3.11/dist-packages/mmcv/image/__init__.py", line 10, in <module>
    from .misc import tensor2imgs
  File "/usr/local/lib/python3.11/dist-packages/mmcv/image/misc.py", line 9, in <module>
    import torch
  File "/usr/local/lib/python3.11/dist-packages/torch/__init__.py", line 1382, in <module>
    from .functional import *  # noqa: F403
  File "/usr/local/lib/python3.11/dist-packages/torch/functional.py", line 7, in <module>
    import torch.nn.functional as F
  File "/usr/local/lib/python3.11/dist-packages/torch/nn/__init__.py", line 1, in <module>
    from .modules import *  # noqa: F403
  File "/usr/local/lib/python3.11/dist-packages/torch/nn/modules/__init__.py", line 35, in <module>
    from .transformer import TransformerEncoder, TransformerDecoder, \
  File "/usr/local/lib/python3.11/dist-packages/torch/nn/modules/transformer.py", line 20, in <module>
    device: torch.device = torch.device(torch._C._get_default_device()),  # torch.device('cpu'),
/usr/local/lib/python3.11/dist-packages/torch/nn/modules/transformer.py:20: UserWarning: Failed to initialize NumPy: _ARRAY_API not found (Triggered internally at ../torch/csrc/utils/tensor_numpy.cpp:84.)
  device: torch.device = torch.device(torch._C._get_default_device()),  # torch.device('cpu'),
Traceback (most recent call last):
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1817, in _get_module
    return importlib.import_module("." + module_name, self.__name__)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/usr/local/lib/python3.11/dist-packages/transformers/generation/utils.py", line 53, in <module>
    from .candidate_generator import (
  File "/usr/local/lib/python3.11/dist-packages/transformers/generation/candidate_generator.py", line 26, in <module>
    from sklearn.metrics import roc_curve
  File "/usr/local/lib/python3.11/dist-packages/sklearn/__init__.py", line 82, in <module>
    from .base import clone
  File "/usr/local/lib/python3.11/dist-packages/sklearn/base.py", line 17, in <module>
    from .utils import _IS_32BIT
  File "/usr/local/lib/python3.11/dist-packages/sklearn/utils/__init__.py", line 19, in <module>
    from .murmurhash import murmurhash3_32
  File "sklearn/utils/murmurhash.pyx", line 1, in init sklearn.utils.murmurhash
ValueError: numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1817, in _get_module
    return importlib.import_module("." + module_name, self.__name__)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<frozen importlib._bootstrap>", line 1204, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1176, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1147, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 690, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 940, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/usr/local/lib/python3.11/dist-packages/transformers/models/auto/tokenization_auto.py", line 38, in <module>
    from .auto_factory import _LazyAutoMapping
  File "/usr/local/lib/python3.11/dist-packages/transformers/models/auto/auto_factory.py", line 40, in <module>
    from ...generation import GenerationMixin
  File "<frozen importlib._bootstrap>", line 1229, in _handle_fromlist
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1805, in __getattr__
    module = self._get_module(self._class_to_module[name])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1819, in _get_module
    raise RuntimeError(
RuntimeError: Failed to import transformers.generation.utils because of the following error (look up to see its traceback):
numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/content/ndlkotenocr_cli/main.py", line 85, in <module>
    main()
  File "/content/ndlkotenocr_cli/main.py", line 81, in main
    cmd(obj={})
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1161, in __call__
    return self.main(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1082, in main
    rv = self.invoke(ctx)
         ^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1697, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 1443, in invoke
    return ctx.invoke(self.callback, **ctx.params)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/core.py", line 788, in invoke
    return __callback(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/click/decorators.py", line 33, in new_func
    return f(get_current_context(), *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/content/ndlkotenocr_cli/main.py", line 77, in infer
    inferencer = OcrInferencer(infer_cfg)
                 ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/content/ndlkotenocr_cli/ocrcli/core/inference.py", line 58, in __init__
    self.proc_list = self._create_proc_list(cfg)
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/content/ndlkotenocr_cli/ocrcli/core/inference.py", line 325, in _create_proc_list
    proc_list.append(self.full_proc_list[i](cfg, i))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/content/ndlkotenocr_cli/ocrcli/procs/layout_extraction.py", line 28, in __init__
    from src.ndl_kotenseki_layout.tools.process import InferencerWithCLI
  File "/content/ndlkotenocr_cli/src/ndl_kotenseki_layout/tools/process.py", line 15, in <module>
    from mmdet.apis import (inference_detector, init_detector)
  File "/usr/local/lib/python3.11/dist-packages/mmdet/apis/__init__.py", line 2, in <module>
    from .det_inferencer import DetInferencer
  File "/usr/local/lib/python3.11/dist-packages/mmdet/apis/det_inferencer.py", line 22, in <module>
    from mmdet.evaluation import INSTANCE_OFFSET
  File "/usr/local/lib/python3.11/dist-packages/mmdet/evaluation/__init__.py", line 4, in <module>
    from .metrics import *  # noqa: F401,F403
    ^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/mmdet/evaluation/metrics/__init__.py", line 5, in <module>
    from .coco_metric import CocoMetric
  File "/usr/local/lib/python3.11/dist-packages/mmdet/evaluation/metrics/coco_metric.py", line 16, in <module>
    from mmdet.datasets.api_wrappers import COCO, COCOeval, COCOevalMP
  File "/usr/local/lib/python3.11/dist-packages/mmdet/datasets/__init__.py", line 31, in <module>
    from .utils import get_loading_pipeline
  File "/usr/local/lib/python3.11/dist-packages/mmdet/datasets/utils.py", line 5, in <module>
    from mmdet.datasets.transforms import LoadAnnotations, LoadPanopticAnnotations
  File "/usr/local/lib/python3.11/dist-packages/mmdet/datasets/transforms/__init__.py", line 16, in <module>
    from .text_transformers import LoadTextAnnotations, RandomSamplingNegPos
  File "/usr/local/lib/python3.11/dist-packages/mmdet/datasets/transforms/text_transformers.py", line 10, in <module>
    from transformers import AutoTokenizer
  File "<frozen importlib._bootstrap>", line 1229, in _handle_fromlist
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1806, in __getattr__
    value = getattr(module, name)
            ^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1805, in __getattr__
    module = self._get_module(self._class_to_module[name])
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/transformers/utils/import_utils.py", line 1819, in _get_module
    raise RuntimeError(
RuntimeError: Failed to import transformers.models.auto.tokenization_auto because of the following error (look up to see its traceback):
Failed to import transformers.generation.utils because of the following error (look up to see its traceback):
numpy.dtype size changed, may indicate binary incompatibility. Expected 96 from C header, got 88 from PyObject