機械学習時代の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つにまとめる(HHH → H)
- ε を削除する
- 同じ文字が隣接するがεで区切られている場合は別の文字として扱う(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を誰でも使えるようにした
- 限界:テキスト検出と認識の分離、複雑なレイアウト、シーンテキストへの対応が課題として残った