1. 程式人生 > >Machine Learning第十一周筆記:photo OCR

Machine Learning第十一周筆記:photo OCR

添加 tor ref border 彩色 amp rip nec lock

博客已經遷移至Marcovaldo’s blog (http://marcovaldong.github.io/)

剛剛完畢了Cousera上Machine Learning的最後一周課程。這周介紹了machine learning的一個應用:photo OCR(optimal character recognition,光學字符識別),以下將筆記整理在以下。

Photo OCR

Problem Description and Pipeline

最後幾小節介紹機器學習的一個應用——photo OCR(optimal character recognition。光學字符識別),這一樣例的內容也能夠應用於計算機視覺(computor vision)。photo OCR要解決的問題是怎樣讓計算機識別出圖像中的文字。給定一張圖像,photo OCR首先要做的是確定當中文字的位置,例如以下圖所看到的:

技術分享

然後將當中的文字正確轉錄下來。

photo OCR仍是機器學習的難點之中的一個。它能夠幫助盲人“看到”面前的事物,能夠幫助汽車自己主動識別道路上的物體。促進自己主動駕駛技術的實現。

為了實現photo OCR,我們要做的幾個過程例如以下:
- 文本探測(text detection),確定文本在圖像中的位置
- 字符分割(character segmentation),將含有文本的圖像片段分割出來,並按一個一個字符切分
- 字符識別(character classification),將圖像中的字符準確的識別出來
當然實際的操作可能要復雜得多,但整體上就是這幾步,這被稱為photo OCR pipeline

技術分享

Sliding Windows

這一小節介紹photo OCR的一個細節——滑動窗體(sliding windows)。我們使用的路人探測(pedestrain detection)的樣例來引出滑動窗體,下圖中含有多個路人,隨著路人與相機距離的大小。代表路人的矩形尺寸不同,但原理一樣。

技術分享

我們在路人探測中使用監督式學習,我們的數據是一個個圖像片段,尺寸為82×36(實際尺寸依據須要選擇)。下圖給出了分類為y=1的positive example和分類為y=0的negative example。

如果有這樣的圖像片段數千份。那我們就能夠從中訓練到一個hypothesis,用於推斷新的圖像片段中是否含有路人。我們拿上面的那張圖像做test set,找出當中的路人。我們從圖像的最最左上角選擇一個尺寸為

82×36的圖像片段,成為窗體。推斷當中是否有路人。

然後向右滑動窗體,假定步長為4(當然,步長為1精確度最高,但速度下降,依據實際情況調整)。每滑動一次推斷一次。滑動最左側之後。再從最左側向下滑動一個步長再向右滑動。直至滑動到整個圖像的最最右下角,就掃描完了整張圖像。

技術分享

技術分享

技術分享

技術分享

以下回到photo OCR,此問題的positive examples和negative examples例如以下圖所看到的。

然後使用上面講的滑動窗體去掃描整個圖像。找到文本所在的圖像片段。

技術分享

技術分享

上圖是整個過程的一個示意圖。以下兩張圖像中的白色部分相應原始圖像中的文本位置,當中右面這張是對左面那張的整合處理(大概應該就是將作圖中挨著的白色片段整合成一大塊)。接下來是字符分割,我們仍然使用滑動窗體。下圖給出了positive examples和negative examples。註意,我們要的positive examples是這樣的恰優點在兩個字符中間的這樣的位置,在這樣的位置我們才幹準確將字符切分開來。

技術分享

最後一步是進行字符的識別:

技術分享

Getting Lots of Data and Artificial Data

這一小節介紹人工數據合成(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: What Part of the Pipeline to Work on Next

這一小節介紹上限分析(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。

技術分享

Conclusion

Summary and Thank you

最後一小節。總結了這門課程的全部內容,見下圖。

技術分享

認真學完了這門課程,我們就了解了機器學習的一些基本算法和一些技巧,算是勉強入了門。接下來還有很多其它的東西等待著我們去學習。

Machine Learning第十一周筆記:photo OCR