アプリケーションの例: 写真の光学文字認識(Application Example: Photo OCR)

写真の光学文字認識(Photo OCR)

問題の説明とパイプライン(Problem Description and Pipeline)

写真の中の文字をコンピューターで読み取る試みを写真OCR、写真の光学文字認識という。

コンピューターで文字を読み取る場合、幾つかの工程(Pipeline)に分けて処理する必要がある。

下記のその手順を記す。

  1. テキストを探す(Text Detection)
  2. 文字の分離(Character Segmentation)
  3. 文字の認識(Character Recognition)

これらの工程で、それぞれ目的関数を用意して、教師あり学習(Supervised Learning)を使って学習させる。

テキストを探す(Text Detection)

文字を含んだ画像($y=1$)と文字を含んでいない画像($y=0$)を大量に用意して、アルゴリズムに学習させる。

文字の分離(Character Segmentation)

文字と文字の境界が見える画像($y=1$)と文字と文字の境界を含まない画像($y=0$)を大量に用意して、アルゴリズムに学習させる。

文字の認識(Character Recognition)

ラベルと同一の文字を含む画像($y=1$)とラベルと異なる文字を含む画像($y=0$)を用意して、アルゴリズムに学習させる。

スライディングウインドウ(Sliding Windows)

特定のサイズの短形(例えば$10 \times 10$)を画像を端から端まで少しづつずらして走査するスライディングウィンドウ(Sliding Windows)というアルゴリズムを使って、短形の中に文字や人が含まれていないか調べる。

1つの短形(Sliding Windows)だけでは、大き過ぎたり、小さ過ぎたりする可能性があるため、短形(Sliding Windows)は複数用意して走査を行う。

人口的に作った大量データをどのようにして得るか(Getting Lots of Data and Artificial Data)

機械学習において信頼出来る方法の1つに低バイアスな学習アルゴリズムに大量のトレーニングセットを用意して訓練する、という手法がある。

大量にデータを用意することで、良い学習アルゴリズムを得ることができる。

大量にデータを用意する方法としては、文字の認識(Character Recognition)であれば下記の手法がある。

  • フォントを変える
  • 文字の大きさを変える
  • 文字を回転させる
  • 文字の位置をずらす
  • 文字を歪める
  • 背景を変える
  • ランダムに選んだピクセルの値を0に置換する

シーリング分析: (Ceiling Analysis: What Part of the Pipeline to Work on Next)

下記の表は各要素と、その要素精度が100%だった時のシステム全体の精度をまとめたものである。

コンポーネント 精度
全体(Overall system) 72%
文字を探す(Text Detection) 89%
文字の分離(Character Segmentation) 90%
文字の認識(Character Recognition) 100%

文字を探す(Text Detection)精度が$100%$になった時$72%$から$89%$となるため、$17%$改善する。

文字の分離(Character Segmentation)の精度が$100%$になった時$89%$から$90%$となるため、$1%$改善する。

文字の認識(Character Recognition)の精度が$100%$になった時$90%$から$100%$となるため、$10%$改善する。

これにより分かることは、

  • 文字を探す(Text Detection)の精度を改善することで、全体の精度を大きく改善できる
  • 文字の分離(Character Segmentation)の精度を改善しても、全体の精度を$1%$しか改善できないので、あまり意味がない

ということである。

このように、どの要素が最も改善できるポテンシャルがあるのか調べる手法をシーリング分析(Ceiling Analysis)という。