如果是想訓練一個手寫體識別的模型,用一些前人收集好的手寫文字集就好了,比如中科院的這些數據集。

nlpr.ia.ac.cn/databases

但是如果我們只是想要訓練一個專門用於識別印刷漢字的模型,那麼我們就需要各種印刷字體的訓練集,那怎麼獲取呢?藉助強大的圖像庫,自己生成就行了!

GitHub地址:github.com/AstarLight/C

先捋一捋思路,生成文字集需要什麼步驟:

  1. 確定你要生成多少字體,生成一個記錄著漢字與label的對應表。
  2. 確定和收集需要用到的字體文件。
  3. 生成字體圖像,存儲在規定的目錄下。
  4. 適當的數據增強。

第三步的生成字體圖像最為重要,如果僅僅是生成很正規的文字,那麼用這個正規文字集去訓練模型,第一圖像數目有點少,第二模型泛化能力比較差,所以我們需要對字體圖像做大量的圖像處理工作,以增大我們的印刷體文字數據集。

我總結了一下,我們可以做的一些圖像增強工作有這些:

  1. 文字扭曲
  2. 背景雜訊(椒鹽)
  3. 文字位置(設置文字的中心點)
  4. 筆畫粘連(膨脹來模擬)
  5. 筆畫斷裂(腐蝕來模擬)
  6. 文字傾斜(文字旋轉)
  7. 多種字體

做完以上增強後,我們得到的數據集已經非常龐大了。

現在開始一步一步生成我們的3755個漢字的印刷體文字數據集。

一、生成漢字與label的對應表

這裡的漢字、label映射表的生成我使用了pickel模塊,藉助它生成一個id:漢字的映射文件存儲下來。

這裡舉個小例子說明怎麼生成這個「漢字:id」映射表。

首先在一個txt文件里寫入你想要的漢字,如果對漢字對應的ID沒有要求的話,我們不妨使用該漢字的排位作為其ID,比如「一二三四五」中,五的ID就是00005。如此類推,把漢字讀入內存,建立一個字典,把這個關係記錄下來,再使用pickle.dump存入文件保存。

二、收集字體文件

字體文件上網收集就好了,但是值得注意的是,不是每一種字體都支持漢字,所以我們需要篩選出真正適合漢字生成的字體文件才可以。我一共使用了十三種漢字字體作為我們接下來漢字數據集用到的字體,具體如下

圖:

當然,如果需要進一步擴大數據集來增強訓練得到的模型的泛化能力,可以花更多的時間去收集各類漢字字體,那麼模型在面對各種字體時也能從容應對,給出準確的預測。

三、文字圖像生成

首先是定義好輸入參數,其中包括輸出目錄、字體目錄、測試集大小、圖像尺寸、圖像旋轉幅度等等。

接下來需要將我們第一步得到的對應表讀入內存,因為這個表示ID到漢字的映射,我們在做一下轉換,改成漢字到ID的映射,用於後面的字體生成。

我們對旋轉的角度存儲到列表中,旋轉角度的範圍是[-rotate,rotate].

現在說一下字體圖像是怎麼生成的,首先我們使用的工具是PIL。PIL裡面有很好用的漢字生成函數,我們用這個函數再結合我們提供的字體文件,就可以生成我們想要的數字化的漢字了。我們先設定好我們生成的字體顏色為黑底白色,字體尺寸由輸入參數來動態設定。

我們寫兩個循環,外層循環是漢字列表,內層循環是字體列表,對於每個漢字會得到一個image_list列表,裡面存儲著這個漢字的所有圖像。

我們將image_list中圖像按照比例分為訓練集和測試集存儲。

寫好代碼後,我們執行如下指令,開始生成印刷體文字漢字集。

解析一下上述指令的附屬參數:

  1. --out_dir 表示生成的漢字圖像的存儲目錄
  2. --font_dir 表示放置漢字字體文件的路徑
  3. --width --height 表示生成圖像的高度和寬度
  4. --margin 表示字體與邊緣的間隔
  5. --rotate 表示字體旋轉的範圍,[-rotate,rotate]
  6. --rotate_step 表示每次旋轉的間隔

生成這麼一個3755個漢字的數據集的所需的時間還是很久的,估計接近一個小時。其實這個生成過程可以用多線程、多進程並行加速,但是考慮到這種文字數據集只需生成一次就好,所以就沒做這方面的優化了。數據集生成完我們可以發現,在dataset文件夾下得到train和test兩個文件夾,train和test文件夾下都有3755個子文件夾,分別存儲著生成的3755個漢字對應的圖像,每個子文件的名字就是該漢字對應的id。隨便選擇一個train文件夾下的一個子文件夾打開,可以看到所獲得的漢字圖像,一共634個。

dataset下自動生成測試集和訓練集

測試集和訓練集下都有3755個子文件夾,用於存儲每個漢字的圖像。

生成出來的漢字圖像

額外的圖像增強

第三步生成的漢字圖像是最基本的數據集,它所做的圖像處理僅有旋轉這麼一項,如果我們想在數據增強上再做多點東西,想必我們最終訓練出來的OCR模型的性能會更加優秀。我們使用opencv來完成我們定製的漢字圖像增強任務。

因為生成的圖像比較小,僅僅是30*30,如果對這麼小的圖像加雜訊或者形態學處理,得到的字體圖像會很糟糕,所以我們在做數據增強時,把圖片尺寸適當增加,比如設置為100×100,再進行相應的數據增強,效果會更好。

噪點增加

輸入指令

使用這種生成的圖像如下圖所示,第一數據集擴大了兩倍,第二圖像的豐富性進一步提高,效果還是明顯的。當然,如果要獲得最好的效果,還需要調一下裡面的參數,這裡就不再詳細說明了。

至此,我們所需的印刷體漢字數據集已經成功生成完畢,下一步要做的就是利用這些數據集設計一個卷積神經網路做文字識別了!完整的代碼可以在GitHub上獲取。

再次送上傳送門:

github.com/AstarLight/C

來源 | 博客園 作者 | Madcola


關注V信公眾號:七月在線實驗室,查看更多BAT面試題,乾貨資料等

掃描二維碼 獲取更多信息

今日學習推薦:

為了讓小夥伴們更好的學習,我們為你準備了機器學習、OCR文字識別實戰、CV就業、推薦系統就業、AI就業班相關方面知識,可免費試聽喔,詳情點擊下方學習~

機器學習集訓營 第八期「線上線下結合,線下在北上深廣杭沈濟鄭成武西長十二城」- 七月在線?

www.julyedu.com圖標OCR文字識別實戰 [國內首套全面公開OCR技術的實戰課程] - 七月在線?

www.julyedu.com
圖標
CV就業班 第一期「BAT大咖小班教學,保證就業」- 七月在線?

www.julyedu.com
圖標
推薦系統就業班 第二期「BAT大咖小班教學,保證就業」- 七月在線?

www.julyedu.com

AI就業班 四期「BAT大咖一對一高端私人定製」 - 七月在線?

www.julyedu.com


推薦閱讀:

相关文章