博客已經遷移至Marcovaldo’s blog (http://marcovaldong.github.io/)git
剛剛完畢了Cousera上Machine Learning的最後一週課程。這周介紹了machine learning的一個應用:photo OCR(optimal character recognition,光學字符識別),如下將筆記整理在如下。github
最後幾小節介紹機器學習的一個應用——photo OCR(optimal character recognition。光學字符識別),這同樣例的內容也可以應用於計算機視覺(computor vision)。photo OCR要解決的問題是怎樣讓計算機識別出圖像中的文字。給定一張圖像,photo OCR首先要作的是肯定當中文字的位置,例如如下圖所看到的:算法
而後將當中的文字正確轉錄下來。windows
photo OCR還是機器學習的難點之中的一個。它可以幫助盲人「看到」面前的事物,可以幫助汽車本身主動識別道路上的物體。促進本身主動駕駛技術的實現。markdown
爲了實現photo OCR,咱們要作的幾個過程例如如下:
- 文本探測(text detection),肯定文本在圖像中的位置
- 字符分割(character segmentation),將含有文本的圖像片斷分割出來,並按一個一個字符切分
- 字符識別(character classification),將圖像中的字符準確的識別出來
固然實際的操做可能要複雜得多,但總體上就是這幾步,這被稱爲photo OCR pipeline網絡
這一小節介紹photo OCR的一個細節——滑動窗體(sliding windows)。咱們使用的路人探測(pedestrain detection)的樣例來引出滑動窗體,下圖中含有多個路人,隨着路人與相機距離的大小。表明路人的矩形尺寸不一樣,但原理同樣。機器學習
咱們在路人探測中使用監督式學習,咱們的數據是一個個圖像片斷,尺寸爲
若是有這樣的圖像片斷數千份。那咱們就可以從中訓練到一個hypothesis,用於推斷新的圖像片斷中是否含有路人。咱們拿上面的那張圖像作test set,找出當中的路人。咱們從圖像的最最左上角選擇一個尺寸爲
而後向右滑動窗體,假定步長爲4(固然,步長爲1精確度最高,但速度降低,依據實際狀況調整)。每滑動一次推斷一次。滑動最左側以後。再從最左側向下滑動一個步長再向右滑動。直至滑動到整個圖像的最最右下角,就掃描完了整張圖像。學習
如下回到photo OCR,此問題的positive examples和negative examples例如如下圖所看到的。
而後使用上面講的滑動窗體去掃描整個圖像。找到文本所在的圖像片斷。
上圖是整個過程的一個示意圖。如下兩張圖像中的白色部分相應原始圖像中的文本位置,當中右面這張是對左面那張的整合處理(大概應該就是將做圖中挨着的白色片斷整合成一大塊)。接下來是字符分割,咱們仍然使用滑動窗體。下圖給出了positive examples和negative examples。注意,咱們要的positive examples是這樣的恰優勢在兩個字符中間的這樣的位置,在這樣的位置咱們才幹準確將字符切分開來。
最後一步是進行字符的識別:
這一小節介紹人工數據合成(artificial data synthesis)。下圖給出了實際遇到的數據,咱們應該可以從這些圖像(這裏咱們使用的都是灰度圖像,比彩色的更好一些)片斷中準確識別出字符。
另外字符可能會使用多種不一樣的字體,那怎樣獲得不少其它的訓練樣本呢?咱們可以將不一樣字體的不一樣字符隨機的粘貼到不一樣的背景上獲得人工合成的訓練樣本,如下第二張圖爲示意。
經過這樣的方法,咱們可以得到大量與原始數據很是相似的合成數據。
第二種方法是經過將原有的圖像片斷作扭曲處理來獲得新的訓練樣本。詳細例如如下圖所看到的:
視頻還給出了語音識別經過引入扭曲來人工合成數據的樣例,經過對原始錄音(original audio)處理,獲得如下合成數據:夾雜電話信號很差的雜音的錄音(audio on bad cellphone connection)、嘈雜環境下的錄音(audio on crowd background)、機器運轉環境下的錄音(audio on machinery background)。
最後,咱們說所有的合成數據應該都是基於原始數據(即原始數據中必須包括有效信息)的,不能向數據集中加入沒有意義的噪聲。
在添加不少其它訓練數據以前。咱們應該確保模型是low bias的,因爲僅僅有這樣的模型才幹經過增大training set來改善其性能。
好比,對於神經網絡,咱們可以經過添加特徵數量,模型層數來確保模型是low bias的,而後再增大training set。
視頻介紹的最後一個問題是得到數據的時間開銷,在實際應用中,咱們應該將其做爲一個成原本考慮。詳細就不寫了。(我認爲吧。沒啥可寫的。給出一張截圖)
這一小節介紹上限分析(ceiling analysis)。上限分析可以幫助咱們分析整個pipeline的哪一步更值得咱們去優化,以得到更好的性能。若是咱們在test set上測試咱們的模型,獲得72%的accuracy。第一步。咱們用人工去作text detection部分的工做(此時,該部分的accuracy達到100%),此時模型的accuracy提高到89%。第二步,咱們再用人工去完畢character segmentation部分的工做(此時該部分的accuracy也達到100%)。而後模型的accuracy達到90%。第三步。咱們用人工去完畢character recognition的工做。終於模型的accuracy達到100%。咱們獲得如下這張表:
分析上面這張表,咱們發現經過對pipeline中三個步驟的提高,咱們可以分別將模型的accuracy添加17%、1%、10%。前面咱們對三個步驟的提高已經達到上限(三個步驟的性能均分別優化到了100%,不能更好),由此獲得的三組數據也是上限,這就是上限分析。由此,咱們知道對text detection和character recognition兩個步驟的優化可以更大程度的改善整個pipeline的性能。因此咱們要優先考慮優化這兩個步驟。
下圖給出了面部識別的pipeline,供咱們加深理解。
對該pipeline的上限分析見下圖,從這張圖咱們知道最值得優化的步驟是face detection。
最後一小節。總結了這門課程的所有內容,見下圖。
認真學完了這門課程,咱們就瞭解了機器學習的一些基本算法和一些技巧,算是勉強入了門。接下來還有不少其它的東西等待着咱們去學習。