cnn验证码识别代码_中文项目:快速识别验证码,CNN也能为爬虫保驾护航

原标题:中文项目:快速识别验证码,CNN也能为爬虫保驾护航

机器之心专栏

作者:Nick Li

随着卷积网络的推广,现在有各种各样的快捷应用,例如识别验证码和数学公式等。本文介绍了一个便捷的验证码识别项目,读者可以借助它快速训练模型与识别验证码。

本项目使用卷积神经网络识别字符型图片验证码,其基于 TensorFlow 框架。它封装了非常通用的校验、训练、验证、识别和调用 API,极大地减低了识别字符型验证码花费的时间和精力。

项目地址:https://github.com/nickliqian/cnn_captcha

1 项目介绍

1.1 关于验证码识别

验证码识别大多是爬虫会遇到的问题,也可以作为图像识别的入门案例。这里介绍一下使用传统的图像处理和机器学习算法,它们都涉及多种技术:

443f5932db2e622883b4bf8c4c066770.png

图像处理

前处理(灰度化、二值化)

图像分割

裁剪(去边框)

图像滤波、降噪

去背景

颜色分离

旋转

机器学习

KNN

SVM

使用这类方法对使用者的要求较高,且由于图片的变化类型较多,处理的方法不够通用,经常花费很多时间去调整处理步骤和相关算法。

而使用卷积神经网络,只需要通过简单的前处理,就可以实现大部分静态字符型验证码的端到端识别,效果很好、通用性很高。

这里列出目前常用的验证码生成库:

b52183708c232526f381efe5c577dcec.png

1.2 目录结构

234571f14f8202b5b7d04e47a1db1312.png

1.3 依赖项

tensorflow

flask

requests

PIL

matplotlib

pip3install tensorflow flask requests PIL matplotlib

1.4 模型结构

4bfaf84146bce88946582e9e2002c976.png

2 如何使用

2.1 数据集

原始数据集可以存放在./sample/origin 目录中,为了便于处理,图片最好以 2e8j_17322d3d4226f0b5c5a71d797d2ba7f7.jpg 格式命名(标签_序列号. 后缀)。

2.2 配置文件

创建一个新项目前,需要自行修改相关配置文件:

图片文件夹

sample_conf.origin_image_dir = "./sample/origin/"# 原始文件

sample_conf.train_image_dir = "./sample/train/"# 训练集

sample_conf.test_image_dir = "./sample/test/"# 测试集

sample_conf.api_image_dir = "./sample/api/"# api接收的图片储存路径

sample_conf.online_image_dir = "./sample/online/"# 从验证码url获取的图片的储存路径

# 模型文件夹

sample_conf.model_save_dir = "./model/"# 训练好的模型储存路径

# 图片相关参数

sample_conf.image_width = 80 # 图片宽度

sample_conf.image_height = 40 # 图片高度

sample_conf.max_captcha = 4 # 验证码字符个数

sample_conf.image_suffix = "jpg"# 图片文件后缀

# 验证码字符相关参数

# 验证码识别结果类别

sample_conf.char_set = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i',

'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']

# 验证码远程链接

sample_conf.remote_url = "https://www.xxxxx.com/getImg"

具体配置的作用会在使用相关脚本的过程中提到。

2.3 验证和拆分数据集

执行下面的文件会校验原始图片集的尺寸和测试图片是否能打开,并按照 19:1 的比例拆分出训练集和测试集。所以需要分别创建和指定三个文件夹:origin,train,test 用于存放相关文件。

也可以修改为不同的目录,但是最好修改为绝对路径。文件夹创建好之后,执行以下命令即可:

python3verify_and_split_data.py

2.4 训练模型

创建好训练集和测试集之后,就可以开始训练模型了,这里不具体介绍 tensorflow 安装相关问题,读者可查看官网。确保图片相关参数和目录设置正确后,执行以下命令开始训练:

python3train_model.py

也可以调用类开始训练或执行一次简单的识别演示:

from train_model import TrainModel

from sample import sample_conf

# 导入配置

train_image_dir = sample_conf[ "train_image_dir"]

char_set = sample_conf[ "char_set"]

model_save_dir = sample_conf[ "model_save_dir"]

tm = TrainModel(train_image_dir, char_set, model_save_dir)

tm.train_cnn() # 执行训练

tm.recognize_captcha() # 识别演示

2.5 批量验证

使用测试集的图片进行验证,输出准确率。

python3test_batch.py

也可以调用类进行验证:

from test_batch import TestBatch

from sample import sample_conf

# 导入配置

test_image_dir = sample_conf[ "test_image_dir"]

model_save_dir = sample_conf[ "model_save_dir"]

char_set = sample_conf[ "char_set"]

total = 100 # 验证的图片总量

tb = TestBatch(test_image_dir, char_set, model_save_dir, total)

tb.test_batch() # 开始验证

2.6 启动 WebServer

项目已经封装好加载模型和识别图片的类,启动 web server 后调用接口就可以使用识别服务。启动 web server:

python3recognize_api.py

接口 url 为 http://127.0.0.1:6000/b

2.7 调用接口

使用 requests 调用接口:

url= "http://127.0.0.1:6000/b"

files= { 'image_file': (image_file_name, open( 'captcha.jpg', 'rb'), 'application')}

r= requests.post(url=url, files=files)

返回的结果是一个 json:

{

'time': '1542017705.9152594',

'value': 'jsp1',

}

文件 recognize_online.py 是使用接口在线识别的例子。

本文为机器之心专栏,转载请联系本公众号获得授权。返回搜狐,查看更多

责任编辑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/351640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CentOS yum 源的配置与使用

一、yum 简介 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器。起初是由yellow dog 这一发行版的开发者Terra Soft 研发,用python 写成,那时还叫做yup(yellow dog updat…

使用ActiveMQ Artemis在两个WildFly服务器之间构建水平JMS桥

有时有必要将不同的Message Broker连接在一起。 在企业消息传递中,此方案称为桥接。 可以使用JMS和其他协议(例如AMQP,ActiveMQ Artemis核心协议)来完成。 该博客文章重点介绍在WildFly中运行的JMS与两个Apache ActiveMQ Artemis …

mysql 逻辑备份 物理备份_数据库的逻辑备份和物理备份--非RMAN

数据库的逻辑备份和物理备份--非RMAN,不用借助其他工具,只要归档日志和物理备份就可以实现的备份数据库的备份和恢复常规而且重要,恢复得到理想状态逻辑备份利用EXP备份,从数据库提取写入操作系统文件1.可以导出一个完整的数据库2.也可以导出…

如何在myeclipse中导入jar包?

右键项目名--->Build Path—>Configure Build Path... 会弹出来一个框 在那四个选项选择 Libraries 然后再选择 右边 第二个选项Add External Jars... 然后就是你JAR的路径。一般将导入的外部包放在lib目录下。

python入门if语句练习_python入门视频:09 if语句_练习.mp4

本视频课程目录如下:python6天学习基础课程 ├─01天│ python入门视频:01 计算机组成-硬件设备.mp4│ python入门视频:02 计算机组成-软件设备.mp4│ python入门视频:03 程序的执行流程和小结_.mp4│ pyt…

spring依赖日志_Spring:设置日志记录依赖项

spring依赖日志这篇文章描述了如何在Spring中设置日志依赖。 它基于Dave Syer的帖子中提供的信息 。 这里提供有关Java日志记录框架的提醒。 该代码示例可在GitHub的Spring-Logging-Dependencies目录中找到。 Spring使用Jakarta Commons Logging API(JCL&#xff0…

网页UTF8转换GBK后出现问号?的原因

网页UTF8转换GBK后出现问号"?"的原因 网页编码转换是进行网页解析和处理的第一步。 互联网上越来越多的网页采用UTF-8编码,UTF-8用1到6个字节编码UNICODE字符,收录了超过10万个字符,BMP部分也有六万多个字符 而在进行编码转换时&…

关于 Number() parsint() abs() 的区别

1. parseInt(‘’) parseInt() 函数可解析一个字符串,并返回一个整数。 如果第一个字符不是数字或者负号,parseInt() 就会返回NaN 2.Number() 函数把对象的值转换为数字 3. Math.abs(x) 取得正数和负数的绝对值 转载于:https://www.cnblogs.com/…

python怎么安装pymysql_Python 安装pyMySQL过程记录

如果你的系统不支持 pip 命令,可以使用以下方式安装:1、使用 git 命令下载安装包安装(你也可以手动下载):$ git clone https://github.com/PyMySQL/PyMySQL$ cd PyMySQL/$ python3 setup.py install2、如果需要制定版本号,可以使用…

C++中的单例模式

单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必…

Spring Boot 学习笔记(三)Spring boot 中的SSM

Spring boot 下的 Spring mvc Controller:即为Spring mvc的注解,处理http请求; RestController:Spring4后新增注解,是Controller与ResponseBody的组合注解,用于返回字符串或json数据; package c…

c mysql日期时间格式_mysql日期和时间类型

TIME 类型TIME 类型用于只需要时间信息的值,在存储时需要 3 个字节。格式为 HH:MM:SS。HH 表示小时,MM 表示分钟,SS 表示秒。TIME 类型的取值范围为 -838:59:59~838:59:59&#xff0…

MySQL问题汇总

1.#include <mysql.h>编译出错 在阅读TrinityCore时&#xff0c;发现了解决方法和解释&#xff1a; #ifdef _WIN32 // hack for broken mysql.h not including the correct winsock header for SOCKET definition, fixed in 5.7 #include <winsock2.h> #endif #inc…

c++中union的使用,看高手们如何解释的

union主要是共享内存&#xff0c;分配内存以其最大的结构或对象为大小&#xff0c;即sizeof最大的。在C/C程序的编写中&#xff0c;当多个基本数据类型或复合数据结构要占用同一片内存时&#xff0c;我们要使用联合体&#xff1b;当多种类型&#xff0c;多个对象&#xff0c;多…

ibm aix_IBM AIX:Java进程大小监视

ibm aix本文将为您提供有关如何计算在IBM AIX 5.3 OS上运行的Java VM进程的Java进程大小内存占用量的快速参考指南。 这是我关于该主题的原始文章的补充文章&#xff1a; 如何在AIX上监视Java本机内存 。 我强烈建议所有参与生产支持或AIX上部署Java应用程序开发的人员阅读此书…

路由的使用

1 路由的基本使用: url是个函数,有四个参数,第一个参数要传正则表达式,第二参数传函数内存地址,第三个参数传默认参数,第四个是路由的别名 url(r^article/aa.html$, views.test), -路由从上往下匹配,一旦匹配成功,后面就不继续匹配了 2 路由的无名分组 url(r^test2/(\d)/(\w)$,…

Ps2022版DR5插件扩展窗口不展示及未正确签署等问题修复

前言 最近在安装DR5的时候遇到了一些报错问题&#xff0c;翻看了几篇文章找了一些实质性的方案&#xff0c;亲测有效&#xff0c;有同样问题的小伙伴自己对号入座哈。 窗口扩展不显示问题 问题 很多人第一次安装DR5时会发现这个【窗口-扩展】是灰色的&#xff0c;且没有DR5…

centos 编译mysql5.6_centos下编译安装MySQL5.6

&#xff0c;虚拟机centos6.5mini网络适配器“桥接模式”继续上一次的Apache编译后&#xff0c;编译安装MySQL5.6MySQL5.6和以前的版本不同之处在于用cmake就行编译&#xff0c;先安装cmake#yum install cmake -y1、开始下载编译MySQL5.6&#xff0c;推荐镜像网站http://mirror…

Spring Boot和多模块项目–添加模块特定的属性文件

你好&#xff01; 在本文中&#xff0c;我将向您展示几种如何在Spring Boot项目中添加模块特定的属性文件的方法。 它将介绍使属性文件可识别配置文件的手动方法以及可识别配置文件的半自动方法。 我的Github帐户上发布了一个示例项目&#xff08; https://github.com/coders-…

修改hostname有几种方式?

1&#xff1a; hostname DB-Server --运行后立即生效&#xff08;新会话生效&#xff09;&#xff0c;但是在系统重启后会丢失所做的修改 2&#xff1a; echo DB-Server > /proc/sys/kernel/hostname --运行后立即生效&#xff08…