賽題以識別類似手寫體的四則運算式為主題,參賽者需要在充滿干擾信息的10萬張圖片中,設計算法識別圖片上數學運算式并計算結果。決賽在初賽的基礎上,引入分數和更加復雜的運算,同樣以最終的識別率來評判算法。
本節會詳細介紹我在進行四則混合運算識別競賽初賽時的所有思路。
問題描述
本次競賽目的是為了解決一個 OCR 問題,通俗地講就是實現圖像到文字的轉換過程。
數據集
初賽數據集一共包含10萬張180*60的圖片和一個labels.txt的文本文件。每張圖片包含一個數學運算式,運算式包含:
3個運算數:3個0到9的整型數字; 2個運算符:可以是+、-、*,分別代表加法、減法、乘法 0或1對括號:括號可能是0對或者1對
圖片的名稱從0.png到99999.png,下面是一些樣例圖片(這里只取了一張):
文本文件 labels.txt 包含10w行文本,每行文本包含每張圖片對應的公式以及公式的計算結果,公式和計算結果之間空格分開,例如圖片中的示例圖片對應的文本如下所示:
(3-7)+5 1
5-6+2 1
(6+7)*2 26
(4+2)+7 13
(6*4)*4 96
評價指標
官方的評價指標是準確率,初賽只有整數的加減乘運算,所得的結果一定是整數,所以要求序列與運算結果都正確才會判定為正確。
我們本地除了會使用官方的準確率作為評估標準以外,還會使用 CTC loss 來評估模型。
使用 captcha 進行數據增強
官方提供了10萬張圖片,我們可以直接使用官方數據進行訓練,也可以通過Captcha,參照官方訓練集,隨機生成更多數據,進而提高準確性。根據題目要求,label 必定是三個數字,兩個運算符,一對或沒有括號,根據括號規則,只有可能是沒括號,左括號和右括號,因此很容易就可以寫出數據生成器的代碼。
生成器
生成器的生成規則很簡單:
相信大家都能看懂。當然,我寫文章的時候又想到一種更好的寫法:
除了生成算式以外,還有一個值得注意的地方就是初賽所有的減號(也就是“-”)都是細的,但是我們直接用 captcha 庫生成圖像會得到粗的減號,所以我們修改了image.py中的代碼,在_draw_character函數中我們增加了一句判斷,如果是減號,我們就不進行 resize 操作,這樣就能防止減號變粗:
我們繼而使用生成器生成四則運算驗證碼:
上圖就是原版生成器生成的圖,我們可以看到減號是很粗的。
上圖是修改過的生成器,可以看到減號已經不粗了。
模型結構
模型結構像之前寫的文章一樣,只是把卷積核的個數改多了一點,加了一些 BN 層,并且在四卡上做了一點小改動以支持多GPU訓練。如果你是單卡,可以直接去掉base_model2 = make_parallel(base_model, 4)的代碼。
BN 層主要是為了訓練加速,實驗結果非常好,模型收斂快了很多。
base_model 的可視化:
model 的可視化:
模型訓練
在經過幾次測試以后,我已經拋棄了 evaluate 函數,因為在驗證集上已經能做到 100% 識別率了,所以只需要看 val_loss 就可以了。在經過之前的幾次嘗試以后,我發現在有生成器的情況下,訓練代數越多越好,因此直接用 adam 跑了50代,每代10萬樣本,可以看到模型在10代以后基本已經收斂。
我們可以看到模型先分為四份,在四個顯卡上并行計算,然后合并結果,計算最后的 ctc loss,進而訓練模型。
結果可視化
這里我們對生成的數據進行了可視化,可以看到模型基本已經做到萬無一失,百發百中。
打包成 docker 以后提交到比賽系統中,經過十幾分鐘的運行,我們得到了完美的1分。
總結
初賽是非常簡單的,因此我們才能得到這么準的分數,之后官方進一步提升了難度,將初賽測試集提高到了20萬張,在這個集上我們的模型只能拿到0.999925的成績,可行的改進方法是將準確率進一步降低,充分訓練模型,將多個模型結果融合等。
官方擴充測試集的難點
在擴充數據集上,我們發現有一些圖片預測出來無法計算,比如[629,2271,6579,17416,71857,77631,95303,102187,117422,142660,183693]等,這里我們取 117422.png 為例。
我們可以看到肉眼基本無法認出這個圖,但是經過一定的圖像處理,我們可以顯現出來它的真實面貌:
然后我們可以看到這樣的結果:
當然,還有一張圖是無法通過預處理得到結果的,142660,這有可能是程序的 bug 造成的小概率事件,所以初賽除了我們跑了一個 docker 得到滿分以外,沒有第二個人達到滿分。
-
圖像
+關注
關注
2文章
1089瀏覽量
40528 -
代碼
+關注
關注
30文章
4818瀏覽量
68874 -
生成器
+關注
關注
7文章
319瀏覽量
21074
原文標題:百度魅族深度學習大賽初賽冠軍作品(圖像識別.源碼)
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論