Coursera Machine Learning Week11 人工的なデータ生成と天井分析

# はじめに
今回は Photo OCR の問題を通じて、以下のことを学びます。

* パイプライン処理
* 人工的なデータ生成
* 天井分析

# Photo OCRとは？
Photo OCR は画像中のテキストに何が書かれているのかコンピュータに理解させるタスクです。以下の画像の例だと、看板に「大久保駅」と書かれていることを読み取ります。
![ocr1.png](https://qiita-image-store.s3.amazonaws.com/0/77079/bd4d8e35-f760-16db-f3b9-772b5aed3271.png)


コンピュータが画像中のテキストを理解できると、画像を探したいときにテキストで検索できるようになります。他にも Photo OCR の技術を応用すると以下のようなことができます：

* 盲目の人が目の前にあるものを理解するのを助ける
* カーナビが道路の標識を読んで、目的地までのナビゲーションをサポートする

## Photo OCRのステップ
Photo OCR のステップは以下の３段階からなります。

1. テキスト検出
2. 文字分割
3. 文字認識

![ocr2.png](https://qiita-image-store.s3.amazonaws.com/0/77079/67822f4a-eeb7-1cf3-0991-8851dc7dc9aa.png)


* テキスト検出ステップでは、画像中のどこにテキストがあるかを検出します。
* 文字分割ステップでは、検出したテキストを文字単位に分割します。
* 文字認識ステップでは、分割された文字に対して分類器を適用することで文字を認識します。

これらのステップは以下のようなパイプライン処理となっています。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/77079/494de9bc-e8d4-0f6e-452c-7f4403b1cd43.png)


パイプライン処理にしておくことで、各モジュールを別々のエンジニアが担当し、仕事を自然に分割できるというメリットがあります。

<!--
以下ではパイプライン処理の各モジュールについて詳しく見ていきます。

# Sliding Windows
## テキスト検出
テキストのアスペクト比が異なるので難しい。
まずは、歩行者検出から考える。歩行者のアスペクト比はほぼ同じだから。

短形の中に歩行者が入っているか分類する。次に、短形を少しずつスライドさせる。短形を少しずつ大きくする。そして同様にスライドさせていく。

テキスト検出の場合
小さい短形をスライドさせていく。
ボックスを洗い出す。
おかしいのは取り除く。

## 文字分割
教師あり学習を使って、画像の真ん中に文字の区切りがあるかどうかで分類する。
ちょっとずつスライドさせていき、分割する位置を決定する。

## 文字認識
分割したら、分類する。

-->

# 人工的なデータ生成
大量のトレーニングデータを得る方法として、人口的にデータ生成するという方法があります。以下では人工的なデータ生成の方法とデータを得るときに気を付けることについて学んでいきます。

## 人口的なデータ生成の方法
人口的なデータ生成には以下の２種類の方法があります：

* 無からデータを作り出す
* 少量のラベル付きデータを拡大する

### 無からデータを作る方法
人工的にデータを生成する方法の一つとして、無からデータを生成する方法があります。この方法では、例えば文字データを得たい場合、異なるフォントから文字を取り出して、ランダムの背景に張り付けていくことでデータを生成するといったことを行います。

<!--
以下は左が実データ、右がランダムの背景に文字を貼り付けて生成したデータです。
![synthetic.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/2013eca3-ae9d-6195-7cde-da247509b5dd.jpeg)
-->

また、無からデータを生成する際には、本物っぽく見えるような作業をする必要があります。具体的には、画像をゆがめたりノイズを載せたりして本物っぽく見えるようにします。

<!--
以下は画像をゆがめている例です。
![noisy.JPG](https://qiita-image-store.s3.amazonaws.com/0/77079/ca30f823-6992-ed93-1155-3f625d0045a9.jpeg)
-->

このような作業をすることで、実質的に無制限のデータを得ることができます。

### 少量のラベル付きデータを拡大する
人工的にデータを生成するもう一つの方法として、少量のラベル付きデータを拡大する方法があります。この方法では、例えばラベルの付いた画像に対してゆがみやノイズを加えるといったことを行ってデータを生成します。


## データ生成するときの注意点
データを生成するときには以下の２点に気を付ける必要があります：

* テストセットで見られそうなゆがみを導入する
* 無意味なノイズをデータに載せない

## データを得るときに気をつけること
データを得る際には以下のことに気をつけます：

* 学習曲線を描いてみて、より多くのデータが役に立つかを確認してから集める
* 現在持っているデータの１０倍のデータを得るのにどれくらいの労力がかかるか問うてみる

データを集めるなら効果があることを確認してから集めましょう。いざ集めてから使えませんでは労力の無駄です。
また、経験的には人手で集めても現在の１０倍のデータを得るのにそれほど時間はかからないので、人工的に生成する前に人手で集めることを検討してみるのも良いでしょう。

また、データを集める方法としては以下の３つが考えられます：

* 人口的なデータ生成
* 自分でタグ付け
* クラウドソーシング

<!--
データを得るための議論
・分類器が低バイアスでこうバリアンすの分類器ではないことを確認する。低バイアスの分類器を持っていなければ特徴数を増やす。低バイアスの分類気になるまで。「大量のデータを収集する前に、そのデータをうまく活用できるか確かめなさい。」「学習曲線を描いてみて、より多いデータが役に立つかを確認してから集めなさい」
・現在持っているデータの１０倍のデータを得るのにどれくらいの労力がかかるか問うてみる。
データを集める方法
* 人口データ生成
* 自分でデータタグ付け
* クラウドソーシング
自分でタグ付けしても意外とすぐに済んでしまう
-->

# 天井分析
私たち開発者の時間は限られています。天井分析では、パイプラインのどのモジュールを改善すると最もパフォーマンスに対して効果があるのかを分析します。パフォーマンス向上の上限（天井）がわかることから天井分析と呼ばれています。
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/77079/494de9bc-e8d4-0f6e-452c-7f4403b1cd43.png)

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%しか性能が向上しません。これの意味するところは、どれだけ文字分割の改善に時間を費やそうとも潜在的な上限はとても小さいということです。

このように天井分析を行うことで、システムのパフォーマンスを向上させるために、『何にどれだけの時間を使うか』を決定する役立てることができます。