# [筆記] 機器學習 應用實例 : Photo OCR
* 光學字符識別 Photo OCR ( photo optical character recognition )
* 目的 : 讓計算機讀出照片中拍到的文字信息
### Machine Learning pipeline

* Photo OCR 步驟 :
1. 文字檢測 ( Text detection ) : 把圖像瀏覽一遍,找出哪裡有文字信息

2. 字符分割 ( Character segmentation ) : 將區域內的文字信息分割成獨立字符

3. 字符識別 ( Character recognition ) : 運行分類器辨識這些字符

4. 較複雜的系統也許在最後會進行拼字校正
### Sliding windows
* 一個可以滑動的視窗來檢測是否存在所需要的信息
* 滑動的距離稱為步長 ( step size ) 或步幅參數 ( stride parameter )
* 步長值越小,表現得越好,但計算量也比較大
* 因為照片有遠近的關係,所以視窗需要按比例放大來重複檢測照片
文字檢測 ( Text detection )

1. 收集樣本訓練出可以識別字符區域 ( y = 1 ) 的機器
2. 使用 Sliding windows 檢測照片

2. 識別後 ( 白色區域為存在字符串 )

3. 經過擴展器 ( expansion operator ) 處理
4. 最後過濾掉較異常的區塊 ( 文字區域應該是矮又寬的 )
字符識別 ( Character recognition )

1. 收集樣本訓練出可以識別字符間隔 ( y = 1 ) 的機器
2. 使用 Sliding windows 檢測 ( 只須向右移動 )
### 人工數據合成 ( Artificial data synthesis )
* 目的為獲取大量的訓練資料,適用於擁有大量資料就能改進的低偏差算法
* 兩種方法來人工獲取新的資料,以 OCR 的字符辨識為例 :
1. 重頭開始創造新的資料
* 隨機選取一個字體 ( 網路上有許多字體庫 )
* 貼到隨機的背景上
* 也許加些模糊操作、變形操作、錯切、縮放、旋轉...

2. 將小的訓練集放大成為更大的訓練集
* 選取一個真實的訓練資料
* 加入人工扭曲,把一個真實的訓練資料變成多個新的訓練資料

* 並不適用於所有問題,為了應用於某個特定問題,需要一些想法與觀察
* 例如辨識語音,可以在背景上加入背景噪音來成為新的訓練資料
* 無意義的變形來新增訓練資料,對於訓練機器是沒有幫助的
* 例如在舊有的訓練資料加上隨機噪音
* 取得更多資料的討論 :
1. 取得更多資料前先確認,擁有更多資料對算法會有所改善,對於低偏差算法會有改善
2. 思考取得預計的資料量需要花多少時間,以下是能取得更多資料的方法
* 人工數據合成
* 自行收集資料與標記
* Crowd source ( 雇用別人來幫忙標記 )
### 上限分析 ( Ceiling analysis )

* 對 pipeline 上的每個模組,進行人工檢測,也就是以 100% 的準確率來執行每個模組
| 模組 | 準確率 |
| -------- | -------- |
| 整個系統 | 72% |
| 文字檢測 100% | 89% |
| 文字檢測、字符分割都 100% | 90% |
| 文字檢測、字符分割、字符識別都 100% | 100% |
* 依照上面的假設數據來看
* 優良的文字檢測能改善系統 89 - 72 = 17%
* 優良的字符分割能改善系統 90 - 89 = 1%
* 優良的字符識別能改善系統 100 - 90 = 10%
* 這樣能了解到改善各個模組,系統的上升空間上限是多少,來決定要在哪個模組投注較多的資源與人力
###### tags: `筆記` `機器學習` `Machine Learning pipeline` `Sliding windows` `人工數據合成` `上限分析`