目次を表示する

OCR技術の過去・現在・未来

機械学習時代のOCR ── LeNet-5からCRNN+CTCへ

機械学習時代のOCR ── LeNet-5からCRNN+CTCへ

この章のテーマ:手作業で設計したルールから、データから学習する特徴量へ。統計的手法からニューラルネットワークへの進化を追い、OCRの精度を飛躍的に高めたアーキテクチャの変遷を理解する。


この章を読み終えると、機械学習がOCRにもたらした本質的な変化 ── 「人間がルールを書く」から「モデルがデータからパターンを学ぶ」への転換 ── を説明できるようになる。特に、CRNN+CTCアーキテクチャがなぜ画期的だったのかを、CTC損失関数の仕組みとともに理解できる。


ルールベースの限界、そして統計的手法の登場

前章で見たように、ルールベースOCRは「人間が文字の特徴を定義する」アプローチだった。しかし、フォントが変われば特徴も変わる。手書き文字になればなおさらだ。

1990年代、この問題に対して統計的アプローチが台頭する。

隠れマルコフモデル(Hidden Markov Model, HMM)

HMMは文字の並びを確率的なプロセスとしてモデル化する手法だ。もともと音声認識で大きな成果を上げていた技術で、OCRにも自然に応用された。

HMMの考え方:
  文字列 = 隠れた状態の遷移系列
  画像特徴 = 各状態から生成される観測値

  例:筆記体の "hello" を認識する場合
  → 各文字(h, e, l, l, o)が「状態」
  → ストロークの特徴量が「観測値」
  → 状態遷移確率 + 出力確率で最も尤もらしい文字列を推定

HMMは特にアラビア語の筆記体認識で威力を発揮した。アラビア語は右から左に書き、文字が連結するため、個々の文字を切り出すのが極めて難しい。HMMなら文字の切れ目を明示的に定義しなくても、系列全体として最適な認識結果を求められる。

さらに、n-gramの言語モデルと組み合わせることで、「文字レベルの認識結果」を「単語レベルの認識結果」に引き上げることができた。

❌ 文字単位の認識だけの場合:
  "rec0gnition" → oとeを間違えてもそのまま出力

✅ 言語モデルと組み合わせた場合:
  "rec0gnition" → "recognition" の方が言語モデル上の確率が高い
  → 文脈を使って誤認識を補正

SVM・ランダムフォレストによる文字分類

2000年代には、サポートベクターマシン(SVM)やランダムフォレスト(Random Forest)が手書き文字分類で高い精度を達成した。これらは特徴量エンジニアリング(HOG特徴量、Gabor特徴量など)を前提とした手法だ。

しかし、特徴量を人間が設計する必要がある点は変わらなかった。この「特徴量設計のボトルネック」を根本的に解消したのが、次に登場するCNNだ。


LeNet-5 ── CNNによる革命の始まり

1998年、Yann LeCunらは論文 “Gradient-Based Learning Applied to Document Recognition” を発表した。ここで提案されたLeNet-5は、OCRの歴史における最大の転換点の一つだ。

なぜ革命的だったのか

LeNet-5の本質的なブレークスルーは、ピクセルからラベルまでをend-to-endで学習できることだった。

❌ 従来のパイプライン:
  画像 → [人手で設計した特徴抽出] → [人手で設計した分類ルール] → ラベル
  → 各段階を個別に最適化。全体最適にはならない

✅ LeNet-5のアプローチ:
  画像 → [CNNが自動で特徴を学習 → そのまま分類] → ラベル
  → 全パラメータを勾配降下法で同時に最適化

LeNet-5のアーキテクチャ

graph LR
    A["入力画像<br/>32x32"] --> B["C1: 畳み込み<br/>6枚の5x5フィルタ<br/>→ 28x28x6"]
    B --> C["S2: プーリング<br/>2x2<br/>→ 14x14x6"]
    C --> D["C3: 畳み込み<br/>16枚の5x5フィルタ<br/>→ 10x10x16"]
    D --> E["S4: プーリング<br/>2x2<br/>→ 5x5x16"]
    E --> F["C5: 畳み込み<br/>120枚の5x5フィルタ<br/>→ 1x1x120"]
    F --> G["F6: 全結合<br/>84ユニット"]
    G --> H["出力層<br/>10クラス<br/>(0-9の数字)"]

7層構成のこのネットワークは、MNISTデータセットで99.05%の精度を達成した。今の基準では小さなモデルだが、当時としては画期的な成果だった。

実用化:ATMでの小切手読み取り

LeNet-5は研究室の中だけの成果にとどまらなかった。AT&TやNCRのATMに実装され、1日あたり数百万枚の小切手を自動読み取りしていた。手書きの金額や口座番号をリアルタイムで認識する ── これは学術的な精度競争ではなく、実世界で動くOCRの始まりだった。


Tesseractのオープンソース化

2005年、HPが自社で開発していたOCRエンジンTesseractをオープンソースとして公開した。翌2006年からはGoogleが開発を引き継ぐ。

Tesseractの歴史:
  1985-1994: HPが開発開始
  2005:      HPがオープンソース化
  2006:      Google が開発を引き継ぎ
  2018:      LSTM ベースのエンジンを搭載した v4.0 リリース

この時点でのTesseractはまだルールベースの認識エンジンだった。しかし、オープンソースとして誰でも使えるOCRエンジンが存在すること自体が大きな意味を持った。研究者も実務者も、ゼロからOCRエンジンを構築する必要がなくなったのだ。

Tesseractは事実上のオープンソースOCRの標準となり、多くのプロジェクトやサービスの基盤として採用された。


CRNN + CTC ── ブレークスルーアーキテクチャ

2015年、Shi, Bai, Yaoらが発表した論文 “An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition” は、OCRの認識パイプラインを根本的に変えた。

CRNNアーキテクチャの全体像

graph TB
    subgraph "CRNN アーキテクチャ"
        A["入力画像<br/>テキスト行画像"] --> B["CNN特徴抽出<br/>(VGGベース)"]
        B --> C["特徴列への変換<br/>画像特徴を時系列データに変換"]
        C --> D["BiLSTM<br/>(双方向LSTM)<br/>文脈を考慮した系列モデリング"]
        D --> E["CTC デコーディング<br/>アライメント不要の系列変換"]
        E --> F["出力テキスト<br/>例: 'HELLO'"]
    end

    style B fill:#4a90d9,color:#fff
    style D fill:#e8a838,color:#fff
    style E fill:#50c878,color:#fff

3つのコンポーネントが連携する:

コンポーネント役割技術的なポイント
CNN画像から特徴マップを抽出VGGライクな深いCNNで空間特徴を捉える
BiLSTM特徴列の文脈をモデル化双方向LSTMで前後の文脈を同時に利用
CTC可変長の出力系列を生成アライメントなしで系列を予測

CTC損失関数 ── なぜ革命的だったのか

CRNN+CTCの最大の革新は、文字のセグメンテーション(切り出し)が不要になったことだ。この「セグメンテーション不要」を実現したのがCTC(Connectionist Temporal Classification)損失関数である。

アライメント問題

テキスト行画像をCNNで処理すると、タイムステップごとの特徴ベクトル列が得られる。例えば、“HELLO” という5文字の画像から20タイムステップの特徴列が出力されるとしよう。

問題:20タイムステップの入力 → 5文字の出力
  → どのタイムステップがどの文字に対応するか(アライメント)が不明
  → "H"は最初の何タイムステップ? "E"はどこから?
  → 文字間のスペースはどこ?

従来は、このアライメントを事前にアノテーションする必要があった。つまり、「この画像の何ピクセル目から何ピクセル目までがHです」というラベルが学習データに必要だった。これは膨大なコストだ。

CTCの解決策:ブランクトークン(ε)

CTCはアライメントを「学習で解決すべき問題」として扱う。そのためにブランクトークン εを導入する。

各タイムステップの出力候補 = {a, b, c, ..., z, ε}

例:20タイムステップで "HELLO" を出力するパス

  パス1: H-H-H-ε-E-E-ε-L-L-L-L-ε-L-L-L-ε-O-O-O-ε
  パス2: ε-H-H-E-E-E-ε-L-L-ε-L-L-L-ε-O-O-O-O-ε-ε
  パス3: H-ε-E-ε-L-ε-L-ε-O-ε-ε-ε-ε-ε-ε-ε-ε-ε-ε-ε

  → すべて同じ出力 "HELLO" にマッピングされる

マッピングルールはシンプルだ:

  1. 連続する同じ文字を1つにまとめる(HHH → H)
  2. ε を削除する
  3. 同じ文字が隣接するがεで区切られている場合は別の文字として扱う(L-ε-L → LL)
graph LR
    A["H H H ε E E ε L L L L ε L L L ε O O O ε"] --> B["圧縮"]
    B --> C["H ε E ε L ε L ε O ε"]
    C --> D["ε除去"]
    D --> E["H E L L O"]

前向き・後ろ向きアルゴリズム(動的計画法)

CTC損失を計算するには、「正解ラベルに到達する全パスの確率の合計」を求める必要がある。全パスを列挙すると指数的な計算量になるが、CTCは**動的計画法(前向き・後ろ向きアルゴリズム)**を使ってこれを効率的に計算する。

核心的な洞察:
  同じタイムステップで同じ状態に到達するパスは「マージ」できる

  タイムステップ t で状態 s にいるパスが100本あっても、
  タイムステップ t+1 以降の計算は「合計確率」に対して1回だけ行えばよい

  → 計算量が指数的 → 多項式的に削減される

これはHMMの前向き・後ろ向きアルゴリズムと同じ原理だ。OCRの歴史が、HMM時代の知見をニューラルネットワークに統合する形で進化していることがわかる。

なぜCRNN+CTCが革命的だったのか

❌ 従来のOCRパイプライン:
  画像 → テキスト検出 → 文字セグメンテーション → 個別文字認識 → 後処理
  → 各段階のエラーが蓄積する
  → セグメンテーションの精度がボトルネック

✅ CRNN + CTC:
  画像 → [CNN → BiLSTM → CTC] → テキスト
  → 文字のセグメンテーション不要
  → end-to-end で学習可能
  → アノテーションは「この画像に何と書いてあるか」のテキストだけでよい

Tesseract 4.0 ── ニューラルOCRの民主化

2018年10月、Tesseract 4.0がリリースされた。最大の変更点はLSTMベースのOCRエンジンの追加だ。

Tesseract 4.0 の主な特徴:
  - LSTMベースの行認識エンジンを追加
  - 従来のレガシーエンジン(--oem 0)も残存
  - 116言語に対応
  - 学習済みモデル + ファインチューニング機能を提供
# Tesseract 4.0 の基本的な使い方
# --oem 1 でLSTMエンジンを指定
tesseract input.png output -l jpn --oem 1

# 利用可能な言語を確認
tesseract --list-langs

Tesseract 4.0は、ニューラルネットワークベースのOCRを誰でも無料で使える形にした。研究者だけでなく、一般の開発者がLSTMベースのOCRを自分のプロジェクトに組み込めるようになった意義は大きい。


この時代の限界

機械学習の導入でOCRは大幅に進歩した。しかし、この時代のアプローチにはまだ重要な限界があった。

テキスト検出と認識の分離

CRNN+CTCは「テキスト行画像 → テキスト」の認識は得意だが、「画像のどこにテキストがあるか」の検出は別のパイプラインに依存していた。

検出と認識が分離していることの問題:
  1. 検出段階のエラーが認識段階に伝播する
  2. 2つのモデルを別々に最適化 → 全体最適にならない
  3. 処理パイプラインが複雑になる

複雑なレイアウトへの対応

新聞のような多段組み、表、図中のテキストなど、複雑なレイアウトに対しては、CNN+RNNのパイプラインだけでは十分に対応できなかった。

シーンテキスト(Scene Text)の壁

看板、道路標識、商品パッケージなど、自然環境中のテキスト(シーンテキスト)は、照明変化・遠近法・曲面・部分的遮蔽など、文書画像にはない困難が山積していた。この領域はまだ課題が多く、次章で取り上げるディープラーニング時代のテキスト検出手法が必要だった。


この章のまとめ

  • 統計的手法(1990s-2000s):HMMが筆記体・アラビア語OCRで成果を上げた。SVMやランダムフォレストも手書き文字分類で活躍したが、特徴量は人間が設計する必要があった
  • LeNet-5(1998年):CNNによるend-to-end学習を実現し、MNISTで99.05%の精度を達成。ATMでの小切手読み取りに実用化された
  • Tesseractのオープンソース化(2005年):HPが公開し、Googleが開発を継続。オープンソースOCRの事実上の標準となった
  • CRNN+CTC(2015年):CNN特徴抽出 + BiLSTM系列モデリング + CTC損失関数の組み合わせにより、文字セグメンテーション不要のend-to-end認識を実現。CTCのブランクトークンと動的計画法が鍵
  • Tesseract 4.0(2018年):LSTMベースの認識エンジンを搭載し、ニューラルOCRを誰でも使えるようにした
  • 限界:テキスト検出と認識の分離、複雑なレイアウト、シーンテキストへの対応が課題として残った