Part1 前言 

大家好,我是ABC_123。本期继续加深一下 2017 年在北京时用python代码结合TensorFlow1.x 进行的验证码识别研究;与以往不同的是,这次我们换成最新的TensorFlow2.x 来识别一下验证码。结果让我大为惊讶,TensorFlow新版本验证码识别能力结合当前的GPU算力,相比9年前,识别效果有了显著提升,计算速度快了很多,而且很多复杂验证码可以短时间内被攻破。关于卷积神经网络识别图像的算法原理可以参考以下这篇文章:

第148篇:卷积神经网络算法识别复杂验证码/图像/人脸识别的原理讲解

注:技术总是不断革新的,先前ABC_123 通过编程结合算法来实现对验证码的识别;这些研究工作,在卷积神经网络算法面前,都变得意义不大。

 Part2 技术研究过程 

  • 基础设施准备

经过不断地优化,以TensorFlow2.x为基础的验证码识别程序变成如下形式:引入了大量用户可控参数以备精准控制验证码识别过程;使用了卷积神经网络(CNN)来识别验证码,使用三层卷积 + 全连接层的经典CNN架构。框架选用TensorFlow 2.x + Keras,激活函数选用ReLU,池化层选用 MaxPooling 2×2,正则化选用 Dropout(0.25),损失函数选用 Sigmoid 交叉熵,优化器选用 Adam (lr=0.001)。

其详细过程如下:

1.  输入验证码图像(200×50)。

2.  [卷积层1] 32个3×3过滤器 → ReLU → MaxPool(2×2) → Dropout(0.25)。

3.  [卷积层2] 64个3×3过滤器 → ReLU → MaxPool(2×2) → Dropout(0.25)。

4.  [卷积层3] 64个3×3过滤器 → ReLU → MaxPool(2×2) → Dropout(0.25)。

5.  [展平层] → 展平后得到 11200 维特征向量。

6.  [全连接层] 1024个神经元 + Dropout。

7.  [输出层] max_captcha × char_set_len 个神经元。

接下来运行命令:

python tensorflow_cnn_train.py --charset digits --max_captcha 4 --batch_size 128 --target_accuracy 0.95

TensorFlow2.x 在验证码识别率达到95%之后,会生成4个文件,这其中就有识别验证码的模型。我们以一本书做比喻,对这4个文件的作用加深理解:

文件

打比方

crack_captcha_model.keras 完整的一本书(封面+目录+内容)
ckpt-1.data-00000-of-00001 只有正文内容的纯文本
ckpt-1.index 这本书的目录指引
checkpoint 记录“当前看到书的第几章”

和先前DGA域名识别一样,首先选择一下算力环境。RTX 4090的GPU环境肯定更好,但是考虑性价比,还是退而求其次选择了RTX 3090。


  • 卷积神经网络知识回顾

卷积神经网络识别验证码/图像的流程如下,在上一篇文章做了详细讲解,这里不过多叙述。对于验证码识别,其输入层如下:

从左到右,依次是输入层、卷积层、最大池化层、全连接层、输出层。

  • 识别复杂验证码测试1

首先拿出一个复杂的验证码样本做测试,大概有几万多个验证码图片样本。从图中可以看出,该类型验证码加入了数字+大写字母、字符旋转、字符大小变换、字符黏连、大量的干扰线、随机背景颜色、字符颜色变换等,如果通过编程算法来识别,难度非常大。接下来我们看一下卷积神经网络算法的识别效果。

如下图所示,在经过10分钟零几秒的时间计算,验证码识别率就达到了95%,比我们自己研究验证码识别算法效率要高的太多了。将程序训练过程中生成的数据制作成Accuracy–Step 曲线图,通过观察分析可以看出:

1.  当 Step 在 0–3000 步区间时:准确率基本处于极低水平,≈0.02 - 0.04,说明模型尚未有效学习或学习率过低。

2.  当 Step ≈3500 步开始:准确率出现明显跳跃式提升。

3.  当 Step 在 4000–5000区间时:准确率快速攀升,从 0.2 → 0.6 → 0.85。

4.  当 Step 在 5000 之后:准确率趋近于收敛,最终稳定在 ≈0.95 左右。

  • 识别企鹅验证码测试2

这是企鹅曾经使用过的验证码,这个验证码就很复杂了,最难的是加入了字体的扭曲。当然最复杂扭曲的是谷歌搜索引擎曾经使用的验证码,那个验证码太强了。对于这种带有扭曲的验证码,如果我们自己编写算法来识别非常困难。此外此套验证码加入了干扰图像(比干扰线更难)、颜色变换、字符的空心、字符的粗细变化,字符粘连等。

最后TensorFlow 2.x 仅花了32分钟零几秒的时间,识别率就达到了95%,太强了。接下来生成Accuracy 随 Step 变化的曲线图,从图中可以看出:

1.  当step 小于3000 时,验证码识别的准确率几乎徘徊在极低值,说明模型尚未有效进行机器学习。

2.  当step 在 3000 - 6000 时,准确率开始出现明显跃升。

3.  当step 在 6000–10000 时,曲线图进入平稳提升区间,模型逐渐趋近收敛状态。

4.  当step 在16000 之后准确率接近 0.93–0.96,接近收敛。

 Part3 总结 

1.  技术总是在不断进步的,先前的验证码识别的一些编程、算法类的尝试,在CNN卷积神经网络面前,都变得意义不大。

2.  对于图像验证码的识别,TensorFlow2.x + 卷积神经网络CNN 就足够用了;而对于滑块验证码的识别,我们下期在做探讨。

3.  大家有好的建议,欢迎给我留言。为了便于技术交流,现已建立微信群"希水涵-信安技术交流群",欢迎您的加入。

图片

公众号专注于网络安全技术分享,包括APT事件分析、红队攻防、蓝队分析、渗透测试、代码审计等,每周一篇,99%原创,敬请关注。

Contact me: 0day123abc#gmail.com

OR 2332887682#qq.com

(replace # with @)

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐