项目背景:

之所以做这个其实很久就有这个想法了,因为搞爬虫有大半年了,怕热很多网站,也模拟登陆了许多网站,包括知乎微博等,但是有个问题是,当我们遇到验证码的时候,就需要人工打验证码了,特别是用selenium登录新浪手机端的时候,每次都需要人为打验证码,感觉还不够全自动。所以就有了这个摸索。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

第一步:(爬取验证码)

我们首先需要获取足够的验证码样本,因为从简单做起,所以本次的验证码都是由数字组成且都比较规则;http://smart.gzeis.edu.cn:8081/Content/AuthCode.aspx

#-*- coding:utf-8 -*-
import requests
import time# 文件下载,主要下载训练集
def download_pics(pic_name):url = 'http://smart.gzeis.edu.cn:8081/Content/AuthCode.aspx'res = requests.get(url,stream=True)with open(u'J:/数据分析学习/python/机器学习之验证码识别/pics/%s.jpg'%(pic_name),'wb') as f:for chunk in res.iter_content(chunk_size=1024):if chunk:f.write(chunk)f.flush()f.close()if __name__ == '__main__':for i in xrange(100):pic_name = int(time.time()*1000000)download_pics(pic_name)

第二步:(切割验证码)

因为每个验证码是4个数字组成,我的思路是把验证码切割成四个,然后逐一识别,这样的准确率应该比较高一些;这里值得一提的就是:切割图片的参数(通过PS可以看到相隔的像素值,然后可以推算出一个公式)、将图片二值化,把图片变成黑白图片、我们需要读取某个文件夹下的所有图片,然后保存下来。

# -*- coding: utf-8 -*-from PIL import Image,ImageEnhance
from PIL import *
import time
# 图片切割
def segment(im):s = 12w = 40h = 81t = 0im_new = []for i in range(4):im1 = im.crop((s+w*i,t,s+w*(i+1),h))im_new.append(im1)return im_new# 图片预处理,二值化,图片增强
def imgTransfer(f_name):im = Image.open(f_name)im = im.filter(ImageFilter.MedianFilter())#enhancer = ImageEnhance.Contrast(im)#im = enhancer.enhancer(1)im = im.convert('L')return imdef cutPictures(img):im = imgTransfer(img)pics = segment(im)for pic in pics:pic.save(u'J:/数据分析学习/python/机器学习之验证码识别/test/%s.jpeg'%(int(time.time()*1000000)),'jpeg')# 读取某文件夹下的所有图片
import os
def getAllImages(folder):assert os.path.exists(folder)assert os.path.isdir(folder)imageList = os.listdir(folder)imageList = [os.path.abspath(item) for item in imageList if os.path.isfile(os.path.join(folder, item))]return imageListif __name__ == '__main__':files_name =  getAllImages(u'J:/数据分析学习/python/机器学习之验证码识别/pics//')for i in files_name:#cutPictures()files =  i.replace('\\','/')s = files.split('/')name = ''for j in s[:-1]:name = name + j + '/'name = name + 'pics/' + s[-1]         cutPictures(name)

第三步:对图片预分类

这里值得一提的是,首先你得知道文件夹的命名不可以出现特殊符号(/ \ * ! | ? < >)等,而机器识别可能会把切割后图片识别成这些特殊字符,所以得加上一个判断;然后机器的识别正确率大概是50%,所有后面还需自己人工分类,变成准确的分类。(有个奇怪的现象,1200张图片,竟然没有一个9)

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 23 14:19:13 2017
对切割后的图片进行分类,及0-9@author: onlyyo
"""import sys
sys.path.append('C:\Users\onlyyo\Desktop\pytesseract-0.1.6\src')
sys.path.append('C:\Python27\Lib\site-packages\pytesser')
from pytesser import *
from pytesseract import *
import pytesseract
from PIL import Image
import os
import shutil#ocr图像识别
def ocr(img):try:img = Image.open(img)rs = image_to_string(img)except:return 'none'return rs#使用ocr进行训练的预分类
def category(originfile,dirs,filename):if not os.path.exists(dirs):os.makedirs(dirs)shutil.copyfile(originfile,dirs+filename)if __name__ == '__main__':dirs = u'J:/数据分析学习/python/机器学习之验证码识别/test/'# 将ocr识别的文件按照数组编号存放在相应的文件夹中for fr in os.listdir(dirs):f = dirs+frif f.rfind(u'.DS_Store') == -1:rs = ocr(f)if '|' not in rs and '*' not in rs :if '?' not in rs and '<'not in rs and '>' not in rs:category(f,u'J:/数据分析学习/python/机器学习之验证码识别/category/%s/'%rs,fr)

第四步:(提取特征值)

批量将切割后并且已经分好类的图像,得到的图片进行二值化(0,1)处理,变成像素值,然后保存在TXT文件下;这里要注意的是保存的格式以及每一个图片的像素值后面要加上它的标签即是什么数字。为下一步的模型训练做准备。

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 23 15:46:59 2017@author: onlyyo
批量将切割后并且已经分好类的图像,得到的图片进行二值化处理,变成像素值,然后保存在TXT文件下
"""
from PIL import Image
import numpy as np
import os# 特征提取,获取图像二值化数学值
def getBinaryPix(im):im = Image.open(im)img = np.array(im)rows,cols = img.shapefor i in range(rows):for j in range(cols):if (img[i,j]<= 128):img[i,j] = 0else:img[i,j] = 1binpix = np.ravel(img)return binpixdef getfiles(dirs):fs = []for fr in os.listdir(dirs):f = dirs + frif f.rfind(u'.DS_Store') == -1:fs.append(f)return fsdef writeFile(content):with open(u'J:/数据分析学习/python/机器学习之验证码识别/traindata/train_data.txt','a+') as f:f.write(content)f.write('\n')f.close()if __name__ == '__main__':dirs = u'J:/数据分析学习/python/机器学习之验证码识别/category/%s/'for i in range(9):for f in getfiles(dirs %(i)):pixs = getBinaryPix(f).tolist()pixs.append(i)pixs =  [str(i) for i in pixs]content = ','.join(pixs)writeFile(content)

第五步:(模型训练)

使用sklearn中的SVM(支持向量机)对第四步得到的数据进行训练,SVM是有监督分类,通过调一些参数可以改善它的预测正确率,比如说核函数-rbf、poly、sigmoid、linear等;

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 23 16:18:39 2017@author: onlyyo
根据之前得到的验证码像素数组,以及他们的标签,用SVM对其进行模型训练
"""from sklearn.svm import SVC
from sklearn import grid_search
import numpy as np
import numpy as np
from sklearn import cross_validation as cs
from sklearn.externals import joblib
from picPreprocessing import loadPredict
import warnings
import timedef load_data():dataset = np.loadtxt(u'J:/数据分析学习/python/机器学习之验证码识别/traindata/train_data.txt',delimiter=',')return dataset# 交叉验证
def cross_validation():dataset = load_data()row,col = dataset.shapeX = dataset[:,:col-1]Y = dataset[:,-1]clf = SVC(kernel='rbf',C=1000)clf.fit(X,Y)scores = cs.cross_val_score(clf,X,Y,cv=5)print "Accuracy: %0.2f (+- %0.2f)" % (scores.mean(),scores.std())return clft0 = time.time()
cross_validation()
#print "fit time:",round(time.time()-t0,3),"s"def searchBestParameter():parameters = {'kernel':('linear','poly','rbf','sigmoid'),'C':[1,100]}dataset = load_data()row,col = dataset.shapeX = dataset[:,:col-1]Y = dataset[:,-1]svr = SVC()clf = grid_search.GridSearchCV(svr,parameters)clf.fit(X,Y)print clf.best_params_#searchBestParameter()
print "fit time:",round(time.time()-t0,3),"s"

第六步:预测验证码

我们的预测模型出来了,接下来就是验证咯!

# -*- coding: utf-8 -*-
"""
Created on Thu Mar 23 17:20:09 2017@author: onlyyo
最后一步,对于要测试的验证码处理,然后进行预测,输出结果"""from split_pic import *
from write_img import *
import os
from cross_svc import cross_validationdef cutPictures2(name):im = imgTransfer(name)pics = segment(im)for pic in pics:pic.save(u'J:/数据分析学习/python/机器学习之验证码识别/test_picture/%s.jpeg'%(int(time.time()*1000000)),'jpeg')def load_Predict(name):
#cutPictures2(name)      #切割图片dirs = u'J:/数据分析学习/python/机器学习之验证码识别/test_picture/'fs = os.listdir(dirs)    # 获取图片名称clf = cross_validation()  predictValue = []for fname in fs:fn = dirs + fnamebinpix = getBinaryPix(fn)       predictValue.append(clf.predict(binpix))predictValue = [str(int(i)) for i in predictValue]print "the picture number is :" ,"".join(predictValue)name = u'J:/数据分析学习/python/机器学习之验证码识别/8473.jpg'
load_Predict(name)

总结:

做验证码识别的话,我觉得思路应该是这样的:

首选得获取足够的样本,

图片切割、图片二值化、降噪增强、

预分类,读取图片像素值即特征值以及标签;

模型训练--SVM、神经网络等。

机器学习之验证码识别相关推荐

  1. python验证码识别库底色深_基于机器学习的验证码识别

    基于机器学习的验证码识别 目录说明 ├── . ├── catpcha_images 验证码采集存储目录 ├── thred_images二值化图片存储目录 ├── noised_images降噪图片 ...

  2. python验证码识别训练模型_python 基于机器学习识别验证码

    1.背景 验证码自动识别在模拟登陆上使用的较为广泛,一直有耳闻好多人在使用机器学习来识别验证码,最近因为刚好接触这方面的知识,所以特定研究了一番.发现网上已有很多基于machine learning的 ...

  3. 验证码识别算法_用Python机器学习搞定验证码

    写爬虫有一个绕不过去的问题就是验证码,现在验证码分类大概有4种: 图像类 滑动类 点击类 语音类 今天先来看看图像类,这类验证码大多是数字.字母的组合,国内也有使用汉字的.在这个基础上增加噪点.干扰线 ...

  4. 实战:CNN+BLSTM+CTC的验证码识别从训练到部署 | 技术头条

    作者|_Coriander 转载自Jerry的算法和NLP(ID: gh_36eba310d433) 1.前言 本项目适用于Python3.6,GPU>=NVIDIA GTX1050Ti,原ma ...

  5. 验证码识别,发票编号识别(转)

    毕业设计做了一个简单的研究下验证码识别的问题,并没有深入的研究,设计图形图像的东西,水很深,神经网络,机器学习,都很难.这次只是在传统的方式下分析了一次. 今年工作之后再也没有整理过,前几天一个家伙要 ...

  6. 字符识别Python实现 图片验证码识别

    字符型图片验证码识别完整过程及Python实现 1   摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...

  7. Discuz验证码识别(上线篇)-写给程序员的TensorFlow教程

    经过前两篇文章的开发,咱们今天终于要进入令人激动的上线篇了.(最近刚刚发布的TensorFlow lite其实也是部署上线的工具集之一)话说我在学习TensorFlow的时候,发现这部分的教程是尤其少 ...

  8. [验证码识别技术]字符验证码杀手--CNN

    字符验证码杀手--CNN 1 abstract 目前随着深度学习,越来越蓬勃的发展,在图像识别和语音识别中也表现出了强大的生产力.对于普通的深度学习爱好者来说,一上来就去跑那边公开的大型数据库,比如I ...

  9. 验证码识别的原理python_Python验证码识别处理实例

    一.准备工作与代码实例 1.PIL.pytesser.tesseract (1)安装PIL:下载地址:http://www.pythonware.com/products/pil/(CSDN下载) 下 ...

最新文章

  1. PyTorch里面的torch.nn.Parameter()
  2. mysql查询枚举类型转换_zendframework获取数据库中枚举类enum的数据并将其转换成数组...
  3. vb 变量赋值为当前选定单元格_第7篇:根据Excel选定行对Word模板填充数据(补充修改)...
  4. 数组排序思想———选择排序
  5. ORACLE TEXT LEXER PREFERENCE(一)
  6. Please ensure that adb is correctly located at……问题解决方案
  7. 牛客网 【每日一题】8月5日题目精讲—蓝魔法师
  8. HTML浮动导致高度塌陷,HTML 文档流,设置元素浮动,导致父元素高度无法自适应的解决方法(高度欺骗)...
  9. JAVA两个视图层_MVC - 管理帐户 . 一个视图有两个局部视图和两个模型
  10. 常用网站URL规划分析
  11. 干程序员辣么久,你为什么还没有年薪60万?
  12. 光源时间_【精品透视】UVLED紫外固化光源崭露头角!
  13. 游戏与计算机系统不兼容,电脑安装游戏时提示此文件版本与正在运行Windows不兼容的解决方法...
  14. SQL2005学习(三十二),Group by
  15. 高中计算机评课,高二信息技术评课记录
  16. android tab activity,Android   ActivityGroup和TabActiviy的差异性
  17. 计算机基础阿春第十一讲,编程天才少年“顾神”,放弃清华保送,被麻省理工全额奖学金挖走...
  18. GMC解封秘籍:解决 Google 账户被封窘境
  19. Limelight完成了对雅虎Edgecast的收购,合并后的公司更名为Edgio,成为全球边缘解决方案的领导者
  20. NLP:自然语言处理技术领域的代表性算法概述(技术迭代路线图/发展时间路线)、四大技术范式变迁概述(统计时代→大模型时代)、四个时代的技术方法论探究(少数公司可承担的训练成本原因)之详细攻略

热门文章

  1. 阿里云进阶课程四——轻轻松松自建云端下载服务器
  2. C#实现桌面应用程序简单的计算器
  3. matlab版qq自动聊天,Matlab调用QQ进行聊天小技巧
  4. 计算机辅助设计 Altium Designer
  5. 一起学爬虫(Python) — 25 震惊!某妈妈竟被多次“玩弄”……
  6. 细数《Sizeable》中场景交互的梦境灵感
  7. 大雪计算机网络,大雪的说说心情短语
  8. 开发一款手机格斗网游需要注意些什么
  9. 【基础】n的阶乘尾部有多少个0 JAVA金典算法-判断一个数(乘积得到的数)的末尾有几个0--发掘
  10. Day 4 打卡第四天