過日子不記錄,就是對自己人生的極大不負責任!
逛喫逛喫小隊完成的題目是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數據集(英文手寫數據集)作爲訓練集
- 數據預處理(vertical_cut_v1.py)
- 二值化 對於Type1,圖片大致可以分爲兩類,一類是背景圖片是大片相同或者近似顏色的圖片,這種可以很方便的使用opencv的二值化函數,選取閾值在85左右進行二值化處理
- 去噪函數:去噪函數應該放在第二步,去幹擾線會導致數據的不連通,因此使用opencv的findcolour函數,通過判斷像素連通域點在20以下的填充爲白色
- 去幹擾線:這一步驟使用的是pycapt提供的去幹擾線函數,起作用的主要是去幹擾線函數,在提供的數據集中,圖片上的干擾線基本上是一個像素點連續的曲線或者直線,根據n鄰域算法可以判斷出是否是干擾線
- 連通域回覆,這一步使用的opencv提供的膨脹函數,可以有效回覆部分一些被過度處理的比較細的字體
- 數據切分,數據切分有兩個處理方案,一個是被稱爲豎直投影切分的辦法,1我們的算法就是採用的這種方法,通過判斷x軸上有色像素點的數目,設定閾值爲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
此外,之前也考慮過直接跳過數據預處理,直接對完整的圖片進行操作,但是失敗並放棄的原因主要是
- 圖片尺寸不固定
- 字符數目不固定
- 這樣訓練集不足
結果分析:
對於初賽結果,準確率僅有6.5%,關於準確率低下的原因:
主要有兩個:
其一:對於比較細的字符如7,9,l等在圖片預處理去噪的過程中,干擾線處理導致連通域不完整,其次使得本來不大的字符被過度處理,在進行後續的步驟的時候不能得到準確的切分,因爲少數幾個關鍵字符,導致切分錯誤
其二:對於背景色是馬賽克的圖片,由於難以選擇合適的固定閾值,於是最後選擇了skimage下的filter函數得到動態調整閾值,再加上50作爲二值化的閾值,但是結果導致仍有大量的噪聲點,在後續的膨脹過程中,就導致了圖片上有很多連通域,在切分的時候就有噪聲點被當作了圖片
其三:在模型輸入的時候還是存在一些不精細的地方,如mnist數據集是28*28的輸入,並且數據輸入的時候進行了歸一化,即輸入的圖片是值在0到1之間的浮點數,而我們在初期測試自己的照片的時候可能存在不是特別好的處理
外部鏈接:
https://www.jianshu.com/p/7a2b227896a8
提供了CTC不定長驗證碼處理的方案