賽題以識別類似手寫體的四則運算式為主題,參賽者需要在充滿干擾信息的10萬張圖片中,設計算法識別圖片上數(shù)學運算式并計算結(jié)果。決賽在初賽的基礎上,引入分數(shù)和更加復雜的運算,同樣以最終的識別率來評判算法。
本節(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行文本,每行文本包含每張圖片對應的公式以及公式的計算結(jié)果,公式和計算結(jié)果之間空格分開,例如圖片中的示例圖片對應的文本如下所示:
(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é)構
模型結(jié)構像之前寫的文章一樣,只是把卷積核的個數(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)有一些圖片預測出來無法計算,比如[629,2271,6579,17416,71857,77631,95303,102187,117422,142660,183693]等,這里我們?nèi)?117422.png 為例。
我們可以看到肉眼基本無法認出這個圖,但是經(jīng)過一定的圖像處理,我們可以顯現(xiàn)出來它的真實面貌:
然后我們可以看到這樣的結(jié)果:
當然,還有一張圖是無法通過預處理得到結(jié)果的,142660,這有可能是程序的 bug 造成的小概率事件,所以初賽除了我們跑了一個 docker 得到滿分以外,沒有第二個人達到滿分。
-
圖像
+關注
關注
2文章
1094瀏覽量
42003 -
代碼
+關注
關注
30文章
4922瀏覽量
72221 -
生成器
+關注
關注
7文章
322瀏覽量
22391
原文標題:百度魅族深度學習大賽初賽冠軍作品(圖像識別.源碼)
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
模數(shù)A/D轉(zhuǎn)換器的基本原理與轉(zhuǎn)換過程解析

A/D轉(zhuǎn)換器的轉(zhuǎn)換過程及電路分析

一文淺析ADC的轉(zhuǎn)換過程
圖像與文字的合成
電液伺服系統(tǒng)位置與壓力控制轉(zhuǎn)換過程的加減速算法與仿真
詳解晶體二極管開關轉(zhuǎn)換過程

如何使用FPGA實現(xiàn)Bayer到RGB圖像格式轉(zhuǎn)換的設計

Linux虛擬地址到物理地址轉(zhuǎn)換過程

一文講解ADC模數(shù)轉(zhuǎn)換芯片的原理及轉(zhuǎn)換過程
應用衛(wèi)星通信領域的一個坐標轉(zhuǎn)換過程—機體坐標系與ENU坐標系的轉(zhuǎn)換

SDI轉(zhuǎn)AV轉(zhuǎn)換器技術解析:轉(zhuǎn)換過程中的關鍵要素與優(yōu)勢
一文看懂ADC轉(zhuǎn)換過程

評論