利用机器学习识别验证码(从0到1)
最近喜欢先把测试结果图放前面。大家可以先看下效果。
识别速度并不是很快,代码并没有进一步优化。
本篇主要讲的是 从制作验证码开始,到我们利用机器学习识别出来结果的过程。
利用机器学习识别验证码的思路是:让计算机经过大量数据和相应标签的训练,计算机习得了各种不同标签之间的差别与关系。形成一个庞大的分类器。此时再向这个分类器输入一张图片。分类器将输出这个图片的“标签”。图片识别过程就完毕了。
下面我们正式开始本篇内容。
一:生成验证码:
这里生成验证码的方式是使用了python的PIL库。 他已经是Python平台上的图像处理标准库了。PIL功能非常强大,API也非常简单易用。
这里就放代码吧。
import random,os
from PIL import ImageFont,Image,ImageDraw,ImageFilter
def auth_code():size = (140,40) #图片大小font_list = list("0123456789") #验证码范围c_chars = " ".join(random.sample(font_list,4)) # 4个+中间加个俩空格print(c_chars)img = Image.new("RGB",size,(33,33,34)) #RGB颜色draw = ImageDraw.Draw(img) #draw一个font = ImageFont.truetype("arial.ttf", 23) #字体draw.text((5,4),c_chars,font=font,fill="white") #字颜色params = [1 - float(random.randint(1, 2)) / 100,0,0,0,1 - float(random.randint(1, 10)) / 100,float(random.randint(1, 2)) / 500,0.001,float(random.randint(1, 2)) / 500]img = img.transform(size, Image.PERSPECTIVE, params)img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)img.save(f'./test_img/{c_chars}.png')if __name__ == '__main__':if not os.path.exists('./test_img'):os.mkdir('./test_img')while True:auth_code()if len(os.listdir('./test_img'))>=3000: # 你改成 10000就行了#我这个电脑太老了。break
运行之后,就在 test_img 生成了如图所示的验证码图片。我这里是直接在生成时候以图片名 标注了 验证码对应的数字。 因为做案例嘛,不想再去爬验证码然后手动标注了。很累的!!
我这里生成的图片还是很干净的。如果你要搞比较复杂一点的图片,可以去看看下面贴的博客。
之前写过一篇利用opencv进行验证码处理,感兴趣可以看看,本篇的验证码并没有过多处理:https://blog.csdn.net/weixin_43582101/article/details/90609399
二:验证码分割
这里是要把我们生成的验证码,给切成4份,按照不同的标注,放到 train_data_img 不同的0—9的文件夹里面。
这个样子。做一个训练集。我这里分割也是处理的比较简单,按照宽度直接除以4 =。=
import os
from PIL import Image
from sklearn.externals import joblib
import time
def read_img():img_array = []img_lable = []file_list = os.listdir('./test_img')for file in file_list:try:image = fileimg_array.append(image)except:print(f'{file}:图像已损坏')os.remove('./test_img/'+file)return img_arraydef sliceImg(img_path, count = 4):if not os.path.exists('train_data_img'):os.mkdir('train_data_img')for i in range(10):if not os.path.exists(f'train_data_img/{i}'):os.mkdir(f'train_data_img/{i}')img = Image.open('./test_img/'+img_path)w, h = img.sizeeachWidth = int((w - 17) / count)img_path = img_path.replace(' ', '').split('.')[0]for i in range(count):box = (i * eachWidth, 0, (i + 1) * eachWidth, h)img.crop(box).save(f'./train_data_img/{img_path[i]}/'+img_path[i]+ str(time.time()) + ".png")if __name__ == '__main__':img_array = read_img()for i in img_array:print(i)sliceImg(i)
跑完之后,每个文件夹下面都有对应的验证码图片,并且他们的标注时图片名的首字母。
三:验证码特征提取
这里的思路是:利用 numpy 先把 train_data_img 图片转换成向量,我没有转01,嫌麻烦=。=
from PIL import Image
import numpy as np
import os
from sklearn.neighbors import KNeighborsClassifier as knn
def img2vec(fname):'''将图片转为向量'''im = Image.open(fname).convert('L')im = im.resize((30,30))tmp = np.array(im)vec = tmp.ravel()return vec
然后利用我们标注好的标签,来做一个特征提取,
tarin_img_path = 'train_data_img'
def split_data(paths):X = []y = []for i in os.listdir(tarin_img_path):path = os.path.join(tarin_img_path, i)fn_list = os.listdir(path)for name in fn_list:y.append(name[0])X.append(img2vec(os.path.join(path,name)))return X, y # x向量 y标签
然后构建一个分类器,
def knn_clf(X_train,label):'''构建分类器'''clf = knn()clf.fit(X_train,label)return clf
这里使用的是sklearn中的knn,我直接调包了。如果想看手写版本的,可以看之前写的KNN手写数字识别。https://blog.csdn.net/weixin_43582101/article/details/88772273
构建完分类器后,就可以把上面的结合起来,做一个识别模型了。
def knn_shib(test_img):X_train,y_label = split_data(tarin_img_path)clf = knn_clf(X_train,y_label)result = clf.predict([img2vec(test_img)])return result
四:验证码识别
我前面忘记搞测试集了,这次还是使用上面生成验证码的方法来生成一点测试集。
import random,time
import os
from PIL import ImageFont,Image,ImageDraw,ImageFilter
def auth_code():size = (140,40) #图片大小font_list = list("0123456789") #验证码范围c_chars = " ".join(random.sample(font_list,4)) # 4个+中间加个俩空格print(c_chars)img = Image.new("RGB",size,(33,33,34)) #RGB颜色draw = ImageDraw.Draw(img) #draw一个font = ImageFont.truetype("arial.ttf", 23) #字体draw.text((5,4),c_chars,font=font,fill="white") #字颜色params = [1 - float(random.randint(1, 2)) / 100,0,0,0,1 - float(random.randint(1, 10)) / 100,float(random.randint(1, 2)) / 500,0.001,float(random.randint(1, 2)) / 500]img = img.transform(size, Image.PERSPECTIVE, params)img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)random_name = str(time.time())[-7:]img.save(f'./test_data_img/{random_name}.png')
if __name__ == '__main__':if not os.path.exists('./test_data_img'):os.mkdir('./test_data_img')while True:auth_code()if len(os.listdir('./test_data_img'))>=30:break
测试集图片保存在 test_data_img 中,但是现在的图片是完整的,我们想要识别,就要按照之前的方法先进行图片切割,分成4份,然后拿我们的模型来识别。
from lx3验证码特征提取 import *
from lx2验证码分割 import *def sliceImg(img_path, count = 4):if not os.path.exists('test_split_img'):os.mkdir('test_split_img')img = Image.open(img_path)w, h = img.sizeeachWidth = int((w - 17) / count)for i in range(count):box = (i * eachWidth, 0, (i + 1) * eachWidth, h)img.crop(box).save('./test_split_img/' + f"{i+1}.png")if __name__ == '__main__':test_data_img = r'test_data_img\.059682.png'sliceImg(test_data_img)result = []for img in os.listdir('test_split_img'):result.append(knn_shib('test_split_img/'+img)[0])print(result)
到这里其实就结束了,这里的代码主要还是以案例为主,并没有进行优化,很多地方都需要改进,一些细节也没有处理,感兴趣的同学大家可以自己再进行改进。
祝大家端午节快乐啊。
数据和代码都放在github。可直接下载,https://github.com/lixi5338619/OCR_Yanzhengma/tree/master
利用机器学习识别验证码(从0到1)相关推荐
- python 基于机器学习识别验证码
1.背景 验证码自动识别在模拟登陆上使用的较为广泛,一直有耳闻好多人在使用机器学习来识别验证码,最近因为刚好接触这方面的知识,所以特定研究了一番.发现网上已有很多基于machine learn ...
- python验证码识别训练模型_python 基于机器学习识别验证码
1.背景 验证码自动识别在模拟登陆上使用的较为广泛,一直有耳闻好多人在使用机器学习来识别验证码,最近因为刚好接触这方面的知识,所以特定研究了一番.发现网上已有很多基于machine learning的 ...
- 利用机器学习识别细碎图斑实战(2):技术路线
本节主要讲利用机器学习做细碎图斑识别的技术路线,我们以后将按照这个技术路线完成整个过程. 首先看看整个技术路线图: 整个流程总共分成七个步骤,这七个步骤也是项目分析类任务的标准流程,下面我们简单来解释 ...
- 利用机器学习识别细碎图斑实战(1):前言
在做自然资源类项目的时候,因为各种原因,会产生大量的细碎图斑,这些图斑可能是外业采集的时候本身就是细碎的,也有可能是因为各种后期处理生成的(比如用村界去切割地类图斑的时候,也会生成大量的细碎图斑)如下 ...
- 利用机器学习识别细碎图斑实战(3):探索性数据分析
先对数据进行声明: 本文使用的数据已经经过了一系列脱密处理,不代表任何区域位置的真实信息,仅能用于学习和练习,提供者不对真实性负责,也不得用于任何盈利性的活动或者公开.出版等用途. 本来应该是要写数据 ...
- 利用pytesser识别简单图形验证码
转自:https://my.oschina.net/jhao104/blog/647326 一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域 ...
- Python验证码识别:利用pytesser识别简单图形
一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域-- 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行 ...
- python图形验证码识别_Python验证码识别:利用pytesser识别简单图形验证码
一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域-- 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行 ...
- python机器学习手写字体识别_Python 3 利用机器学习模型 进行手写体数字检测
0.引言 介绍了如何生成手写体数字的数据,提取特征,借助 sklearn 机器学习模型建模,进行识别手写体数字 1-9 模型的建立和测试. 用到的几种模型: 1. LR,Logistic Regres ...
最新文章
- linux 云主机 卡顿 排查过程
- Java注释(Annotation)详解
- linux中mysql如何删除库,Linux环境下MySQL基础命令(2)----查看、创建、删除库和表...
- Linux系统给进程绑核
- Intel最新路线图:10nm得等2017年底
- 商场内自动扶梯的研究
- Python 进阶 —— 可变参数(*args, **kw)与参数收集的逆过程
- xugu clob字段如何导出_如何优雅的导出EXCEL
- 解数独(Python)
- 循环移动(cyclic)
- 大学计算机word操作教程,word技巧大全:73个word实用技巧分享-电脑教程
- 大学生简历计算机专业模板,计算机专业大学生简历模板
- 【DirectX 2D游戏编程基础】DirectX精灵的创建
- Android实现可编辑下拉菜单
- ubuntu 20.04 安装谷歌输入法
- Java job interview:项目开发小组成员网站数据访问层设计
- [AV1] AV1技术专栏(正在更新中)
- 2018 微信数据报告,看看你的微信用了多少天?
- xeon e5-2400 系列处理器能做四路服务器吗?,英特尔Xeon E5系列双路处理器大阅兵
- 关于魔兽T人和延迟的恶劣挂原理及实现
热门文章
- 2012浙大计算机考研分数线,浙江大学2012年考研复试分数线公布
- android复制粘贴功能
- 客户隐隐约约感觉到自己想要什么,但没法确切说出来
- 牛皮了!遇到“ORA-12154: TNS: 无法解析指定的连接标识符”错误,到底该如何解决?
- 賽事№20190220:6項4次3連環(B)
- 优思学院|什么是精益生产?企业如何实现精益生产?
- 知识点滴 - 世界上有多少国家?国旗是什么?
- Facebook被巴西扣押近7700万元:只因WhatsApp不听话
- 蓝牙HC-05上电自动互联(最详细教程)
- leetcode 1371.每个元音包含偶数次的最长子字符串(find the longest substring containing vowels in even counts)C语言