验证码破解没有训练集?我教你生成一万个!

你好,我是悦创。

对于验证码破解,很多机构都停留于云打码、OCR 等基础破解方法,当然不能否认这些方法的便捷性,但机构不讲的原因,你得品,你细细品。

不过我想给你分享的则是深度学习识别验证码,别慌!其实并不难。这次我将分多篇给你分享验证码数据集生成、验证码生成库、深度学习识别验证码、滑动验证码。希望对你有所帮助,也希望你关注加星号,我的公众号:AI悦创,你的支持是我创作的动力!

对于验证码数据集生成,我第一想到的就是通过一些类库生成与需要破解的验证码类似的数量级,当然这会花费你一定的时间。今天我给大家推荐一个 Python 生成验证码的第三方库,并且我们来生成自己的数据集。

1. captcha 的安装

对于 captcha 的安装其实非常简单,使用如下命令:

pip install captcha

如果安装失败,可以去该链接:https://pypi.org/project/captcha/#files 下载 whl 文件,直接离线安装。

如何生成验证码呢?我直接给大家上两个生成验证码的代码。

第一种:

"""
project = 'Code', file_name = 'Demo_1.py', author = 'AI悦创'
time = '2020/5/11 22:55', product_name = PyCharm, 公众号:AI悦创
code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
"""
from captcha.image import ImageCaptcha
import random


list = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        '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',
        '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']

# 定义验证码尺寸
width, height = 170, 80

#生成一万张验证码
for i in range(10000):
    generator = ImageCaptcha(width=width, height=height)


    # 从list中取出4个字符
    random_str = ''.join([random.choice(list) for j in range(4)])
    # 生成验证码
    img = generator.generate_image(random_str)
    # 在验证码上加干扰点
    generator.create_noise_dots(img, '#000000', 4, 40)

    # 在验证码上加干扰线
    generator.create_noise_curve(img, '#000000')

    # 将图片保存在目录yzm文件夹下
    file_name = './yanzhengma/'+random_str+'_'+str(i)+'.jpg'
    img.save(file_name)

关于每一句代码的意思,我都写在注释里了,所以这里不会过多的阐述。

第二种:

"""
project = 'Code', file_name = 'Demo_2.py', author = 'AI悦创'
time = '2020/5/11 23:13', product_name = PyCharm, 公众号:AI悦创
code is far away from bugs with the god animal protecting
    I love animals. They taste delicious.
"""
import sys
import os
import shutil
import random
import time
from captcha.image import ImageCaptcha

# 用于生成验证码的字符集
CHAR_SET = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
# 字符集的长度
CHAR_SET_LEN = 10
# 验证码的长度,每个验证码由4个数字组成
CAPTCHA_LEN = 4

# 验证码图片的存放路径
CAPTCHA_IMAGE_PATH = 'images/'
# 用于模型测试的验证码图片的存放路径,它里面的验证码图片作为测试集
TEST_IMAGE_PATH = 'test/'
# 用于模型测试的验证码图片的个数,从生成的验证码图片中取出来放入测试集中
TEST_IMAGE_NUMBER = 100


# 生成验证码图片,4位的十进制数字可以有10000种验证码
def generate_captcha_image(charSet=CHAR_SET, charSetLen=CHAR_SET_LEN, captchaImgPath=CAPTCHA_IMAGE_PATH):
    k = 0
    total = 1
    for i in range(CAPTCHA_LEN):
        total *= charSetLen

    for i in range(charSetLen):
        for j in range(charSetLen):
            for m in range(charSetLen):
                for n in range(charSetLen):
                    captcha_text = charSet[i] + charSet[j] + charSet[m] + charSet[n]
                    image = ImageCaptcha()
                    image.write(captcha_text, captchaImgPath + captcha_text + '.png') # 图片格式改成其他可能会有问题
                    k += 1
                    sys.stdout.write("\rCreating %d/%d" % (k, total))
                    sys.stdout.flush()


# 从验证码的图片集中取出一部分作为测试集,这些图片不参加训练,只用于模型的测试
def prepare_test_set():
    fileNameList = []
    for filePath in os.listdir(CAPTCHA_IMAGE_PATH):
        captcha_name = filePath.split('/')[-1]
        fileNameList.append(captcha_name)
    random.seed(time.time())
    random.shuffle(fileNameList)
    for i in range(TEST_IMAGE_NUMBER):
        name = fileNameList[i]
        shutil.move(CAPTCHA_IMAGE_PATH + name, TEST_IMAGE_PATH + name)


if __name__ == '__main__':
    generate_captcha_image(CHAR_SET, CHAR_SET_LEN, CAPTCHA_IMAGE_PATH)
    prepare_test_set()
    sys.stdout.write("\nFinished")
    sys.stdout.flush()

# 运行结果
Creating 10000/10000
Finished

这是为下一步通过CNN对验证码进行识别做准备,当然captcha也可以生成字母数字同时存在的以及设置字体什么的,功能还是很全的。

数字生成的结果如下图:

图一-1

该函数库可以生成任意形式的数字字符类验证码,只要在创建对象时:

captcha = ImageCaptcha(fonts=['/path/to/A.ttf', '/path/to/B.ttf']) 即可修改字体,利用该类中write函数,可以将任意长度数量的字符改为验证码。

不过上面的 ImageCaptcha 还可以定义一些参数:

图一

从源码中我们可以看到还可以定义字体、字体大小,当然这个根据你所要破解的验证码来决定。

最后大家看下我生成的验证码照片:

图二

图三

总结

其实大家可以发现 Python 的这个库并没有想象的那么强大,这里我要给大家推荐另一个库,只不过它不是 Python 的,而是 Java 的,它所能设置的参数更加的详细。如果本文超过20在看,下篇文章我将详细的给大家介绍。

有关于验证码训练的教程,欢迎关注本公众号,之后为你双手奉上!

AI悦创·创造不同!
AI悦创 » 验证码破解没有训练集?我教你生成一万个!

Leave a Reply