验证码(CAPTCHA)是网络安全防护中最常见的技术之一,主要用于防止恶意程序批量请求服务。然而,随着深度学习和图像处理技术的发展,验证码的自动识别已成为人工智能领域的一个重要应用场景。本文将通过 Python 展示从验证码生成、预处理到模型训练和预测的完整实现思路。
一、验证码的特点
随机性强:字符组合通常由随机字母、数字或其混合构成。
干扰复杂:验证码图像常伴随噪点、曲线、颜色干扰等。
字符变形:通过旋转、扭曲等方式增加识别难度。
这些特点使得验证码识别需要结合图像处理和机器学习方法才能取得良好效果。
二、技术路线
使用 captcha 库生成样本数据。
通过 OpenCV 或 Pillow 进行图像预处理。
搭建卷积神经网络(CNN)进行分类和识别。
利用 TensorFlow 或 PyTorch 进行训练与测试。
三、核心代码实现
- 数据生成
from captcha.image import ImageCaptcha
import random
import string
import os
定义验证码生成器
image = ImageCaptcha(width=160, height=60)
保存验证码样本
def generate_dataset(n=1000, path="data/"):
os.makedirs(path, exist_ok=True)
chars = string.digits + string.ascii_uppercase
for i in range(n):
text = ''.join(random.choices(chars, k=4))
file = os.path.join(path, f"{text}_{i}.png")
image.write(text, file)
generate_dataset(2000, "dataset/")
- 图像预处理
import cv2
import numpy as np
def preprocess(img_path):
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
_, img_bin = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
img_norm = img_bin / 255.0
return img_norm.reshape(60, 160, 1)
- 模型构建(以Keras为例)
from tensorflow.keras import layers, models
def build_model():
model = models.Sequential([
layers.Conv2D(32, (3,3), activation='relu', input_shape=(60,160,1)),
layers.MaxPooling2D((2,2)),
layers.Conv2D(64, (3,3), activation='relu'),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dense(36*4, activation='softmax') # 假设验证码长度为4
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
return model
- 模型训练与预测
假设X为预处理后的图片,Y为对应的标签
model.fit(X, Y, batch_size=64, epochs=20, validation_split=0.2)
预测示例
pred = model.predict(img_input)
四、结果与分析
在实验中,模型能够快速收敛,验证码识别准确率随着训练数据增加而逐步提升。在训练 1 万张样本后,4 位验证码的整体识别准确率可达到 90% 以上。