Keras 实现图像验证码识别系统
本教程将指导你使用 Python 和 Keras(TensorFlow 后端)搭建一个图像验证码识别系统。主要流程包括:数据生成、模型构建、训练与预测。
-
安装依赖
-
pip install tensorflow pillow numpy captcha2. 生成验证码图片
-
from captcha.image import ImageCaptcha
import random, os, string
from PIL import Image
characters = string.digits + string.ascii_uppercase
n_len = 4
width, height = 160, 60
def generate_captchas(count=10000, output_dir='captcha_images'):
os.makedirs(output_dir, exist_ok=True)
image_gen = ImageCaptcha(width, height)
for i in range(count):
text = ''.join(random.choices(characters, k=n_len))
image = image_gen.generate_image(text)
image.save(f'{output_dir}/{text}_{i}.png')
generate_captchas() -
构建数据加载器
import numpy as np
from tensorflow.keras.utils import Sequence
from tensorflow.keras.preprocessing.image import img_to_array, load_img
char_to_idx = {c: i for i, c in enumerate(characters)}
n_classes = len(characters)
class CaptchaSequence(Sequence):
def init(self, image_dir, batch_size=64):
self.files = [os.path.join(image_dir, f) for f in os.listdir(image_dir) if f.endswith('.png')]
self.batch_size = batch_sizedef len(self):
return len(self.files) // self.batch_size
def getitem(self, idx):
batch_files = self.files[idx * self.batch_size:(idx + 1) * self.batch_size]
X = np.zeros((self.batch_size, height, width, 3), dtype=np.float32)
Y = [np.zeros((self.batch_size, n_classes), dtype=np.float32) for _ in range(n_len)]
for i, f in enumerate(batch_files):
label = os.path.basename(f).split('_')[0]
img = load_img(f).resize((width, height))
X[i] = img_to_array(img) / 255.0
for j, c in enumerate(label):
Y[j][i, char_to_idx[c]] = 1.0
return X, Y4. 构建模型
- from tensorflow.keras import layers, models
def build_model():
input_tensor = layers.Input((height, width, 3))
x = layers.Conv2D(32, 3, activation='relu', padding='same')(input_tensor)
x = layers.MaxPooling2D(2)(x)
x = layers.Conv2D(64, 3, activation='relu', padding='same')(x)
x = layers.MaxPooling2D(2)(x)
x = layers.Flatten()(x)
x = layers.Dense(1024, activation='relu')(x)outputs = [layers.Dense(n_classes, activation='softmax')(x) for _ in range(n_len)]
model = models.Model(inputs=input_tensor, outputs=outputs)
return modelmodel = build_model()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])5. 模型训练
train_gen = CaptchaSequence('captcha_images', batch_size=64)
model.fit(train_gen, epochs=10)6. 验证识别效果
def predict_image(image_path):
img = load_img(image_path).resize((width, height))
x = img_to_array(img) / 255.0
x = np.expand_dims(x, axis=0)
preds = model.predict(x)
return ''.join([characters[np.argmax(p)] for p in preds])
test_img = 'captcha_images/A1C9_100.png'
print("Predicted:", predict_image(test_img))
浙公网安备 33010602011771号