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


Posted in Python onMay 10, 2019

前言

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

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

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

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

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

一、大量验证码准备

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

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

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

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

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

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

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

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

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

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

三、图片的分割

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

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

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

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

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

四、识别分类

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

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

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

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

五、提取特征值

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

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

六、机器训练

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

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

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

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

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

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

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

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

Python3.5 + sklearn利用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分享给大家

总结

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

Python 相关文章推荐
Python Web开发模板引擎优缺点总结
May 06 Python
Python中使用PyQt把网页转换成PDF操作代码实例
Apr 23 Python
Python基于递归算法求最小公倍数和最大公约数示例
Jul 27 Python
python使用循环打印所有三位数水仙花数的实例
Nov 13 Python
python实现字符串加密成纯数字
Mar 19 Python
python增加图像对比度的方法
Jul 12 Python
扩展Django admin的list_filter()可使用范围方法
Aug 21 Python
Python3使用PySynth制作音乐的方法
Sep 09 Python
Python Process多进程实现过程
Oct 22 Python
Python实现隐马尔可夫模型的前向后向算法的示例代码
Dec 31 Python
Python递归及尾递归优化操作实例分析
Feb 01 Python
想学画画?python满足你!
Dec 24 Python
python lxml中etree的简单应用
May 10 #Python
基于Python的PIL库学习详解
May 10 #Python
python导入坐标点的具体操作
May 10 #Python
python简单验证码识别的实现方法
May 10 #Python
eclipse创建python项目步骤详解
May 10 #Python
Python实现字符型图片验证码识别完整过程详解
May 10 #Python
使用python PIL库实现简单验证码的去噪方法步骤
May 10 #Python
You might like
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
本地机apache配置基于域名的虚拟主机详解
2013/08/10 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
ThinkPHP查询返回简单字段数组的方法
2014/08/25 PHP
php常用表单验证类用法实例
2015/06/18 PHP
CI框架使用composer安装的依赖包步骤与方法分析
2016/11/21 PHP
CI(CodeIgniter)框架中URL特殊字符处理与SQL注入隐患分析
2019/02/28 PHP
jquery中 $.expr使用实例介绍
2014/06/09 Javascript
Javascript实现多彩雪花从天降散落效果的方法
2015/02/02 Javascript
js实现文字跟随鼠标移动而移动的方法
2015/02/28 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
2015/09/05 Javascript
JS获取字符串实际长度(包含汉字)的简单方法
2016/08/11 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
手把手15分钟搭一个企业级脚手架
2019/09/16 Javascript
vue实现微信浏览器左上角返回按钮拦截功能
2020/01/18 Javascript
微信小程序中的上拉、下拉菜单功能
2020/03/13 Javascript
Vue项目中使用flow做类型检测的方法
2020/03/18 Javascript
[03:17]史诗级大片应援2018DOTA2国际邀请赛 致敬每一位坚守遗迹的勇士
2018/07/20 DOTA
python2 与 python3 实现共存的方法
2018/07/12 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
numpy concatenate数组拼接方法示例介绍
2019/05/27 Python
Python中关于浮点数的冷知识
2019/09/22 Python
HTML5 Canvas中使用路径描画二阶、三阶贝塞尔曲线
2015/01/01 HTML / CSS
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
.net软件工程师面试题
2015/03/31 面试题
CSMA/CD介质访问控制协议
2015/11/17 面试题
中专自我鉴定范文
2013/10/16 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
2014年化验员工作总结
2014/11/18 职场文书
2015圣诞节贺卡寄语
2015/03/24 职场文书
mysql sql常用语句大全
2022/06/21 MySQL