Python3.5 + sklearn利用SVM自动识别字母验证码方法示例

前言

最近正在研究人工智能,为了加深对算法的理解,决定写个自动设别验证码的程序。看了看网上的demo,大部分都是python2的写法,而且验证码的识别都是用的数字做例子,那我就写个基于python3字母识别的程序,不过一路写下来碰到不少坑,大家感兴趣的话可以慢慢看。

图片识别有几个比较大的步骤是必须完成的:

1、有大量的验证码图片作为样本

2、图片要进行处理  流程是:灰度化==》二值化==》字符切割==》识别分类

3、图像识别要提取特征值,然后把图片二值化的数据当做样本做训练,最后基于样本完成对新验证码的识别

一、大量验证码准备

因为要写字母识别,所以需要大量的字母验证码,正好之前做过某电商的项目,印象中是纯字母的查了下果然是的所以就用那个网站作为例子了。

获取验证码方法很简单,找到验证码动态生成的地址,

然后调用python的urllib.request获得图片然后保存就好了

二、图片的灰度化和二值化

其实为了增强识别率,我们将彩色的图片灰度化,

这样就变成了黑白两色,黑的是255白的是0,这样更容易让机器来识别。

灰度化和二值化之前、后的效果图

三、图片的分割

经过观察验证码可以发现,验证码是4位的字母,

同时验证码直接是有空白分隔的(后面的验证码有黏连的单独讲)

这里使用垂直投影法,根据投影进行图片的切割。这个算法讲起来太复杂,看代码吧。。。

效果如下,反正就是切成了4个图片

   

四、识别分类

这里因为图片太多了,要对每个图片分26个字母的哪一个太麻烦,所以借用Google的tesseract这个OCR的软件,用它来帮我识别下图片是哪个字母(当然它识别的成功率不高,不然也不用人工智能了),然后识别错误的我再手动分类。

经过ocr识别和人工分类后,我的temp目录下就变成了这样的,每个目录下都是正确的字母图片

五、提取特征值

将字母的文件夹图片取出,提取特征值然后存储到文本文件里

六、机器训练

这里使用sklearn.svm这个支持向量机的算法,来对数据进行分类。

SVM的算法是啥,可以看看知乎大神的讲解https://www.zhihu.com/question/21094489 ,

通过fit进行训练后,将训练的结果保存到pkl文件里,其实里面都是0和1的特征值

七、最后的验证就很简单了

找个验证码图片,调用之前的方法,变成二值化的数据,然后用SVM进行识别,就能得到正确的结果了

八、滴水算法(解决黏连问题)

这个验证码也不是完全都有空格分割好的,可能是长这样的,字母直接黏在一起了

这样的字母为了分割出来,就要用滴水算法,模拟水滴重力下落的过程,自动切分图片。

可以看我的water.py文件里面是详细的算法。

讲讲碰到的坑

1、python3不能用opencv了,尤其是cv2.cv方法只是python2用的,不用他换个python写法一样可以实现

2、原始图片有蓝色边,刚开始老识别错误,后来发现问题后,要先进行切割,保证只有字母是有颜色的,其它区域是白色的。

这个是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是我自己创建的,位置在E:\Program Files (x86)\Tesseract-OCR\tessdata\configs 这里的letters是用来

约束识别范围的,比如我设置tessedit_char_whitelist abcdefghijklmnopqrstuvwxyz 这就表示只识别字母,这样

就会把1,0之类的变成l和o了

最后附上github的源码地址 https://github.com/zjy090/verifyCode  (本地下载)

下次研究遗传算法GA的实现等写好了也写个demo分享给大家

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。

(0)

相关推荐

  • SVM基本概念及Python实现代码

    SVM(support vector machine)支持向量机: 注意:本文不准备提到数学证明的过程,一是因为有一篇非常好的文章解释的非常好:支持向量机通俗导论(理解SVM的三层境界),另一方面是因为我只是个程序员,不是搞数学的(主要是因为数学不好.),主要目的是将SVM以最通俗易懂,简单粗暴的方式解释清楚. 线性分类: 先从线性可分的数据讲起,如果需要分类的数据都是线性可分的,那么只需要一根直线f(x)=wx+b就可以分开了,类似这样: 这种方法被称为:线性分类器,一个线性分类器的学习目标便

  • Python中支持向量机SVM的使用方法详解

    除了在Matlab中使用PRTools工具箱中的svm算法,Python中一样可以使用支持向量机做分类.因为Python中的sklearn库也集成了SVM算法,本文的运行环境是Pycharm. 一.导入sklearn算法包 Scikit-Learn库已经实现了所有基本机器学习的算法,具体使用详见官方文档说明 skleran中集成了许多算法,其导入包的方式如下所示, 逻辑回归:from sklearn.linear_model import LogisticRegression 朴素贝叶斯:fro

  • Python中使用支持向量机SVM实践

    在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异常值检测)以及回归分析. 其具有以下特征: (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值.而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解. (2) SVM通过最大化决策边界的边缘来实现控制模型的能力.尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等. (3)SVM一般

  • Python SVM(支持向量机)实现方法完整示例

    本文实例讲述了Python SVM(支持向量机)实现方法.分享给大家供大家参考,具体如下: 运行环境 Pyhton3 numpy(科学计算包) matplotlib(画图所需,不画图可不必) 计算过程 st=>start: 开始 e=>end: 结束 op1=>operation: 读入数据 op2=>operation: 格式化数据 cond=>condition: 是否达到迭代次数 op3=>operation: 寻找超平面分割最小间隔 ccond=>cond

  • Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录

    本文介绍了Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录,分享给大家,具体如下: Python 2.7 IDE Pycharm 5.0.3 Firefox浏览器:47.0.1 Selenium PIL Pytesser Tesseract 扯淡 ​ 我相信每个脚本都有自己的故事,我这个脚本来源于自己GRD教务系统,每次进行登录时,即使我输入全部正确,第一次登录一定是登不上去的!我不知道设计人员什么想法?难道是为了反爬机制?你以为一次登不上,我tm就不爬了?我

  • Python机器学习之SVM支持向量机

    SVM支持向量机是建立于统计学习理论上的一种分类算法,适合与处理具备高维特征的数据集. SVM算法的数学原理相对比较复杂,好在由于SVM算法的研究与应用如此火爆,CSDN博客里也有大量的好文章对此进行分析,下面给出几个本人认为讲解的相当不错的: 支持向量机通俗导论(理解SVM的3层境界) JULY大牛讲的是如此详细,由浅入深层层推进,以至于关于SVM的原理,我一个字都不想写了..强烈推荐. 还有一个比较通俗的简单版本的:手把手教你实现SVM算法 SVN原理比较复杂,但是思想很简单,一句话概括,就

  • Python中使用支持向量机(SVM)算法

    在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别.分类(异常值检测)以及回归分析. 其具有以下特征: (1)SVM可以表示为凸优化问题,因此可以利用已知的有效算法发现目标函数的全局最小值.而其他分类方法都采用一种基于贪心学习的策略来搜索假设空间,这种方法一般只能获得局部最优解.   (2) SVM通过最大化决策边界的边缘来实现控制模型的能力.尽管如此,用户必须提供其他参数,如使用核函数类型和引入松弛变量等.   (3)S

  • python实现基于SVM手写数字识别功能

    本文实例为大家分享了SVM手写数字识别功能的具体代码,供大家参考,具体内容如下 1.SVM手写数字识别 识别步骤: (1)样本图像的准备. (2)图像尺寸标准化:将图像大小都标准化为8*8大小. (3)读取未知样本图像,提取图像特征,生成图像特征组. (4)将未知测试样本图像特征组送入SVM进行测试,将测试的结果输出. 识别代码: #!/usr/bin/env python import numpy as np import mlpy import cv2 print 'loading ...'

  • 手把手教你python实现SVM算法

    什么是机器学习 (Machine Learning) 机器学习是研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能.它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域. 机器学习的大致分类: 1)分类(模式识别):要求系统依据已知的分类知识对输入的未知模式(该模式的描述)作分析,以确定输入模式的类属,例如手写识别(识别是不是这个数). 2)问题求解:要求对于给定的目标状态,寻找一个将当前状态转换为目标状态的动作序

  • Python3.5 + sklearn利用SVM自动识别字母验证码方法示例

    前言 最近正在研究人工智能,为了加深对算法的理解,决定写个自动设别验证码的程序.看了看网上的demo,大部分都是python2的写法,而且验证码的识别都是用的数字做例子,那我就写个基于python3字母识别的程序,不过一路写下来碰到不少坑,大家感兴趣的话可以慢慢看. 图片识别有几个比较大的步骤是必须完成的: 1.有大量的验证码图片作为样本 2.图片要进行处理  流程是:灰度化==>二值化==>字符切割==>识别分类 3.图像识别要提取特征值,然后把图片二值化的数据当做样本做训练,最后基于

  • Python利用BeautifulSoup解析Html的方法示例

    介绍 Beautiful Soup提供一些简单的.python式的函数用来处理导航.搜索.修改分析树等功能.它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序. Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码.你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了.然后,你仅仅需要说明一下原始编码方式就可以了. Beautiful

  • python3.6中@property装饰器的使用方法示例

    本文实例讲述了python3.6中@property装饰器的使用方法.分享给大家供大家参考,具体如下: 1.@property装饰器的使用场景简单记录如下: 负责把一个方法变成属性调用: 可以把一个getter方法变成属性,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值: 只定义getter方法,不定义setter方法就是一个只读属性 2.通过一个例子来加深对@property装饰器的理解:利用@property给一个Screen对象

  • python利用拉链法实现字典方法示例

    前言 字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法. 在Python中怎样用列表实现字典? 用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办? 最简单的办法就是使用拉链法. 拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好, num的数足够大,就能够保证列表中的每一

  • 利用PHP_XLSXWriter代替PHPExcel的方法示例

    前言 本文主要给大家介绍的是关于利用PHP_XLSXWriter代替PHPExcel的方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 二者有何区别? PHPExcel 是一个处理Excel,CVS文件的开源框架,它基于微软的OpenXML标准和PHP语言.可以使用它来读取.写入不同格式的电子表格,这也是PHP至今最通用的Excel处理工具,但是它有一个非常致命的缺点: 特别占内存,对大批量的表格数据几乎会让人累觉不爱,处理速度非常慢,但是它功能非常丰富,API非常多,所以在导

  • Java实现去掉字符串重复字母的方法示例

    本文实例讲述了Java实现去掉字符串重复字母的方法.分享给大家供大家参考,具体如下: package demo; public class Ctrl { public static void main(String[] args){ String s = "akkbcccrsa"; System.out.println("我们测试结果:"); System.out.print("原字符串:"); System.out.println(s); Ct

  • python3利用Socket实现通信的方法示例

    参考于: python cs架构实现简单文件传输 原文中程序运行有误,在此做修改与解释,如下: 功能说明: 共2个py文件分别为server和client端,采用socket进行通信.提供两种功能:"dir" 命令用于显示服务器端可下载文件名:"get/put+文件名" 命令用于与服务器端进行下载或发送数据交换. Socket解释 服务器上socket编写步骤: 1.调用socket函数创建socket对象,如: socket_server = socket.soc

  • python3中dict(字典)的使用方法示例

    一.clear(清空字典内容) stu = { 'num1':'Tom', 'num2':'Lucy', 'num3':'Sam', } print(stu.clear()) #输出:None 二.copy(拷贝字典) stu = { 'num1':'Tom', 'num2':'Lucy', 'num3':'Sam', } stu2 = stu.copy() print(stu2) 三.fromkeys(指定一个列表,把列表中的值作为字典的key,生成一个字典) name = ['tom','l

  • python3实现钉钉消息推送的方法示例

    背景 偶然发现一个python实现的按照农历/阴历推送消息提醒的程序,钉钉群消息推送.此处总结并对其可推送的消息做. DingtalkNotice 环境:python3.7 安装: pip install schedule #实现定时任务的模块 pip install DingtalkChatbot #python封装的各种消息的调用 pip install sxtwl #日历库 钉钉自定义机器人: 钉钉群机器人是一个高级扩展的功能,可以将第三方服务的信息聚合到钉钉群众,实现信息的自动化同步.1

  • C++利用LuaIntf调用Lua的方法示例

    C++利用LuaIntf调用Lua 本文主要介绍了C++利用LuaIntf调用Lua的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. void LuaTest::OnResponse(uint32_t uLuaRpcId, const std::string& sRespContent) const { using LuaIntf::LuaRef; LuaRef require(m_pLuaState, "require"); try { LuaRe

随机推荐