Python3.5 + sklearn利用SVM自動識別字母驗(yàn)證碼方法示例
前言
最近正在研究人工智能,為了加深對算法的理解,決定寫個自動設(shè)別驗(yàn)證碼的程序??戳丝淳W(wǎng)上的demo,大部分都是python2的寫法,而且驗(yàn)證碼的識別都是用的數(shù)字做例子,那我就寫個基于python3字母識別的程序,不過一路寫下來碰到不少坑,大家感興趣的話可以慢慢看。
圖片識別有幾個比較大的步驟是必須完成的:
1、有大量的驗(yàn)證碼圖片作為樣本
2、圖片要進(jìn)行處理 流程是:灰度化==》二值化==》字符切割==》識別分類
3、圖像識別要提取特征值,然后把圖片二值化的數(shù)據(jù)當(dāng)做樣本做訓(xùn)練,最后基于樣本完成對新驗(yàn)證碼的識別
一、大量驗(yàn)證碼準(zhǔn)備
因?yàn)橐獙懽帜缸R別,所以需要大量的字母驗(yàn)證碼,正好之前做過某電商的項(xiàng)目,印象中是純字母的查了下果然是的所以就用那個網(wǎng)站作為例子了。
獲取驗(yàn)證碼方法很簡單,找到驗(yàn)證碼動態(tài)生成的地址,
然后調(diào)用python的urllib.request獲得圖片然后保存就好了
二、圖片的灰度化和二值化
其實(shí)為了增強(qiáng)識別率,我們將彩色的圖片灰度化,
這樣就變成了黑白兩色,黑的是255白的是0,這樣更容易讓機(jī)器來識別。
灰度化和二值化之前、后的效果圖
三、圖片的分割
經(jīng)過觀察驗(yàn)證碼可以發(fā)現(xiàn),驗(yàn)證碼是4位的字母,
同時驗(yàn)證碼直接是有空白分隔的(后面的驗(yàn)證碼有黏連的單獨(dú)講)
這里使用垂直投影法,根據(jù)投影進(jìn)行圖片的切割。這個算法講起來太復(fù)雜,看代碼吧。。。
效果如下,反正就是切成了4個圖片
四、識別分類
這里因?yàn)閳D片太多了,要對每個圖片分26個字母的哪一個太麻煩,所以借用Google的tesseract這個OCR的軟件,用它來幫我識別下圖片是哪個字母(當(dāng)然它識別的成功率不高,不然也不用人工智能了),然后識別錯誤的我再手動分類。
經(jīng)過ocr識別和人工分類后,我的temp目錄下就變成了這樣的,每個目錄下都是正確的字母圖片
五、提取特征值
將字母的文件夾圖片取出,提取特征值然后存儲到文本文件里
六、機(jī)器訓(xùn)練
這里使用sklearn.svm這個支持向量機(jī)的算法,來對數(shù)據(jù)進(jìn)行分類。
SVM的算法是啥,可以看看知乎大神的講解https://www.zhihu.com/question/21094489 ,
通過fit進(jìn)行訓(xùn)練后,將訓(xùn)練的結(jié)果保存到pkl文件里,其實(shí)里面都是0和1的特征值
七、最后的驗(yàn)證就很簡單了
找個驗(yàn)證碼圖片,調(diào)用之前的方法,變成二值化的數(shù)據(jù),然后用SVM進(jìn)行識別,就能得到正確的結(jié)果了
八、滴水算法(解決黏連問題)
這個驗(yàn)證碼也不是完全都有空格分割好的,可能是長這樣的,字母直接黏在一起了
這樣的字母為了分割出來,就要用滴水算法,模擬水滴重力下落的過程,自動切分圖片。
可以看我的water.py文件里面是詳細(xì)的算法。
講講碰到的坑
1、python3不能用opencv了,尤其是cv2.cv方法只是python2用的,不用他換個python寫法一樣可以實(shí)現(xiàn)
2、原始圖片有藍(lán)色邊,剛開始老識別錯誤,后來發(fā)現(xiàn)問題后,要先進(jìn)行切割,保證只有字母是有顏色的,其它區(qū)域是白色的。
這個是cutImg方法的作用
3、使用Google的ocr時,使用了python的pytesseract,這個要先在電腦安裝Tesseract-OCR,然后要在程序里指定路徑才行,
不然會報錯誤的。pytesseract.pytesseract.tesseract_cmd = 'E:/Program Files (x86)/Tesseract-OCR/tesseract'
4、pytesseract.image_to_string(cur_img, config='-psm 7 outputbase letters')
這個letters是我自己創(chuàng)建的,位置在E:\Program Files (x86)\Tesseract-OCR\tessdata\configs 這里的letters是用來
約束識別范圍的,比如我設(shè)置tessedit_char_whitelist abcdefghijklmnopqrstuvwxyz
這就表示只識別字母,這樣
就會把1,0之類的變成l和o了
最后附上github的源碼地址 https://github.com/zjy090/verifyCode (本地下載)
下次研究遺傳算法GA的實(shí)現(xiàn)等寫好了也寫個demo分享給大家
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。
相關(guān)文章
Python利用txt文件對Mysql進(jìn)行增刪改查移
這篇文章主要介紹了如何在Python中利用TXT文件對Mysql中的記錄進(jìn)行增刪改查移,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)2021-12-12Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果示例
這篇文章主要介紹了Python實(shí)現(xiàn)PS圖像調(diào)整顏色梯度效果,結(jié)合實(shí)例形式分析了Python實(shí)現(xiàn)PS圖像調(diào)整中顏色梯度的原理與相關(guān)操作技巧,需要的朋友可以參考下2018-01-01Python如何自動獲取目標(biāo)網(wǎng)站最新通知
這篇文章主要介紹了Python如何自動獲取目標(biāo)網(wǎng)站最新通知,本文給大家分享實(shí)現(xiàn)思路及示例代碼,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06Python數(shù)據(jù)類型之Set集合實(shí)例詳解
這篇文章主要介紹了Python數(shù)據(jù)類型之Set集合,結(jié)合實(shí)例形式詳細(xì)分析了Python數(shù)據(jù)類型中集合的概念、原理、創(chuàng)建、遍歷、交集、并集等相關(guān)操作技巧,需要的朋友可以參考下2019-05-05