python入门教程之识别验证码

yizhihongxing

那我来讲解关于“Python入门教程之识别验证码”的攻略。

1. 前言

验证码是目前防止自动化机器人攻击的一种重要方式。而在自动化测试、爬虫等场景下,我们又需要自动识别验证码。因此,学习如何识别验证码也是学习Python的重要一环。

2. 主要技术

本教程将采用Python 3.7版本,涉及到如下技术:

  • 图像处理

  • 机器学习

  • 神经网络

3. 环境和库的准备

首先我们需要准备开发环境,这里我们建议使用Anaconda来安装Python。然后我们需要安装相关库来进行图像处理、机器学习以及神经网络的开发。这里数Python基本的库:NumPy、SciPy等。在机器学习和神经网络的开发中,我们推荐使用tensorflow。

4.验证码的识别过程

验证码的识别主要涉及以下几个步骤:

  • 数据集的准备

  • 图像预处理

  • 训练模型

  • 验证码测试

4.1 数据集的准备

为了训练模型,我们需要一个包含验证码的数据集,这里我们可以直接通过网络爬虫爬取,或者通过收集公开数据集来获取。可以通过以下方式获取训练集:

import requests
import os

def save_image(url, filename):
    with open(filename, "wb") as f:
        f.write(requests.get(url).content)

def download_captcha(count):
    for i in range(count):
        url = "http://www.example.com/captcha/{0}.png".format(str(i))
        filename = os.path.join("captcha", "{0}.png".format(str(i)))
        save_image(url, filename)

if __name__ == '__main__':
    download_captcha(10000)   #下载10000个验证码

4.2 图像预处理

预处理是为了让原始图像更适合机器学习或神经网络算法的处理,预处理中可以包括以下技术:

  • 二值化

  • 去噪

  • 分割

import glob
import cv2

def preprocess_image(image_path):
    gray = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
    gray = cv2.resize(gray, (200, 60))
    _, binary = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY)
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
    binary = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
    binary = cv2.medianBlur(binary, 3)
    return binary

if __name__ == '__main__':
    paths = glob.glob(os.path.join("captcha", "*.png"))
    for image_path in paths:
        binary = preprocess_image(image_path)
        cv2.imwrite(os.path.join("captcha_preprocessed", os.path.basename(image_path)), binary)

4.3 训练模型

这里我们使用tensorflow来训练一个卷积神经网络模型(CNN),用于识别验证码:

import tensorflow as tf
import os

def train_cnn():
    char_set = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    char_set_len = len(char_set)
    input_height, input_width = 60, 200
    input_channel = 1
    batch_size = 100
    epochs = 100
    output_node_names = "output"
    model_dir = os.path.join("captcha_model", "model.ckpt")

    X = tf.placeholder(tf.float32, [None, input_height, input_width, input_channel])
    Y = tf.placeholder(tf.float32, [None, char_set_len * 4])

    logits = cnn(X, char_set_len)
    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=Y))
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)

    predict = tf.reshape(logits, [-1, 4, char_set_len])
    max_pred = tf.argmax(predict, axis=2)
    decoded_pred = tf.reduce_join(tf.transpose(tf.argmax(predict, axis=2), perm=[1, 0]), 1)

    saver = tf.train.Saver()
    with tf.Session() as session:
        session.run(tf.global_variables_initializer())
        for epoch in range(epochs):
            avg_loss = 0.
            total_batch = int(len(X_train) / batch_size)
            for i in range(total_batch):
                batch_X = X_train[i*batch_size:(i+1)*batch_size]
                batch_Y = Y_train[i*batch_size:(i+1)*batch_size]
                _, c = session.run([optimizer, loss], feed_dict={X: batch_X, Y: batch_Y})
                avg_loss += c / total_batch
            print("Epoch:", '%d' % (epoch + 1), "cost=", "{:.9f}".format(avg_loss))

        saver.save(session, model_dir)
        print("Model saved!")

if __name__ == '__main__':
    train_cnn()

4.4 验证码测试

训练好模型后,我们可以用训练好的模型去测试验证码的识别效果了。验证码测试主要步骤如下:

  • 从验证码中分割出4个字符

  • 对每个字符进行预处理

  • 利用模型进行识别

import glob
import cv2
import os
import numpy as np
import tensorflow as tf

def test_captcha():
    char_set = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
    char_set_len = len(char_set)
    input_height, input_width = 60, 200
    input_channel = 1
    model_dir = os.path.join("captcha_model", "model.ckpt")

    X = tf.placeholder(tf.float32, [None, input_height, input_width, input_channel])
    logits = cnn(X, char_set_len)
    predict = tf.reshape(logits, [-1, 4, char_set_len])
    max_pred = tf.argmax(predict, axis=2)
    decoded_pred = tf.reduce_join(tf.transpose(tf.argmax(predict, axis=2), perm=[1, 0]), 1)

    saver = tf.train.Saver()
    with tf.Session() as session:
        saver.restore(session, model_dir)
        paths = glob.glob(os.path.join("captcha", "*.png"))
        for image_path in paths:
            image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
            _, binary = cv2.threshold(image, 100, 255, cv2.THRESH_BINARY)
            contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
            c_len = len(contours)
            if c_len != 4:
                print("can't recognize captcha.")
                continue
            part_digits = []
            for j in range(c_len):
                x, y, w, h = cv2.boundingRect(contours[j])
                part_image = binary[y:y+h, x:x+w]
                part_image = cv2.resize(part_image, (input_width, input_height))
                part_digits.append(part_image)
            part_digits_array = np.array(part_digits) / 255.0
            predict_res = session.run(decoded_pred, feed_dict={X: part_digits_array[:, :, :, np.newaxis]})
            print(predict_res)

if __name__ == '__main__':
    test_captcha()

以上就是关于“Python入门教程之识别验证码”的攻略了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python入门教程之识别验证码 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 用Python实现写倒序输出(任意位数)

    用Python实现写倒序输出(任意位数)攻略 问题描述 在Python中实现一个函数,能够输入任意整数并输出其逆序的结果。 思路分析 我们可以先将输入的整数转换成字符串,再将字符串逆序输出即可,下面是该函数的伪代码: def reverse_num(num): 1. 将输入的数字转化为字符串 2. 将字符串逆序输出 代码实现 下面是该函数的Python代码实…

    python 2023年6月5日
    00
  • Python栈算法的实现与简单应用示例

    下面是详细讲解“Python栈算法的实现与简单应用示例”的完整攻略,包含两个示例说明。 栈算法 栈是一种常用的数据结构,它具有后进先出(LIFO)的特点。栈的基本操作包括入栈(push)、出栈(pop)、看栈顶元素(peek)和判断栈是否为空(isEmpty)等。 Python实现栈算法 要实现栈算法,可以使用Python中列表(list)来模拟栈。以下是算…

    python 2023年5月14日
    00
  • python3 实现验证码图片切割的方法

    下面是详细讲解“python3 实现验证码图片切割的方法”的完整攻略。 步骤一:安装必要的库 使用 Python3 实现验证码图片切割需要用到Pillow和numpy库,如果没有安装的话可以使用以下命令进行安装: pip3 install Pillow numpy 步骤二:读取验证码图片 使用Pillow库读取验证码图片可以很方便地获取每个像素的RGB值,这…

    python 2023年6月3日
    00
  • python实现微信机器人: 登录微信、消息接收、自动回复功能

    Python实现微信机器人:登录微信、消息接收、自动回复功能 本文将介绍如何使用Python实现微信机器人,主要包括登录微信、消息接收和自动回复功能。这个机器人可以自动反应好友的消息,在接收到特定关键字时自动回复。 实现思路 要实现微信机器人,我们需要用到itchat这个Python库。itchat可以模拟微信客户端的行为,实现登录、消息接收等功能。具体来说…

    python 2023年5月23日
    00
  • 如何使用Python批量更新数据库中的数据?

    以下是如何使用Python批量更新数据库中的数据的完整使用攻略。 使用Python批量更新数据库中的数据的前提条件 在使用Python批量更新数据库中的数据前,需要确已经安装并启动了支持更新数据的数据库,例如MySQL或PostgreSQL,并需要安装Python的相应数据库驱动程序例如mysqlconnector-python或psycopg2。 步骤1:…

    python 2023年5月12日
    00
  • 详解MySQL用事件调度器Event Scheduler创建定时任务

    下面是详解MySQL用事件调度器Event Scheduler创建定时任务的完整攻略: 什么是MySQL事件调度器 MySQL事件调度器(Event Scheduler)是MySQL数据库中的一种内置的定时任务调度器,可以自动执行存储过程、函数或SQL语句,并在指定的时间间隔内进行周期性的重复执行,实现了MySQL数据库的自动化管理和维护。我们可以利用MyS…

    python 2023年6月13日
    00
  • python中json.dumps()和json.loads()的用法

    下面是Python中json.dumps()和json.loads()的用法的详细讲解: 1. json.dumps() json.dumps()函数是将Python对象编码成JSON格式的字符串。语法格式如下: json.dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, a…

    python 2023年6月3日
    00
  • python调试器中的所有变量都未定义

    【问题标题】:all variables are undefined in python debuggerpython调试器中的所有变量都未定义 【发布时间】:2023-04-03 06:54:01 【问题描述】: 我在 Python 3.6 上遇到了一个非常奇怪的问题。在我的代码中间,我调用import pdb; pdb.set_trace() 来调试一些…

    Python开发 2023年4月8日
    00
合作推广
合作推广
分享本页
返回顶部