TensorFlow新手实战破验证码(1)

来源:互联网 发布:linux安装扫描漏洞 编辑:程序博客网 时间:2024/06/06 09:51

TensorFlow新手实战破验证码

稍稍学了些tensorflow,就忍不住想实战练练手,就拿某学校的选课系统开刀吧。(最终识别成功率100%)
不要了解tensorflow的,可以先看基础教程
本文完整代码已上传。破验证码完整代码下载

本博文不会公布用来练手的网站的链接,不过不影响看这篇博文。你可以一边看本博文一边自己随便找个网站练手,也可以直接使用本博文提供的验证码模拟生成工具。

第一步 挑选目标

作为一个新手,选择合适的练手目标可以说是很重要的,一上来就想破那种拖动拼图或回答问题类型的验证码对我来说很不现实。
首先让我们来看一下我选择的target:
这里写图片描述
仔细看一下验证码的大图:
这里写图片描述
为啥要选这个网站,因为它“好欺负”。下面简述一下原因:
1.均匀分布
通过观察可以轻易发现,这个网站的验证码的四个数字在图片中的位置大致是均匀分布的,这样一来,我们就可以通过分割图片来把问题从一开始的识别四个数字简化为识别单个数字。
2.颜色单一
整个验证码只有黑白两色,识别时不需要多通道。
3.字体规则
字体形变不大,大小几乎一直没变。
4.干扰少
只有两条干扰线,识别简单。
5.易于推测出生成该验证码的代码
其实这点才是最重要的(捂脸笑),因为验证码的训练集实在不好找啊,你基本不太可能搞到网站生成验证码的完整源码。碰到这种情况,我的解决方案就是自己推测出网站验证码生成的规则,然后自己写了一个生成验证码的程序。

第二步 生成训练集

这一步就是通过观察网站的验证码,推测其验证码生成规律,然后自己写个生成器。
最后的效果大概是这样:
这里写图片描述
你可能会发现字体和网站上的有些不一样,不过这不重要,因为我实在看不出网站的验证码用的字体是啥,所以我把我电脑上所有的字体都加入了训练集。
现在让我们继续观察验证码:
这里写图片描述
可以轻易总结出规律:
1.一个数字占了大约50*100个像素。
2.数字进行了简单的扭曲。
3.数字上加了两条干扰线。
下面我们用代码来一一实现。

1.首先是要用到的库

import randomimport stringimport sysimport mathfrom PIL import Image,ImageDraw,ImageFont,ImageFilter

PIL用于处理图片。
没安装的在命令行输pip install Pillow。
2.然后写两个要用到函数
生成干扰线的函数:

#用来绘制干扰线def gene_line(draw):    py = random.randint(0, 3)    begin = (-py*50, random.randint(0, 100))    end = (200-py*50, random.randint(0, 100))    draw.line([begin, end], fill = 0,width=5)

生成验证码的函数:

filename="D:/"typen=2typet=["arialbd.ttf","corbelb.ttf"]#字体的位置font_path = "C:/Windows/Fonts/"#生成验证码图片的高度和宽度size = (180,180)#生成验证码def gene_code():    width,height = size #宽和高    image = Image.new('1',(width,height),1) #创建图片    font = ImageFont.truetype(font_path+typet[random.randint(0, typen-1)],70) #验证码的字体    draw = ImageDraw.Draw(image)  #创建画笔    source = ['0','1','2','3','4','5','6','7','8','9']    text = random.randint(0, 9) #生成字符串    font_width, font_height = font.getsize(source[text])    draw.text(((width - font_width) /2, (height - font_height)/2-5),source[text],font= font,fill=0) #填充字符串    rx=random.uniform(-0.2, 0.2)    ry=random.uniform(-0.2, 0.2)    image = image.transform((width+100,height+100), Image.AFFINE, (1,rx,0,ry,1,0),Image.BILINEAR)  #创建扭曲    px=random.randint(-20, 20)    py=random.randint(-6, 6)    image = image.crop((65-70*rx+py,40-70*ry+px,115-70*rx+py,140-70*ry+px))    aa = str(".png")    path = filename + source[text] + aa    image.save(path)    draw = ImageDraw.Draw(image)    gene_line(draw)    gene_line(draw)    image.save(path)

你可以更改typen和typet改变训练的字体类型。
3.测试函数
试一下gene_code()效果如何:

gene_code()

打开filename定义的位置看一下,默认D盘根目录,效果大致如下这里写图片描述
可以发现和原网站的验证码基本一致,只是字体上可能有些不同,你可以尝试改typen和typet改变训练的字体类型。

还有 TensorFlow新手实战破验证码(2)

阅读全文
0 0
原创粉丝点击