如果是想訓練一個手寫體識別的模型,用一些前人收集好的手寫文字集就好了,比如中科院的這些數據集。
http://www.nlpr.ia.ac.cn/databases/handwriting/Offline_database.html
但是如果我們只是想要訓練一個專門用於識別印刷漢字的模型,那麼我們就需要各種印刷字體的訓練集,那怎麼獲取呢?藉助強大的圖像庫,自己生成就行了!
GitHub地址:https://github.com/AstarLight/CPS-OCR-Engine/blob/master/ocr/gen_printed_char.py
先捋一捋思路,生成文字集需要什麼步驟:
- 確定你要生成多少字體,生成一個記錄著漢字與label的對應表。
- 確定和收集需要用到的字體文件。
- 生成字體圖像,存儲在規定的目錄下。
- 適當的數據增強。
第三步的生成字體圖像最為重要,如果僅僅是生成很正規的文字,那麼用這個正規文字集去訓練模型,第一圖像數目有點少,第二模型泛化能力比較差,所以我們需要對字體圖像做大量的圖像處理工作,以增大我們的印刷體文字數據集。
我總結了一下,我們可以做的一些圖像增強工作有這些:
- 文字扭曲
- 背景雜訊(椒鹽)
- 文字位置(設置文字的中心點)
- 筆畫粘連(膨脹來模擬)
- 筆畫斷裂(腐蝕來模擬)
- 文字傾斜(文字旋轉)
- 多種字體
做完以上增強後,我們得到的數據集已經非常龐大了。
現在開始一步一步生成我們的3755個漢字的印刷體文字數據集。
一、生成漢字與label的對應表
這裡的漢字、label映射表的生成我使用了pickel模塊,藉助它生成一個id:漢字的映射文件存儲下來。
這裡舉個小例子說明怎麼生成這個「漢字:id」映射表。
首先在一個txt文件里寫入你想要的漢字,如果對漢字對應的ID沒有要求的話,我們不妨使用該漢字的排位作為其ID,比如「一二三四五」中,五的ID就是00005。如此類推,把漢字讀入內存,建立一個字典,把這個關係記錄下來,再使用pickle.dump存入文件保存。
二、收集字體文件
字體文件上網收集就好了,但是值得注意的是,不是每一種字體都支持漢字,所以我們需要篩選出真正適合漢字生成的字體文件才可以。我一共使用了十三種漢字字體作為我們接下來漢字數據集用到的字體,具體如下
圖: