/CNN-Get-Captcha

基于CNN神经网络实现的正方教务系统的验证码识别

Primary LanguagePythonApache License 2.0Apache-2.0

CaptchaReconition-CNN

Base on

  • CNN
  • tensorflow
  • python 3.5

基于卷积神经网络的验证码识别

说明

  • 由于本程序使用模拟方式生成验证码数据集,最终所得预测准确率不会很高(取决于验证码的模拟程度)。
  • 本项目的模型识别准确率大概能达到80%
  • 本项目例子训练总用时不到一个小时。(GPU - GT940M)

目标验证码

target-0 target-1 target-2

项目包含

  • /model/* : 经过训练的模型,其中包含两个模型。
  • /dataset/* : 训练集存放目录。
  • arialbd.ttf : 模拟训练集所用字体。
  • target-captcha.gif : 目标验证码。
  • generate_dataset.py : 生成模拟验证码训练集,并转存到TFRecord。
  • img_process.py : 简单图像处理函数。
  • batching.py : batch数据并输出作为训练数据。
  • train.py : 训练和增强训练的操作。
  • inference.py : 卷积神经网络的结构。
  • constant.py : 共用常量(方便调整)。

安装模块

  • tensorflow : pip install tensorflow
  • matplotlib : pip install matplotlib
  • numpy : pip install numpy
  • PIL : pip install pillow
  • wheezy : pip install wheezy.captcha

关于模块wheezy.captcha.image的修改

为了实现更准确的功能,而对wheezy.captcha.image模块的text函数进行了简单的修改

修改一:

def text(fonts, font_sizes=None, drawings=None, color='#5C87B2',
         squeeze_factor=0.8):

改成

def text(fonts, font_sizes=None, drawings=None, color='#5C87B2',
         squeeze_factor=0.8, start_x=0, start_y=0):

修改二:

offset = int((width - sum(int(i.size[0] * squeeze_factor)
                          for i in char_images[:-1]) -
              char_images[-1].size[0]) / 2)
for char_image in char_images:
    c_width, c_height = char_image.size
    mask = char_image.convert('L').point(lambda i: i * 1.97)
    image.paste(char_image,
                (offset, int((height - c_height) / 2)),
                mask)

改成

offset = start_x + random.randint(0, 15)
# offset = int((width - sum(int(i.size[0] * squeeze_factor)
#                           for i in char_images[:-1]) -
#               char_images[-1].size[0]) / 2)
offset_y = start_x + random.randint(0, 8)
for char_image in char_images:
    c_width, c_height = char_image.size
    mask = char_image.convert('L').point(lambda i: i * 1.97)
    image.paste(char_image,
                (offset, offset_y),
                mask)

引用项目

建议

如需进一步提高识别率,切合目标验证码,可通过一下方式实现。

  1. 人工标记一定数量的训练集,然后再稍稍提高学习率进行训练(不要训练过猛,避免过拟合)。
  2. 适当增加神经网路的复杂度,并适当修改验证码生成参数。

LICENSE

Apache-2.0