生成数据集

利用python captcha库实现随机验证码的生成。实现代码如下,随机字符可以自己写随机函数,然后写入到对应的保存位置。

captcha = ImageCaptcha(width=width, height=height)
captcha.write(随机字符, 保存地址)

可以通过matplotlib.pyplot 库查看生成的图片

plt.figure()
for i in range(20):
    plt.subplot(5,4,i+1) # 绘制前20个验证码,以5行4列子图形式展示
    plt.tight_layout() # 自动适配子图尺寸
    plt.imshow(images[i])
    plt.title("Label: {}".format(texts[i])) # 设置标签为子图标题
    plt.xticks([]) # 删除x轴标记
    plt.yticks([]) # 删除y轴标记
plt.show()

数据集处理

将三通道图片处理为灰度图:

np.dot(img[...,:3], [0.299, 0.587, 0.114])

将训练结果处理为onehot格式(length为验证码长度,charset为你自己验证码的可选字符长度):

 vec = np.zeros(length * len(charset))
 for i in range(length):
    # One-hot 编码验证码中的每个数字
    # 每个字符的热码 = 索引 + 偏移量
    vec[charset.index(text[i]) + i*len(charset)] = 1

训练模型

通过keras 高级神经网络api训练model:
captcha-keras-summary.jpg
生成model保存

集成flask,简单部署

代码如下,其中rgb2gray代表转灰度图
@app.route('/predict', methods=['POST'])
def predict():

if request.method == 'POST':
    if request.files.get('image'): # 图像文件
        image = request.files['image'].read()
        received_image = True

        image = np.array(Image.open(BytesIO(image)))
        image = rgb2gray(image).reshape(1, 60, 160, 1).astype('float32') / 255         
        pred = model.predict(image)
        return pred

测试

curl -X POST -F image=@7483.png 'http://localhost:5000/predict'

通过该命令,将测试机图片放入image后面,即可得出结果