版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019届电子科学与技术专业毕业论文(设计)目录摘要关键词引言绪论11.1选题的背景与意义11.2与本课题相关的国内外研究状况2验证码识别基本流程22.1验证码样本收集过程32.2图片处理过程42.2.1彩色的图片转换成灰度图42.2.2将灰度图二值化处理62.3编写训练代码82.3.1验证码生成82.3.2定义cnn网络神经三层几卷的训练模型132.3.3训练模型22致谢参考文献python基于tensorflow的简单验证码识别摘要:我的设计是围绕tensorflow这个深度学习的框架来编写代码搭建cnn网络训练图片,将彩色图片转换成灰度图、将灰度图二值化处理、去除图片噪点等三个大的步骤最终实现图片的验证识别。我的设计来源于网页的验证码,因为我们在很多登录的页面都可以看到验证码的填写,但是许多验证码里面有很多的干扰因素,导致我们看不清验证码,而导致我们多次的去验证。我的设计就解决了这一问题,它通过以上的三个步骤来实现验证码的准确识别与导出,这样就大大减少了我们的验证次数。关键词:深度学习;二值化处理;去噪Python'ssimpleverificationcoderecognitionbasedontensorflowAbstract:Mydesignistowritecodearoundtensorflow,whichisadeeplearningframework,tobuildCNNnetworktrainingpictures,toconvertcolorpicturesintogray-scaleimages,tobinarygray-scaleimages,toremoveimagenoiseandotherthreemajorstepstofinallyachieveimageverificationandrecognition.Mydesigncomesfromtheverificationcodeofthewebpage,becausewecanseethefillingoftheverificationcodeonmanyloginpages,buttherearemanyinterferencefactorsinmanyverificationcodes,whichcauseustonotseetheverificationcodeclearly,andleadsustoverifymanytimes.Mydesignsolvesthisproblem.Itcanidentifyandexporttheverificationcodeaccuratelythroughtheabovethreesteps,whichgreatlyreducesourverificationtimes.Keyword:Deeplearning;Binaryprocessing;Denoising绪论验证码识别在许多自动化程序里面的模拟登陆经常用到,一直很好奇到底是怎么使用机器来识别验证码,最近刚好看到这方面的知识,所以特地去研究学习了一番。发现网上已经有很多基于tensorflow的验证码识别,本文主要参考网络上的资料,集合自己的实际情况进行改进学习。1.1选题的背景与意义
随着互联网技术的快速发展和应用,网络在给人们提供丰富资源和极大便利的同时,伴随而来的就是互联网系统的安全性问题。验证码的出现正是加强web系统安全的产物。验证码(CAPTCHA)最早作为卡内基梅隆大学的-一个科研项目,是一种区分用户是人类还是计算机的公共自动程序。在一个验证码测试中,
由计算机生成一个问题并评判用户的答案,这个问题必须只有人类才能解答。由于计算机无法解答,回答出该问题的用户就会被认为是人类。CAPTCHA在网络上的大规模使用起源于1999-2000年Yahoo网站的账号注册。目前大部分网站都引入了验证码机制来加强网络的安全验证。 随着互联网的高速发展,网络在给人们的生活带来极大便利的同时,其安全问题也日益突出。网络验证码作为--项广泛使用的验证手段,对网络安全起到了重要的作用。对验证码识别技术的研究,可以及时发现和改善验证码的漏洞,在增强网络安全性、防止恶意机器程序攻击方面有着重要意义。1.2与本课题相关的国内外研究状况国外在验证码识别技术方面的研究早已成为一个较为热门的领域,并逐渐形成一个产业,验证码识别技术的理论体系已日渐趋于完善。1997年,Alta
Vista的研究者们研发出第1个验证码系统用于防止恶意计算机程序为篡改搜索结果将URL加到搜索引擎上。该测试为扭曲字符识别,对于当时常规OCR的攻击能够形成有效的抵抗。2000年9月
,CMU研究组为了给聊天室解决恶意计算机程序在聊天室内散布广告信息而产生的一系列问题,设计了首个商用验证码Gimpy系列,并首次提出验证码的概念。到此之后,国内外各大网站、众多研究机构纷纷开始验证码使用和研究,各种各样的验证方案被设计出,验证码技术得到大力发展。2验证码识别基本流程基本流程如下图所示2.1验证码样本收集过程由于是识别简单的验证码,就去网上找了一个网站,把登陆页面的验证码下载下来例:这个是网上的一个网站登陆页面上的验证码图片,看上去工工整整,没有什么特别的地方。于是手动下载了二十几张作为TensorFlow的训练样本。后来发现样本太少,根本没办法识别。但是大量的验证码图片手动下载太浪费时间,就想了个办法,使用python的requests模块来多线程下载网站上的图片,具体下载代码: //这里获取的实际上是图片的二进制代码 text=requests.get('/xxx.jpg') //把图片保存到本地 withwithopenopen('test.png,'wwbb')asfile: file.write(text.content)跑了不到半个小时就下载了几万张验证码,这样子训练样本应该是够了训练的图片收集好,接下是整理下载好的图片。按照图片里面的内容来命名图片名字。比如上面的验证码名字就叫my55g.jpg手动改了几十张图片之后,发现人工改文件名太麻烦,耗时太久。后来发现可以用ImageCaptcha来生成我们想要的图片,只需要下面的代码就可以生成。#导入captcha包下的image文件中的ImageCaptcha类,使用之前先实例化fromcaptcha.imageimportImageCaptchaic=ImageCaptcha()ic.write('1a8c','1a8c'+'.png',format='png')既然有了自动生成的图片,那么之前网站下好的图片验证码就不需要了。就改成了识别自定义的图片验证码。2.2图片处理过程在找验证码的过程中,发现网上的验证码一般不是简单的验证码,有的验证码上面还会有各种干扰的信息,如下图:由于这种验证码干扰因素较多,也花了许多时间在怎么处理图片这个问题上面,回归正题,这种有干扰的图片验证码会造成机器学习的准确率大大下降,所以,在把需要训练的图片集丢给机器学习之前,我们要有干扰的图片进行去干扰处理这个时候就要用到python的图片处理库PIL。这是一张之前找验证码的时候网站上的登陆页面的验证码想要识别上面的验证码,就要有一套图片处理的算法,处理完这些图片后,得到的大量的简单验证码图片去给机器自动学习。在给机器学习之前,先要对原始的图片进行处理,一般来说需要下面几个步骤:将彩色图片转换成灰度图将灰度图二值化处理去除图片噪点经过自己测试,图片经过上面代码代码处理之后后,一般图片图片的验证码上面的数字、字母肉眼已经可以很好识别出来了,给机器学习的话应该也没多大问题了。下面是三个处理步骤的具体代码2.2.1彩色的图片转换成灰度图一个颜色的都存在有红、绿、蓝三种原色进行组成的,可以通过PIL下面的的代码,将它转换的为一张灰色的图像:具体代码实现fromPILimportImage#打开原始图片im=Image.open('vc.png')#展示原始图片im.show()#将原始图片灰度化grey_im=im.convert('L')#展示灰度化图片grey_im.show()#保存灰度化图片grey_im.save('grey.png')运行上面的代码,就可以看到了一张灰度图了2.2.2将灰度图二值化处理经过第一步得到了一张灰度图,但是这样的图片对于机器学习来说还是太复杂,接下来就是将灰度图二值化。二值化的顾名思义就是把图片转化成只有黑色和白色的图片。Python很多图片处理模块就可以进行处理。二值化一般通过多次测试确认一个阈值,大于我们设定的值就改成白色,小于我们设定的值就改成为黑色,然后把图片分成黑色和白色,最后我的们肉眼看到的就是一张只有的黑色和白色的图片。具体代码实现:fromPILimportImage#二值处理#设定阈值threshold,像素值小于阈值,取值0,像素值大于阈值,取值1#阈值具体多少需要多次尝试,不同阈值效果不一样defget1_table1(threshold1=50):table=[]foriinrange(255):ifi<threshold:table.append(0)else:table.append(1)returntable#打开灰度化图片并进行二值处理binary_im=Image.open('grey.png').point(get_table(120),"1")#展示二值化图片binary_im.show()#保存二值化图片binary_im.save('binary.png')要多次测试处理效果才能得到一个阈值取值结果。上面的图片经过黑白化处理图片之后,变成了下面的这样子。 但是这样还是有干扰线,这些线条会影响机器学习的识别率,还需要做最后一步降噪
2.2.3将图片降噪处理程序对图片降噪处理有很多种方法,难点在于要知道图片上的点哪些到底是是噪点。这里采用的逻辑算法是:
判断图片点的像素值与它旁边8个像素点的值比较,对比得出结果。如果这个点与周围8个像素点小于N时就判断这个点是噪点,可以判断这个点为噪点。
具体实现代码:
deftest_get_pixelpixel(imageimage,xx,ty,GG,NN):
#获取像素值
L_L=imageimage.getpixelimageimage((xx,y_y))
#与其c他阈e1lm值比较
ifL_test>G_gtest:
L_est=True
else:
L_test=False
nearDotsnearDots_test=0
ifL_L_test==(image_image_test.getpixel((xx-1,yy-1))>G):
nearDotsnearDots_test+=1
ifL_L_test==(imageimage_test.getpixel((yx-1,yx))>G):
nearDotsnearDots_test+=1
ifL_L_test==(imageimage_test.getpixel((xx-1,yy+1))>G):
nearDotsnearDots+=1
ifL_L_test==(imageimage_test.getpixel((xy,yx-1))>G):
nearDotsnearDots_test+=1
ifL_L_test==(imageimage_test.getpixel((xyx,xy+1))>G):
nearDotsnearDots_test+=1
ifL_L_test==(imageimage_test.getpixel((xx+1,yy-1))>G):
nearDotsnearDots_test+=1
ifL_L_test==(imageimage_test.getpixel((xx+1,yy))>G):
nearDotsnearDots_test+=1
ifL_L_test==(imageimage_test.getpixel((Xx+1,yY+1))>G):
nearDotsnearDots_test+=1
ifnearDotsnearDots_test<N:
returnimageimage_test.getpixel((xx,yy-1))
else:
returnNone
#降噪
defclear_noise(imagimage,G,N,Z):
draw=ImageDraw_test.Draw(imagimage)
foriinrange(0,Z):
forxinrange_test(1,image_test.size[0]-1):
foryinrange(1,image_test.size[1]-1):
color=get_pixel_test(image_test,x,y,G,N)
ifcolor_testisnotNone:
draw._test_testpoint((x,y),color)
#打开图片
b_imb_im=Image_test.open(test.png')
#将二值化图片降噪
clear_noise(b_b_im,40,4,4)
#展示降噪后的图片
b_im.show()
#保存降噪后的图片
b_im.save(test.png')降噪后的图片:这样一来,图片经过程序的三个步骤的处理,验证码图片上的干扰已经去掉,再把图片丢给机器训练,准确率应该有所提高。2.3编写训练代码由于tensorflow是一个深度学习的框架,需要提前了解一些它的相关术语和概念。由大量的神经元进行相连接并且进行计算,它由很多个层构成。在外部输入信息的基础上,可以改变内部的数据结构,通常用来对输入数据和输出数据间复杂的关系进行建模操作。神经网络它由大量的内部节点和之间的复杂联系构成,负责传递内部信息和加工信息,神经元也可以通过机器训练而被强化。神经网络系统,可以理解为存在于计算机内部的一种神经系统,比如输入层就是负责接收信息和数据,比如说一只狗的图片。输出层就是计算机对这个狗的图片的认知,它是不是狗。隐藏层就是对这个狗的图片加工处理。卷积层:理解1:
卷积取可以理解为数据的局部特征,全连接就是把以前数据的局部特征重新通过程序权值矩阵组装成完整的图。
因为用到了所有数据产生的局部特征,所以叫全连接。
理解2:
卷积网络在表现上有一点像我们正在召开的党和国家的“人民代表大会”。卷积核的数量相当于候选人数,图片中不同的特征会选择不同的“候选人”(卷积核)。
池化层有着类似于“合票”的作用,不同特征在对不同的“候选人”有着各自的偏好。
实现网上预订客户可口的饭菜,需要设计具备详细菜单的订餐系统。通过建立数据库,存储各种饭菜的详细信息,为了避免有时通过网上订餐会出现订单丢失的现象,做到系统响应及时,将从数据库管理入手,收集各餐馆及客户相关资料全连接的作用相当于是是“代表普选”。所有被程序各个区域选出的代表,对最终这个结果进行“投票”,全连接保证了结果是整个图像,既图像中各个部分(所谓所有代表),都有对最终结果影响的权利。
理解3:
假设有一只小蜜蜂,它的任务是找花朵采蜜。你的视野比较窄,没那么大,只能看到很小的一片区域。当你找到一个花朵之后,不知道要找到的是不是全部的花朵,所以全部的蜜蜂开了个会,把所有的花朵都拿出来分享了。预订餐饮网站是订餐的一种更加有效的销售渠道,并且是对传统销售餐饮的扩展。它除了必要的订餐功能以外,还包括新的餐饮展示,其口味介绍及餐饮信息检索等服务。在符合人们网上订餐需求的大前提下,餐饮销售商还实现了以向客户提供便捷的服务的目的以及一个便利的检索平台。客户可以根据餐饮信息介绍来灵活选取订购自己喜欢的餐饮。在使客户心满意足的同时,还为企业节约大量资源和资金以及时间,还对整个餐饮行业的运作产生许多积极的影响。该网站设计的最终目的是增加企业的市场竞争能力。池化层:
池化层是卷积神经网络中另一个非常重要的概念,它实际上是一种教学形式的降采样。有着许多不同形式的非线性池功能,并在那里“(最大池)的最大池”是最常见的。它是将输入的图像划分为通过若干个矩形进行区域,对每个子区域文化输出一个最大值。理论上这种机制有效的原因在于,在发现一个特定的特征之后,它的精确位置远远不及它和其他特征的相对位置的关系重要。池化层会不断持续的减小数据的空间大小,所以参数的数量和计算的量也会下降减少,在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。系统利用支持计算的高效的Web服务开发工具,以JSP数据库技术为前台,SQLServer2000为后台数据库,采用三层网络结构开发一个功能较为完善的网上订餐系统。该系统具有一定的实用性,用户可上网浏览网页菜单,查看留言和订餐情况;同时管理员也可对整个系统的信息进行相应管理。即管理菜单信息留言和订单信息。池化层通常会分别作用于每一个输入的特征并尝试减小其大小。最常用形式的池化层是每次隔2个元素从当前图像划分出2*2的区块,然后对这每个区块中的4个数取最大值。这将会减少图片75%的数据量。池化的作用:池化层操作后的图片结果与原来相比输入缩小了。池化层的的引入是仿照人类的视觉感官系统对视觉上的输入对象进行降维和抽象操作。在以前卷积神经网络过去的工作处理中中,研究者普遍认为池化层有以下三个效果:1.特征不变形:池化操作是模型进行更加广泛关注学生是否存在某些特征而不是一个特征具体的位置。2.特征降维:池在空间范围内相当于降维,使模型能够提取更宽范围的特征。同时减小下一层的输入的大小,从而减少了计算量和参数的数目。3.在一定程度上可以防止过拟合,更方便进行优化。
卷积层:多个卷积核F(过滤器)的和所述组合物的偏移值B,(其中,卷积核基质当量),卷积核与输入图像的点积可被累积和特征图。卷积层的特征:(1)网络局部连接:卷积核每一次仅作用于图片的局部(2)卷积核权值共享:一个基于卷积层可以有多个国家不同的卷积核,每一个filter在与输入数据矩阵形式进行点积操作的过程中,其权值是固定资产不变的。全连接层:作为一个“分类”整个卷积神经网络。如果说一个卷积层、池化层和激活相关函数层等操作是将原始信息数据映射到隐层特征进行空间发展的话,全连接层则起到将学到的“分布式系统特征可以表示”映射到样本标记研究空间的作用。
在实际应用中,可以通过卷积运算实现全连接层:完全连接到前层的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为具有hxw、h和w卷积核的全局卷积,分别是前层卷积结果的高度和宽度。由于Internet技术的高速发展,人们生活与Internet的脚步越来越紧密。同时也随着市场化和经济全球化越来越多的普及,众多国内外企业都深刻地认识到想要提高企业的市场竞争力,就要率先抓住Internet的商机,走网络信息化的特色道路。于是基于网上的订餐系统就在这样的情况下应运而生和发展起来了。网上订餐系统是一种针对餐饮业而设计的商务服务网站。其主要功能是完成网上预订餐饮与其相应工作,即通过网上界面进行订餐与对其服务进行对应评价完全连接层的缺点在于,其破坏CNN空间图像结构,启动卷积层“而不是”所有的连接层,通常为1×1的卷积核,它不包含完整的卷积成为完全连接的神经网络(FCN)卷积神经系统网络中全连接层的设计,属于中国人们在传统文化特征信息提取+分类管理思维下的一种“迁移学生学习“思想,但在我们这种end-to-end的模型中,其用于数据分类的功能其实是被弱化了,而全连接层参数没有过多的缺点也激励着人们可以设计出更好的模型能够替代之达到企业更好的效果。训练代码编写过程:2.3.1验证码生成#coding:utf-8
#description:用于验证码的生成,生成训练集和测试集
importrandom
importnumpyasnp
fromPILimportImage
fromcaptcha.imageimportImageCaptcha
NUMBER=['0','1','2','3','4','5','6','7','8','9']
LOW_CASE=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u',
'v','w','x','y','z']
UP_CASE=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U',
'V','W','X','Y','Z']
CAPTCHA_LIST=NUMBER
CAPTCHA_LEN=4
CAPTCHA_HEIGHT=60
CAPTCHA_WIDTH=160
defrandom_captcha_text_text(char_set1set1=CAPTCHA_LIST_List,captcha_size1=CAPTCHA_LEN_len):
"""
随机生成定长字符串
:paramchar_set:备选字符串列表
:paramcaptcha_size:字符串长度
:return:字符串
"""
captcha_text=[random.choice(char_set)for_inrange(captcha_size)]
return''.join(captcha_text)
defgen_captcha_text_and_image_image(width_width=CAPTCHA_WIDTH_image,height_height=CAPTCHA_HEIGHT_image,save=None):
"""
生成随机验证码
:paramwidth:验证码图片宽度
:paramheight:验证码图片高度
:paramsave:是否保存(None)
:return:验证码字符串,验证码图像np数组
"""
image=ImageCaptcha(width=width,height=height)
#验证码文本
captcha_text=random_captcha_text()
captcha=image.generate(captcha_text)
#保存
ifsave:
image.write(captcha_text,'./img/'+captcha_text+'.jpg')
captcha_image=Image.open(captcha)
#转化为np数组
captcha_image=np.array(captcha_image)
returncaptcha_text,captcha_image
if__name__=='__main__':
t,im=gen_captcha_text_and_image(save=True)
print(t,im.shape)#(60,160,3)
运行之后,生成的验证码2.3.2定义cnn网络神级三层几卷的训练模型#-*-coding:utf-8-*-
#description:训练模型
importos
importpat.v1astf
fromdatetimeimportdatetime
fromtensorflow_core.python.layers.coreimportdropout
fromutilimportget_next_batch
fromcaptcha_genimportCAPTCHA_HEIGHT,CAPTCHA_WIDTH,CAPTCHA_LEN,CAPTCHA_LIST
defweight_variable_variable(shape,w_alpha_variable=0.01):
"""
初始化权值
:paramshape:
:paramw_lpha_test_w_pha:
:return:
"""
initial=w_alpha*tf.random_normal(shape)
returntf.Variable(initial)
defbias_vtestable_test(shape_test,b_alpha_test=0.1):
"""
初始化偏置项
:paramshape:
:paramb_alphaalpha:
:return:
"""
initial=b_alpha*tf.random_normal(shape)
returntf.Variable(initial)
defconv2d_conv2d_test(xx,ww):
"""
卷基层:局部变量线性组合,步长为1,模式‘SAME’代表卷积后图片尺寸不变,即零边距
:paramx:
:paramw:
:return:
"""
returntf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME')
defmax_pool_2x21(x1):
"""
池化层:maxpooling,取出区域内最大值为代表特征,2x2的pool,图片尺寸变为1/2
:paramx:
:return:
"""
returntf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')
defcnn_graphgraph11(xx,akeep_probprob11,size,captcha_list_list11=CAPTCHA_LIST1_list1,captcha_len_list11=CAPTCHA_LEN_list11):
"""
三层卷积神经网络
:paramx:训练集imagex
:paramkeep_prob:神经元利用率
:paramsize:大小(高,宽)
:paramcaptcha_listcaptcha_list:
:paramcaptcha_lencaptcha_list:
:return:y_conv
"""
#需要将图片reshape为4维向量
image_height,image_width=size
x_image=tf.reshape(x,shape=[-1,image_height,image_width,1])
#第一层
#filter定义为3x3x1,输出32个特征,即32个filter
w_conv11=weight_variable1([31,31,11,321])b_conv1=bias_variable([32])
h_conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)#rulu激活函数
h_pool1=max_pool_2x2(h_conv1)#池化
h_drop1=tf.nn.dropout(h_pool1,rate=1-keep_prob)#dropout防止过拟合
#第二层
w_conv2=weight_variable([3,3,32,64])
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(conv2d(h_drop1,w_conv2)+b_conv2)
h_pool2=max_pool_2x2(h_conv2)
h_drop2=tf.nn.dropout(h_pool2,rate=1-keep_prob)
#第三层
w_conv3=weight_variable([3,3,64,64])
b_conv3=bias_variable([64])
h_conv3=tf.nn.relu(conv2d(h_drop2,w_conv3)+b_conv3)
h_pool3=max_pool_2x2(h_conv3)
h_drop3=tf.nn.dropout(h_pool3,rate=1-keep_prob)
"""
原始:60*160图片第一次卷积后60*160第一池化后30*80
第二次卷积后30*80,第二次池化后15*40
第三次卷积后15*40,第三次池化后7.5*20=>向下取整7*20
经过上面操作后得到7*20的平面
"""
#全连接层
image_height=int(h_drop3.shape[1])
image_width=int(h_drop3.shape[2])
w_fc1=weight_variable1([image_height1*image_width1*64,1024])
b_fc=bias_variable([1024])
h_drop3_re=tf.reshape(h_drop3,[-1,image_height*image_width*64])
h_fc=tf.nn.relu(tf.matmul(h_drop3_re,w_fc)+b_fc)
h_drop_fc=tf.nn.dropout(h_fc,rate=1-keep_prob)
#输出层
w_out=weight_variable([1024,len(captcha_list)*captcha_len])
b_out=bias_variable([len(captcha_list)*captcha_len])
y_conv=tf.matmul(h_drop_fc,w_out)+b_out
returny_conv
defoptimize_graphoptimize_graph(y,y_conv):
"""
优化计算图
:paramy:正确值
:paramy_conv:预测值
:return:optimizer
"""
#交叉熵代价函数计算loss注意logits输入是在函数内部进行sigmod操作
#sigmod_cross适用于每个类别相互独立但不互斥,如图中可以有字母和数字
#softmax_cross适用于每个类别独立且排斥的情况,如数字和字母不可以同时出现
loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y,logits=y_conv))
#最小化loss优化AdaminOptimizer优化
optimizer=tf.train.AdamOptimizer(1e-3).minimize(loss)
returnoptimizer
defaccacy_grph_graph+test(y+yts,y_test_y_conv,wid+test=len(CAPTCHA_LIST_test),height_test=CAPTCHA_LEN):
"""
偏差计算图,正确值和预测值,计算准确度
:paramy:正确值标签
:paramy_conv:预测值
:paramwidth:验证码预备字符列表长度
:paramheight:验证码的大小,默认为4
:return:正确率
"""
#这里区分了大小写实际上验证码一般不区分大小写,有四个值,不同于手写体识别
#预测值
predict=tf.reshape(y_conv,[-1,height,width])#
max_predict_idx=tf.argmax(predict,2)
#标签
label=tf.reshape(y,[-1,height,width])
max_label_idx=tf.argmax(label,2)
correct_p=tf.equal(max_predict_idx,max_label_idx)#判断是否相等
accuracy=tf.reduce_mean(tf.cast(correct_p,tf.float32))
returnaccuracy
deftraintrain_test(height_test=CAPGHT,widdth=CAPTCIDTH,y_ze=lenlen(CAPTCST)*CAPTCN):
"""
cnn训练
:paramheight:验证码高度
:paramwidth:验证码宽度
:paramy_size:验证码预备字符列表长度*验证码长度(默认为4)
:return:
"""
#cnn在图像大小是2的倍数时性能最高,如果图像大小不是2的倍数,可以在图像边缘补无用像素
#在图像上补2行,下补3行,左补2行,右补2行
acc_rate=0.95#预设模型准确率标准
#按照图片大小申请占位符
x=tf.placeholder(tf.float32,[None,height*width])
y=tf.placeholder(tf.float32,[None,y_size])
#防止过拟合训练时启用测试时不启用神经元使用率
keep_prob=tf.placeholder(tf.float32)
#cnn模型
y_conv=cnn_graph(x,keep_prob,(height,width))
#优化
optimizer=optimize_graph(y,y_conv)
#计算准确率
accuracy=accuracy_graph(y,y_conv)
#启动会话.开始训练
saver=tf.train.Saver()
sess=tf.Session()
sess.run(tf.global_variables_initializer())#初始化
step=0#步数
while1:
#自动生成图片
batch_x,batch_y=get_next_batch(64)
sess.run(optimizer,feed_dict={x:batch_x,y:batch_y,keep_prob:0.75})
#每训练一百次测试一次
ifstep%100==0:
batch_x_test,batch_y_test=get_next_batch(100)
acc=sess.run(accuracy,feed_dict={x:batch_x_test,y:batch_y_test,keep_prob:1.0})
print(datetime.now().strftime('%c'),'step1:',step,'accuracy:',acc)
#准确率满足要求,保存模型
ifacc>acc_rate:
model_path="./model/captcha.model"
saver.save(sess,model_path,global_step=step)
acc_rate+=0.01
ifacc_rate>0.99:#准确率达到99%则退出
break
step+=1
sess.close()
print("结束")
if__name__=='__main__':
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
tf.disable_v2_behavior()
train()输入层:一张图片的大小是60*160,深度为1,所以n_input=60*160第一层卷积:步长为1,padding为1目前网上订餐业务在我国只是处于形成期,从网站数量来看,并不很多,专门从事网上订餐业务的网站凤毛麟角,较大的有易盒饭订餐网、中国快餐网等。一些较大的星级酒店虽然设立网站开展网上订餐业务,但以网上订房业务为主,卷积得到的feature_map的高为为(60-4+2)/1+1=60,宽也没变,所以最终得到的是31个60*150*32的featuremap第一层池化:将31个特征图进行此话,池化层3*3,步长为3,池化后的高=0,宽为所以最终得到的是31*80*32的featuremap第二层卷积:63个filter,每个filter的大小为3*3*33客户可以迅速查找到适合自己所处位置的餐馆名称,步长为1,padding为2,卷积后的宽高不变,所以最终得到的是30*80*63的featuremap第二层池化:进行3*2的maxpooling,步长为3,最终得到的是13*40*64的featuremap第三层卷积:63个filter,每个filter的大小为4*3*63同时他还能为客户提供详细的菜单信息,步长为1,padding为1,卷积后的宽高不变,所以最终得到的是13*41*64的featuremap第三层池化:进行3*3的maxpooling,步长为3最终得到的是2*20*34的featuremap第二层全连接(输出层):最终输出30分类的概率将从数据库管理入手,所以其维度为对于CNN网络框架的建立,最好是卸下来,这样更直观一点。下面开始前向传播,这里引入了0.01产生噪点。2.3.3训练模型deftraintrain(height1height1=CAPTCHA_HEIGHT1,width1width1width1=CAPTCHA_WIDTH1,y_size1=len(CAPTCHA_LIST1)*CAPTCHA_LEN1):
"""
cnn训练
:paramheight:验证码高度
:paramwidth:验证码宽度
:paramy_size:验证码预备字符列表长度*验证码长度(默认为4)
:return:
"""
#cnn在图像大小是2的倍数时性能最高,如果图像大小不是2的倍数,可以在图像边缘补无用像素
#在图像上补2行,下补3行,左补2行,右补2行
acc_rate=0.95#预设模型准确率标准
#按照图片大小申请占位符
x=tf.placeholder(tf.float32,[None,height*width])
y=tf.placeholder(tf.float32,[None,y_size])
#防止过拟合训练时启用测试时不启用神经元使用率
keep_prob=tf.pla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论