ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English
IIIFマニフェストファイルからOCR結果を含むTEI_XMLファイルを作成するプログラム

IIIFマニフェストファイルからOCR結果を含むTEI_XMLファイルを作成するプログラム

概要 IIIFマニフェストファイルからOCR結果を含むTEI_XMLファイルを作成するプログラムを作成しました。このプログラムの使用方法について説明します。 仕組み IIIFマニフェストファイルのURLを指定して、NDL古典籍OCR-LiteによるOCR結果を含むTEI/XMLファイルを作成します。 https://github.com/ndl-lab/ndlkotenocr-lite 使い方 以下のノートブックにアクセスしてください。 https://colab.research.google.com/github/nakamura196/000_tools/blob/main/IIIFマニフェストファイルからTEI_XMLファイルを作成するプログラム.ipynb そして、一つ目の再生ボタンを押します。 完了したら、「実行」という部分のmanifest_urlとoutput_dirの値を更新して、セルを実行します。 output_dirに、OCR結果を含むTEI/XMLファイルが出力されます。 出力例 以下のように、ページおよび行ごとのOCR結果を含むファイルが作成されます。 <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title>OCR結果: https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/0f11a3ed-18c2-7322-6340-19ed3f0d966e/manifest</title> </titleStmt> <publicationStmt> <publisher>NDL古典OCR</publisher> <date>2025-01-29</date> </publicationStmt> <sourceDesc> <bibl> <ptr target="https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/0f11a3ed-18c2-7322-6340-19ed3f0d966e/manifest"/> </bibl> </sourceDesc> </fileDesc> </teiHeader> <text> <body> <ab n="1" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/002/A05_4_002_0001.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-1">国外</seg> <lb/> <seg type="本文" n="3" corresp="#zone-3">空せみ二</seg> <lb/> <seg type="本文" n="4" corresp="#zone-4">ゆふかほ</seg> </ab> <ab n="2" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/002/A05_4_002_0002.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-1">あつたい</seg> <lb/> <seg type="本文" n="2" corresp="#zone-2">・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・</seg> <lb/> <seg type="本文" n="3" corresp="#zone-3">中川ノ中川宿にて之源氏十六才</seg> <lb/> <seg type="本文" n="4" corresp="#zone-4">住ぬ</seg> <lb/> <seg type="本文" n="5" corresp="#zone-5">ねられ給はぬまゝに。われはかく人に</seg> <lb/> <seg type="本文" n="6" corresp="#zone-6">にくまれてもならはぬを。こよひなん</seg> <lb/> <seg type="本文" n="7" corresp="#zone-7">はじめてうしと世を思ひ知ぬれば</seg> <lb/> <seg type="本文" n="8" corresp="#zone-8">はつかしうてながらふまじくこそ思ひ</seg> <lb/> <seg type="本文" n="9" corresp="#zone-9">なりぬれなどの給へば。なみたをさへ</seg> <lb/> <seg type="本文" n="10" corresp="#zone-10">こぼしてふしたり。いどらうたしと</seg> <lb/> <seg type="本文" n="11" corresp="#zone-11">おぼすてさぐりのほそくちいさき</seg> <lb/> <seg type="本文" n="12" corresp="#zone-12">ほどがみのいとながからざりしけ</seg> <lb/> まとめ 不完全な点もあるかと思いますが、参考になりましたら幸いです。 ...

校異源氏物語に対する類似テキスト検索アプリを作成しました。

校異源氏物語に対する類似テキスト検索アプリを作成しました。

概要 校異源氏物語に対する類似テキスト検索アプリを作成しました。以下のURLからお試しいただけます。 https://huggingface.co/spaces/nakamura196/genji_predict 本アプリの使用方法などについて紹介します。 データ 以下の校異源氏物語DBで公開されているテキストデータを使用します。 https://kouigenjimonogatari.github.io/ アプリの内容 仕組みは単純で、校異源氏物語の巻毎・ページ毎のテキストを用意しておき、入力された文字列との編集距離を算出し、類似度が高いテキスト(+巻とページ)を返却します。 ソースコードは以下です。 https://huggingface.co/spaces/nakamura196/genji_predict/tree/main 応用例 例えば、以下の「[源氏物語] [4](東京大学総合図書館所蔵)」では、1つのIIIFマニフェスト内に複数の巻が含まれており、何コマ目から何コマ目までが何巻に属するのか、素人には判断が難しい場合があります。 https://da.dl.itc.u-tokyo.ac.jp/portal/assets/b90bbddc-509d-7c12-0fb9-af409a90a487 そこで、上記に資料に対してコマ毎のOCRテキストを取得し、今回作成したアプリに問い合わせることで、ページ毎に推定される巻数が提示され、巻の変わり目を知る手助けを行うことができます。 OCR OCRにあたっては、NDL古典籍OCR-Liteを使用します。 https://github.com/ndl-lab/ndlkotenocr-lite OCR結果を修正して、以下のようなTEI/XMLを作成しました。 <?xml version="1.0" encoding="UTF-8"?> <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://relaxng.org/ns/structure/1.0"?> <?xml-model href="http://www.tei-c.org/release/xml/tei/custom/schema/relaxng/tei_all.rng" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> <TEI xmlns="http://www.tei-c.org/ns/1.0"> <teiHeader> <fileDesc> <titleStmt> <title>OCR結果: https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/b90bbddc-509d-7c12-0fb9-af409a90a487/manifest</title> </titleStmt> <publicationStmt> <publisher>NDL古典籍OCR-Lite</publisher> <date>2025-01-29</date> </publicationStmt> <sourceDesc> <bibl> <ptr target="https://iiif.dl.itc.u-tokyo.ac.jp/repo/iiif/b90bbddc-509d-7c12-0fb9-af409a90a487/manifest"/> </bibl> </sourceDesc> </fileDesc> </teiHeader> <text> <body> <ab n="1" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/004/A05_4_004_0001.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-1-1">国外</seg> <lb/> <seg type="本文" n="3" corresp="#zone-1-3">紅葉のか</seg> <lb/> <seg type="本文" n="4" corresp="#zone-1-4">はなのえん</seg> <lb/> <seg type="本文" n="5" corresp="#zone-1-5">あふひ</seg> </ab> <ab n="2" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/004/A05_4_004_0002.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-2-1">OOO</seg> <lb/> <seg type="本文" n="2" corresp="#zone-2-2">□□□□□□□□</seg> <lb/> <seg type="本文" n="3" corresp="#zone-2-3">源氏十七才ノ十月より四年の十月迄有</seg> <lb/> <seg type="本文" n="4" corresp="#zone-2-4">/朱雀院の行幸ば。神無月の十日</seg> <lb/> <seg type="本文" n="5" corresp="#zone-2-5">あまりなり。よのつねならず。おもし</seg> <lb/> <seg type="本文" n="6" corresp="#zone-2-6">ろかるべきたびのこと成ければ。御</seg> <lb/> <seg type="本文" n="7" corresp="#zone-2-7">かた〴〵物見給はぬことを口おし</seg> <lb/> <seg type="本文" n="8" corresp="#zone-2-8">がり給。うへもなつぼの。み給はざらん</seg> <lb/> <seg type="本文" n="9" corresp="#zone-2-9">をあかずおぼさるれば。誠楽を御</seg> <lb/> <seg type="本文" n="10" corresp="#zone-2-10">前にてせさせ給ふ。源氏の中将は。</seg> <lb/> <seg type="本文" n="11" corresp="#zone-2-11">青海波をぞまひ給ける。かたてには。</seg> <lb/> <seg type="本文" n="12" corresp="#zone-2-12">火とのゝ頭中将がたちようい人にこ</seg> <lb/> <seg type="本文" n="13" corresp="#zone-2-13">となるを。立ならびては。花のかたはらの</seg> <lb/> <seg type="本文" n="14" corresp="#zone-2-14">みやまばなり。入がたの日かげさやか</seg> <lb/> <seg type="本文" n="15" corresp="#zone-2-15">にさしたるに。がくのこゑまさり。物の</seg> <lb/> <seg type="本文" n="16" corresp="#zone-2-16">おもしろきほどに。おなじまひのあ</seg> <lb/> <seg type="本文" n="17" corresp="#zone-2-17">しぶみおもゝち。よに見えぬさまなり。</seg> <lb/> <seg type="本文" n="18" corresp="#zone-2-18">詠などし給へるはこれや仏の御迦</seg> <lb/> <seg type="本文" n="19" corresp="#zone-2-19">一後順伽のこゑならんと聞ゆ。おもし</seg> </ab> <ab n="3" type="page" facs="https://iiif.dl.itc.u-tokyo.ac.jp/iiif/soto_ogai_202310/A05_4/004/A05_4_004_0003.tif/full/full/0/default.jpg"> <lb/> <seg type="本文" n="1" corresp="#zone-3-1">ろく哀なるに。みかと泪おとし給。</seg> <lb/> <seg type="本文" n="2" corresp="#zone-3-2">上達部みこたちもみななき給ぬ</seg> <lb/> <seg type="本文" n="3" corresp="#zone-3-3">詠はてゝ初うちなをし給へるにま</seg> <lb/> <seg type="本文" n="4" corresp="#zone-3-4">ちとりたるがくのにぎはゝしきに</seg> <lb/> <seg type="本文" n="5" corresp="#zone-3-5">かほの色あひまさりてつねよりも</seg> <lb/> <seg type="本文" n="6" corresp="#zone-3-6">ひかると見え給。春宮の女御。かく</seg> 推定 上記のXMLファイルを入力として、先に紹介したGradioアプリのAPIを利用します。 ...

Azureの仮想マシンを用いたNDLOCRのGradioアプリ構築

Azureの仮想マシンを用いたNDLOCRのGradioアプリ構築

概要 以下の記事で、Azureの仮想マシンとNDLOCRを用いたGradioアプリについて紹介しました。 本記事では、このアプリの構築方法に関する備忘録です。 仮想マシンの構築 GPUを使用するにあたり、クォータの要求を行う必要がありました。 要求後、今回は「NC8as_T4_v3」を使用します。 Docker環境の構築 以下の記事を参考にします。 https://zenn.dev/koki_algebra/scraps/32ba86a3f867a4 Secure Boot の無効化 以下のように記載されています。 Secure Boot を無効化しないと NVIDIA Driver が正しくインストールされない. 実際、無効化しなかった場合、以下の画面が表示され、前に進めませんでした。 以下で、Secure Bootを無効化します。 NVIDIA Driver のインストール ubuntu-drivers コマンドのインストールを行い、インストール可能な NVIDIA Driver を確認する。 sudo apt-get update sudo apt install ubuntu-drivers-common ubuntu-drivers devices 以下が結果です。 vendor : NVIDIA Corporation model : TU104GL [Tesla T4] driver : nvidia-driver-535 - distro non-free recommended driver : nvidia-driver-470-server - distro non-free driver : nvidia-driver-535-server - distro non-free driver : nvidia-driver-470 - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin recommendedをインストールします。 ...

ndlocr_cli(NDLOCR(ver.2.1)アプリケーションを試すことができるGradioアプリを作成しました。

ndlocr_cli(NDLOCR(ver.2.1)アプリケーションを試すことができるGradioアプリを作成しました。

概要 ndlocr_cli(NDLOCR(ver.2.1)アプリケーションを試すことができるGradioアプリを作成しました。 以下のURLからお試しください。 https://ndlocr.aws.ldas.jp/ 補足 現在は1枚の画像アップロードのみに対応しています。今後、PDFのアップロード機能などのオプションも追加したいと思います。 Azureで使用可能なVMである「NC8as_T4_v3」に搭載されている「NVIDIA Tesla T4 GPU」を使用しています。 まとめ いつまでこの形で提供できるかはわかりませんが、ndlocr_cli(NDLOCR(ver.2.1)アプリケーションの精度の確認などにあたり、ご利用いただけますと幸いです。

NDL古典籍OCR-Liteを用いたGradio Appを作成しました。

NDL古典籍OCR-Liteを用いたGradio Appを作成しました。

概要 NDL古典籍OCR-Liteを用いたGradio Appを作成しました。 以下でお試しいただけます。 https://huggingface.co/spaces/nakamura196/ndlkotenocr-lite 「NDL古典籍OCR-Lite」ではデスクトップアプリケーションが提供されているため、Gradioのようなウェブアプリがなくても簡単に実行可能な環境が用意されています。 そのため、本ウェブアプリの用途としては、スマホやタブレット等からの利用や、ウェブAPIを介して利用などが考えられます。 作成時の工夫や不具合対応 サブモジュールの利用 本家のndlkotenocr-liteをサブモジュールとして導入しました。 [submodule "ndlkotenocr-lite"] path = ndlkotenocr-lite url = https://github.com/ndl-lab/ndlkotenocr-lite.git そして、ビルド時に以下を実行します。 #!/bin/bash # サブモジュールを初期化して更新 git submodule update --init --recursive git submodule update --remote これにより、ビルド時に、本家のndlkotenocr-liteの最新ファイルを利用できるかと思います。 (誤った理解をしている点もあるかもしれません。) Dockerfileの利用 上記のサブモジュールの利用にあたり、Dockerfileを使ってビルドする方式にしました。 sdkをdockerにすることで、Dockerfileに基づいてビルドされました。 --- title: NDL Kotenseki OCR-Lite Gradio App emoji: 👀 colorFrom: red colorTo: blue sdk: docker pinned: false --- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference Gradioのバージョン4.44.1の利用 当初のバージョン5.7.1のGradioを使用していましたが、後述するAPI利用の際、以下のエラーが出て利用できませんでした。 ValueError: Could not fetch api info for https://nakamura196-ndlkotenocr-lite.hf.space/: {"detail":"Not Found"} そこで、バージョン4.44.1を使用することで、このエラーを回避することができました。 ...

NDL古典籍OCR-Lite(ndlkotenocr-lite)をMac OSで使用する

NDL古典籍OCR-Lite(ndlkotenocr-lite)をMac OSで使用する

概要 2024年11月26日にNDLラボから、NDL古典籍OCR-Liteが公開されました。 https://lab.ndl.go.jp/news/2024/2024-11-26/ 本記事ではMac OSでの使用方法について紹介します。 使用方法(動画) https://www.youtube.com/watch?v=NYv93sJ6WLU 使用方法(テキスト) 以下にアクセスします。 https://github.com/ndl-lab/ndlkotenocr-lite/releases/tag/1.0.0 一覧からmacosを含むものを選びます。またチップについても、合致するものを選択します。 リンクをクリックすると、以下のように、「ndlkotenocr-lite_v1.0.0_macos_m1.tar.gz」がダウンロードされます。 ダブルクリック等で展開すると、macosというフォルダの中に、「NDLkotenOCR-Lite」というアプリケーションが展開されます。 「NDLkotenOCR-Lite」というアプリケーションをダブルクリックして起動します。 ただし、初回実行時は、以下のような警告と共に開くことができません。 「プライバシーとセキュリティ」に移動して、「このまま開く」を押すことで、アプリケーションを開くことができます。 結果、以下が起動します。 処理対象と出力先を選択して「OCR」ボタンを押すことで、以下のように認識されました。 ここでは『源氏物語』(東京大学総合図書館所蔵)を使用しています。 出力結果としては、txt, json, xmlファイルが生成されました。 まとめ 現時点ではNDL古典籍OCR ver.3と比較すると、読み取り精度が平均して約2%程度低下するとのことですが、GPUがなくとも軽量なOCR処理が可能となった点は大きなメリットだと思います。 開発者および公開に関わった方々に感謝いたします。

Google Cloud Vision APIを用いて、単一ページから構成される透明テキスト付きPDFを作成する

Google Cloud Vision APIを用いて、単一ページから構成される透明テキスト付きPDFを作成する

概要 PDFを対象に、Google Cloud Vision APIを使って、透明テキスト付きPDFを作成する機会がありましたので、備忘録です。 以下、simpleで検索した例です。 背景 今回は単一ページから構成されるPDFを対象とします。 手順 画像の作成 OCRの対象とする画像を作成します。 デフォルトの設定だとボヤけた画像ができてしまったので、解像度を2倍に設定し、また後述するプロセスで、解像度を考慮した位置合わせを実施しています。 以下をインストールします。 PyMuPDF Pillow import fitz # PyMuPDF from PIL import Image import json from tqdm import tqdm import io # 入力PDFファイルと出力PDFファイル input_pdf_path = "./input.pdf" # 単一ページのPDFファイル output_pdf_path = "./output.pdf" # 入力PDFファイルを開き、単一ページを読み込み pdf_document = fitz.open(input_pdf_path) page = pdf_document[0] # 最初のページを選択 # ページを画像としてレンダリングし、OCRでテキストを抽出 # pix = page.get_pixmap() # 解像度300 DPIでレンダリング zoom = 2.0 # 解像度を上げるためにズーム設定 mat = fitz.Matrix(zoom, zoom) pix = page.get_pixmap(matrix=mat) img = Image.open(io.BytesIO(pix.tobytes("png"))) img.save("./image.png") Google Cloud Vision API 出力された画像を対象に、Google Cloud Vision APIを適用します。 { "textAnnotations": [ { "boundingPoly": { "vertices": [ { "x": 141, "y": 152 }, { "x": 1082, "y": 152 }, { "x": 1082, "y": 1410 }, { "x": 141, "y": 1410 } ] }, "description": "Sample PDF...", "locale": "la" }, { "boundingPoly": { "vertices": [ { "x": 141, "y": 159 }, { "x": 363, "y": 156 }, { "x": 364, "y": 216 }, { "x": 142, "y": 219 } ] }, "description": "Sample" }, { "boundingPoly": { "vertices": [ { "x": 382, "y": 156 }, { "x": 506, "y": 154 }, { "x": 507, "y": 213 }, { "x": 383, "y": 215 } ] }, "description": "PDF" }, ... 出力結果として得られるJSONファイルを./google_ocr.jsonといった名前で保存します。 ...

縦書きに対応したText Overlay pluginを導入済みのMiradorのリポジトリ

縦書きに対応したText Overlay pluginを導入済みのMiradorのリポジトリ

概要 縦書きに対応したText Overlay pluginを導入済みのMiradorのリポジトリを更新しました。 https://github.com/nakamura196/mirador-integration-textoverlay 参考 変更元のText Overlay pluginのリポジトリは以下です。 https://github.com/dbmdz/mirador-textoverlay デモ 以下のページで動作内容をご確認いただけます。 https://nakamura196.github.io/mirador-integration-textoverlay/ 画面右上の「Text visible」ボタンを押すと、テキストが表示されます。ロード中のままとなってしまう場合には、ページの再読み込みをしてください。 参考 以下の記事で紹介した方法を使い、Text Overlay pluginをMirador 3に追加しています。 使用例 Text Overlay pluginの使用方法などについては、以下の記事を参考にしてください。 まとめ 今後、テキスト表示にあたり、ロードしたままになってしまう不具合を解消したいと思います。 IIIF画像とテキストの応用にあたり、参考になりましたら幸いです。

画像ファイルに対してGoogle Cloud Visionを適用して、IIIFマニフェストおよびTEI/XMLファイルを作成する

画像ファイルに対してGoogle Cloud Visionを適用して、IIIFマニフェストおよびTEI/XMLファイルを作成する

概要 画像ファイルに対してGoogle Cloud Visionを適用して、IIIFマニフェストおよびTEI/XMLファイルを作成するライブラリを作成しました。 https://github.com/nakamura196/iiif_tei_py 本ライブラリの使用方法を説明します。 使用方法 以下で使い方などを確認できます。 https://nakamura196.github.io/iiif_tei_py/ ライブラリのインストール GitHubのリポジトリから、ライブラリをインストールします。 pip install https://github.com/nakamura196/iiif_tei_py GCのサービスアカウントの作成 以下の記事などを参考に、GC(Google Cloud)のサービスアカウントキー(JSONファイル)をダウンロードします。 https://book.st-hakky.com/data-science/data-science-gcp-vision-api-setting/ そして、以下のような.envファイルを作成します。 GOOGLE_APPLICATION_CREDENTIALS=your-google-credentials.json 実行 入力サンプル画像として、IIIF Cookbookでも使用されている以下の画像を使用します。 https://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png 以下のようなファイルを作成して実行します。 from iiif_tei_py.core import CoreClient cred_path = CoreClient.load_env() url = "https://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png" output_tei_xml_file_path = "./tmp/01/output.xml" CoreClient.create_tei_xml_with_gocr(url, output_tei_xml_file_path, cred_path, title="Sample") 上記の例では、IIIFマニフェストファイルが./tmp/01/output.jsonに、TEI/XMLファイルが./tmp/01/output.xmlに作成されます。 結果の確認 IIIF IIIFマニフェストファイルをMiradorで表示した例が以下です。 JSONファイルの内容は以下です。 { "@context": "http://iiif.io/api/presentation/3/context.json", "id": "http://example.org/iiif/abc/manifest", "label": { "none": [ "Sample" ] }, "type": "Manifest", "items": [ { "id": "http://example.org/iiif/abc/canvas/p1", "type": "Canvas", "label": { "none": [ "[1]" ] }, "height": 1800, "width": 1200, "items": [ { "id": "http://example.org/iiif/abc/annotation/p0001-image", "type": "AnnotationPage", "items": [ { "body": { "id": "https://iiif.io/api/presentation/2.1/example/fixtures/resources/page1-full.png", "type": "Image", "format": "image/jpeg", "height": 1800, "width": 1200 }, "id": "http://example.org/iiif/abc/annotation/p0001-image/anno", "type": "Annotation", "motivation": "painting", "target": "http://example.org/iiif/abc/canvas/p1" } ] } ], "annotations": [ { "id": "http://example.org/iiif/abc/canvas/p1/curation", "type": "AnnotationPage", "items": [ { "body": { "type": "TextualBody", "value": "[00001] Top", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=245/69/94/52", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=245,69,94,52" }, { "body": { "type": "TextualBody", "value": "[00002] of", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=355/69/49/52", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=355,69,49,52" }, { "body": { "type": "TextualBody", "value": "[00003] First", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=420/69/112/54", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=420,69,112,54" }, { "body": { "type": "TextualBody", "value": "[00004] Page", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=547/70/134/53", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=547,70,134,53" }, { "body": { "type": "TextualBody", "value": "[00005] to", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=697/71/50/52", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=697,71,50,52" }, { "body": { "type": "TextualBody", "value": "[00006] Display", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=763/71/189/54", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=763,71,189,54" }, { "body": { "type": "TextualBody", "value": "[00007] Middle", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=296/593/163/164", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=296,593,163,164" }, { "body": { "type": "TextualBody", "value": "[00008] of", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=433/733/76/76", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=433,733,76,76" }, { "body": { "type": "TextualBody", "value": "[00009] First", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=484/786/123/124", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=484,786,123,124" }, { "body": { "type": "TextualBody", "value": "[00010] Page", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=584/889/128/129", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=584,889,128,129" }, { "body": { "type": "TextualBody", "value": "[00011] on", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=691/998/80/80", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=691,998,80,80" }, { "body": { "type": "TextualBody", "value": "[00012] Angle", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=749/1057/148/149", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=749,1057,148,149" }, { "body": { "type": "TextualBody", "value": "[00013] Bottom", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=203/1686/175/55", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=203,1686,175,55" }, { "body": { "type": "TextualBody", "value": "[00014] of", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=398/1689/51/53", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=398,1689,51,53" }, { "body": { "type": "TextualBody", "value": "[00015] First", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=466/1689/109/54", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=466,1689,109,54" }, { "body": { "type": "TextualBody", "value": "[00016] Page", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=593/1690/130/54", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=593,1690,130,54" }, { "body": { "type": "TextualBody", "value": "[00017] to", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=740/1692/51/54", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=740,1692,51,54" }, { "body": { "type": "TextualBody", "value": "[00018] Display", "format": "text/plain" }, "id": "http://example.org/iiif/abc/canvas/p1#xywh=808/1693/190/54", "type": "Annotation", "motivation": "commenting", "target": "http://example.org/iiif/abc/canvas/p1#xywh=808,1693,190,54" } ] } ] } ] } TEI また、TEI/XMLファイルをOxygen XML Editorで表示した例が以下です。 ...

ndlocr_cli実行時の共有メモリ不足への対応ほか

ndlocr_cli実行時の共有メモリ不足への対応ほか

概要 ndlocr_cli(NDLOCR(ver.2.1)アプリケーションのリポジトリ)を実行した際、いくつか対応を行う必要がありましたので、その備忘録です。 なお、これらの対応は私の設定漏れや変則的な使用方法によるものが多く、一般的な使用においては発生しないと思われます。同様の不具合が発生した際の参考としてご覧ください。 共有メモリ不足 ndlocr_cliを実行した際、以下のエラーが発生しました。 Predicting: 0it [00:00, ?it/s]ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm). DataLoader worker (pid(s) 3999) exited unexpectedly Chat GPTによる回答は以下でした。 「Unexpected bus error encountered in worker」というエラーメッセージは、通常、PyTorchのDataLoaderを使用している際に、共有メモリ(shared memory)が不足している場合に発生します。特に、データセットが大きい場合や多くのワーカーを使用している場合にこの問題が見られることがあります。 そして、以下の指示がありました。 Dockerや他の仮想環境を使用している場合は、共有メモリのサイズを増やす必要があります。Dockerを使用している場合は、コンテナを起動する際に --shm-size オプションを設定します。例えば、docker run --shm-size 2G ... のように設定します。 これについて、私のdockerの実行コマンドを確認したところ、--shm-sizeの指定が漏れていました。以下のスクリプトでは、--shm-size=256mが指定されていました。 https://github.com/ndl-lab/ndlocr_cli/blob/master/docker/run_docker.sh 上記のオプションを付与して実行したところ、無事、共有メモリ不足のエラーは解消しました。 (参考)現在の共有メモリのサイズを確認する 以下のコマンドにより確認できました。 df -h /dev/shm 上記のエラーが発生した時、64mとなっていました。 KeyError: ‘STRING’ 何度か、KeyError: 'STRING'に遭遇しました。この対処にあたり、以下の二つのファイルに変更を加えました。 https://github.com/ndl-lab/ndlocr_cli/blob/master/cli/core/inference.py#L681 https://github.com/ndl-lab/ruby_prediction/blob/646de35cefde6fa205f4b6a3ac308e7f5ba91061/output_ruby.py#L104C45-L104C65 line_xml.attrib['STRING']やelm.attrib['STRING']の箇所でエラーが発生していたため、以下の処理を加えました。 if 'STRING' not in line_xml.attrib: continue 参考:プログレスバーの追加 OCR処理中のプログレスバーを表示したいケースがありました。以下の箇所を修正します。 ...

ndlocr_cliをdockerでインストールした後の容量

ndlocr_cliをdockerでインストールした後の容量

ndlocr_cliをdockerでインストールした後の容量に関する備忘録です。 以下の手順を参考に、ndlocr_cliをセットアップしました。 以下のように、50GB弱が使われるようでしたので、残りの容量で入出力の画像ファイルなどを処理する必要があります。(以下では、200GBのディスク容量を割り当てた例です。) mdxuser@ubuntu-2204:~/ndlocr_cli$ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 5.7G 1.4M 5.7G 1% /run /dev/sda2 196G 45G 143G 24% / tmpfs 29G 0 29G 0% /dev/shm tmpfs 5.0M 0 5.0M 0% /run/lock /dev/sda1 1.1G 6.1M 1.1G 1% /boot/efi tmpfs 5.7G 4.0K 5.7G 1% /run/user/1000 AWS(Amazon Web Services)やmdx(データ活用社会創成プラットフォーム)において、仮想マシンを立ち上げる際の、仮想ディスク(GB)の指定などに役立てば幸いです。 参考になりましたら幸いです。

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

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

お知らせ 2026-02-24 ! 本ページで提供しているノートブックは今後更新されません。 NDLOCRについては、デスクトップアプリケーションおよびコマンドラインツールとして簡易に利用可能な「NDLOCR-Lite」が公開されました。今後は、こちらをお使いいただけますと幸いです。 https://github.com/ndl-lab/ndlocr-lite 2025-04-02 現在、不具合が発生しています。修正が完了するまで、ご使用をお控えください。 不具合を修正しました。 2025-03-21 NDL古典籍OCRについては、デスクトップアプリケーションとして簡易に利用可能な「NDL古典籍OCR-Lite」が公開されました。今後は、こちらをお使いいただけますと幸いです。 https://github.com/ndl-lab/ndlkotenocr-lite 概要 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の活用にあたり、お役に立ちましたら幸いです。

mdxでNDL古典籍OCRを実行する

mdxでNDL古典籍OCRを実行する

更新履歴 2024-05-22 「Dockerコマンドを実行するユーザーをdockerグループに追加」を追記しました。 概要 mdxは大学・研究機関で共創する産学官連携のためのデータプラットフォームです。 https://mdx.jp/ 今回は、mdxの仮想マシンを使用して、NDL古典籍OCRを実行してみます。 https://github.com/ndl-lab/ndlkotenocr_cli プロジェクトの申請 今回、プロジェクトタイプは「お試し/Trial」を選択しました。 「お試し/Trial」では、1つのGPUパックが割り当てられました。 仮想マシンの作成 デプロイ 今回は、「01_Ubuntu-2204-server-gpu (Recommended)」を選択しました。 デプロイ前の画面では、以下のように設定しました。パックタイプを「GPUパック」、パック数を1としました。 公開鍵については、ローカルPCで以下のように作成しました。 cd ~/.ssh/mdx ssh-keygen その後に作成されたid_rsa.pubの内容を貼り付けました。 その後、仮想マシンのデプロイが完了するまで少し待ちます。 SSH接続のためのネットワーク設定 以下の動画を参考に進めることができました。 https://youtu.be/p7OqcnXBQt8?si=E5JtC-xnrc5ZQYo_ まず起動した仮想マシンのサービスネットワーク1のIPv4アドレスを控えておきます。 次に、ネットワークタグから「DNAT」を追加しました。「転送元グローバルIPv4アドレス」は自動入力され、「転送先プライベートIPアドレス」に先ほど控えておいたサービスネットワークのIPv4アドレスを入力しました。 次に「ACL」を追加しました。動画にならって、以下のように設定しました。 特定のIPアドレスからのみアクセスする場合、以下のように設定しました。 一方、セキュリティの観点から、無制限に任意のアドレスからのアクセスを許可するのはリスクが伴いますが、以下のように設定することで、任意のアドレスからssh接続できるようです。 接続を試す DATで追加した転送元グローバルIPv4アドレスを使用します。初期ログイン後、パスワードの変更が求められるので、変更します。 ssh mdxuser@ -i ~/.ssh/mdx/id_rsa VS Codeで接続する その後の操作は、必須ではありませんが、VS Codeの拡張機能である「Remote Explorer」を使いました。 仮想マシン内での作業 GPUの確認 sudo su root@ubuntu-2204:/home/mdxuser# nvidia-smi +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.86.10 Driver Version: 535.86.10 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 NVIDIA A100-SXM4-40GB On | 00000000:03:00.0 Off | 0 | | N/A 25C P0 45W / 400W | 4MiB / 40960MiB | 0% Default | | | | Disabled | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | No running processes found | +---------------------------------------------------------------------------------------+ Dockerのインストール 以下のページの手順に沿って、Dockerをインストールしました。 ...

Mirador3プラグイン開発: Text Overlay pluginで縦書き対応を行う

Mirador3プラグイン開発: Text Overlay pluginで縦書き対応を行う

概要 Text Overlay plugin for Mirador 3は、OCRまたはトランスクリプションに基づいて選択可能なテキストオーバーレイを表示するMirador3のプラグインです。 https://github.com/dbmdz/mirador-textoverlay 以下でデモページが公開されています。 https://mirador-textoverlay.netlify.app/ 一方、日本語などの縦書きテキストを表示してみると、以下のようにうまく表示ができませんでした。 そこで、上記のリポジトリをフォークして、縦書きテキストも表示できるようにしました。以下のリポジトリでソースコードを公開しています。(いずれプルリクエストも検討したいと思います。) https://github.com/nakamura196/mirador-textoverlay 結果、以下のように縦書きテキストも表示できるようになりました。 デモページは以下です。 https://nakamura196.github.io/mirador-integration-textoverlay/?manifest=https://nakamura196.github.io/static/iiif/6722fa34-2fff-11ee-a029-0242ac1c000c/manifest_o.json&annotationState=1&canvasIndex=3 以下、本モジュール開発に関連する事項をメモします。 マニフェストファイルの構造 本モジュールでは、以下の要件を満たすIIIFマニフェストが必要とのことでした。 https://github.com/dbmdz/mirador-textoverlay#requirements-for-supported-iiif-manifests いくつかのオプションがありますが、以下のwellcome collectionのマニフェストを参考にしました。 https://iiif.wellcomecollection.org/presentation/v2/b18035723 Canvas毎にseeAlsoでALTO XMLファイルへのURLが指定されています。 { "@id": "https://iiif.wellcomecollection.org/presentation/b18035723/canvases/b18035723_0003.JP2", "@type": "sc:Canvas", "label": "-", "thumbnail": { "@id": "https://iiif.wellcomecollection.org/thumbs/b18035723_0003.JP2/full/72,100/0/default.jpg", "@type": "dctypes:Image", "service": { "@context": "http://iiif.io/api/image/2/context.json", "@id": "https://iiif.wellcomecollection.org/thumbs/b18035723_0003.JP2", "profile": "http://iiif.io/api/image/2/level0.json", "protocol": "http://iiif.io/api/image", "width": 732, "height": 1024, "sizes": [ { "width": 72, "height": 100 }, { "width": 143, "height": 200 }, { "width": 286, "height": 400 }, { "width": 732, "height": 1024 } ] } }, "seeAlso": { "@id": "https://api.wellcomecollection.org/text/alto/b18035723/b18035723_0003.JP2", "profile": "http://www.loc.gov/standards/alto/v3/alto.xsd", "format": "text/xml", "label": "METS-ALTO XML" }, "height": 3372, "width": 2411, "images": [ { "@id": "https://iiif.wellcomecollection.org/presentation/b18035723/canvases/b18035723_0003.JP2/painting/anno", "@type": "oa:Annotation", "motivation": "sc:painting", "resource": { "@id": "https://iiif.wellcomecollection.org/image/b18035723_0003.JP2/full/732,1024/0/default.jpg", "@type": "dctypes:Image", "format": "image/jpeg", "height": 1024, "width": 732, "service": { "@context": "http://iiif.io/api/image/2/context.json", "@id": "https://iiif.wellcomecollection.org/image/b18035723_0003.JP2", "profile": "http://iiif.io/api/image/2/level1.json", "protocol": "http://iiif.io/api/image", "width": 2411, "height": 3372 } }, "on": "https://iiif.wellcomecollection.org/presentation/b18035723/canvases/b18035723_0003.JP2" } ], "otherContent": [ { "@id": "https://iiif.wellcomecollection.org/annotations/v2/b18035723/b18035723_0003.JP2/line", "@type": "sc:AnnotationList", "label": "Text of page -" } ], "within": "" } まとめ 開発したプラグインについて、xmlファイルのロードが完了しない時があるなど、引き続き改善が必要ですが、Mirador3のプラグイン開発やIIIF、OCR結果の活用にあたり、参考になりましたら幸いです。 ...

ALTO (Analyzed Layout and Text Object) XMLについて

ALTO (Analyzed Layout and Text Object) XMLについて

概要 ALTO (Analyzed Layout and Text Object) XMLについて、GPT-4に問い合わせた結果を共有します。 https://www.loc.gov/standards/alto/ 必須項目 ALTO (Analyzed Layout and Text Object) XMLは、OCR生成テキストとそのレイアウトを表現するためのXMLスキーマです。その構造は非常に柔軟で、多くの要素と属性が存在しますが、必須の要素は限られています。 最も単純な形式のALTO XMLは、以下のような階層構造を持ちます: <alto>: ルート要素です。ALTO XMLスキーマのバージョンを示す@xmlns属性と@xmlns:xsi属性を持つ必要があります。また、<Description>と<Layout>という二つの子要素を持つ必要があります。 <Description>: ファイルのメタデータを含みます。この要素自体に必須の子要素はありませんが、通常、<MeasurementUnit>, <sourceImageInformation>や<OCRProcessing>などの子要素を含むでしょう。 <Layout>: ファイルの物理的なレイアウトを表現します。これは<Page>という子要素を1つ以上含む必要があります。 <Page>: 一つのページを表現します。この要素は@IDと@WIDTHと@HEIGHTという三つの必須属性を持つべきです。また、<PrintSpace>という子要素を1つ持つことができます。 上記の要素はALTO XMLの最も基本的な構造を表現していますが、テキストの内容やそのレイアウトを詳細に表現するためには、さらに多くの要素と属性を使用することが可能です。例えば、<PrintSpace>, <TextBlock>, <TextLine>, <String>などの要素を使用することで、テキストの物理的な配置や内容を詳細に表現することができます。それぞれの要素や属性の詳細については、ALTO XMLスキーマのドキュメンテーションを参照してください。 OCRProcessing要素 OCRProcessing要素は、ALTO XML内の<Description>エレメント内で使用されます。この要素は、特定のOCRプロセスに関する情報を格納します。それは以下のサブ要素を持つことができます: ocrProcessingStep: OCR処理の各ステップを記述します。この要素は processingDateTime, processingAgency, processingSoftware, processingStepSettings, processingStepDescriptionといった属性を持つことができます。 以下に、OCRProcessingエレメントの使用例を示します: <Description> ... <OCRProcessing ID="OCR1"> <ocrProcessingStep> <processingDateTime>2023-08-01T00:00:00</processingDateTime> <processingAgency>Agency Name</processingAgency> <processingSoftware> <softwareCreator>Software Creator Name</softwareCreator> <softwareName>Software Name</softwareName> <softwareVersion>Software Version</softwareVersion> </processingSoftware> <processingStepSettings>Settings</processingStepSettings> <processingStepDescription>Description of the processing step</processingStepDescription> </ocrProcessingStep> </OCRProcessing> ... </Description> ここで、processingDateTimeはOCR処理が行われた日時を表し、processingAgencyはその処理を行った機関名を表します。processingSoftwareはOCR処理に使用されたソフトウェアに関する情報を含み、processingStepSettingsとprocessingStepDescriptionはそれぞれ設定と処理手順の説明を提供します。 ...

Google Colabを用いたNDL古典籍OCRチュートリアルの不具合の修正および機能追加を行いました。

Google Colabを用いたNDL古典籍OCRチュートリアルの不具合の修正および機能追加を行いました。

概要 以下の記事で紹介している、Google Colabを用いたNDL"古典籍"OCRアプリのチュートリアルを作成しています。 今回、以下の更新を行いました。 利用条件の追加 不具合の修正 IIIF Presentation API v3のマニフェストファイルの入力への対応 更新したノートブックは、これまでと同じ以下のURLでアクセスいただけます。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/NDL古典籍OCRの実行例.ipynb 利用条件の追加 ノートブック自体はCC0でご利用ください。ただし、「NDL古典籍OCRアプリケーション」は国立国会図書館がCC BY 4.0ライセンスで公開するものですので、クレジットの表示をお願いいたします。また、OCR適用対象の資料の利用条件などについても、それぞれご確認ください。 不具合の修正 OCR結果が出力されない不具合が発生していました。また、ライブラリのインストールにも長い時間がかかるようになっていました。これらの2点を修正しています。 IIIF Presentation API v3のマニフェストファイルの入力への対応 これまで、IIIF Presentation API v2のマニフェストファイルの入力のみに対応していました。 今回、v3への対応を行いました。この検証にあたり、以下の記事で紹介したIIIF Presentation API v3のマニフェストファイルを使用しました。 まとめ この間、不具合が発生しており申し訳ありません。NDL古典籍OCRの活用に役立つことができれば幸いです。

Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリ

Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリ

概要 Hugging Face Spaceを用いたNDL古典籍OCRのウェブアプリを作成しました。以下でお試しいただけます。画像アップロードして、1分程度すると、OCR結果のテキストとJSONデータが表示されます。 https://huggingface.co/spaces/nakamura196/ndl_kotenseki_ocr 本アプリの作成にあたっては、以下の記事を参考にさせていただきました。 https://qiita.com/relu/items/e882e23a9bd07243211b 使い分け NDL古典籍OCRを試す環境として、Google Colabを用いたチュートリアルを別途用意しています。 上記では無料でGPUを使用することができるため、高速なOCR処理が可能です。一方、ノートブックの初回起動時に、関連するライブラリやモデルのダウンロードを行うため、4分程度のセットアップ時間がかかってしまう点等に課題があります。 一方、今回Hugging Face Spaceを用いた作成したアプリケーションでは、72時間連続して使用されない(2023年2月時点)限り、OCR処理を即座に実行することが可能です。さらに、Web APIによる利用も可能といった点が挙げられます。(APIによる利用については後述します。)ただし、無料枠ではGPUが使用できないため、1画像あたり1分程度の処理時間がかかる点が課題です。(有料枠でGPUを使用することもできます。) APIによる利用 APIによる利用例を試すことができるノートブックを用意しました。504 Gateway Time-outというエラーが発生してしまう場合もありますが、参考になりましたら幸いです。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/GradioのAPIを用いたNDL古典籍OCRの例.ipynb まとめ NDL古典籍OCRの精度(≠速度)を試してみる場合など参考になりましたら幸いです。

NDL古典籍OCRをAmazon EC2のCPU環境で実行する

NDL古典籍OCRをAmazon EC2のCPU環境で実行する

概要 NDL古典籍OCRをAmazon EC2のCPU環境で実行してみましたので、その備忘録です。高額になりがちなGPU環境を用意せずに実行できる点が利点ですが、1画像あたり30秒から1分程度の時間がかかりますので、ご注意ください。 本環境の構築にあたり、以下の記事を参考にしています。 https://qiita.com/relu/items/e882e23a9bd07243211b インスタンス クイックスタートのUbuntuを選択します。 インスタンスタイプについえは、t2.medium以上をおすすめします。それより小さいインスタンスだと、エラーが発生しました。 サーバ内での設定 sshでログインし、以下を実行します。 sudo apt-get update && sudo apt-get upgrade -y sudo apt -y install build-essential sudo apt -y install libgl1-mesa-dev libglib2.0-0 sudo apt -y install unzip sudo apt install -y python3-pip sudo apt install -y python3.10-venv python3 -m venv app source app/bin/activate pip install --upgrade pip git clone https://github.com/ndl-lab/ndlkotenocr_cli.git cd ndlkotenocr_cli vi requirements.txt requirements.txtを開き、scikit-imageのバージョンを除く。また、torchとtorchvisionを追加する。 click lmdb==1.2.1 natsort==7.1.1 nltk==3.6.6 numpy==1.22.4 albumentations==1.2.1 opencv-python==4.6.0.66 protobuf==3.19.6 pyyaml scikit-image # scikit-image==0.16.2 scipy==1.7.3 lightgbm==3.3.2 transformers==4.19.1 pandas==1.3.5 mmcls==0.23.1 mmdet==2.25.0 datasets==2.2.1 jiwer==2.3.0 wheel torch torchvision 引き続き以下を実行する。 ...

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

Amazon SageMaker Studioを用いたNDL古典籍OCRの実行

概要 これまで、Google Cloud PlatformやGoogle Colabを用いたNDL OCR及びNDL古典籍OCRのチュートリアルを作成してきました。 今回は、Amazon SageMaker Studioを用いたNDL古典籍OCRの実行方法について説明します。なお、今回の方法では、実行の際に費用が発生しますのでご注意ください。 Amazon SageMaker Studioの説明は以下です。 https://aws.amazon.com/jp/sagemaker/studio/ ドメインの設定など ドメインの設定などは以下の記事などを参考にしてください。 https://dev.classmethod.jp/articles/how-to-walk-around-amazon-sagemaker-studio-new-ui/ 今回は以下のように作成済みのユーザープロファイルから「起動」→「Studio」を選択したところから説明します。 Studioでの操作 ノートブックの起動方法はいくつかありますが、ここでは、「File」→「New」→「Notebook」で起動してみます。 その後、以下のようなダイアログが表示されるため、今回は「ml.g4dn.xlarge」を選択します。 !nvidia-smiを実行すると、Tesla T4が表示されます。 ノートブックの実行 以下のファイルをノートブックをダウンロードし、SageMakerにアップロードしてください。 https://github.com/nakamura196/ndl_ocr/blob/main/sagemaker_ndl_kotenseki_ocr.ipynb ノートブックの作成にあたっては、@blue0620さんのノートブックを参考にしています。 https://github.com/blue0620/NDLkotenOCR-GoogleColabVersion/blob/main/NDLkotensekiOCR_googlecolabversion.ipynb 上記からの大きな差分として、まず、以下を実行しています。これらを行わないと、ライブラリのインストール時に、error: command 'gcc' failed with exit status 1といったエラーが発生します。 !apt update !apt -y install build-essential !apt -y install libgl1-mesa-dev libglib2.0-0 以下のように、OCR処理が実行されます。 インスタンスの削除 実行後は、忘れずにインスタンスの削除を行います。例えば、画面左部の「Running Terminals and Kernels」から「Running Instances」にあるインスタンスをシャットダウンします。 まとめ Amazon SageMaker Studioを用いたNDL古典籍OCRの実行方法について説明しました。

Google Colabを用いたNDL

Google Colabを用いたNDL

概要 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のチュートリアルについては、以下を参考にしてください。