|
目录1、验证码识别原理1.1Tensorflow介绍1.2Tensorflow运行原理1.3卷积神经网络CNN(ConvolutionalNeuralNetworks)2、验证码识别实现步骤2.1安装第三方模块2.1.1安装TensorFlow模块2.2.2安装cuda2.2.3下载cudnn2.2读取验证码样本形成模型2.2.1图片进行预处理2.2.2使用预处理完成的图片训练生成模型3、使用训练出来的模型进行验证码识别3.1Django项目3.2.net项目4、源码及素材下载地址技术交流博主介绍:计算机科班人,全栈工程师,掌握C、C#、Java、Python、Android等主流编程语言,同时也熟练掌握mysql、oracle、sqlserver等主流数据库,能够为大家提供全方位的技术支持和交流。目前工作五年,具有丰富的项目经验和开发技能。提供相关的学习资料、程序开发、技术解答、代码讲解、文档报告等专业服务。🍅文末获取源码🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到我哟《精品项目实战》Python的图像识别已经有一些第三方库可以使用,但是本文将详细介绍使用Python对图像验证码进行识别训练,以及我们对训练后的model的一个使用。首先我们需要准备一些验证码图片并把图片命名为具体的验证码结果,我会将这些素材和源码一同打包,感兴趣的可以下载。1、验证码识别原理机器学习是人工智能的一个子集,它是利用统计技术提供了向计算机“学习”数据的能力,而不需要复杂的编程。简单来说,机器学习可以被定义为一种科学,它使计算机像人类一样行动和学习,并通过以实际交互和观察的形式向他们提供信息和数据,以独立的方式提高他们的学习能力。1.1Tensorflow介绍tensorflow是由谷歌开发,使用比较广泛的深度学习框架,主要用来深度学习(机器学习也用)以及其他涉及大量运算,也是Github上最受欢迎的深度学习;tensorflow在图像分类、音频处理,推荐系统和自然语言处理等领域应用十分广泛,谷歌几乎涉及深度学习或者机器学习的项目,都在使用tensorflow作为运算框架;tensorflow之所以能收到广大开发者的青睐,离不开tensorflow底层优秀的封装,让开发人员能在不了解底层原理的情况下快速上手并且能直接开发。1.2Tensorflow运行原理1.3卷积神经网络CNN(ConvolutionalNeuralNetworks)CNN是一种常用于图像识别、语音识别等领域的深度学习模型。CNN是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。CNN是由输入层、卷积层(convolutionallayer)、池化层(poolinglayer,也称为去样层)、全连接层及输出层构成。卷积层和池化层一般会取若干个,采用卷积层和池化层交替设置,即一个卷积层连接一个池化层,池化层再连接一个卷积层,以此类推。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面具有很强的优势。(1)卷积层:通过卷积操作来提取图像特征通过过滤器(卷积核)来过滤图像各个小区域,从而得到小区域的特征值。(2)池化层:下采样,数据降维,防止过拟合可以从上图中看到,原始图片20x20的,对其进行下采样,采样的窗口为10x10,最终将其下采样称为一个2x2大小的特征图。这么做的主要目的是因为有时候及时做完卷积,图像任然很大(由于卷积核比较小),为了降低数据维度,就进行了下采样。总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。(3)全连接层:输出结果经过卷积层和池化层处理过后的数据输入到全连接层,得到最终想要的结果。经过卷积层和池化层降维过的数据,全连接层才能“跑得动”。2、验证码识别实现步骤环境:Windows10开发工具:PyCharm2.1安装第三方模块2.1.1安装TensorFlow模块根据python版本选择合适的TensorFlow版本,可按如下版本匹配:PythonTensorFlowCUDA3.6.3(64位,TensorFlow只支持64位)tensorflow-gpu1.10.09.0#普通的模块安装:pipinstalltensorflow-gpu#使用镜像地址进行模块安装:pipinstalltensorflow-gpu-ihttps://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple#卸载模块:pipuninstalltensorflow-gpu#指定模块版本进行安装:pipinstalltorch==1.6.0+cu101#使用以下下载好的whl进行安装:pipinstallG:\whl\torch-1.6.0+cu101-cp36-cp36m-win_amd64.whl123456789102.2.2安装cuda下载地址:https://developer.nvidia.com/cuda-toolkit-archive安装完成运行python程序如果报如下错误:ImportError:Couldnotfind'cudnn64_7.dll'.TensorFlowrequiresthatthisDLLbeinstalledinadirectorythatisnamedinyour1请继续下面的操作。2.2.3下载cudnn下载地址:https://developer.nvidia.com/rdp/cudnn-archive选择合适的版本:解压后把bin\cudnn64_7.dll文件拷贝到C:\ProgramFiles\NVIDIAGPUComputingToolkit\CUDA\v9.0\bin目录下,运行程序,如果报错:ImportError:Matplotlibrequiresnumpy>=1.15;youhave1.14.5,则升级numpy。2.2读取验证码样本形成模型2.2.1图片进行预处理一张原始的图片,并不一定每个点或者每个特征都是神经网络所必须的。例如,一张彩色图片做文字识别,可能彩色的信息就不重要,但是为了存储颜色一般需要花费3倍的数据空间。或者在图像上有很多小小的噪音点,这些点对图像的识别没有用处,反而有反效果。这种在正式处理运算之前对图像的操作,叫做图像数据的预处理。灰度化:将灰度图变为黑白图,黑白图上只有纯黑色和纯白色两种颜色。这种情况有助于过滤掉无关信息,而关注于主要的区域,或者图像区域的边界。二值化:二值化一般使用阈值法,即设置一个阈值,如果灰度大于阈值设为255,小于阈值设为0,这时阈值的选择就成了关键。python中二值化可以使用opencv模块提供了threshold方法对图片进行二值化,需要先安装opencv。实现代码如下:importosimporttensorflowastfimportcv2#原始图片路径img_path='F:\\train\\img\\'#灰度化的图片路径gray_path='F:\\train\\gray\\'defrgb_to_gray_scale():#读取immg下的图片i=0fornameinos.listdir(img_path):i=i+1ifi>500:withtf.Session()assess:img=tf.read_file(img_path+name)#灰度化img_data=tf.image.decode_jpeg(img,channels=3)#解码gray_img=sess.run(tf.image.rgb_to_grayscale(img_data.eval()))#灰度化#二值化一般使用阈值法,即设置一个阈值retval,im_at_fixed=cv2.threshold(gray_img,185,255,cv2.THRESH_BINARY)cv2.imwrite(gray_path+name,im_at_fixed)#保存图片print("灰度化以及二值化完成")rgb_to_gray_scale()123456789101112131415161718192021222324252627如下彩色图像经过处理得到2.2.2使用预处理完成的图片训练生成模型(1)导入包并定于根据实际情况设置常量importtensorflowastfimportnumpyasnpfromPILimportImageimportosimportrandomimportcv2train_data_dir=r'F:\train\gray'#根据实际情况替换test_data_dir=r'F:\train\img'#图片高度IMAGE_HEIGHT=23#图片宽度IMAGE_WIDTH=68#验证码的长度MAX_CAPTCHA=4#验证码字符集个数(如本次只有纯数字,所以字符集格式为10[0-9])CHAR_SET_LEN=10X=tf.placeholder(tf.float32,[None,IMAGE_HEIGHT*IMAGE_WIDTH])Y=tf.placeholder(tf.float32,[None,MAX_CAPTCHA*CHAR_SET_LEN])keep_prob=tf.placeholder(tf.float32)#dropout12345678910111213141516171819202122(2)灰度处理函数和标签处理函数defconver2gray(img):iflen(img.shape)>2:gray=np.mean(img,-1)returngrayelse:returnimgdeftext2vec(text):try:text_len=len(text)iftext_len>MAX_CAPTCHA:raiseValueError('longerthan4')vector=np.zeros(MAX_CAPTCHA*CHAR_SET_LEN)fori,cinenumerate(text):idx=i*CHAR_SET_LEN+int(c)#[1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0....]一共四十个元素里面只有四个元素为1vector[idx]=1returnvectorexceptExceptionase:print(text)12345678910111213141516171819(3)获取验证码图片的缩影路径#获取所有验证码图片def_get_filenames_and_classes(dataset_dir):photo_filenames=[]forfilenameinos.listdir(dataset_dir):#获取文件路径path=os.path.join(dataset_dir,filename)photo_filenames.append(path)returnphoto_filenames12345678(4)由于cnn计算每次需要随机选择一批量的照片,所以需要批次提取照片函数defgen_train_data(batch_size=32):#生成训练数据train_file_name_list=os.listdir(train_data_dir)selected_train_file_name_list=random.sample(train_file_name_list,batch_size)batch_x=np.zeros([batch_size,IMAGE_HEIGHT*IMAGE_WIDTH])batch_y=np.zeros([batch_size,MAX_CAPTCHA*CHAR_SET_LEN])i=0forselected_train_file_nameinselected_train_file_name_list:captcha_image=Image.open(os.path.join(train_data_dir,selected_train_file_name))captcha_image=np.array(captcha_image)image=conver2gray(captcha_image)#获取labellabels=selected_train_file_name.split('\\')[-1][0:4]batch_x[i,:]=image.flatten()/255batch_y[i,:]=text2vec(labels)i=i+1returnbatch_x,batch_y1234567891011121314151617181920(5)cnn训练算法defcnn(w_alpha=0.01,b_alpha=0.1):x=tf.reshape(X,shape=[-1,IMAGE_HEIGHT,IMAGE_WIDTH,1])w_c1=tf.Variable(w_alpha*tf.random_normal([3,3,1,32]))b_c1=tf.Variable(b_alpha*tf.random_normal([32]))conv1=tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(x,w_c1,strides=[1,1,1,1],padding='SAME'),b_c1))conv1=tf.nn.max_pool(conv1,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')conv1=tf.nn.dropout(conv1,keep_prob)w_c2=tf.Variable(w_alpha*tf.random_normal([3,3,32,64]))b_c2=tf.Variable(b_alpha*tf.random_normal([64]))conv2=tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv1,w_c2,strides=[1,1,1,1],padding='SAME'),b_c2))conv2=tf.nn.max_pool(conv2,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')conv2=tf.nn.dropout(conv2,keep_prob)w_c3=tf.Variable(w_alpha*tf.random_normal([3,3,64,64]))b_c3=tf.Variable(b_alpha*tf.random_normal([64]))conv3=tf.nn.relu(tf.nn.bias_add(tf.nn.conv2d(conv2,w_c3,strides=[1,1,1,1],padding='SAME'),b_c3))conv3=tf.nn.max_pool(conv3,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME')conv3=tf.nn.dropout(conv3,keep_prob)#全连接层w_d=tf.Variable(w_alpha*tf.random_normal([3*9*64,1024]))b_d=tf.Variable(w_alpha*tf.random_normal([1024]))dense=tf.reshape(conv3,shape=[-1,w_d.get_shape().as_list()[0]])dense=tf.nn.relu(tf.add(tf.matmul(dense,w_d),b_d))dense=tf.nn.dropout(dense,keep_prob)w_out=tf.Variable(w_alpha*tf.random_normal([1024,MAX_CAPTCHA*CHAR_SET_LEN]))b_out=tf.Variable(b_alpha*tf.random_normal([MAX_CAPTCHA*CHAR_SET_LEN]))out=tf.add(tf.matmul(dense,w_out),b_out)returnout12345678910111213141516171819202122232425262728293031(6)训练函数deftrain_cnn()utput=cnn()loss=tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=output,labels=Y))optimizer=tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)predict=tf.reshape(output,[-1,MAX_CAPTCHA,CHAR_SET_LEN])max_idx_p=tf.argmax(predict,2)max_idx_l=tf.argmax(tf.reshape(Y,[-1,MAX_CAPTCHA,CHAR_SET_LEN]),2)correct_pred=tf.equal(max_idx_p,max_idx_l)accuracy=tf.reduce_mean(tf.cast(correct_pred,tf.float32))saver=tf.train.Saver()withtf.Session()assess:sess.run(tf.global_variables_initializer())step=0whileTrue:batch_x,batch_y=gen_train_data(64)_,loss_=sess.run([optimizer,loss],feed_dict={X:batch_x,Y:batch_y,keep_prob:0.75})print('step+loss',step,loss_)#每100step计算一次准确率ifstep%10==0:batch_x_test,batch_y_test=gen_train_data(100)acc=sess.run(accuracy,feed_dict={X:batch_x_test,Y:batch_y_test,keep_prob:1.})print('step+acc',step,acc)#如果准确率大于50%,保存模型,完成训练ifloss_
{%csrf_token%}123456789101112131415启动项目获取验证码接口:http://ip:端口/yzm/,如果请求方式为GET,弹出如下页面使用。识别结果如下3.2.net项目注:如果你的服务器使用CPU来处理图像,CPU和GPU图像处理能力有差别,所以如果连续快速识别可能会出现异常。4、源码及素材下载地址下载地址:https://download.csdn.net/download/xch_yang/89306923技术交流大家点赞、收藏、关注、评论啦!精彩专栏推荐订阅:在下方专栏👇🏻👇🏻👇🏻👇🏻《精品项目实战》更多技术干货,请持续关注程序员大佬超。原创不易,转载请务必注明出处。
|
|