導航:首頁 > 源碼編譯 > svm驗證碼識別演算法

svm驗證碼識別演算法

發布時間:2022-03-02 05:14:44

A. 驗證碼識別技術

public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException
{
// 驗證碼圖片的寬度。
int width = 70;
//驗證碼圖片的高度。
int height=36;
BufferedImage buffImg=new BufferedImage(width,height,
BufferedImage.TYPE_INT_RGB);
Graphics2D g=buffImg.createGraphics();

//創建一個隨機數生成器類。
Random random=new Random();

// 設定圖像背景色(因為是做背景,所以偏淡)
g.setColor(getRandColor(180, 250));
g.fillRect(0,0,width,height);
//創建字體,字體的大小應該根據圖片的高度來定。
Font font=new Font("Times New Roman",Font.PLAIN,28);
//設置字體。
g.setFont(font);

//畫邊框。
g.setColor(Color.BLACK);
g.drawRect(0,0,width-1,height-1);
// 隨機產生160條干擾線,使圖象中的認證碼不易被其它程序探測到。
g.setColor(Color.GRAY);
for (int i=0;i<50;i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
g.drawLine(x,y,x+xl,y+yl);
}

//randomCode用於保存隨機產生的驗證碼,以便用戶登錄後進行驗證。
StringBuffer randomCode=new StringBuffer();

// 設置默認生成4個驗證碼
int length = 4;

// 設置備選驗證碼:包括"a-z"和數字"0-9"
String base = "";
int size = base.length();

//隨機產生4位數字的驗證碼。
for (int i=0;i<length;i++) {
//得到隨機產生的驗證碼數字。
int start = random.nextInt(size);
String strRand = base.substring(start, start + 1);

//用隨機產生的顏色將驗證碼繪制到圖像中。
// g.setColor(new Color(red,green,blue));
// 生成隨機顏色(因為是做前景,所以偏深)
g.setColor(getRandColor(1, 100));
g.drawString(strRand,13*i+6,28);

//將產生的四個隨機數組合在一起。
randomCode.append(strRand);
}
//將四位數字的驗證碼保存到Session中。
HttpSession session=req.getSession();
session.setAttribute("rand",randomCode.toString());

//禁止圖像緩存。
res.setHeader("Pragma","no-cache");
res.setHeader("Cache-Control","no-cache");
res.setDateHeader("Expires", 0);

res.setContentType("image/jpeg");

//將圖像輸出到Servlet輸出流中。
ServletOutputStream sos=res.getOutputStream();
ImageIO.write(buffImg, "jpeg",sos);
sos.close();

}
Color getRandColor(int fc,int bc){//給定范圍獲得隨機顏色
Random random = new Random();
if(fc>255) fc=255;
if(bc>255) bc=255;
int r=fc+random.nextInt(bc-fc);
int g=fc+random.nextInt(bc-fc);
int b=fc+random.nextInt(bc-fc);
return new Color(r,g,b);
}
}
這個是之前弄過的一個,可能比你的需求是簡單了些,你就作為簡單的參考吧

B. 機器自動識別驗證碼的原理是怎麼樣的

現在一般的驗證碼識別演算法無非就是:1.先把背景顏色和可能是干擾的點和線(噪點)去掉; 2.把旋轉和扭曲的文字進行歸位; 3.把文字塊分離出來,然後對照訓練樣本進行識別。這些演算法基於以下幾點:1.大多數驗證碼的背景單一,背景與文字顏色的區別很大,噪點明顯,很容易被剔除;2.GIF動態驗證碼只是坑人的。因為對於程序來說只要轉換成其他格式就變成靜態圖片了,並不影響識別,反而造成人類識別相對困難;3.干擾點和線與驗證碼文字差別一般比較明顯,太多的干擾點和線也能輕松去除,反而不利於人類識別;4.文字一般是相同顏色的,如果每個文字顏色不一樣反而更容易被程序分離出來;5.旋轉和扭曲的文字確實在一定程度上提高了程序的識別難度,但是訓練樣本多了也是可以在某種程度上提高識別的准確率的。另外,扭曲和粘連的文字(Google那種圖片驗證碼就是這樣,不是reCAPTCHA哦)連人類都不容易識別(參考:如何識別高級的驗證碼),程序就更難了。

C. 類似這種驗證碼用深度學習的方法識別難度大不大

採用深度學習演算法,通過對目前市場上普遍使用的驗證碼圖像進行建模分析,再搜集海量樣本訓練數據,可以做到識別各種類型驗證碼。這種方式對研發者技術背景要求比較高,涉及計算機視覺和深度學習等方面的技術,要保證識別的准確率和穩定性,還要通過多層復雜神經網路訓練等等。這方面可以參考識碼看看。

D. 如何快速學習神經網路演算法識別驗證碼

驗證碼都是伺服器生成的圖片,如果是動態的,就是調用servlet生成的,怎麼提取我還不太清楚,不過我想網路上應該會有很多資料。

我現在看的是識別驗證碼的東西,在截取到驗證碼圖片之後,針對這個黑白背景,只有干擾線的驗證碼。

機器學習之識別簡單驗證碼
時間 2016-10-15 22:46:31 隨風'S Blog

主題 數據挖掘
關於驗證碼識別的文章網上很多圖像識別的大神教程也比較多,不過大多數專業性太強了,對非專業人士讀起來簡直是天書,不過隨著機器學習的普及,一大批機器學習的開源工具出現了,這也算對大多數像我一樣的學渣的福音,由於最近項目中牽扯到了一些機器學習相關的東西,所以自己最近也一直在學習機器相關的東西,這篇驗證碼的識別也算是練手了,本文也算是學習中的筆記,所以文章中難免有一些錯誤,歡迎各路大神指點。
由於本人不是相關專業的,對於文中相關演算法就不會具體去討論了,主要以實戰為目的。
准備工作
主要是用到了一些機器學習開源的框架以及一些輔助工具。
Scikit-Learn 比較有名的Python機器學習模塊,主要是操作簡單。
Pybrain Python機器學習模塊,主要以神經網路為核心,所有的訓練方法都以神經網路為一個實例。
pytesseract 圖像識別小工具,本文主要是用來預處理訓練樣本的。
PIL Python圖像處理庫。
問題分析
首先在進行具體工作之前,我們得看看我們需要解決的是什麼問題,那麼對於驗證碼識別來說,可以看作一個分類問題,對於數字的圖片驗證碼來說的話,其實就是0-9數字分類的問題,驗證碼識別最難的部分在於怎麼去將驗證碼進行切割成單個字元圖片,當然對於圖片裁剪也就是特徵提取有很多辦法,例如垂直投影法,等距切割法等等,其中等距切割也是比較簡單的,但是對於稍微復雜一點的驗證碼識別時准確率非常低,因為等距切割時將驗證碼按照相同的寬度進行裁剪,對於那些字元寬度大小不一的,就算裁剪出來也不能很好的表示字元的特徵,所以有時候需要先對圖片進行一系列的預處理,例如字元矯正等等,然後再用垂直投影法在x軸和y軸上按照投影的大小進行裁剪。
對於垂直投影法來說的話,最後我們還得考慮訓練集在維度上都同意,由於是非等級切割,所以每個圖片的像素肯定不一樣,所以為了維度統一還得進行填充,總之稍微麻煩一點。
這里主要是以等距切割為例子,因為在操作起來比較簡單,那麼掩碼也是選用0-9的純數字驗證碼來進行識別,驗證碼如下

這樣的圖片看起來的話間距基本上都差不多大,所以在分割時也比較容易,將圖片切成四塊後,就可以拿每一塊去進行訓練識別了。
使用機器學習來進行訓練和識別的話,我們就得考慮特徵選取了,一般驗證碼識別有一套標準的流程,圖片

對於驗證碼識別來說我們關注的不是驗證碼的顏色,而是字元代表的含義,所以在圖片處理時進行灰度化和二值化以及去噪,比如說去掉干擾線,那麼去噪也有相應的演算法來實現,這里不做具體討論,二值化其實就是將圖片呈現出兩種顏色,即非黑即白,這樣的好處是在特徵處理時可以使用0和1來代表黑色和白色,0和1代表什麼顏色取決於個人喜好。
這樣的話將二值化和其它步驟處理後的圖片進行特徵提取,將黑色像素點標記成1,白色像素點標記成0,這樣就可以得到圖片的數值表示,那麼特徵維度就等於圖片像素的大小,最終將圖片按照X軸或者Y軸表示,即將像素的所標記的值合並到一行,例如
1111100000000000010
1110000000000000000
表示成,這樣每張圖片就可以使用一行0和1的數值來表示。
進行特徵提取之後,我們得到了圖片在數學上的表示,那麼下一步就需要進行模型訓練了,由於如上文所述,圖片識別是一個分類問題,所以在機器學習中,我主要採用了兩種模型來進行訓練, SVM支持向量機 和 BP神經網路 來進行模型訓練,SVM使用scikit-learn機器學習包裡面的實現來做,神經網路使用Pybrain來進行實現。
有關SVM和BP神經網路的演算法部分,大家最好還是去網上搜下相關的Paper,這樣你才能知道什麼演算法能解決什麼問題,以及它大概的原理是什麼樣子的,有能力的同學可以去對推導下這兩個演算法。
實踐
在問題分析部分我們已經對驗證碼識別的大概思路有了一個了解,那麼這部分則主要正對上面所述部分進行具體實現。
首先,我們應該明白SVM和神經網路模型演算法是屬於有監督學習,即需要對樣本進行標注,也就是標記每張圖片表示的是那個數字,但是實際遇到的問題是,如果數據量小的話,我們可以進行人工標注,那麼在數據量比較大的情況下,人工標注可能就不太現實了,所以對於圖片來說的話也一樣,你進行切割完成之後你必須得標注這個數字是幾,所以我們需要對切割的圖片進行預處理,也就是打標記,我比較懶,所以我也不會一個個去打標簽,所以這里使用ocr來對切割的圖片進行預分類,ocr在單文字識別上的效果正確率還是可以的,在ocr進行預分類之後,我們只需要去糾正那些分類錯誤的圖片即可,這樣就能大大的減少工作量。
這里實現主要有以下幾個步驟:
圖片採集
圖片預處理(包括圖片切割,二值化以及圖像增強)
圖片的預分類標注以及手動糾錯標注
特徵提取
模型訓練以及預測
圖片採集
圖片採集就比較簡單,不過多的闡述,如下圖代碼所示

將下載到了圖片按照時間戳存到指定位置

圖片預處理以及圖片裁剪
對圖片進行預處理後採用等距切割法對圖片進行切割

裁剪後的圖片如下

圖片預分類
圖片預分類採用pytesseract來對分割的圖片進行預分類,減輕工作量。
具體代碼如下

ocr的分類效果正確率應該在50%以上,剩下的就是對預分類的圖片進行人工糾錯了。
ocr的分類效果圖

人工糾錯和標記後的結果

每個目錄表示一個類別標簽。
特徵提取
特徵提取的具體內容請參考問題分析中,裡面有詳細的說明。
關鍵代碼如下

最終圖片的數學上表示會以記錄在 /Users/iswin/Downloads/yzm/traindata/train_data.txt 中,數據的格式如下圖所示

紅色線框表示一張圖片數值上的表示,最後一個數字0表示該圖片的類型,我是為了方便把標簽追加到最後一行。
SVM模型分類
這里svm的實現使用了scikit-learn來實現,關於scikit-learn的使用去官網看Tutorial就好了,這里需要說一下SVM關於參數選擇的問題,我們都知道SVM支持多個核函數,例如高斯核、線性核、poly以及sgmoid核函數,但是選擇那麼核函數一開始對於不太熟悉的同學怎麼選擇的確是個問題,所以這里使用了scikit-learn的GridSearchCV來對參數進行最優化選擇,經過參數尋優,這里高斯核的最終效果還是不錯的,所以訓練的時候直接使用高斯核來進行訓練。
為了方便預測時的使用,這里對訓練結果使用了joblib模塊來進行持久化。為了簡單對評價模型進行,這里使用了5折交叉驗證來對結果進行檢驗。
最終結果的准確率在:Accuracy: 0.96 (+/- 0.09)
具體代碼如下:

舉個預測的例子,看看效果

BP神經網路模型分類
BP神經網路也稱負反饋神經網路,即按誤差逆傳播演算法訓練的多層前饋網路,是目前應用最廣泛的神經網路模型之一,在BP神經網路之後,又出現了在深度學習中應用最廣泛的CNN即卷積神經網路,這幾天也正在學習。
本文使用了三層BP神經網路來對訓練集進行訓練,即輸入層+2層隱含層+輸出層,關於BP神經網路本身這里需要注意的是激活函數的選擇以及對於多分類問題輸出層函數選擇的問題,激活函數主要有sigmod、tanh以及relu,關於怎麼選取激活函數,這塊沒有進行深入了解,一般都是每個激活函數都跑一次,看最終效果。
這里的神經網路模型分類主要是對Pybrain用法的學習以及BP神經網路的基本認識,輸入層使用了LinearLayer即線性輸入層,隱含層使用了SigmoidLayer即激活函數為sigmod的隱含層,輸出層由於是多分類問題,所以使用了SoftmaxLayer,最終在神經網路計算的結果中選取數值最大的那個索引位置就是預測的驗證碼類別,也就是0-9之間的數值。
關於Pybrain的資料除了官方文檔不是特別多,關於構建神經網路的方式提供了兩種方式,一種是 buildNetwork 函數來進行構建,另外一種就是使用 FeedForwardNetwork 函數來進行構建,這里需要注意的是如果使用 FeedForwardNetwork 來進行構建的話,注意要手動給各層加上Bias偏置項,否則結果可能可能非常差,當時我實驗時沒加,半天計算結果不對,最後看了下buildNetwork函數的源代碼才發現沒加Bias項,還有就是需要注意迭代至收斂的步數即函數中的 *maxEpochs=500 ,這個根據情況調整,Pybrain有自己的數據集格式,所以在使用時必須按照它的格式來進行數據的初始化。
這里除了輸入層的維度(即驗證碼的訓練集維度)和輸出是固定的之外,其中隱含層的神經元個數也是可以調整的,具體的感興趣的同學自己去調然後再看下結果。
對模型使用10折交叉驗證進行了簡單評估,錯誤率在Total error: 0.062左右,效果比SVM的差一點,應該通參數調優應該可以提高准確率,不過重在學習。
訓練集樣本: /Users/iswin/Downloads/yzm/traindata/train_data_uniq.txt
主要代碼如下:

舉個例子,來看看預測效果

總結
通過這個小實驗,至少讓我對機器學習和相關演算法大致有了一個了解,同時作為安全人員來說至少知道了如何使用開源的機器學習框架來構架自己的模型,筆記中難免會有錯誤之處,歡迎大家提出意見。

E. Tesseract-OCR訓練識別驗證碼有什麼高效的辦法嗎

很多網頁上得驗證碼圖片,可以通過OCR識別技術將其中的數字字元讀取出來。

F. 根據機器生成特徵碼,然後按照自己的演算法,結合特徵碼生成出驗證碼,特徵碼和驗證碼應該是一一對應。

原型:
int WINAPI icePub_machineGetInfo(int typeFlag,char *strInfo)
輸入:flag 模式標志,1-5
輸出:strMachineCode 機器碼串

CString str1;
char buff[1024];

typedef int (WINAPI ICEPUB_MACHINEGETINFO)(int typeFlag,char *strInfo);
ICEPUB_MACHINEGETINFO *icePub_machineGetInfo = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_machineGetInfo = (ICEPUB_MACHINEGETINFO *)GetProcAddress(hDLLDrv, "icePub_machineGetInfo");
}

icePub_machineGetInfo(1,buff);
str1=buff;//mac
icePub_machineGetInfo(2,buff);
str1=str1+buff;//cpu
icePub_machineGetInfo(3,buff);
str1=str1+buff;//hard
icePub_machineGetInfo(4,buff);
str1=str1+buff;//memery
icePub_machineGetInfo(5,buff);
str1=str1+buff;//biosdate
AfxMessageBox(str1);

原型:
int WINAPI icePub_getMD5FromString(char *strData,char *strResult)
輸入:strData 待處理的文本串
輸出:strResult MD5結果串,32位元組
返回碼:

char buff[1024];
char buff2[1024];

strcpy(buff2,"Walk At Familiar Alley, Pursue Concordand's Footfall, Between Front And Back, What Course To Follow?");

typedef int (WINAPI ICEPUB_GETMD5FROMSTRING)(char *strData,char *strResult);
ICEPUB_GETMD5FROMSTRING *icePub_getMD5FromString = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_getMD5FromString=(ICEPUB_GETMD5FROMSTRING *)GetProcAddress(hDLLDrv,"icePub_getMD5FromString");
}
if(icePub_getMD5FromString)
icePub_getMD5FromString(buff2,buff);
if(hDLLDrv)
FreeLibrary(hDLLDrv);

AfxMessageBox(buff);

原型:
int WINAPI icePub_encryptText2(char *strInput, char *strOutputHexstring, char *strKey)
輸入:strInput 待加密文本數據串
strKey 單des密鑰,8位元組長度
輸出:strOutputHexstring 加密後16進制串
返回碼:

char buff[1024],buff2[1024],key[1024];
int len=0;

strcpy(buff,"Take apart Letter Long, Listen Hidden Never-ending bitterness, Between Sky And Terra, Beartthrob Popple.");
strcpy(key,"11223344");

typedef int (WINAPI ICEPUB_ENCRYPTTEXT2)(char *strInput, char *strOutputHexstring, char *strKey);
ICEPUB_ENCRYPTTEXT2 *icePub_decryptText2 = 0;
HINSTANCE hDLLDrv = LoadLibrary("icePubDll.dll");
if(hDLLDrv)
{
icePub_decryptText2=(ICEPUB_ENCRYPTTEXT2 *)GetProcAddress(hDLLDrv,"icePub_encryptText2");
}
if(icePub_decryptText2)
len=icePub_decryptText2(buff,buff2,key);
if(hDLLDrv)
FreeLibrary(hDLLDrv);
AfxMessageBox(buff2);

幾個函數可參考

G. 識別驗證碼的演算法

一、驗證碼的基本知識
1. 驗證碼的主要目的是強制人機交互來抵禦機器自動化攻擊的。
2. 大部分的驗證碼設計者並不得要領,不了解圖像處理,機器視覺,模式識別,人工智慧
的基本概念。
3. 利用驗證碼,可以發財,當然要犯罪:比如招商銀行密碼只有6位,驗證碼形同虛設,計
算機很快就能破解一個有錢的賬戶,很多帳戶是可以網上交易的。
4. 也有設計的比較好的,比如Yahoo,Google,Microsoft等。而國內Tencent的中文驗證
碼雖然難,但算不上好。
二、人工智慧,模式識別,機器視覺,圖像處理的基本知識
1)主要流程:
比如我們要從一副圖片中,識別出驗證碼;比如我們要從一副圖片中,檢測並識別出一張
人臉。 大概有哪些步驟呢?
1.圖像採集:驗證碼呢,就直接通過HTTP抓HTML,然後分析出圖片的url,然後下載保存就
可以了。 如果是人臉檢測識別,一般要通過視屏採集設備,採集回來,通過A/D轉操作,存為
數字圖片或者視頻頻。
2.預處理:檢測是正確的圖像格式,轉換到合適的格式,壓縮,剪切出ROI,去除噪音,灰度
化,轉換色彩空間這些。
3.檢測:車牌檢測識別系統要先找到車牌的大概位置,人臉檢測系統要找出圖片中所有
的人臉(包括疑似人臉);驗證碼識別呢,主要是找出文字所在的主要區域。
4.前處理:人臉檢測和識別,會對人臉在識別前作一些校正,比如面內面外的旋轉,扭曲
等。我這里的驗證碼識別,「一般」要做文字的切割
5.訓練:通過各種模式識別,機器學習演算法,來挑選和訓練合適數量的訓練集。不是訓練
的樣本越多越好。過學習,泛化能力差的問題可能在這里出現。這一步不是必須的,有些識
別演算法是不需要訓練的。
6.識別:輸入待識別的處理後的圖片,轉換成分類器需要的輸入格式,然後通過輸出的類
和置信度,來判斷大概可能是哪個字母。識別本質上就是分類。
2)關鍵概念:
圖像處理:一般指針對數字圖像的某種數學處理。比如投影,鈍化,銳化,細化,邊緣檢測,
二值化,壓縮,各種數據變換等等。
1.二值化:一般圖片都是彩色的,按照逼真程度,可能很多級別。為了降低計算復雜度,
方便後續的處理,如果在不損失關鍵信息的情況下,能將圖片處理成黑白兩種顏色,那就最好
不過了。
2.細化:找出圖像的骨架,圖像線條可能是很寬的,通過細化將寬度將為1,某些地方可能
大於1。不同的細化演算法,可能有不同的差異,比如是否更靠近線條中間,比如是否保持聯通
行等。
3.邊緣檢測:主要是理解邊緣的概念。邊緣實際上是圖像中圖像像素屬性變化劇烈的地
方。可能通過一個固定的門限值來判斷,也可能是自適應的。門限可能是圖像全局的,也可
能是局部的。不能說那個就一定好,不過大部分時候,自適應的局部的門限可能要好點。被
分析的,可能是顏色,也可能是灰度圖像的灰度。
機器視覺:利用計算機來模式實現人的視覺。 比如物體檢測,定位,識別。按照對圖像
理解的層次的差別,分高階和低階的理解。
模式識別:對事物或者現象的某種表示方式(數值,文字,我們這里主要想說的是數值),
通過一些處理和分析,來描述,歸類,理解,解釋這些事物,現象及其某種抽象。
人工智慧:這種概念比較寬,上面這些都屬於人工智慧這個大的方向。簡單點不要過分
學院派的理解就是,把人類的很「智能」的東西給模擬出來協助生物的人來處理問題,特別是
在計算機裡面。

H. 人工智慧要做實驗了,題目是數字識別,用matlab實現svm演算法,就是支持向量機

使用Matlab中的LIBSVM工具箱。

I. 求驗證碼識別技術方面的高手,圖像分割,細化,去噪點,形態學分析,神經網路分類,SVM演算法,KNN演算法

樓上的所有列的標題,所以它有什麼關系?
如果你要查找的信息,這是最好的CNKI上面看的文章很多中國車牌識別。
但是,這需要學校購買到外部網路的許可權是非常困難的。

J. 我想學習驗證碼自動識別技術!

我有一點這方面的資料,告訴我郵箱,給你發過去!

閱讀全文

與svm驗證碼識別演算法相關的資料

熱點內容
命令方塊指令冰封劍 瀏覽:782
android中so文件 瀏覽:274
手工用氣球做的捏捏樂解壓神器 瀏覽:194
app升級後就閃退怎麼辦 瀏覽:33
手錶上的樂塗app怎麼下載 瀏覽:719
程序員身上的六宗罪是什麼 瀏覽:143
游戲編程精粹6 瀏覽:67
修復ie的命令 瀏覽:600
linux伺服器怎麼查看地址 瀏覽:63
底部異地持倉源碼 瀏覽:104
加密應用手機 瀏覽:798
程序員考試考什麼科目 瀏覽:485
程序員必備文檔編輯 瀏覽:960
踩水果解壓大全 瀏覽:634
什麼是dk伺服器在 瀏覽:461
nusoapphp下載 瀏覽:929
黑莓原生解壓rar 瀏覽:956
百度解壓縮在哪 瀏覽:788
硬解壓卡怎麼用 瀏覽:183
新買的聯想伺服器怎麼配置 瀏覽:757