目錄windows
隨着網絡上的圖片的數量愈來愈多,讀取圖片上的文字成爲了一個日益加強的需求。網絡
按照photo ocr問題的各個處理流程,咱們能夠大體爲不一樣的環節分配不一樣數量的人去進行。機器學習
文字檢測和行人檢測的差異:ide
行人因爲其矩形的長寬比例(ratio)大體比較固定(根據距離遠近不一樣產生差異),所以可能較爲容易檢測。而文字則可能有各類各樣的形狀,相對比較難以確認其所在的區域。性能
若是要創建一個行人檢測的系統,咱們須要一些形狀/像素相同的照片,分別是有行人的正例,和沒有行人的反例。學習
用一個固定比例的小矩形(patch)做爲檢測器,在目標圖片上逐漸平移,每次平移距離稱爲step-size/stride。用這個小矩形在整個圖片上完成一次完整的掃描,而後再用稍微大一點的矩形,重複操做。最後,記錄下全部用小矩形檢測到的行人。字體
與行人檢測相似,咱們用像素相同的正例和反例來作訓練。component
在訓練好檢測器模型後,咱們就能夠用模型來作檢測工做。圖片
如上圖,首先咱們會用一個小滑動窗口完成一次掃描,而後標註出模型認爲可能有文字的部分爲白色小塊,而後咱們將這些白色小塊部分作一個擴張(expansion)(左圖->右圖)。以後沒咱們能夠用針對擴張後的,有較大面積,連續的和有規則輪廓的白色塊,咱們將它們用矩形窗口框起來,再使用模型去嘗試確認這些框起來的區域是否有文字。ip
這是在文字檢測後的下一個步驟。
以下圖,一樣,咱們用正例和反例訓練出能夠檢測文字邊界的檢測器模型。
而後,咱們用滑動窗口掃描目標圖像,並在每一個模型認爲是文字邊界的地方作標記。
Photo OCR問題的處理流程:
機器學習模型的訓練中,咱們每每須要大量的數據。而這些數據從哪裏來呢?咱們能夠用Artificial Data Synthesis(人工數據合成)。
以下圖,假設咱們收集了一個文字識別的數據集(圖像+字母標記),咱們如何將它」擴大「呢?
首先,字母能夠變換成不少不一樣的字體,而且給字母能夠賦予不一樣的背景樣式。對真實數據(左圖)進行一番變化後,咱們就能夠得到合成數據(右圖)。
另外,咱們還能夠對數據圖像引入必定程度的扭曲(以下圖)。
相似的作法在語音識別(speech recognition)裏面也有(爲原始純淨的語音添加不一樣的干擾音和背景音【噪音】)。
要注意的是,所添加的噪音/扭曲必須是在對應類型的數據集中比較有表明性的噪音/扭曲。
得到更多數據的注意事項:
確認使用的是low bias的分類器(經過畫學習曲線來判別)(若是是high bias的分類器,增長樣本數量對提高模型性能已經不太有用了【見前面】,這時要增長訓練特徵數目,好比在神經網絡裏能夠增長隱藏層的神經元數目)
注意得到更多數據的投入成本。考慮到所付出的工做和模型可能從更多的數據中得到的性能改善,做出權衡。(不一樣的三種途徑:人工合成,本身蒐集,衆籌)
咱們但願在改善機器學習系統的性能時,把更多的精力投入到性價比比較高的部分,即改善的努力最有可能獲得回報的部分,那麼,咱們就須要首先找出當前是系統的哪一個部分對系統的性能限制最大。
以下圖,回到文字識別問題,咱們對識別系統的不一樣組件(component)的準確度進行對比:
按照流程的順序,咱們會不斷地將每一個涉及到模型性能的流程作一些調整,使得當前流程的模型表現「完美」,即經過調整,使某個流程的模型在某個數據集上表現100%準確(手工標記正確標籤(ground-truth labels),而後將徹底正確處理過的數據再輸入到下一個模型中)。這時,再測量系統的準確率如何,這個準確率也就是當前流程模型表現「完美」時的系統瓶頸(ceiling)性能。
得到了全部流程中的模型的表現完美的狀況下,系統的瓶頸性能後,咱們就能夠開始抉擇,在哪些模型的改進上下功夫。固然是在可以使得瓶頸性能得到最大程度的改進的模型上!(上圖中,是文字檢測模型,由於能夠得到最大72%->89%的大幅度改善。至於文字識別的100%識別率對於系統改進是沒有太大參考意義的,由於其屬於模型的最後輸出判斷結果的部分,它的改善在實際狀況下會被前面的流程限制。)
以下圖,另外一個瓶頸分析的例子:人臉識別。