Python机器学习方法智能识别亚马逊验证码

概述

亚马逊网站验证码全部由英文字母组成,每个字母的形式也是多样的,通过Tesseract-OCR技术识别效率还是比较低,非常不理想。这里采用向量空间技术进行训练识别,经测试,识别率可达到95%,这个识别率通过训练库的不断增加还可继续提高。下面废话不多说,直接上干货。

技术详解

亚马逊验证码如下图:

我这里收集了大量的亚马逊网站验证码,下面将随机抽一张验证码为mnyaph作详细讲解,如下图:

总体思路

1.将原图片作二值化等特殊处理转换得到低像素图片

2.分割出每个字母的图片,并加入到训练库中

3.每个字母图片在训练库中训练

4.将每个字母图片训练后的结果依次组合起来,就是最终验证码

使用技术库

PIL :图片处理库

scipy : 科学计算库

  • 原图片处理

这里将jpg格式转换为更小容量的gif格式,方便后面处理,并将原图片中的黑色像素(0)拷贝到新的相同尺寸的白色图片上,得到新的Image对象。下图为处理后的图片

    im = Image.open(image_file)

    im = im.convert('P')

    im_size = im.size

    new_im = Image.new('P', im_size, 255)

    im_width = im_size[0]
    im_height = im_size[1]

    for y in range(im_height):
        for x in range(im_width):
            pixel = im.getpixel((x, y))
            if pixel ==0:
                new_im.putpixel((x, y), pixel)
  • 切割图片得到单个字母图片

纵向切割出每个字母,切割规则为:依次纵向检索每个像素点,在横向(x轴)固定的前提下:若遇到像素值为0,则表示为黑色的字母;若整个纵向都没遇到黑色(0),则表示是分割点。我们可以得到一样图片的横向(x轴)的所有分割点的坐标,最后分割即可。如下图:

计算得到的切割坐标,如下:

def get_x_coord(image) -> '返回切割的x坐标':
    image_width = image.size[0]
    image_height = image.size[1]

    crop_list = []
    start_pos = 0
    is_start_one_char = False

    for x in range(image_width):
        is_black_pos = False
        for y in range(image_height):
            pixel = image.getpixel((x,y))
            if pixel == 0:
                if is_start_one_char == False:
                    start_pos = x
                is_black_pos = True
                is_start_one_char = True
                break
        if is_start_one_char== True and is_black_pos == False:
            end_pos = x
            is_start_one_char = False
            crop_list.append((start_pos, end_pos))

    return crop_list
  • 单个字母图片加入到训练库中

将分割出的每个字母图片加入到训练库中,方便后面训练匹配,训练库中的数量越多识别率越高。将每个字母分类放入不同的文件夹中,如下所示:

例如a文件夹中的图片如下:

  • 训练识别单个字母图片

拿到一张单个字母图片后,去训练库中匹配每个图片,计算出相似度最高的,记录出相应的字母文件夹即为最终的字母。

匹配算法:AI与向量空间算法,通俗点讲就是原图片的所有像素点与训练库中的每张图片的所有像素点计算余弦值,余弦值越大,相似度越高。

具体方法是:计算出原图片与训练库中的每张图片像素的余弦值,选出最大值对应的训练库中的文件夹名即为最终的字母。

如下为匹配的结果,与原图片完全吻合

    match_captcha = []
    for crop in crop_list:
        crop_im = new_im.crop((crop[0], 0, crop[1], im_height)) #(左上x, 左上y, 右下x, 右下y)
        filename = 'e:/crop/' + str(time.time()) + '.gif'
        # crop_im.save(filename)

        all_result = [] #单个切片的所有字母的相似性

        remove_letter = ['d', 'i', 'o', 'q', 's', 'v', 'w', 'z']
        for letter in list(set(string.ascii_lowercase)- set(remove_letter)):

            refer_image_dir = r'E:\training_library\%s' % letter

            for refer_image in os.listdir(refer_image_dir):
                refer_im = Image.open(os.path.join(refer_image_dir, refer_image))

                crop_list = list(crop_im.getdata())
                refer_list = list(refer_im.getdata())
                min_count = min(len(crop_list), len(refer_list))

                result = 1 - spatial.distance.cosine(crop_list[:min_count-1], refer_list[:min_count-1])
                all_result.append({'letter' : letter, 'result' : result})

        match_letter = max(all_result, key=lambda x: x['result']).get('letter')
        match_captcha.append(match_letter)

    print('验证码为:{0}'.format(''.join(match_captcha)))

经测试,每个字母图片的识别时间大约为1s左右,所以一张亚马逊验证码的识别时间大约为5-6s,这个时间是非常可以接受的。

原文发布于微信公众号 - Python中文社区(python-china)

原文发表时间:2018-11-07

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏PaddlePaddle

转载|使用PaddleFluid和TensorFlow训练RNN语言模型

在图像领域,最流行的 building block 大多以卷积网络为主。上一篇我们介绍了转载|使用PaddleFluid和TensorFlow实现图像分类网络S...

16330
来自专栏新智元

【干货】用神经网络识别歌曲流派(附代码)

DataSet: 本文使用GTZAN Genre Collection音乐数据集,地址:[1]

33950
来自专栏奇点大数据

Pytorch神器(3)

上次我们的连载讲到用最简便的方法,也就是pip方法安装Pytorch。大家都成功了吧。

15310
来自专栏CreateAMind

CRF++代码分析

61150
来自专栏jeremy的技术点滴

tensorflow学习笔记_03

34340
来自专栏人工智能LeadAI

C++实现神经网络之一 | Net类的设计和神经网络的初始化

闲言少叙,直接开始 既然是要用C++来实现,那么我们自然而然的想到设计一个神经网络类来表示神经网络,这里我称之为Net类。由于这个类名太过普遍,很有可能跟其他人...

34050
来自专栏集智的专栏

使用腾讯云 GPU 学习深度学习系列之四:深度学习的特征工程

本系列文章主要介绍如何使用 腾讯云GPU服务器 进行深度学习运算,前面主要介绍原理部分,后期则以实践为主。

3.8K40
来自专栏深度学习那些事儿

A trap of parameter 'size_average' in pytorch

上面的程序很简单,设定一个loss函数,然后设定一个input和target进行loss计算,然后再backward。

17230
来自专栏人工智能LeadAI

TF使用例子-情感分类

这次改写一下,做一个简单的分类模型和探讨一下hidden layer在聚类的应用场景下会有什么效果。为了能写的尽可能让读者理解,本文也会写一下keras来实现(...

59230
来自专栏ATYUN订阅号

深度学习:如何理解tensorflow文本蕴含的原理

文本的entailment(蕴涵)是一个简单的逻辑练习,用来判断一个句子是否可以从另一个句子推断出来。承担了文本的entailment任务的计算机程序,试图将一...

1K60

扫码关注云+社区

领取腾讯云代金券