ホーム 記事一覧 ブック DH週間トピックス 検索 このサイトについて
English

KotenOCR: 近代OCRの検出重複を解消する(NMS追加とクラスフィルタリング)

はじめに KotenOCRは、国立国会図書館(NDL)が公開したOCRモデルをiOS上で動作させ、くずし字や近代活字をオフラインで認識するアプリです。 近代OCRモード(NDLモード)では、NDLのDEIMv2-Sモデルでレイアウト検出を行い、PARSeQで文字認識を行います。しかし、iOS実装の検出結果が本家のndlocr-liteと比べて明らかに多く、テキストが重複して認識されるという問題がありました。 本記事では、原因の調査から修正までの過程を記録します。 症状:検出数が多すぎる テスト画像として、NDLデジタルコレクションから取得した「校異源氏物語」の序文ページを使いました。 本家ndlocr-liteでは17件の行検出(line_main、line_captionなど)が得られるのに対し、iOS実装では28件の検出が返り、OCR結果にも重複テキストや文字化けが混入していました。 検出数が多い原因は大きく3つありました。 原因1:NMS(Non-Maximum Suppression)が未実装だった DEIMv2モデルのONNX出力は、内部でNMSを完了した結果を返すと想定していました。しかし本家ndlocr-liteのコードを読むと、モデル推論後に追加のNMS(IoU閾値=0.2)を適用していることがわかりました。 つまり、モデル出力にはまだ重複する矩形が含まれており、後処理でそれを除去する必要があったのです。 修正:NMSの追加 DEIMDetector.swiftにNMS処理を追加しました。 // DEIMDetector.swift — postprocess() の末尾 // Sort by score descending let sorted = detections.sorted { $0.score > $1.score } // Apply NMS to remove overlapping detections let nmsResult = applyNMS(sorted, iouThreshold: iouThreshold) return Array(nmsResult.prefix(maxDetections)) NMS本体の実装は以下のとおりです。スコア降順にソートされた検出結果を走査し、既に採用した矩形とのIoUが閾値を超える場合は除外します。 // DEIMDetector.swift /// Apply Non-Maximum Suppression to remove overlapping detections. private func applyNMS(_ detections: [Detection], iouThreshold: Float) -> [Detection] { var kept: [Detection] = [] for det in detections { var shouldKeep = true for existing in kept { if computeIoU(det.box, existing.box) > iouThreshold { shouldKeep = false break } } if shouldKeep { kept.append(det) } } return kept } /// Compute Intersection over Union between two boxes [x1, y1, x2, y2]. private func computeIoU(_ a: [Int], _ b: [Int]) -> Float { let x1 = max(a[0], b[0]) let y1 = max(a[1], b[1]) let x2 = min(a[2], b[2]) let y2 = min(a[3], b[3]) let interW = max(0, x2 - x1) let interH = max(0, y2 - y1) let interArea = Float(interW * interH) let areaA = Float((a[2] - a[0]) * (a[3] - a[1])) let areaB = Float((b[2] - b[0]) * (b[3] - b[1])) let unionArea = areaA + areaB - interArea guard unionArea > 0 else { return 0 } return interArea / unionArea } 原因2:全クラスをOCRに送っていた DEIMv2モデルは17クラスのレイアウト要素を検出します。 ...

KotenOCR:くずし字をオフラインで認識するiOSアプリの開発と公開

KotenOCR:くずし字をオフラインで認識するiOSアプリの開発と公開

はじめに 古典籍に書かれたくずし字(変体仮名・草書体の漢字)を読むのは、専門家でも容易ではありません。近年はAI-OCRによって機械的な認識が可能になってきましたが、調査した限り、スマートフォンでオフライン利用できるツールは見当たりませんでした。 KotenOCRは、国立国会図書館(NDL)が公開した軽量くずし字OCRモデル「NDL古典籍OCR-Lite」をiOS上で動作させ、写真を撮るだけでくずし字を認識できるアプリです。 App Store(無料): https://apps.apple.com/jp/app/kotenocr/id6760045646 背景:既存ツールの状況 NDLが「NDL古典籍OCR-Lite」を公開したことで、くずし字OCRの敷居は下がりました。既存ツールを見渡すと以下のような状況でした。 ツール 形態 インターネット接続 NDL古典籍OCR-Lite デスクトップ / Web / CLI 不要(デスクトップ版) miwo(CODH) モバイルアプリ 必要 古文書カメラ(TOPPAN) モバイルアプリ 必要 モバイルアプリは存在するものの、いずれもクラウド通信が必要です。一方、NDL古典籍OCR-LiteはPC環境でしか動作しません。 そこで、NDL古典籍OCR-Liteのモデルをスマートフォンに載せて、オフラインで動くiOSアプリを作ることにしました。 KotenOCRの特徴 完全オフライン — すべての処理がデバイス上で完結。通信不要 iPhone / iPad対応 — iOS 16.0以上 無料 — App Storeから無料でダウンロード可能 スキャン履歴 — 認識結果を保存・管理 TXT / PDFエクスポート — 認識テキストをファイルとして出力 範囲トリミング — 認識する領域を指定可能 使い方 古典籍の写真を撮影する(またはライブラリから選択) AIがくずし字を自動認識 認識されたテキストをコピー・エクスポート OCRパイプライン 写真からテキストが認識されるまでの処理フローは以下の通りです。 写真 → トリミング → テキスト領域検出 → 文字認識 → 読み順決定 → 表示 テキスト領域検出: RTMDetモデルにより、画像内の文字領域を検出 文字認識: PARSeqモデルにより、検出領域内の文字を認識(7,141文字、NDLmojiの文字集合に対応) 読み順: 日本語の縦書き・右から左への読み順を考慮して並べ替え ...

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(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処理が可能となった点は大きなメリットだと思います。 開発者および公開に関わった方々に感謝いたします。

NDLTSR (NDL Table Structure Recognition)を試す

NDLTSR (NDL Table Structure Recognition)を試す

概要 NDLTSR (NDL Table Structure Recognition)は以下のように説明されています。 資料画像に含まれる表の構造を認識するプログラムを公開しています。 座標付きのOCRテキストデータと組み合わせることで表中に含まれるテキストデータを構造化する用途に利用できます。 参考(外部リンク):次世代デジタルライブラリーへの新機能(表の構造化)の追加及び新機能のソースコード及びデータセットの公開について 本プログラムにより、国立国会図書館が公開しているNDLTableSetを学習した機械学習モデルによる表構造の推論を行えるほか、LORE-TSR(外部リンク)と同様の方法により別途利用者が用意したデータセットによる再学習を行うことが可能です。 ノートブック 以下のノートブックを用意しました。 https://colab.research.google.com/github/nakamura196/000_tools/blob/main/NDLTSR.ipynb 以下のように、「ランタイム」 > 「すべてのセルを実行」 からお試しいただけます。 結果 以下のような認識結果が出力されます。 参考 台湾総督府農業試験所 編『台湾総督府農業試験所彙報』第197号 甘藷の生育、収量並に品質に及ぼす懽漑の影響,台湾総督府農業試験所,昭和15-19. 国立国会図書館デジタルコレクション https://dl.ndl.go.jp/pid/1046122 (参照 2024-04-26) https://dl.ndl.go.jp/pid/1046122/1/1 注意 以下のように公式の説明がありますが、本プログラムで得られるのは表の構造情報のみである点にご注意ください。 本プログラムが推論できるのは、表の構造情報(各セルの矩形座標及びセル間の関係性を表す数値情報)であるので、プログラム単体でOCR処理プログラムとして利用することはできません。 次世代デジタルライブラリーの機能と同様の処理を行うためには、別途座標付きテキストデータを出力するOCR処理プログラムが必要です。 まとめ NDLTSR (NDL Table Structure Recognition)の試行にあたり、参考になりましたら幸いです。

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をインストールしました。 ...

NDL-DocLデータセット(資料画像レイアウトデータセット)の変換と可視化

NDL-DocLデータセット(資料画像レイアウトデータセット)の変換と可視化

NDL Labが公開するNDL-DocLデータセット(資料画像レイアウトデータセット)について、Pascal VOC形式のXMLファイルをCOCO形式のJSONファイルへ変換し、その内容を可視化するノートブックを作成しました。 https://github.com/nakamura196/ndl_ocr/blob/main/NDL_DocLデータセット(資料画像レイアウトデータセット)の変換と可視化.ipynb 上記のノートブックを開き、「ランタイム」 > 「すべてのセルを実行」 を押すことで、変換と可視化を行うことができます。 実行後に作成される「/content/img」フォルダと「/content/dataset_kotenseki.json」ファイルを使用することで、COCO形式のデータが求められる機械学習プログラムに使用することができます。 参考になりましたら幸いです。

NDL OCRでルビのテキスト化を行えるようにしていただきました。

NDL OCRでルビのテキスト化を行えるようにしていただきました。

概要 NDL OCRについて、これまではルビのテキスト化を行わない設定がデフォルトでした。これに対して、NDLの方々のご協力により、テキスト化を行うか否かを設定できるようにしていただきました。 https://github.com/ndl-lab/ndlocr_cli/ config.yamlの以下をTrueにするとルビのテキスト化機能が動作します。 yield_block_rubi: False また、以下の留意事項があるとのことです。ご利用される際はご注意ください。 必ずしもルビの振られた漢字の箇所で切れるわけではなく、複数箇所のルビがマージされて出力されてしまうことも多い ルビは字のサイズが小さいことから、〓になってしまうことも多い チュートリアル用のノートブックの更新 ルビのテキスト化オプションについて、チュートリアル用のGoogle Colabにも追加しました。 https://colab.research.google.com/github/nakamura196/ndl_ocr/blob/main/ndl_ocr_v2.ipynb rubyというオプションにチェックを入れると、ルビのテキスト化を行います。デフォルトでは、従来通りFalse(ルビのテキスト化は行わない設定)にしています。 また今回の機能追加に合わせて、PDFを入力とした際の不具合修正や、認識結果の出力方法の変更等を行いました。認識結果を保存したGoogleドライブへのリンクを出力し、リンク先で認識結果を確認する方法に統一しました。 操作方法については、今回の修正内容は含まれていませんが、以下のデモ動画を用意しています。Google Colabの使い方など、参考になりましたら幸いです。 https://youtu.be/46p7ZZSul0o