賽題以識別類似手寫體的四則運算式為主題,參賽者需要在充滿干擾信息的10萬張圖片中,設(shè)計算法識別圖片上數(shù)學運算式并計算結(jié)果。決賽在初賽的基礎(chǔ)上,引入分數(shù)和更加復(fù)雜的運算,同樣以最終的識別率來評判算法。
本節(jié)會詳細介紹我在進行四則混合運算識別競賽初賽時的所有思路。
問題描述
本次競賽目的是為了解決一個 OCR 問題,通俗地講就是實現(xiàn)圖像到文字的轉(zhuǎn)換過程。
數(shù)據(jù)集
初賽數(shù)據(jù)集一共包含10萬張180*60的圖片和一個labels.txt的文本文件。每張圖片包含一個數(shù)學運算式,運算式包含:
3個運算數(shù):3個0到9的整型數(shù)字; 2個運算符:可以是+、-、*,分別代表加法、減法、乘法 0或1對括號:括號可能是0對或者1對
圖片的名稱從0.png到99999.png,下面是一些樣例圖片(這里只取了一張):
文本文件 labels.txt 包含10w行文本,每行文本包含每張圖片對應(yīng)的公式以及公式的計算結(jié)果,公式和計算結(jié)果之間空格分開,例如圖片中的示例圖片對應(yīng)的文本如下所示:
(3-7)+5 1
5-6+2 1
(6+7)*2 26
(4+2)+7 13
(6*4)*4 96
評價指標
官方的評價指標是準確率,初賽只有整數(shù)的加減乘運算,所得的結(jié)果一定是整數(shù),所以要求序列與運算結(jié)果都正確才會判定為正確。
我們本地除了會使用官方的準確率作為評估標準以外,還會使用 CTC loss 來評估模型。
使用 captcha 進行數(shù)據(jù)增強
官方提供了10萬張圖片,我們可以直接使用官方數(shù)據(jù)進行訓練,也可以通過Captcha,參照官方訓練集,隨機生成更多數(shù)據(jù),進而提高準確性。根據(jù)題目要求,label 必定是三個數(shù)字,兩個運算符,一對或沒有括號,根據(jù)括號規(guī)則,只有可能是沒括號,左括號和右括號,因此很容易就可以寫出數(shù)據(jù)生成器的代碼。
生成器
生成器的生成規(guī)則很簡單:

相信大家都能看懂。當然,我寫文章的時候又想到一種更好的寫法:

除了生成算式以外,還有一個值得注意的地方就是初賽所有的減號(也就是“-”)都是細的,但是我們直接用 captcha 庫生成圖像會得到粗的減號,所以我們修改了image.py中的代碼,在_draw_character函數(shù)中我們增加了一句判斷,如果是減號,我們就不進行 resize 操作,這樣就能防止減號變粗:

我們繼而使用生成器生成四則運算驗證碼:

上圖就是原版生成器生成的圖,我們可以看到減號是很粗的。
上圖是修改過的生成器,可以看到減號已經(jīng)不粗了。
模型結(jié)構(gòu)



模型結(jié)構(gòu)像之前寫的文章一樣,只是把卷積核的個數(shù)改多了一點,加了一些 BN 層,并且在四卡上做了一點小改動以支持多GPU訓練。如果你是單卡,可以直接去掉base_model2 = make_parallel(base_model, 4)的代碼。
BN 層主要是為了訓練加速,實驗結(jié)果非常好,模型收斂快了很多。
base_model 的可視化:
model 的可視化:

模型訓練
在經(jīng)過幾次測試以后,我已經(jīng)拋棄了 evaluate 函數(shù),因為在驗證集上已經(jīng)能做到 100% 識別率了,所以只需要看 val_loss 就可以了。在經(jīng)過之前的幾次嘗試以后,我發(fā)現(xiàn)在有生成器的情況下,訓練代數(shù)越多越好,因此直接用 adam 跑了50代,每代10萬樣本,可以看到模型在10代以后基本已經(jīng)收斂。

我們可以看到模型先分為四份,在四個顯卡上并行計算,然后合并結(jié)果,計算最后的 ctc loss,進而訓練模型。
結(jié)果可視化
這里我們對生成的數(shù)據(jù)進行了可視化,可以看到模型基本已經(jīng)做到萬無一失,百發(fā)百中。
打包成 docker 以后提交到比賽系統(tǒng)中,經(jīng)過十幾分鐘的運行,我們得到了完美的1分。

總結(jié)
初賽是非常簡單的,因此我們才能得到這么準的分數(shù),之后官方進一步提升了難度,將初賽測試集提高到了20萬張,在這個集上我們的模型只能拿到0.999925的成績,可行的改進方法是將準確率進一步降低,充分訓練模型,將多個模型結(jié)果融合等。
官方擴充測試集的難點
在擴充數(shù)據(jù)集上,我們發(fā)現(xiàn)有一些圖片預(yù)測出來無法計算,比如[629,2271,6579,17416,71857,77631,95303,102187,117422,142660,183693]等,這里我們?nèi)?117422.png 為例。

我們可以看到肉眼基本無法認出這個圖,但是經(jīng)過一定的圖像處理,我們可以顯現(xiàn)出來它的真實面貌:

然后我們可以看到這樣的結(jié)果:

當然,還有一張圖是無法通過預(yù)處理得到結(jié)果的,142660,這有可能是程序的 bug 造成的小概率事件,所以初賽除了我們跑了一個 docker 得到滿分以外,沒有第二個人達到滿分。
-
圖像
+關(guān)注
關(guān)注
2文章
1096瀏覽量
42354 -
代碼
+關(guān)注
關(guān)注
30文章
4971瀏覽量
74069 -
生成器
+關(guān)注
關(guān)注
7文章
322瀏覽量
22733
原文標題:百度魅族深度學習大賽初賽冠軍作品(圖像識別.源碼)
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
模數(shù)A/D轉(zhuǎn)換器的基本原理與轉(zhuǎn)換過程解析
A/D轉(zhuǎn)換器的轉(zhuǎn)換過程及電路分析
labview編程模擬十進制數(shù)到二進制數(shù)的轉(zhuǎn)換過程
當將IoT原理應(yīng)用到工廠流程時,在轉(zhuǎn)換過程中會丟失什么?
一文淺析ADC的轉(zhuǎn)換過程
圖像與文字的合成
電液伺服系統(tǒng)位置與壓力控制轉(zhuǎn)換過程的加減速算法與仿真
詳解晶體二極管開關(guān)轉(zhuǎn)換過程
如何使用FPGA實現(xiàn)Bayer到RGB圖像格式轉(zhuǎn)換的設(shè)計
Linux虛擬地址到物理地址轉(zhuǎn)換過程
一文講解ADC模數(shù)轉(zhuǎn)換芯片的原理及轉(zhuǎn)換過程
應(yīng)用衛(wèi)星通信領(lǐng)域的一個坐標轉(zhuǎn)換過程—機體坐標系與ENU坐標系的轉(zhuǎn)換
SDI轉(zhuǎn)AV轉(zhuǎn)換器技術(shù)解析:轉(zhuǎn)換過程中的關(guān)鍵要素與優(yōu)勢
一文看懂ADC轉(zhuǎn)換過程
實現(xiàn)圖像到文字的轉(zhuǎn)換過程
評論