卷积神经网络实现字符型验证码的破解

前段时间实现了滑动验证码的破解,只是简单的利用opencv来进行缺口位置识别,然后用selenium进行人为拖动,实现方式上没有用到神经网络,没有凸显出深度学习的强大。赶巧,最近又接到一个字符型验证码破解的求助,于是想使用神经网络来实现。

字符型的验证码估计大家也都习以为常了,先来看下我接到的字符型验证码如下:在这里插入图片描述

比较幸运的是,每张图片的名字就是图片里验证码的内容,这个对于我来说,就省了90%的工程(不需要去手工打标签,标注每张图片的内容了),这些就是我们的训练集了,我们的神经网络输入就是这些照片,而神经网络的输出就是这些照片的名称(忽略掉.jpg)。

谈到图像的处理与识别,首先想到的神经网络就是大名鼎鼎得CNN网络(卷积神经网络),它在图像处理领域有着独特的优势和广泛的应用。如果你对CNN了解不多,建议去看下CNN实现mnist手写体数据集的识别,这里就不做过多讲解了。

这里先简单介绍下用的框架和包,搭建神经网络,首先要用到的就是tensorflow,本文是基于tensorflow来实现的,对图像的处理,就不得不提到opencv,本文是用opencv来读取图片和对图片进行一些列的操作,最后用的是numpy包,这个用来做数组处理的。当然可视化部分需要用到matplotlib.pyplot。

import cv2
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as mlt

从图片中,我们可以看到验证码都是数字加小写的英文字母,这个我们需要建立一个字典,将小写字母转成数字,以便于神经网络的输出。

import string
label_dict={}
characters = string.digits + string.ascii_lowercase
for i,x in enumerate(characters):
    label_dict[x]=i

接下来是定义一些卷积神经网络中的一些常用函数,卷积函数,池化函数,权重和偏置生成函数。至于卷积和池化操作,不懂的童鞋自行百度。

def conv2d(x,w):
    return tf.nn.conv2d(x,w,strides=[1,1,1,1],padding='SAME',name='conv2d')
def max_pool(x):
    return tf.nn.max_pool(x,ksize=[1,2,2,1],strides=[1,2,2,1],padding='SAME',name='maxpool')
def weight_variable(shape):
    return tf.Variable(tf.truncated_normal(shape,stddev=0.1))
def bias_variable(shape):
    return tf.Variable(tf.constant(0.1,shape=shape))

一、搭建神经网络
这里选择搭建输入层—>隐藏层1—>隐藏层2—>隐藏层3—>全连接层—>输出层的神经网络结构。
x的形状是[None,25x60],None代表每次输入多少张图片,每张图片是(25,60)形状的数组,将其所有内容放到1行里面,转成最后(1,25x60)形式。将验证码转换为训练时用的标签向量,维数是(4x36)例如验证码是‘2ax8’,则对应的输出是[0 0 1 0 0 0…0 0 0 0 0,
0 0 0 0 0 0…1 0 0 0 0 0,
0 0 0 0 0 0 …0 0 1 0 0 0,
0 0 0 0 0 0 0 1… 0 0 0 0 ]
数组中1的位置代表该行代表那个字母或者数字。

xs=tf.placeholder(tf.float32,shape=[None,25*60],name='x')
ys=tf.placeholder(tf.float32,shape=[None,36*4],name='label-input')
keep_prob = tf.placeholder(tf.float32, name='keep-prob')

卷积,采用的卷积核为5*5

#第一层卷积
w_conv1=weight_variable([5,5,1,32])
b_conv1=bias_variable([32])
x_image=tf.reshape(xs,[-1,25,60,1],name='x-input')
h_conv1=tf.nn.relu(conv2d(x_image,w_conv1)+b_conv1)
pool_1=max_pool(h_conv1)
pool_1=tf.nn.dropout(pool_1,keep_prob)

#第二层卷积
w_conv2=weight_variable([5,5,32,64])
b_conv2=bias_variable([64])
h_conv2=tf.nn.relu(conv2d(pool_1,w_conv2)+b_conv2)
pool_2=max_pool(h_conv2)
pool_2=tf.nn.dropout(pool_2,keep_prob)

#第三层卷积
w_conv3=weight_variable([5,5,64,64])
b_conv3=bias_variable([64])
h_conv3=tf.nn.relu(conv2d(pool_2,w_conv3)+b_conv3)
pool_3=max_pool(h_conv3)
pool_3=tf.nn.dropout(pool_3,keep_prob)

接下来就是实现全连接层和输出层

#全连接层
w_fc_1=weigh
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值