TensorFlow 验证码识别

验证码可以说是爬虫中最常见的,本次介绍的方法可以处理如下简单的验证码:

可以观察到,此类验证码特点明显,4位数字,每个数字所处位置固定。

主要分为四步:

  1. 样本数据
  2. 创建训练数据
  3. 跑模型,现在全是数字
  4. 预测

1. 样本数据

在`src/data/captcha`下存放验证码图片,一般名字就是答案,然后需要在`src/data/captcha.json`中描写对应关系,例如

{

  "3601.jpg": "3601",

  "1651.jpg": "1651",

  "3771.jpg": "3771",

  "6172.jpg": "6172",

  "7104.jpg": "7104",

  "7134.jpg": "7134",

  "8113.jpg": "8113",

  "8395.jpg": "8395"

}

前面是文件名,后面是答案

2.创建训练数据

运行文件`src/create_train_data.py`,这将会创建文件`src/data/captcha.npz`和和图片1~9的数字,数字在`src/data/train`,可以打开看看,切割效果不好的话需要修改,打开文件`src/img.py`,修改如下几个参数

SHIFT_PIXEL = 7  # 将图像从右向左移动

BINARY_THRESH = 30  # 图像二进制阈值

LETTER_SIZE = (20, 23)  # 字母 宽, 高

如果图片位置非常规则,就像这种

只有4个数字,每个数字位置都确定不变,可以直接将位置写死,如

letter_boxs = [[[0, 7], [11, 24]], [[13, 5], [30, 30]], [[30, 5], [45, 29]], [[47, 4], [61, 28]]]

上面的点分别就是下图中的1、2、3、4、5、6、7、8

3.跑模型

这个就比较简单了,直接运行`src/train.py`,会出现模型并保存在`src/checkpoint`目录下

4.预测

运行`src/predict.py`,传入进去的需要是一个图片对象,当然你可以直接传入图片url,但是并不能维持session状态,因为它是直接去下载图片的,`io.imread(argv, as_gray=True)`的源码实现

@contextmanager
def file_or_url_context(resource_name):
    """Yield name of file from the given resource (i.e. file or url)."""
    if is_url(resource_name):
        _, ext = os.path.splitext(resource_name)
        try:
            with tempfile.NamedTemporaryFile(delete=False, suffix=ext) as f:
                u = urlopen(resource_name)
                f.write(u.read())
            # f must be closed before yielding
            yield f.name
        finally:
            os.remove(f.name)
    else:
        yield resource_name

他这里就是先创建了一个临时文件,将图片写进去,再读取图片。如果需要维持session状态,也可以按照他这样,先创建一个临时文件,之后再删除。

原文发布于微信公众号 - Python爬虫与算法进阶(zhangslob)

原文发表时间:2019-03-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券