Photo OCR
在此章的課程中瞧捌,Andrew主要是想通過OCR問題的解決來闡釋在實際項目中我們應該如何定義問題膳帕,并將一個大問題分解為多個小問題鹿霸,并通過pipeline的方式將對這些小問題的解決方案串聯(lián)起來乡括,從而解決這個大問題。我認為這是解決實際問題的一個經(jīng)典的方法論挎峦,有助于我們在實際工作和生活中更好地思考問題,分解問題合瓢,并最終解決問題坦胶。
Problem Description and Pipeline
此小節(jié)主要是通過Photo OCR(Optical Character Recognition)問題來闡釋什么是pipeline. OCR簡單說就是識別圖片中的文字的問題。那么要解決這個問題晴楔,實際我們可以分解為三個小一點的問題顿苇,即 1,識別出有文字的區(qū)域税弃;2纪岁,分割字符;3则果,識別字符幔翰。如下圖所示:
每一個問題可能都需要一個功能模塊去解決,而不同的模塊又可以分給不同的工程師去解決短条,從而可以通過team work的方式來解決一個實際的問題导匣。如下圖所示:
Sliding Window
文字區(qū)域識別是一個相對較難的問題,因為文字識別區(qū)域會有非常多的變化茸时,寬高比都不固定贡定,所以Andrew先以人物識別為例講述如何進行識別(因為人物,尤其是站立的人物可都,其寬高比是基本固定的)缓待。那么,我們自己想象一下該如何去識別呢渠牲?(我最開始的想法是只要有人出現(xiàn)這個圖片就判定為1旋炒,沒有人就判定為0,但問題是這并沒有圈定人物區(qū)域签杈,直到看到課程中講到滑動窗口的概念才恍然大悟)瘫镇。先看看Andrew在課程中講述的如何識別人物,如下圖所示:
- 我們需要首先收集樣本答姥,Andrew的例子中樣本是固定的82x36分辨率的圖片铣除,有人物的標記為1,沒有人物的標記為0
- 通過有監(jiān)督學習鹦付,我們就有了一個模型可以識別類似圖片中是否有人
之后尚粘,就是我們要說的滑動窗口(sliding window)了
- 我們可以用同樣寬高比例的方框,從圖片一角開始滑動敲长,每次滑動所取的區(qū)域圖片都可以利用我們之前訓練的模型來識別是否有人郎嫁,這樣從頭到尾的滑動一遍之后秉继,我們就知道那個區(qū)域有人,哪個區(qū)域沒有人泽铛。
- 滑動的距離被定義為step-size或者stride尚辑,可以是一個像素,也可以是多個像素厚宰。step-size越小則最后可能識別錯誤的可能越小
- 由于遠近的關(guān)系腌巾,圖片中有的人物會比較大,有的會比較小铲觉,所以我們可能需要不同尺寸的矩形框去掃描澈蝙。但是需要注意的是即使使用了不同尺寸我們也可以保持同樣的寬高比,然后再將原尺寸矩形框通過拉伸或者壓縮使得其符合82x36的分辨率撵幽,然后再使用模型進行識別灯荧。
針對文字識別,我們可以使用類似的方法進行滑動窗口識別盐杂,同樣我們需要先訓練一個模型逗载,針對有文字的圖片標記為1,沒有文字的標記為0链烈,這樣訓練出一個模型厉斟。
之后再利用滑動窗口的方法對要識別的圖像進行滑動掃描,如下圖:
- 在文字識別的時候先使用較小的矩形框進行滑動識別强衡,并根據(jù)框中是否有文字的概率來選擇不同的灰度進行置灰擦秽,當有文字的概率越高,灰度越袖銮凇(左下圖中白色兩點)感挥,相反越黑。
- 然后我們通過expansion越败,將白色方框區(qū)域進行拓展使其連成一片區(qū)域触幼。
- 最后將符合我們寬高比的區(qū)域進行框選即可
下一步,是將有文字的區(qū)域送人下一個pipeline究飞,進行文字分割置谦,首先也要有一個模型,來訓練其識別字符的分割線亿傅,如下圖所示:
- 訓練分割字符的模型霉祸,將中間可分割的圖片標記為1,不可分割的圖片標記為0袱蜡,從而訓練出一個模型。
- 然后再利用滑動窗口在我們之前框出的文字區(qū)域進行滑動識別慢宗,從而分割字符
分割好之后坪蚁,就是利用我們之前課程講過的文字識別的模型進行文字識別即可奔穿。
Getting lots of data and artificial data
此小節(jié)主要講了如何獲得大量數(shù)據(jù),其中一個技巧就是人造數(shù)據(jù)敏晤,通過合成贱田,distortion等方法我們可以生成一些“假”的數(shù)據(jù),但是這些數(shù)據(jù)卻能大幅提升我們模型的性能嘴脾。
Andrew首先舉了一個字符識別的例子男摧,如下圖:
- 這里是通過把不同font的字符放到不同的背景中合成新的樣本
還有不同的方式來人工生成的數(shù)據(jù),是通過引入distortion來生成新的樣本译打,如下圖:
另外耗拓,不同的領(lǐng)域合成數(shù)據(jù)的方式是不同的,比如在語音識別領(lǐng)域奏司,我們是通過引入不同的背景噪音來合成新的樣本數(shù)據(jù)乔询,如下:
最后,關(guān)于數(shù)據(jù)作者強調(diào)了如下兩點:
- 即在增加數(shù)據(jù)之前首先要確認你已經(jīng)有了一個low bias的模型韵洋,其實也就是我們之前課程所說的要先看看我們模型目前面臨的是一個什么問題竿刁,是high bias問題還是high variance問題,只有當我們解決了high bias問題之后搪缨,才需要考慮增加數(shù)據(jù)量的問題食拜。
- 通常在項目中我們需要問下“要獲取10倍的數(shù)據(jù)量需要投入多少資源(人力和時間)”,通常副编,很可能我們不需要花費太多的時間就可以獲取到10倍的數(shù)據(jù)量负甸,從而大幅提升我們的模型的性能。
- 作者還介紹幾種獲取大量數(shù)據(jù)的方法齿桃,除了之前講到的人工合成數(shù)據(jù)惑惶,自己標記之外,還可以找相應的眾包網(wǎng)站短纵,去雇傭其它人來進行標記带污。
Ceiling Analysis
所謂Ceiling Analysis(上限分析)實際是分析Pipeline中每個module隊算法的影響度的分析,即哪個模塊對算法的改進最有用香到,然后我們把我們的精力資源投入到那個產(chǎn)出更高的模塊鱼冀。具體做法如下:
- 我們首先使用我們現(xiàn)有的model在測試集中測試下錯誤率,本例是72%
- 然后我們將text detection模塊的輸出數(shù)據(jù)均使用100%正確的數(shù)據(jù)(比如人工檢查圈選)悠就,然后再用模型跑一下測試集千绪,這時候我們會得到一個新的錯誤率,本例是89%, 這樣我們就知道當我們改進我們text detection模塊時梗脾,我們最多可以讓系統(tǒng)性能提升17%(89%-72%)
- 同樣道理荸型,我們可以接著講character segmentation輸出的數(shù)據(jù)全部設(shè)置為正確的輸出,再看總的error rate炸茧,這次是90%瑞妇,說明改進character segmentation對系統(tǒng)整體性能的提升非常有限稿静,只有1%,那么我們可以不必花精力在這個模塊上了辕狰。
- 以此類推改备,可以看到character recognition模塊對于系統(tǒng)的整體提升可以有10%的貢獻度
之后,Andrew又舉了一個更復雜的例子蔓倍,但是大同小異
總的來說悬钳,我們在一個項目的pipeline中,要通過ceiling analysis來分析究竟哪個模塊的改善對于我們系統(tǒng)的整體性能提升有的大的幫助偶翅,然后將我們resource投入到哪些可能帶來最大改善的模塊中更加有意義默勾。
至此,我們機器學習的課程就全部完結(jié)了倒堕,非常感謝Andrew灾测,他的課程真的非常棒!