大家好,我是雪球。1.前言今天给大家分享的实战项目是常用的验证码标注&识别。从想法的诞生到想法的实现,再到编码实战的整个过程,我整理了这个过程前后的几万字,打算分章发表。言归正传,一起来看看今天的内容吧!今天的内容主要阐述本文的创作灵感、需求分析和实现思路。首先介绍一下验证码的基本概念。验证码的全称是图灵测试(CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart,简称CAPTCHA)。和人类公共全自动程序。验证码的主要目的是强制人机交互以抵抗机器自动化攻击。为了保证服务器系统的稳定性和用户信息的安全,大多数网站都采用了验证码技术。图片验证码是目前最常用的一种,本文主要讨论这种验证码的识别。最初图片验证码识别的想法起源于2012年的大学阶段,当时学校的教务系统每次抢课都崩溃,需要和其他同学抢指定课程一个特定的时间段。当时想绕过系统图片验证码,通过代码自动抢班。鉴于我当时编码能力和技术能力有限,机器学习和神经网络相关框架的效果很差,最终因各种条件无法实现。完了~~XDM,等等,故事还没完,时间回到2021年,作为一个勤于搬砖,善于思考和学习的程序员,在被社会打了几年之后,想用他目前的项目经验、学习能力和编码能力,以及业界机器学习、神经网络等AI技术的发展,能否实现我们多年来一直在思考的想法,实现高精度的识别和预测图片验证码,训练高可用的CNN模型。经过笔者在开始项目前几天的资料查询,确信高可用验证码识别模型的想法是可以做到的,于是开始了CNN神经网络等技术预习的漫长学习过程-知识。几个月后,项目的实际代码发布了。效果不错。我觉得还不错。基本实现了高可用。500张训练数据图像,CNN模型对单个字符的准确率超过97%。这里先贴出项目的项目Git地址,有基础的同学可以直接拉项目玩源码:【Java后台-万能验证码打标系统】(https://gitee.com/snowball2dev/DataMarkService)[vue管理后台模板-通用验证码标注系统](https://gitee.com/snowball2dev/DataMarkService-Vue)[Python-图片验证码识别模型案例](https://gitee.com/snowball2dev/VerifyCodeRecognize-Python)[MarkSystem在线效果体验地址](http://139.9.191.103:8084/)OK,XDM,如果你还想往下看,那么请跟随笔者的学习和编码实践过程来了解常用的验证码识别方法和流程。2、需求分析说到图片验证码识别功能,这个功能一开始想起来很简单。上网搜索关键词,相关文章和开源项目很多。以下是github搜索结果:乍一看,好像天下有免费的午餐。只要下载一个CNN-python项目,改几行代码,然后开始疯狂的数据标注过程,就可以跑出模型了。作者自己一开始也是这么想的,只是为了简单粗暴,所以把几个项目弄下来跑起来后发现代码可以用,但是效果很捉襟见肘,单字识别正确率很low,不到70%,4-6个字符,正确率会更低,基本达不到很高的正确率,可用性很一般。对于一个有追求的程序猿来说,这样的工作是不可能完成的,所以这就是这个项目的全部工作。在使用这些开源项目的过程中,我发现下载的项目的实现过程大多分为两种思路。第一种不需要切图,直接用数据标注训练模型;进行分类训练。项目执行的具体过程不做演示。有兴趣的读者可以开源自己做。以下是作者对两种思路应用的实践思考总结:1.第一种方法不需要图像切割。优点:简单粗暴,通用性强,直接使用各种卷积神经网络模型对图像验证码进行特征提取,适用于了解验证码生成的正向编码过程,使用代码生成图像验证码数据进行模型训练.缺点:数据量小时模型拟合效果差,需要大量人工数据标注。不适合不知道验证码生成规则的少量标注数据。2.第二类字符切割是根据验证码生成规则,分析验证码的背景干扰、噪声点像素、字体变形和堆叠、随机字符位置和数字、反转颜色等,并进行反向处理图片的。实现局部字符可切割,降低卷积模型层级,减少数据标注量,实现字符分类。优点:可以对单张图片验证码做特殊预处理,可以实现部分字符分割,可以对小字符图片进行分类训练,小批量数据标注可以训练模型达到高拟合效果,实现可用性缺点:通用性不强,训练模型只适合特定的图片验证码,复杂的验证码不一定能切XDM等,还有一个思路:作者在学习OpenCV的时候想到的,通过图片预处理、轮廓检测,然后通过A-Z、0-9字符的SIFT算法进行特征提取,最后与需要匹配的字符进行FLANN匹配。理想很充实。然后写完相关代码,发现由于验证码的前向生成过程导致字符特征变化太大,不适合,所以放弃了这个想法,代码见上述代码链接中的python项目image_match.py??。按照以上思路,天下没有免费的午餐。好的数据和特征工程同样重要。要想取得好的效果,就要具体问题具体分析。所以笔者分析了自己的图片验证码识别案例,比较适合第二种。另外一个原因是大批量标注数据的人工成本太高,个人不太喜欢。下面将结合一个案例详细介绍第二种识别思路的实现过程。三、实现思路根据需求初步分析,大致可以分为四个步骤:1、数据采集/预处理:http批量下载、OpenCVAPI使用学习、图像预处理2、数据标注:GUI标注功能开发,手册标注数据3.CNN神经网络模型训练:windows环境,cpu/gpu,学习神经网络框架API,微积分、线生成、概率论等前置知识,加深对神经网络模型的理解、使用pytroch框架的实现4.项目部署:linux环境下,标注系统VUE的前端部署,标注系统Java的后端部署,Python模型的部署下面是Xmind脑图导出效果:4.总结我是雪球。本篇内容主要讲解常用验证码标注&识别的背景知识,介绍验证码的基本概念,描述本文的创作灵感、需求分析和实现思路。小伙伴们快来练起来吧!如果你在学习过程中遇到什么问题,欢迎加我为好友,我会拉你进Python学习交流群一起讨论学习。本文转载自微信公众号《Python爬虫与数据挖掘》,可通过以下二维码关注。转载本文请联系Python爬虫与数据挖掘公众号。
