验证码识别极简教程:80行Python代码实现端到端识别
一、环境准备(3个核心库)
bash
pip install tensorflow opencv-python pillow
二、完整代码(mini_captcha.py)
python
import cv2
import numpy as np
from PIL import Image, ImageDraw
import random
import string
from tensorflow import keras
from tensorflow.keras import layers
更多内容访问ttocr.com或联系1436423940
配置参数
CHARS = string.digits # 仅识别数字
IMG_SIZE = (120, 40) # 图片尺寸
1. 极简验证码生成器
def gen_captcha():
text = ''.join(random.choices(CHARS, k=4))
img = Image.new('RGB', IMG_SIZE, (255,)*3)
draw = ImageDraw.Draw(img)
# 绘制文字(简单干扰)
for i, c in enumerate(text):
draw.text((10+i*25+random.randint(-3,3),
10+random.randint(-5,5), c, fill=(0,)*3)
# 添加干扰线
for _ in range(2):
draw.line([(random.randint(0,IMG_SIZE[0]),
(random.randint(0,IMG_SIZE[1]))]*2,
fill=(random.randint(50,200),)*3)
return text, np.array(img)
2. 超轻量模型
def build_model():
model = keras.Sequential([
layers.Conv2D(16, (3,3), activation='relu', input_shape=(IMG_SIZE[1], IMG_SIZE[0], 1)),
layers.MaxPooling2D((2,2)),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(len(CHARS)*4, activation='softmax'),
layers.Reshape((4, len(CHARS)))
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
return model
3. 主流程
if name == 'main':
# 生成数据
X, y = [], []
char_map = {c:i for i,c in enumerate(CHARS)}
for _ in range(1000):
text, img = gen_captcha()
X.append(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)[...,None]/255.0)
y.append([char_map[c] for c in text])
X, y = np.array(X), np.array(y)
# 训练
model = build_model()
model.fit(X, y, epochs=10, validation_split=0.2)
# 测试
text, img = gen_captcha()
pred = model.predict(cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)[None,...,None]/255.0)
print(f"真实: {text} 预测: {''.join([CHARS[i] for i in np.argmax(pred[0], axis=1)])}")
Image.fromarray(img).show()
三、代码解析
极简生成器:
仅生成数字验证码
包含基础的位置扰动和干扰线
微型模型:
1层CNN + 1层全连接
模型参数量极小,训练速度快
高效流程:
内存中生成数据
10个epoch快速训练
即时显示测试结果
四、使用说明
保存为mini_captcha.py
安装依赖:pip install tensorflow opencv-python pillow
直接运行:python mini_captcha.py
五、执行效果
终端输出示例:
真实: 5293 预测: 5293
浙公网安备 33010602011771号