世界を動かす技術を、日本語で。

Nanonets-OCR-s – 文書を構造化されたマークダウンに変換するOCRモデル

概要

Nanonets-OCR-s は、画像からMarkdown形式への変換に特化した高度なOCRモデル。 数式・画像・署名・透かし など複雑な要素も正確に抽出・構造化。 LLMとの連携 や下流処理に最適なセマンティックタグ付けを実現。 多様な実装方法 (transformers, vLLM, docext)をサポート。 GitHub・論文情報 も公開、研究・業務利用に適したモデル。

Nanonets-OCR-sの特徴

  • 画像からMarkdown形式 への直接変換を実現する最先端OCRモデル
  • 数式認識
    • LaTeX形式 で数式・数式ブロックを自動抽出
    • インライン($...$)とディスプレイ($$...$$)の区別
  • 画像説明生成
    • 画像を <img>タグ で記述し、内容・スタイル・文脈まで自動説明
    • ロゴ・グラフ・図表等の多様な画像タイプに対応
  • 署名検出・分離
    • <signature>タグ で署名部分を識別・抽出
    • 法務・ビジネス文書処理に有用
  • 透かし検出・抽出
    • <watermark>タグ で透かしテキストを明示的に出力
  • チェックボックス対応
    • チェックボックスやラジオボタンを Unicode記号 (☐, ☑, ☒)で正規化
  • 複雑な表の抽出
    • Markdown・HTML両形式 で表を高精度に抽出・再現

利用方法(transformers経由)

  • 必要なライブラリ
    • transformers, PIL, torch
  • モデル・トークナイザー・プロセッサの準備
    • model_path = "nanonets/Nanonets-OCR-s"
    • AutoModelForImageTextToText, AutoTokenizer, AutoProcessorの利用
  • 推論関数例
    • 画像ファイルをPILで開き、 プロンプト を付与してモデルに入力
    • テーブルはHTML形式、数式はLaTeX形式で抽出
    • 画像説明や透かし・ページ番号もタグで明示
  • 出力例
    • 構造化されたMarkdownテキストを返却

vLLM経由での利用

  • vLLMサーバーの起動
    • vllm serve nanonets/Nanonets-OCR-s
  • OpenAI互換APIでの推論
    • 画像をbase64エンコードし、API経由で送信
    • テンプレートプロンプトで詳細な抽出指示が可能
    • 最大トークン数や温度設定のカスタムも可能

docext経由での利用

  • インストールと起動
    • pip install docext
    • python -m docext.app.app --model_name hosted_vllm/nanonets/Nanonets-OCR-s
  • 詳細情報
    • GitHubリポジトリ で追加情報・サンプルコードを提供

論文・引用情報

  • BibTex形式
    • @misc{Nanonets-OCR-S, ...}
  • 著者
    • Souvik Mandal, Ashish Talewar, Paras Ahuja, Prathamesh Juvatkar
  • 発表年
    • 2025年

まとめ

  • Nanonets-OCR-s は、LLM時代の文書デジタル化に最適な 高機能OCRモデル
  • 数式・画像・署名・透かし など多様な要素を Markdown構造 で出力
  • 研究・業務 双方で高い導入効果

Hackerたちの意見

フルディスクリーマー:私はNanonetsで働いています。Nanonets-OCR-sを紹介できるのが楽しみです!これは、ドキュメントをクリーンで構造化されたMarkdownに変換する強力で軽量な(3B)VLMモデルです。このモデルは、ドキュメントの構造や内容のコンテキスト(テーブル、数式、画像、グラフ、透かし、チェックボックスなど)を理解するように訓練されています。主な特徴:

  • LaTeX数式認識:インラインおよびブロックレベルの数学を適切にフォーマットされたLaTeXに変換します。$...$と$$...$$を区別します。
  • LLM用の画像説明:埋め込まれた画像を構造化されたタグを使って説明します。ロゴ、チャート、グラフなどを扱います。
  • 署名検出と分離:スキャンしたドキュメント内の署名を見つけてタグ付けし、ブロックとして出力します。
  • 透かし抽出:透かしのテキストを抽出し、トレーサビリティのためにタグ内に保存します。
  • スマートチェックボックスとラジオボタンの処理:チェックボックスをUnicodeシンボル(例えば、☑️、☐、⚪️)に変換し、下流のアプリでの信頼性のある解析を実現します。
  • 複雑なテーブル抽出:複数行/列のテーブルを扱い、構造を保持し、MarkdownとHTMLの両方の形式で出力します。 Huggingface / GitHub / 試してみてください: https://huggingface.co/nanonets/Nanonets-OCR-s ColabでDocextを試してみてください: https://github.com/NanoNets/docext/blob/main/PDF2MD_README.m...

Docextの正しいリンク: https://github.com/NanoNets/docext/blob/main/PDF2MD_README.m...

画像自体を抽出する方法はあるの?それとも、後で別のプロセスが必要なのかな?

こういうモデルの場合、多言語が言及されていないと、実際の英語以外のPDFではすごくパフォーマンスが悪くなるよね。

このモデルは主に英語のドキュメントで訓練されているから、英語が主な言語として挙げられているんだ。でも、訓練データには少しだけ中国語やいろんなヨーロッパの言語も含まれているよ。さらに、ベースモデル(Qwen-2.5-VL-3B)は多言語対応なんだ。誰かがRedditで中国語でも動くって言ってたよ: https://www.reddit.com/r/LocalLLaMA/comments/1l9p54x/comment...

Datalab/Markerと比べてどうなの? https://github.com/datalab-to/marker いろんなPDF->MDコンバーターを評価したけど、これが一番良かったよ。ただ、完璧ではないけどね。

自分でもクロス比較を始めたばかりなんだけど、もし候補のリストがあれば教えてもらえると嬉しいな。

体験的には、数学とコードが混ざった複雑な目的にはすごく役立ってるよ。私の「リトマス試験」みたいな論文の一つは、Fortranの逆ラプラス変換アルゴリズムに関する古い論文なんだけど、インラインとディスプレイの数式、モノスペースのコードブロックが混ざってて、最初からOCRが必要なんだ。現在のモデルでは満足できる結果を出してるのは少ないけど、例えばMarkerで書き取った以下のページでは、インラインの$\sigma_0$が「s 0」になっちゃったり、$f(t)$が「f~~t*!」になっちゃったりしてる。でも、今のモデルは両方とも正しく認識してくれるよ。

こういうモデルがMarkdownをターゲットにしてるのは残念だよね。もっと構造的で仕様のあるものじゃなくて。Markdownにはいろんなバリエーションがあって、脚注や参照、図などのサポートが限られてるし。

実際、私たちはモデルをMarkdownに変換しながら、同時にセマンティックタグ付けもできるように訓練してるんだ。例えば、数式はLaTeX数式として抽出され、画像(グラフや図など)はタグ内で説明されるよ。同様に、, ``, もね。さらに、複雑なテーブルはMarkdownではなくHTMLテーブルとして抽出するよ。

「構造化Markdown」の話を聞く方が、LLM OCRモデルよりもワクワクしたんだけど、結局のところ特定の要素にタグを付けるだけみたい。LLMの文脈では役立つけど、それ以外ではあまり使えないかな。

10年分の古いWordやPowerPointのドキュメントを取り込んで、個々の要素を他のフォーマットに再利用できる標準化された形式に変換するものを探してたんだ。これ、そういうシステムを実現するための重要な基盤になりそうだね。今は、要素を簡単にアーカイブして引き出せるカタログやアーカイブ、歴史機能が必要だな。素晴らしい仕事だね!

unoconvやpandocから始めて、変換後にLLMを使ってクリーンアップすればいいんじゃない?

マルチカラムのテキストやヘッダー、フッターにはどう対応してるの?

階層的なカラムヘッダーや、rowspanやcolspanが1より大きいテーブルでモデルを訓練したから、問題なく動くはずだよ。だから、MarkdownじゃなくてHTMLでテーブルを予測するんだ。

これをローカルでPDFに対して実行するためのPowerShellスクリプトを作ったよ: https://gist.github.com/kordless/652234bf0b32b02e39cef32c71e... ちゃんと動くけど、古いGPU(Nvidia 1080 8GB)だとすごく遅いんだ。今はページごとに少なくとも5分はかかってるかな、もっとかも。追記: PDFからMarkdownへの変換ユーティリティを試してみたい人がいたら教えてね。Cloud Runでホストしてて、GPUサポートもあるから、だいたい1時間くらいで終わると思う。終わったらここにリンクを貼るよ。

これについて報告するね。https://www.sidis.net/animate.pdf からのサンプル出力はこんな感じだよ: 「THE ANIMATE AND THE INANIMATE WILLIAM JAMES SIDIS 黒と白のイラストで、本を持った人物が描かれていて、その下にラテン語のフレーズ「ARTI et VERITATI」がある。 BOSTON RICHARD G. BADGER, PUBLISHER THE GORHAM PRESS Googleによってデジタル化されました」 やってくれたことにはエラーが全く見当たらなくて、かなり印象的だよ。ここでは目次を作成してる(リンクしたPDFとは少し違うコピーを使ったけど): 「Chapter Page PREFACE 3 I. THE REVERSE UNIVERSE 9 II. REVERSIBLE LAWS 14」 めちゃくちゃ遅いのを除けば、言ってることをちゃんとやってるみたいで、かなり良さそう。

docling(https://github.com/docling-project/docling)と比べてどうなの?

Shipibo(ペルーの先住民言語)からスペイン語への辞書を持ってて、それをShipiboから英語への辞書に翻訳しようとしてるんだけど、フォーマットで苦労してるんだ。二列になってたり、変な改行があったり、定義にShipiboとスペイン語が両方入ってるから理解しづらいし。しかもスキャンがあまり良くないから、これを試してみる必要があるかも。

複数列や複数行のテーブルのある文書はどう扱うの?例えば、https://www.japanracing.de/Teilegutachten/Teilegutachten-JR1... のページ1のrowspanやpage29のcolspanとか。