通过python实现验证码自动识别系统

发布于:2022-12-03 ⋅ 阅读:(131) ⋅ 点赞:(0)

目录
1 ; 引言(Introduction) 3
2 ; 图片预处理(Image preprocessing) 3
2.1 ; 灰度化 3
2.2 ; 二值化处理 3
2.3 ; 求连通域面积去噪点处理 4
3 ;利用CNN进行样本训练(Sample training using CNN ) 4
3.1 ; 卷積神经网络概述 4
3.2 ; 模型训练 4
3.2.1 ; 图片信息代码化 5
3.2.2 ; 定义函数 5
3.2.3 ; 生成采样集 5
3.2.4 ; 定义卷积神经网络结构 5
3.2.5 ; 训练样本集 5
3.3 ; 模型预测 6
4 ; 结论(Conclusion) 15
参考文献(References) 16
3 ;利用CNN进行样本训练(Sample training using CNN )
3.1 ; 卷積神经网络概述
卷积神经网络是近几年发展起来,被不断重视的一种用于高效识别的网络引擎[6]。20世纪60年代,Hubel和Wiesel研究猫脑皮层中用于局部敏感,以及方向选择的神经元时发现了其独特的网络结构可以有效降低反馈神经网络的复杂性,继而提出卷积神经网络(Convolutional Neural Networks,CNN)[7]。
CNN由三种不同的层组成,分别是:卷积层、池化层、密集层或全连接层。
卷积层:假设某张图片有55个像素,其中1代表白,0代表黑,这幅图就被视为是一张55的单色图像。现在用一个由随机的0和1组成的33矩阵去和图像中的字区域做乘法,每次迭代移动一个像素,这样该乘法就会得到一个全新的33矩阵,这个矩阵被叫作滤波器[8],它的任务是提取图像特征,它使用一种优化算法来决定这个33矩阵中具体的0和1。在神经网络的卷句层中需要使用许多这种滤波器来提取多个特征,这个33矩阵的每一个单个步骤被称作步幅[9]。
池化层:池化层主要使用不同的函数为其中的输入矩阵降维。一般情况下,最大池化层出现在卷积层之后。池化层使用22矩阵,利用与卷积层相同的方式处理图像,不过它的目的是为了给图像本身进行降维操作。
全连接层:全连接层位于之前一层和激活函数之间[10]。
3.2 ; 模型训练
3.2.1 ; 图片信息代码化
首先,先输入图片的信息作为备用,通过图片属性可以得知是114
450像素的,最多包含6个字母,每个字母我们利用0和1来进行数字化表示,比如a可以数字化为10000000000000000000000000,b可以数字化为01000000000000000000000000,以此类推。基于以上的信息,我们在代码中将其表示为:
IMAGE_HEIGHT=114
IMAGE_WIDTH =450
MAX_CAPTCHA=6
CHAR_SET_LEN=26
3.2.2 ; 定义函数
定义一个从本文训练集中提取图片的函数,此处有一步预处理被省略,即将训练集图片重命名,以简化到只需获取验证码的名称和图片即可,其中以矩阵的形式返回图片[11]。再定义两个函数,一个将名字转换为向量,另一个将向量转换为名字。
3.2.3 ; 生成采样集
首先本文通过之前定义的get_name_and_image()函数得到的图片已经被以含布尔值的矩阵形式返回了,接下来通过语句1*(image.flatten())将其转换成1行114450列的只含有0和1的矩阵,从而生成采样集。本文转载自http://www.biyezuopin.vip/onews.asp?id=14635代码如图2所示。
3.2.4 ; 定义卷积神经网络结构
通过方案选择,本文采用3+1的结构,即三个卷积层加上一个全连接层来定义卷积神经网络结构。在每个卷积层中,都选择使用2
2的最大池化层和一个随机失活(dropout)层,其中卷积核尺寸选择的是55。在全连接层中,原始图片114450的结果经过了三层池化层,其长和宽都被压缩了八倍,也就是15*57左右的大小。
3.2.5 ; 训练样本集
当把结构设计完成后,就可以开始训练样本集了,通过交叉熵(Cross Entropy)函数sigmoid_cross_entropy_with_logits()来比较其中的loss值[12],并采用adam优化器来进行优化。训练中,每一步的loss值都要输出,每100步的准确率也要输出。通过设置,本文这里将目标准确率设置为99%,即只有当样本训练准确率达到了99%后,才会结束训练。
训练结束后,得到模型输出文件,训练部分到这里就结束了。

while True:
    time.sleep(1)
    try:
        elem_submit = driver.find_element_by_id('order-submit')
        elem_code = driver.find_element_by_id('checkcodeTxt')

        # 如果验证码已经有了,则跳过,等待页面跳转
        if getattr(elem_code, 'text'):
            continue
        # 终于到验证码的问题了
        img_code_path = crop_image_code(box=(740,101, 926,146))
        img_code_2 = sharpness_image_code('./' + img_code_path)
        code = image_file_to_string('D:\\python-learning\learning-group\library-auto\\' + img_code_2)
        if code:
            # 填入验证码,并提交
            elem_code.send_keys(code)
            elem_submit.click()
        else:
            # 刷新验证码
            driver.find_element_by_id('orderCheckCodeImg').click()
    except Exception:
        if driver.window_handles[1]:
            driver.switch_to.window(driver.window_handles[1])
            driver.get_screenshot_as_file('./success.jpg')
            break;
![在这里插入图片描述](https://img-blog.csdnimg.cn/db621fffdd034a04874f27a77355fe63.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/ddda4d24e1314d0d8b30848270382b33.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/68669e7ebf38488893f64d828f2f0f25.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/5c8353b2db5f49c085d1b014bb967ee8.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/221640f5d1c446de95f9985a980a7d16.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/40443892847c448b88e15ef97b78f1a0.png#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/d7a369d201b74a4baf2fa3d18aa4caf4.png#pic_center)


网站公告

今日签到

点亮在社区的每一天
去签到