無制限 OCR:ワンショット・ロングホライズン解析

2026/06/23 20:35

無制限 OCR:ワンショット・ロングホライズン解析

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

論文集「Unlimited-OCR Works」は、Deepseek-OCR を凌駕し、単一画像と複雑なマルチページ PDF 両方をサポートする ModelScope 上にホストされたモデルを発表しています。同プロジェクトは Deepseek-OCR、Deepseek-OCR-2、PaddleOCR の基礎技術をAcknowledgments に明記し、arXiv(eprint: 2606.23050)に参照リストを公開しています。推論は厳密にバージョン管理されており、Python 3.12.3、CUDA 12.9、および torch==2.10.0、transformers==4.57.1 など特定のパッケージのバージョンが必要となります。実装オプションとしては、Huggingface AutoModels が

gundam
(base_size=1024)および base モードの両方で
torch.bfloat16
をサポートするか、32k コンテキスト長とファサイト注意力機構を備えた SGLang サーバー上で動作し、カスタムログイットプロセッサを使用して DeepSeek OCR の制約を管理するものがあります。本システムは OpenAI 互換エンドポイント
0.0.0.0:10000
を介してストリーミング API を提供し、ngram ウィンドウの構成、および画像と PDF の同時処理のための並列推論機能を提供します。高度なドキュメント知能の全潜力を発揮するには、これらの厳格な前提条件に対するハードウェアを慎重に検証する必要があります。

Text to translate:

The paper "Unlimited-OCR Works" introduces a model hosted on ModelScope that pushes beyond Deepseek-OCR to support both single images and complex multi-page PDFs, specifically targeting one-shot long-horizon parsing tasks. The project, contributed by teams including Deepseek-OCR, acknowledges foundations in Deepseek-OCR, Deepseek-OCR-2, and PaddleOCR, with a citation list provided on arXiv (eprint: 2606.23050). Inference is strictly versioned, requiring Python 3.12.3, CUDA 12.9, and specific package versions such as torch==2.10.0 and transformers==4.57.1. Implementation options include Huggingface AutoModels supporting

torch.bfloat16
in both
gundam
(base_size=1024) and base modes, or an SGLang server running on
fa3
attention with 32k context length and custom logit processors to manage DeepSeek OCR constraints. The system offers a streaming API via OpenAI-compatible endpoints at
0.0.0.0:10000
, configurable ngram windows, and batch inference capabilities via
infer.py
for concurrent processing of images and PDFs. Successful deployment requires careful validation of hardware against these strict prerequisites to leverage the full potential of advanced document intelligence.

本文

ワンショット・長文脈解読の時代へようこそ

リリース日: 2026 年 6 月 23 日

  • 📄 論文: arXiv で利用可能
  • 🤝 モデル: ModelScope コミュニティにて公開済み(支援に感謝)
  • 🚀 進化: Deepseek-OCR の性能向上を目指し、Unlimited-OCR を発表

推論(Inference)

Transformers

NVIDIA GPU 上で Huggingface Transformers を使用した推論方法です。
検証環境:Python 3.12.3 + CUDA 12.9
必要なパッケージは以下の通りです:

  • torch==2.10.0
  • torchvision==0.25.0
  • transformers==4.57.1
  • Pillow==12.1.1
  • matplotlib==3.10.8
  • einops==0.8.2
  • addict==2.4.0
  • easydict==1.13
  • pymupdf==1.27.2.2
  • psutil==7.2.2

実装例

import os
import torch
from transformers import AutoModel, AutoTokenizer

model_name = 'baidu/Unlimited-OCR'

# トークネライザーとモデルの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(
    model_name,
    trust_remote_code=True,
    use_safetensors=True,
    torch_dtype=torch.bfloat16,
)
# モデルを評価モードに設定し、GPU へ移します
model = model.eval().cuda()

# ── シングル画像処理(2 つの構成をサポート) ──
# gundam: base_size=1024, image_size=640, crop_mode=True
# base:   base_size=1024, image_size=1024, crop_mode=False
model.infer(
    tokenizer,
    prompt='<image>document parsing.',  # プロンプト
    image_file='your_image.jpg',        # 入力画像ファイル
    output_path='your/output/dir',      # 出力ディレクトリ
    base_size=1024, 
    image_size=640, 
    crop_mode=True,                     # gundam モードの場合:True
    max_length=32768,
    no_repeat_ngram_size=35, 
    ngram_window=128,
    save_results=True,                  # 結果を保存するか
)

# ── マルチページ/PDF は base 構成(image_size=1024)のみを使用します ──
model.infer_multi(
    tokenizer,
    prompt='<image>Multi page parsing.',
    image_files=['page1.png', 'page2.png', 'page3.png'], # ページリスト
    output_path='your/output/dir',
    image_size=1024,                    # base モード:1024
    max_length=32768,
    no_repeat_ngram_size=35, 
    ngram_window=1024,
    save_results=True,
)

# ── PDF 処理(ページを画像に変換してからマルチページ推論) ──
import tempfile, fitz  # PyMuPDF ライブラリを使用

def pdf_to_images(pdf_path, dpi=300):
    doc = fitz.open(pdf_path)
    tmp_dir = tempfile.mkdtemp(prefix='pdf_ocr_')
    mat = fitz.Matrix(dpi / 72, dpi / 72) # DPI に基づく変換行列
    paths = []
    for i, page in enumerate(doc):
        out = os.path.join(tmp_dir, f'page_{i+1:04d}.png')
        page.get_pixmap(matrix=mat).save(out)
        paths.append(out)
    doc.close()
    return paths

# PDF を画像リストに変換して推論を実行
model.infer_multi(
    tokenizer,
    prompt='<image>Multi page parsing.',
    image_files=pdf_to_images('your_doc.pdf', dpi=300),
    output_path='your/output/dir',
    image_size=1024,
    max_length=32768,
    no_repeat_ngram_size=35, 
    ngram_window=1024,
    save_results=True,
)

SGLang

SGLang 環境を準備します。推奨手法として

uv
を用いた仮想環境の構築と、以下のパッケージインストールを行ってください:

  • ローカルの SGLang wheel パッケージ
  • kernels==0.11.7
    (バージョンは環境に合わせて調整必要)
  • PDF 変換に使用する
    pymupdf==1.27.2.2

インストール手順

# 仮想環境の作成とアクティベーション(Python 3.12 推奨)
uv venv --python 3.12
source .venv/bin/activate

# SGLang ウィールのインストール
uv pip install wheel/sglang-0.0.0.dev11416+g92e8bb79e-py3-none-any.whl
# Kernels パッケージの固定
uv pip install kernels==0.11.7 
# PDF 変換ライブラリのインストール
uv pip install pymupdf==1.27.2.2

サーバー起動と API リクエスト

SGLang サーバーを起動します:

python -m sglang.launch_server \
    --model baidu/Unlimited-OCR \
    --served-model-name Unlimited-OCR \
    --attention-backend fa3 \
    --page-size 1 \
    --mem-fraction-static 0.8 \
    --context-length 32768 \
    --enable-custom-logit-processor \
    --disable-overlap-schedule \
    --skip-server-warmup \
    --host 0.0.0.0 \
    --port 10000

OpenAI 互換 API を使用してストリーミングリクエストを送信する Python スクリプト例:

import base64
import json
import os
import tempfile

import fitz
import requests
from sglang.srt.sampling.custom_logit_processor import DeepseekOCRNoRepeatNGramLogitProcessor

server_url = "http://127.0.0.1:10000"
session = requests.Session()
session.trust_env = False


# PDF から画像を抽出するヘルパー関数(Transformers 版と同等のロジック)
def pdf_to_images(pdf_path, dpi=300):
    doc = fitz.open(pdf_path)
    tmp_dir = tempfile.mkdtemp(prefix="pdf_ocr_")
    mat = fitz.Matrix(dpi / 72, dpi / 72)
    image_paths = []
    for i, page in enumerate(doc):
        image_path = os.path.join(tmp_dir, f"page_{i + 1:04d}.png")
        page.get_pixmap(matrix=mat).save(image_path)
        image_paths.append(image_path)
    doc.close()
    return image_paths


# 画像を base64 エンコードして API 形式に変換する関数
def encode_image(image_path):
    ext = os.path.splitext(image_path)[1].lower()
    mime = "image/jpeg" if ext in (".jpg", ".jpeg") else f"image/{ext.lstrip('.')}"
    with open(image_path, "rb") as f:
        data = base64.b64encode(f.read()).decode("utf-8")
    return {"type": "image_url", "image_url": {"url": f"data:{mime};base64,{data}"}}


# プロンプトと画像リストを組み合わせたメッセージ構造を構築する関数
def build_content(prompt, image_paths):
    return [{"type": "text", "text": prompt}] + [encode_image(path) for path in image_paths]


# メインの推論処理を実行する関数
def generate(prompt, image_paths, image_mode, ngram_window):
    payload = {
        "model": "Unlimited-OCR",
        "messages": [{"role": "user", "content": build_content(prompt, image_paths)}],
        "temperature": 0,
        "skip_special_tokens": False,
        "images_config": {"image_mode": image_mode}, # 画像処理モード(gundam / base)
        "custom_logit_processor": DeepseekOCRNoRepeatNGramLogitProcessor.to_str(),
        "custom_params": {
            "ngram_size": 35,
            "window_size": ngram_window,
        },
        "stream": True, # ストリーミング出力を有効化
    }
    response = session.post(
        f"{server_url}/v1/chat/completions",
        headers={"Content-Type": "application/json"},
        data=json.dumps(payload),
        timeout=1200,
        stream=True,
    )
    response.raise_for_status()

    chunks = []
    # ストリーミング応答の逐次処理
    for line in response.iter_lines(chunk_size=1, decode_unicode=True):
        if not line or not line.startswith("data: "):
            continue
        data = line[len("data: "):]
        if data == "[DONE]":
            break
        event = json.loads(data)
        delta = event["choices"][0].get("delta", {}).get("content", "")
        if delta:
            print(delta, end="", flush=True)
            chunks.append(delta)
    print()
    return "".join(chunks)


# シングル画像処理:gundam モードの例
generate("document parsing.", ["your_image.jpg"], image_mode="gundam", ngram_window=128)

# マルチ画像処理:base モードのみ対応
generate("Multi page parsing.", ["page1.png", "page2.png"], image_mode="base", ngram_window=1024)

# PDF 処理:base モードのみ対応(事前に変換)
generate("Multi page parsing.", pdf_to_images("your_doc.pdf", dpi=300), image_mode="base", ngram_window=1024)

バッチ推論

infer.py
を使用して、SGLang サーバーを自動的に起動し、画像ディレクトリまたは PDF ファイルに対して並列(コンカレント)リクエストを送信します。

画像ディレクトリの処理:

python infer.py \
    --image_dir ./examples/images \
    --output_dir ./outputs \
    --concurrency 8 \
    --image_mode gundam

PDF ページの処理:

python infer.py \
    --pdf ./examples/document.pdf \
    --output_dir ./outputs \
    --concurrency 8 \
    --image_mode gundam

有用なオプション:

  • --model_dir baidu/Unlimited-OCR
    :ローカルのパスまたは Hugging Face モデル ID
  • --gpu 0
    :使用したい CUDA デバイス(例:
    CUDA_VISIBLE_DEVICES
    の設定用)
  • --server_log ./log/sglang_server.log

引用文献

@misc{yin26unlimitedocrworks,
      title={Unlimited OCR Works}, 
      author={Youyang Yin and Huanhuan Liu and YY and Qunyi Xie and Chaorun Liu and Shiqi Yang and Shaohua Wang and Zhanlong Liu and Hao Zou and Jinyue Chen and Shu Wei and Jingjing Wu and Mingxin Huang and Zhen Wu and Guibin Wang and Tengyu Du and Lei Jia},
      year={2026},
      eprint={2606.23050},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/2606.23050} 
}

同じ日のほかのニュース

一覧に戻る →

2026/06/24 3:40

ジェリーの地図

## Japanese Translation: 「ジェリーのワールド」は、1963 年夏にニューヨーク・コールドスプリングに住むアーティスト・ジェリーによって開始された、架空の都市を巨大な円形地図として機能させる、独自性の高い二次元アートプロジェクトである。4,000 点以上の個々のパネル(8x10 インチ)が N、S、E、W の座標を用いて配置されており、本作は二つの明確な時代へと発展してきた。時代 1(1963–1983)では軽量なタイプライター用紙が使われ、パネルは時系列順に積み重ねられていたが、時代 2(2003–現在)では再生された重紙を用い、座標順でパネルを配置し、自動化されたシステムを採用している。創作プロセスは、約 100 枚のユニークなカードからなる専用デッキによって厳密に管理されており、これらカードには描画サイズ、絵混ぜの色調調整、アーカイブ作業、ブログ投稿などの管理業務などランダム化された指示が含まれている。各カードサイクルは数分から数日続き、巨大な黒または赤の数字に基づいて作業ユニット(1 インチ正方形)を指し示す。実行にはアクリル絵具、マーカー、コラージュ、インクジェット印刷などのメディアが用いられる。プロジェクトはベースレイヤー、ザ・バッド、ザ・レッドディメンション、ブラックネッズ、ザ・ジグurat フェーズ、ザ・フロード、そしてリ・バーストといった段階的な概念層を通じて進行する。元々屋根裏部屋に保管され、アーティストの息子であるヘンリーによって数十年後に再発見された本作は、現在では公的展覧会やデジタルアーカイブとの統合を達成しており、環境に優しい素材の使用と創造的かつ管理業務を含む意思決定を導く厳格なルールベースのワークフローを通じて、現代アートの持続可能性への転換を浮き彫りにしている。 ## サマリー: 「ジェリーのワールド」は 1963 年に開始され、現在も継続中の二次元アートプロジェクトであり、架空の都市を巨大な円形地図として機能させる独自性の高いものである。その最も顕著な特徴は、約 100 枚のユニークなカードからなる専用デッキによって駆動される厳格でランダム化されたシステムである。これらのカードには実行とアーカイブ作業に関する独自の指示が含まれており、描画サイズから絵混ぜの色調調整に至るまで、各工程を決定する。このシステムにより、作品は純粋な直感に頼らずルールに基づくガイダンスによって発展する。プロセスは特定のルールに従い、カードの色に基づいて方向が変化し、その結果としてザ・バッドやザ・レッドディメンションといった段階的な層が構築される。元々はニューヨークのコールドスプリングで制作された物理的な作品は、アーティストの息子によって数十年後に再発見された。第一世代では軽量な紙が使われたが、現在のフェーズでは再生素材と自動化されたシステムを採用しており、デジタルアーカイブで引退した作品を保存しながらも新たなパネルを生成したり既存のセクションを完了させることができる。この堅固なワークフローは、一貫した管理ルーチンを強制することで協力者に影響を与え、環境に優しい素材の使用や展覧会における公的関与を通じて現代アートにおける持続可能性への転換を強調している。 ## キーポイント一覧 - 1963 年夏、アーティスト・ジェリーはニューヨーク・コールドスプリングで架空の都市の地図を描き始めたが、それは彼の屋根裏部屋に保管されており、後に息子であるヘンリーによって再発見された。 - プロジェクトは現在、4,000 点以上の個々の 8 インチ x10 インチのパネルからなる二次元的な「バーチャルワールド」アートプロジェクトであり、中央を起点として N、S、E、W の座標を用いて近似円形に配置されている。 - 実行にはアクリル絵具、マーカー、彩色鉛筆、インク、コラージュ、そしてインクジェット印刷が重紙上に用いられ、これは規則および約 100 枚のユニークなカードからなる専用デッキからのランダム生成された指示によって決定される。 - 各カードサイクルは前回の作業が完了するまで開始されず、数分から数日かかる;タスクとは、カード上の巨大な黒または赤の数字で指定された作業ユニット(1 ユニット=1 インチ正方形)をカバーすることを指す。 - カード指示は次の 5 つのカテゴリーに分類される:上位次元への進歩(バッド、レッド、ブラック、ジグurat)、隣接する 4 パネルのスプラッター塗装、新しいシードパネルの作成、新しい色調の混合、および連続する 9 パネルのスクリーン印刷。 - アドдиショナルなアーティスト指示には、マスターの更新/複製、ファイルからのパッチワークまたは写真の使用、数字の追加/削除、デッキからのカードの除去/追加、ブログ投稿や販売価値の計算などの管理業務が含まれる。 - ヘルパー指示には、デジタルライブラリー用のパネルのスキャン、引退したパネルのソート/アーカイブ、現在のパネルのコピー作成、アーカイブインベントリを更新する作業が含まれる。 - 作業方向はカードの色によって決定される:黒は地図 perimeter 周りの時計回りの進行を示し、赤は反時計回りの進行を示す。 - 新しいパネルは「新しいパネル」カードを描画するか、アートのセクションを完了するために生成され、常に親ページと同じ「中心」点を保ち、「その日の色」を使用する。 - プロセスは次の層で表現される:ベースレイヤー(パッチ、塗られたバンド、コラージュ、シティスクエア)、ザ・バッド(白/黑白/グレー/黒のコラージュ)、ザ・レッドディメンション(ソリッドレッドのコラージュ)、ブラックネッズ、ザ・ジグurat フェーズ、ザ・フロード(ブルーのコラージュ)、そしてリ・バースト(クラフト紙)。 - プロセスは二つの明確な時代へと発展した:時代 1(1963–1983)では軽量なタイプライター用紙が使われ、ゲストアーティストはいなかった、パネルは時系列順に積み重ねられた;時代 2(2003–現在)では再生された紙が使われ、デッキ駆動の自動化システムを採用し、展覧会が開催され、パネルは座標順に積み重ねられている。

2026/06/24 3:00

Swift パッケージインデックス、Apple に加入

## Japanese Translation: ## 日本語翻訳: 元のサマリーは明確で、正確かつ完全です。変更する必要はありません。 ## 翻訳対象のテキスト: (必要であればここに貼り付け;なければそのまま元の文章を繰り返す):元のサマリーは明確で、正確かつ完全です。変更する必要はありません。

2026/06/24 2:50

FUTO スワイプ:新たなスワイプタイピングモデル

## Japanese Translation: 主なイノベーションは「FUTO Keyboard」というプライバシーを最優先とした Android アプリであり、クラウドサーバーの必要性なくデバイス上で迅速かつ正確なスワイプタイピングを可能にします。データをローカルに保持することで、キーストロークを外部ネットワークへ送る際に生じる一般的なセキュリティリスクを排除します。推論はオンデバイスで実装されており、サーバーサイドデモと比べてはるかに低いレイテンシを実現しています。ミリ秒単位で入力を処理し、エラーレートは 1% を下回ります(具体的には、ビーム幅 300 を使用したテストセットにおいて、トップ 4 の失敗率は約 4%、エラー率は 1% 未満です)。 技術の基盤となるのはオープンなモデルファミリ(Encoder、ContextLM、Decoder)で、総パラメータ数 2,494,767 のうち有効パラメータは 1,364,271 です。低性能向けスマートフォンを最適化しています。「swipe-library」という C++ ライブラリが推論とビームサーチを担当し、スワイプパスから単語予測への変換を行います。学習は効率的で、ワークステーション用 GPU 1 台のみで完了しました。開発者は 2024 年 8 月にデータセット収集を開始し(100 万件以上のユーザーのスワイプデータを収集)、2025 年 3 月に MIT ライセンスの下で HuggingFace にフィルタリングされた 100 万件のスワイプデータをリリースしました。モデルは FUTO モデルライセンス、推論ライブラリは GPL の下に利用可能です。エンドユーザーへの謝示は長期投資合意の一部として必須であり、速度とプライバシーを最優先とするオフラインモバイル入力の持続可能なエコシステムを支えています。

無制限 OCR:ワンショット・ロングホライズン解析 | そっか~ニュース