侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   176

前言

最近正在研究人工智能,为了加深对算法的理解,决定写个自动设别验证码的程序。看了看网上的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分享给大家

总结

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


  • 上一条:
    详解Python sys.argv使用方法
    下一条:
    python lxml中etree的简单应用
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客