經過前面的文字定位和文本切割,我們已經能夠找出圖像中單個文字的區域,接下來可以建立相應的模型對單字進行識別。
模型選擇
在模型方面,我們選擇了深度學習中的卷積神經網絡模型,通過多層卷積神經網絡,構建了單字的識別模型。
卷積神經網絡是人工神經網絡的一種,已成為當前圖像識別領域的主流模型。 它通過局部感知野和權值共享方法,降低了網絡模型的復雜度,減少了權值的數量,在網絡結構上更類似於生物神經網絡,這也預示着它必然具有更優秀的效果。 事實上,我們選擇卷積神經網絡的主要原因有:
1、對原始圖像自動提取特征 卷積神經網絡模型可以直接將原始圖像進行輸入,免除了傳統模型的人工提取特征這一比較困難的核心部分;
2、比傳統模型更高的精度 比如在MNIST手寫數字識別任務中,可以達到99%以上的精度,這遠高於傳統模型的精度;
3、 比傳統模型更好的泛化能力 這意味着圖像本身的形變(伸縮、旋轉)以及圖像上的噪音對識別的結果影響不明顯,這正是一個良好的OCR系統所必需的。
訓練數據
為了訓練一個良好的模型,必須有足夠多的訓練數據。幸運的是,雖然沒有現成的數據可以用,但是由於我們只是做印刷字體的識別,因此,我們可以使用計算機自動生成一批訓練數據。通過以下步驟,我們構建了一批比較充分的訓練數據:
1。 更多細節 由於漢字的結構比數字和英文都要復雜,因此,為了體現更多的細節信息,我使用48×48的灰度圖像構建樣本,作為模型的輸入;
2。 常見漢字 為了保證模型的實用性,我們從網絡爬取了數十萬篇微信公眾平台上的文章,然后合並起來統計各自的頻率,最后選出了頻率最高的3000個漢字(在本文中我們只考慮簡體字),並且加上26個字母(大小寫)和10個數字,共3062字作為模型的輸出;
3。 數據充分 我們人工收集了45種不同的字體,從正規的宋體、黑體、楷體到不規范的手寫體都有,基本上能夠比較全面地覆蓋各種印刷字體;
4。 人工噪音 每種字體都構建了5種不同字號(46到50)的圖片,每種字號2張,並且為了增強模型的泛化能力,將每個樣本都加上5%的隨機噪音。
模型結構
在模型結構方面,有一些前人的工作可以參考的。一個類似的例子是MNIST手寫數字的識別——它往往作為一個新的圖像識別模型的“試金石”——是要將六萬多張大小為28×28像素的手寫數字圖像進行識別,這個案例跟我們實現漢字的識別系統具有一定的相似性,因此在模型的結構方面可以借鑒。一個常見的通過卷積神經網絡對MNIST手寫數字進行識別的模型結構如圖
圖18 本文用來識別印刷漢字的網絡結構
經過充分訓練后,如圖17的網絡結構可以達到99%以上的精確度,說明這種結構確實是可取的。但是很顯然,手寫數字不過只有10個,而常用漢字具有數千個,在本文的分類任務中,就共有3062個目標。也就是說,漢字具有更為復雜和精細的結構,因此模型的各方面都要進行調整。首先,在模型的輸入方面,我們已經將圖像的大小從28x28提高為48x48,這能保留更多的細節,其次,在模型結構上要復雜化調整,包括:增加卷積核的數目,增加隱藏節點的數目、調整權重等。最終我們的網絡結構如圖18。
在激活函數方面,我們選取了RuLe函數為激活函數
實驗表明,它相比於傳統的sigmoid、tanh等激活函數,能夠大大地提升模型效果[3][4];在防止過擬合方面,我們使用了深度學習網絡中最常用的Dropout方式[5],即隨機地讓部分神經元休眠,這等價於同時訓練多個不同網絡,從而防止了部分節點可能出現的過擬合現象。
需要指出的是,在模型結構方面,我們事實上做了大量的篩選工作。比如隱藏層神經元的數目,我們就耗費了若干天時間,嘗試了512、1024、2048、4096、8192等數目,最終得到1024這個比較適合的值。數目太多則導致模型太龐大,而且容易過擬合;太少則容易欠擬合,效果不好。我們的測試發現,從512到1024,效果有明顯提升;而再增加節點效果沒有明顯提升,有時還會有明顯下降。
模型實現
我們的模型在操作系統為CentOS 7的服務器(24核CPU+96G內存+GTX960顯卡)下完成,使用Python 2。7編寫代碼,並且使用Keras作為深度學習庫,用Theano作為GPU加速庫(Tensorflow一直提示內存溢出,配置不成功。 )。
在訓練算法方面,使用了Adam優化方法進行訓練,batch size為1024,迭代30次,迭代一次大約需要700秒。
如果出現形近字時,應該是高頻字更有可能,最典型的例子就是“日”、“曰”了,這兩個的特征是很相似的,但是“日”出現的頻率遠高於“曰”,因此,應當優先考慮“日”。 因此,在訓練模型的時候,我們還對模型最終的損失函數進行了調整,使得高頻字的權重更大,這樣能夠提升模型的預測性能。
經過多次調試,最終得到了一個比較可靠的模型。 模型的收斂過程如下圖。
訓練曲線圖:Loss(損失函數)和Acc(精度)
模型檢驗
我們將從以下三個方面對模型進行檢驗。 實驗結果表明,對於單字的識別效果,我們的模型優於Google開源的OCR系統Tesseract。
訓練集檢驗
最終訓練出來的模型,在訓練集的檢驗報告如表1。
從表1可以看到,即便在加入了隨機噪音的樣本中,模型的正確率仍然有99。7%,因此,我們有把握地說,單純從單字識別這部分來看,我們的結果已經達到了state of the art級別,而且在黑體、宋體等正規字體中(正規字體樣本是指所有訓練樣本中,字體為黑體、宋體、楷體、微軟雅黑和Arial unicode MS的訓練樣本,這幾種字體常見於印刷體中。),正確率更加高!
測試集檢驗
我們另外挑選了5種字體,根據同樣的方法生成了一批測試樣本(每種字體30620張,共153100張),用來對模型進行測試,得到模型測試正確率為92。11%。 五種字體的測試結果如表2。
從表中可以看出,即便是對於訓練集之外的樣本,模型效果也相當不錯。接着,我們將隨機噪音增大到15%(這對於一張48×48的文字圖片來說已經相當糟糕了),得到的測試結果如表3。
平均的正確率為87。59%,也就是說,噪音的影響並不明顯,模型能夠保持90%左右的正確率。 這說明該模型已經完全達到了實用的程度。