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

简介:

概述

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

技术详解

亚马逊验证码如下图:

e95bb376810bc678dc1c7181c0f140aaf3a7e095

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

92ee6215643935e796345772ba59b8f6b6580b2e

总体思路

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

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

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

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

使用技术库

PIL :图片处理库

scipy : 科学计算库

 ●   原图片处理

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

cb47c4863cbcb4f4643c72f590b8898d4765c56d


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轴)的所有分割点的坐标,最后分割即可。如下图:

55404907c523e60d7fc81fa0d038562d43733824

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

df6cccb6efd9157c50033f382f5c227e21a8d8b8


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
 ●   单个字母图片加入到训练库中

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

fb761707069ccb73dc42a4f5ddb9ac913eba4acf

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

36991e499b081dab76941e882f74a53fb9092b29

 ●    训练识别单个字母图片

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

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

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

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

8dd940f46acf5c75bbe3b73cdec9e37054e0df31


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,这个时间是非常可以接受的。


原文发布时间为:2018-11-7

本文作者:zarten

本文来自云栖社区合作伙伴“Python中文社区”,了解相关信息可以关注“Python中文社区”。

相关文章
|
8月前
|
传感器 存储 人工智能
用通义灵码2.5打造智能倒计时日历:从零开始的Python开发体验
本文记录了使用通义灵码2.5开发倒计时日历工具的全过程,展现了其智能体模式带来的高效协作体验。从项目构思到功能实现,通义灵码不仅提供了代码生成与补全,还通过自主决策分解需求、优化界面样式,并集成MCP工具扩展功能。其记忆能力让开发流程更连贯,显著提升效率。最终成果具备事件管理、天气预报等功能,界面简洁美观。实践证明,通义灵码正从代码补全工具进化为真正的智能开发伙伴。
|
10月前
|
机器学习/深度学习 算法 Python
机器学习特征筛选:向后淘汰法原理与Python实现
向后淘汰法(Backward Elimination)是机器学习中一种重要的特征选择技术,通过系统性地移除对模型贡献较小的特征,以提高模型性能和可解释性。该方法从完整特征集出发,逐步剔除不重要的特征,最终保留最具影响力的变量子集。其优势包括提升模型简洁性和性能,减少过拟合,降低计算复杂度。然而,该方法在高维特征空间中计算成本较高,且可能陷入局部最优解。适用于线性回归、逻辑回归等统计学习模型。
426 7
|
5月前
|
数据采集 监控 调度
应对频率限制:设计智能延迟的微信读书Python爬虫
应对频率限制:设计智能延迟的微信读书Python爬虫
|
8月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1132 12
Scikit-learn:Python机器学习的瑞士军刀
|
6月前
|
安全 数据库 数据安全/隐私保护
Python办公自动化实战:手把手教你打造智能邮件发送工具
本文介绍如何使用Python的smtplib和email库构建智能邮件系统,支持图文混排、多附件及多收件人邮件自动发送。通过实战案例与代码详解,帮助读者快速实现办公场景中的邮件自动化需求。
608 0
|
11月前
|
机器学习/深度学习 数据可视化 算法
Python与机器学习:使用Scikit-learn进行数据建模
本文介绍如何使用Python和Scikit-learn进行机器学习数据建模。首先,通过鸢尾花数据集演示数据准备、可视化和预处理步骤。接着,构建并评估K近邻(KNN)模型,展示超参数调优方法。最后,比较KNN、随机森林和支持向量机(SVM)等模型的性能,帮助读者掌握基础的机器学习建模技巧,并展望未来结合深度学习框架的发展方向。
Python与机器学习:使用Scikit-learn进行数据建模
|
10月前
|
机器学习/深度学习 数据可视化 TensorFlow
Python 高级编程与实战:深入理解数据科学与机器学习
本文深入探讨了Python在数据科学与机器学习中的应用,介绍了pandas、numpy、matplotlib等数据科学工具,以及scikit-learn、tensorflow、keras等机器学习库。通过实战项目,如数据可视化和鸢尾花数据集分类,帮助读者掌握这些技术。最后提供了进一步学习资源,助力提升Python编程技能。
|
10月前
|
机器学习/深度学习 数据可视化 算法
Python 高级编程与实战:深入理解数据科学与机器学习
在前几篇文章中,我们探讨了 Python 的基础语法、面向对象编程、函数式编程、元编程、性能优化和调试技巧。本文将深入探讨 Python 在数据科学和机器学习中的应用,并通过实战项目帮助你掌握这些技术。
|
11月前
|
数据采集 存储 前端开发
用Python抓取亚马逊动态加载数据,一文读懂
用Python抓取亚马逊动态加载数据,一文读懂
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品消费需求分析的深度学习模型
使用Python实现智能食品消费需求分析的深度学习模型
291 21

推荐镜像

更多