令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

版权声明:禁止转载至其它平台,转载至博客需带上此文链接。 https://blog.csdn.net/qq_41841569/article/details/85029217

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

实验背景

验证码是反爬虫的利器,传统的方法需要字符切割,字符识别,但是对于字符重叠的,字符扭曲的情况,识别效果差。本实验本着实验精神,利用深度学习进行端对端的验证码识别。

学习Python中有不明白推荐加入交流群
                号:960410445
                群里有志同道合的小伙伴,互帮互助,
                群里有不错的视频学习教程和PDF!

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

实验器材

● alexnet

● tensorflow

● captcha

实验内容

数据集生成

验证码识别训练数据集采用captcha python插件来生成,验证码图片生成的同时,标签也生成了。

pip install captcha

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

ps: 同一个验证码生成训练集存在样式单一的问题,可以通过爬虫的方式,下载不同样式的验证吗,唯一的耗时的需要人工的进行标签识别。所以说ImageNet数据集才显得那么重要。

本实验生成数字和小写字母的4个随机的验证码,供20W张图片(160*60)。

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

将数据集转换成tfrecord文件,这里配合网络模型,4个输出标签对应4个验证字符。

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

深度学习网络结构

本实验利用alexnet(5个conv+3个全连接,输入图像大小为224*224)来训练验证码的识别器。直接采用slim里的网络模型。

本实验为了识别验证码中的4个字符,采用多目标标签的方式,即一个输入,有多个输出标签,实现中对alexnet的输出和损失函数做了调整,在原来的第8个全连接一个输出,改成4个输出。如下:

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

损失函数为4个输出的损失的均值

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

网络结构:

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

训练

训练超参数说明

epoch:200000学习率:0.0001

训练过程中有一个比较奇特的现象,在9k次迭代之前,loss损失似乎徘徊不定(看不到要收敛的趋势)和精确度也很低(只有8%不到)(差点失去信心了)。 在9k次迭代之后,loss损失慢慢降低,逐步收敛。训练精确度也达到92%以上。训练时间大概在30分钟

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

识别结果

usage: test_one.py [-h] [--image_num IMAGE_NUM] [--image_dir IMAGE_DIR]
 [--tf_data_dir TF_DATA_DIR]
 [--check_point_dir CHECK_POINT_DIR] [--gpu GPU]
 [--learning_rate LEARNING_RATE] [--batch_size BATCH_SIZE]
 [--epoch_size EPOCH_SIZE] [--img_file IMG_FILE]
python test_one.py --img_file ./images/001y.jpg --batch_size 1
2018-12-13 23:10:00.440321: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX
2018-12-13 23:10:00.788711: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1392] Found device 0 with properties: 
name: GeForce GTX 1080 Ti major: 6 minor: 1 memoryClockRate(GHz): 1.582
pciBusID: 0000:02:00.0
totalMemory: 10.91GiB freeMemory: 10.45GiB
2018-12-13 23:10:00.788784: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1471] Adding visible gpu devices: 0
2018-12-13 23:10:01.133237: I tensorflow/core/common_runtime/gpu/gpu_device.cc:952] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-12-13 23:10:01.133304: I tensorflow/core/common_runtime/gpu/gpu_device.cc:958] 0 
2018-12-13 23:10:01.133333: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0: N 
2018-12-13 23:10:01.133780: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 5586 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)
./checkpoint/crack_captcha.model-141300
predict: 0 0 1 y

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

令人感到过分,又跑出来教人用python破解验证码,还是可训练模型

0和o 有时候识别的不是很好。人眼无法分清的模型有时候能分的清楚。

实验结语

本实验WedO创客实验和大家一个训练了一个识别验证码的模型,对于生成的同样样式的验证码识别效果还是不错的。

目前还存在几个问题:

  • 对于其他样式的验证码识别效果不好,优化的思路:增加其他验证码的训练数据(一种方法是利用爬虫方式爬取各种不同的验证码,就是要耗费时间来人工标注)。目前来看,不同的验证码系统需要单独训练一个解码器。
  • 验证码的字符个数,实验中定为4个。要是其他长度的验证码无法使用。

猜你喜欢

转载自blog.csdn.net/qq_41841569/article/details/85029217