等幅フォント特化型OCR — monospace-ocr

AI/ML

概要

monospace-ocrは、等幅フォントで書かれたスキャン画像から文字を読み取ることに特化したシンプルなOCRツールです。ページの上部と下部を非連続に学習して垂直方向のドリフトをとらえ、学習済みのグリッド位置(テンプレート)を後続ページに再利用することでピクセルシフトの影響を低減します。トレーニングは train_top.txt / train_bot.txt から行い、run.sh で全ページのOCRを実行して recovered.pdf を生成します。デバッグモード(-d/—debug)では可視化を出力して検証がしやすくなっています。(約300字)

GitHub

リポジトリの統計情報

  • スター数: 28
  • フォーク数: 4
  • ウォッチャー数: 28
  • コミット数: 28
  • ファイル数: 12
  • メインの言語: Python

主な特徴

  • 等幅フォント向けのテンプレートベースOCRで軽量かつ説明可能
  • ページ上部と下部を個別に学習して垂直ドリフトを補正
  • 学習したグリッド位置を後続ページに再利用してピクセルシフトを抑制
  • デバッグ表示(-d/—debug)で認識状況を可視化可能

技術的なポイント

monospace-ocrはディープラーニング等の大規模学習には依存せず、画像中の文字グリッド位置を「覚える(memorize)」アプローチを取っています。READMEにある通り、まず特定ページ(例: page-001_2x.png)の上部と下部をそれぞれ train_top.txt / train_bot.txt で学習し、文字セルの位置と対応するビットマップ(テンプレート)を作成します。学習は「非連続」に行うことで、ページ全体の垂直ドリフト(スキャン時の傾きや紙の伸縮など)を局所的に補正できる点が特徴です。

学習後の実行フェーズでは、生成したグリッド位置を新しいページにそのまま適用し、各セルに対するパターンマッチングやクラスタリング(cluster.py の存在が示すように)によって文字を判定します。これにより、ページごとのわずかなピクセルシフトが発生しても、固定グリッドを使うことで誤認識を減らします。処理は主にPythonで実装されており、シェルスクリプト(train.sh / run.sh)でワークフローを自動化。アウトプットは recovered.pdf としてまとめられます。

デバッグモードでは、認識セルの重なりや候補状況を視覚的に確認でき、誤認識が起きやすいセルの見当をつけやすい設計です。設計上はモノスペース前提なので可変幅フォントや手書き、複雑なレイアウトには向きませんが、タイプセットや活字が規則的に並ぶ資料の復元・OCRに有効です。読み取り性能の改善余地としては、テンプレートの自動更新(オンライン学習)、ノイズ除去前処理の強化、類似文字の判定に機械学習ベースの分類器を組み合わせる手法が考えられます。(約700字)

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • .python-version: file
  • README.md: file
  • b64-debug: dir
  • cluster.py: file
  • train.sh: file
  • run.sh: file
  • train_top.txt: file
  • train_bot.txt: file
  • page-001_2x.png: file
  • recovered.pdf: file
  • utils.py: file …他 1 ファイル

(注)READMEの記載によれば、処理は ../EFTA00400459-{000..=075}_2x.png のような命名規則に従う画像群を前提としており、まず page-001_2x.png を使った学習実行を推奨しています。

まとめ

等幅フォント向けの実用的で軽量なテンプレートOCR。定形資料の大量復元に有用。

リポジトリ情報:

READMEの抜粋: Expects ../EFTA00400459-{000..=075}_2x.png to exist

  • Run ./train.sh to generate training from train_top.txt and train_bot.txt corresponding to page-001_2x.png
  • Run ./run.sh to OCR all pages and generated recovered.pdf

Trains from top of page-001 and bottom of page-001 non-contiguously to capture vertical drift. Memorizes grid location and reuses for subsequent pages (non-training runs) to prevent pixel shifts.

In training runs with -d/--debug, generates a debug view that lets you …