导航:首页 > 源码编译 > 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验证码识别算法相关的资料

热点内容
程序员考试考什么科目 浏览:483
程序员必备文档编辑 浏览:958
踩水果解压大全 浏览:632
什么是dk服务器在 浏览:459
nusoapphp下载 浏览:927
黑莓原生解压rar 浏览:954
百度解压缩在哪 浏览:786
硬解压卡怎么用 浏览:181
新买的联想服务器怎么配置 浏览:755
mc命令方块的代码 浏览:650
服务器老打不开怎么办 浏览:254
单片机智能仪器 浏览:706
别告诉我你会记笔记pdf 浏览:160
一套谷歌51浏览器易源码 浏览:378
unix安装命令 浏览:57
cephmonitor源码 浏览:439
单片机的硬件结构重点 浏览:557
地铁逃生用什么服务器最好 浏览:930
租用云服务器怎么样 浏览:440
app上诉通讯录有什么后果 浏览:515