はじめに
今回は Photo OCR の問題を通じて、以下のことを学びます。
- パイプライン処理
- 人工的なデータ生成
- 天井分析
Photo OCRとは?
Photo OCR は画像中のテキストに何が書かれているのかコンピュータに理解させるタスクです。以下の画像の例だと、看板に「大久保駅」と書かれていることを読み取ります。
コンピュータが画像中のテキストを理解できると、画像を探したいときにテキストで検索できるようになります。他にも Photo OCR の技術を応用すると以下のようなことができます:
- 盲目の人が目の前にあるものを理解するのを助ける
- カーナビが道路の標識を読んで、目的地までのナビゲーションをサポートする
Photo OCRのステップ
Photo OCR のステップは以下の3段階からなります。
- テキスト検出
- 文字分割
- 文字認識
- テキスト検出ステップでは、画像中のどこにテキストがあるかを検出します。
- 文字分割ステップでは、検出したテキストを文字単位に分割します。
- 文字認識ステップでは、分割された文字に対して分類器を適用することで文字を認識します。
これらのステップは以下のようなパイプライン処理となっています。
パイプライン処理にしておくことで、各モジュールを別々のエンジニアが担当し、仕事を自然に分割できるというメリットがあります。
人工的なデータ生成
大量のトレーニングデータを得る方法として、人口的にデータ生成するという方法があります。以下では人工的なデータ生成の方法とデータを得るときに気を付けることについて学んでいきます。
人口的なデータ生成の方法
人口的なデータ生成には以下の2種類の方法があります:
- 無からデータを作り出す
- 少量のラベル付きデータを拡大する
無からデータを作る方法
人工的にデータを生成する方法の一つとして、無からデータを生成する方法があります。この方法では、例えば文字データを得たい場合、異なるフォントから文字を取り出して、ランダムの背景に張り付けていくことでデータを生成するといったことを行います。
また、無からデータを生成する際には、本物っぽく見えるような作業をする必要があります。具体的には、画像をゆがめたりノイズを載せたりして本物っぽく見えるようにします。
このような作業をすることで、実質的に無制限のデータを得ることができます。
少量のラベル付きデータを拡大する
人工的にデータを生成するもう一つの方法として、少量のラベル付きデータを拡大する方法があります。この方法では、例えばラベルの付いた画像に対してゆがみやノイズを加えるといったことを行ってデータを生成します。
データ生成するときの注意点
データを生成するときには以下の2点に気を付ける必要があります:
- テストセットで見られそうなゆがみを導入する
- 無意味なノイズをデータに載せない
データを得るときに気をつけること
データを得る際には以下のことに気をつけます:
- 学習曲線を描いてみて、より多くのデータが役に立つかを確認してから集める
- 現在持っているデータの10倍のデータを得るのにどれくらいの労力がかかるか問うてみる
データを集めるなら効果があることを確認してから集めましょう。いざ集めてから使えませんでは労力の無駄です。
また、経験的には人手で集めても現在の10倍のデータを得るのにそれほど時間はかからないので、人工的に生成する前に人手で集めることを検討してみるのも良いでしょう。
また、データを集める方法としては以下の3つが考えられます:
- 人口的なデータ生成
- 自分でタグ付け
- クラウドソーシング
天井分析
私たち開発者の時間は限られています。天井分析では、パイプラインのどのモジュールを改善すると最もパフォーマンスに対して効果があるのかを分析します。パフォーマンス向上の上限(天井)がわかることから天井分析と呼ばれています。
Photo OCRの例で天井分析を説明します。
Photo OCRの例
パフォーマンスの分析には何らかの評価指標が必要です。今回のPhoto OCRの例では評価指標として文字レベルでの正確さを採用します。これはつまり、認識した文字のうちどれだけの割合が正解しているかを表しています。
Photo OCRのシステム全体では72%のAccuracyを持つとします。
コンポーネント | Accuracy |
---|---|
システム全体 | 72% |
まず、最初のモジュール『テキスト検出』に細工をします。何をするかというと、手動で画像のどこにテキストがあるかを与えます。これにより、100%正確なテキスト検出を行うことができます。これはつまり、もし100%正確なテキスト検出のモジュールがあったらシステム全体のパフォーマンスはどう変わるかを分析します。
以下の例の場合、システム全体の性能は17%向上しています。
コンポーネント | Accuracy |
---|---|
システム全体 | 72% |
テキスト検出 | 89% |
次に、文字分割が100%正しく行えた場合のシステム全体のAccuracyを分析します。以下の例の場合では1%向上しています。
コンポーネント | Accuracy |
---|---|
システム全体 | 72% |
テキスト検出 | 89% |
文字分割 | 90% |
最後に、文字認識が100%正しく行えた場合のAccuracyを分析します。以下の例の場合では10%向上しています。
コンポーネント | Accuracy |
---|---|
システム全体 | 72% |
テキスト検出 | 89% |
文字分割 | 90% |
文字認識 | 100% |
この分析のいい点は各モジュールを改善したときの潜在的な上限がわかるということです。
完璧なテキスト検出を行えるとシステム全体の性能は17%向上します。テキスト検出のパフォーマンス向上に時間を使えばシステム全体の性能を17%向上できる可能性があるということです。
一方、文字分割では1%しか性能が向上しません。これの意味するところは、どれだけ文字分割の改善に時間を費やそうとも潜在的な上限はとても小さいということです。
このように天井分析を行うことで、システムのパフォーマンスを向上させるために、『何にどれだけの時間を使うか』を決定する役立てることができます。