Keras 实现图像验证码识别系统

本教程将指导你使用 Python 和 Keras(TensorFlow 后端)搭建一个图像验证码识别系统。主要流程包括:数据生成、模型构建、训练与预测。

  1. 安装依赖

  2. pip install tensorflow pillow numpy captcha2. 生成验证码图片

  3. 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()

  4. 构建数据加载器
    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. 构建模型
  1. 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))

posted @ 2025-04-30 16:00  ttocr、com  阅读(13)  评论(0)    收藏  举报