比賽記錄——記錄一次失敗的比賽,九坤量化驗證碼識別大賽

過日子不記錄,就是對自己人生的極大不負責任!

逛喫逛喫小隊完成的題目是type1,但是在初期拿到數據集時候,也嘗試構建了其他幾個任務的數據集。關於type1,因爲所處理的是手寫字符,所以採用的方案是使用mnist數據集來訓練模型,mnist數據集模型,根據wiki上的介紹:

該模型的準確率可以達到error在0.17%左右,在使用過程中,由於訓練平臺的原因,我們採用的是mnist測試數據集上準確率可以到98.5%以上的模型

wiki上的介紹在這裏

算法處理的步驟;

數據生成:(最後雖然沒有用上,但是我們好好做了所有數據生成的代碼) 文件夾:data_generation/data_generation.py 裏面有8個type的data,其中英文單詞和中文成語選取的是牛津詞典和新華詞典裏的數據庫,任務7中,生成倒置漢字時候,改寫了captcha庫中關於字體旋轉的部分,令其大於180度,其餘的都使用captcha庫可以得到近似的效果

 

後來發現type1和·type2中的都是手寫字符,於是使用了mnist和Enghand數據集(英文手寫數據集)作爲訓練集

  1. 數據預處理(vertical_cut_v1.py)
    1. 二值化 對於Type1,圖片大致可以分爲兩類,一類是背景圖片是大片相同或者近似顏色的圖片,這種可以很方便的使用opencv的二值化函數,選取閾值在85左右進行二值化處理
    2. 去噪函數:去噪函數應該放在第二步,去幹擾線會導致數據的不連通,因此使用opencv的findcolour函數,通過判斷像素連通域點在20以下的填充爲白色
    3. 去幹擾線:這一步驟使用的是pycapt提供的去幹擾線函數,起作用的主要是去幹擾線函數,在提供的數據集中,圖片上的干擾線基本上是一個像素點連續的曲線或者直線,根據n鄰域算法可以判斷出是否是干擾線
    4. 連通域回覆,這一步使用的opencv提供的膨脹函數,可以有效回覆部分一些被過度處理的比較細的字體
    5. 數據切分,數據切分有兩個處理方案,一個是被稱爲豎直投影切分的辦法,1我們的算法就是採用的這種方法,通過判斷x軸上有色像素點的數目,設定閾值爲6,閾值大於6的時候,就判斷處於字符處,閾值小於6的時候判斷是空白背景
    6. 補充,關於背景色是馬賽克的圖片,不同之處在於要選擇合適的閾值二值化,以及使用opencv的findcolour函數選擇更合適的去噪閾值(試出來的)

2、模型選擇:多層卷積神經網絡,在mnist數據集上,根據wiki的介紹,目前最好的效果是 Hu, Jie; Shen, Li; Albanie, Samuel; Sun, Gang; Wu, Enhua (2017). "Squeeze-and-Excitation Networks"中的Committee of 20 CNNS with Squeeze-and-Excitation Networks

此外,之前也考慮過直接跳過數據預處理,直接對完整的圖片進行操作,但是失敗並放棄的原因主要是

  1. 圖片尺寸不固定
  2. 字符數目不固定
  3. 這樣訓練集不足

結果分析:

對於初賽結果,準確率僅有6.5%,關於準確率低下的原因:

主要有兩個:

其一:對於比較細的字符如7,9,l等在圖片預處理去噪的過程中,干擾線處理導致連通域不完整,其次使得本來不大的字符被過度處理,在進行後續的步驟的時候不能得到準確的切分,因爲少數幾個關鍵字符,導致切分錯誤

其二:對於背景色是馬賽克的圖片,由於難以選擇合適的固定閾值,於是最後選擇了skimage下的filter函數得到動態調整閾值,再加上50作爲二值化的閾值,但是結果導致仍有大量的噪聲點,在後續的膨脹過程中,就導致了圖片上有很多連通域,在切分的時候就有噪聲點被當作了圖片

其三:在模型輸入的時候還是存在一些不精細的地方,如mnist數據集是28*28的輸入,並且數據輸入的時候進行了歸一化,即輸入的圖片是值在0到1之間的浮點數,而我們在初期測試自己的照片的時候可能存在不是特別好的處理

 

外部鏈接:

https://www.jianshu.com/p/7a2b227896a8

提供了CTC不定長驗證碼處理的方案

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章