大家好,今天来为大家分享网站项目源码分享的一些知识点,和网站源码推荐的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!
机器之心专栏
作者:kerlomz
网上关于验证码识别的开源项目众多,但大多是学术型文章或者仅仅是一个测试demo,那么企业级的验证码识别究竟是怎样的呢?
1.前言
网上关于验证么识别的开源项目众多,但大多是学术型文章或者仅仅是一个测试demo,那么企业级的验证码识别究竟是怎样的呢?前方高能预警,这是一个生产水准的验证码识别项目,笔者可以向你们保证,它一定会是各位所见过的文章中最实用的,你甚至可以不需要懂代码写代码就能轻松使用它训练一个99识别率的模型。这才是企业级应该有的样子:算法开发负责框架,训练只需要一个实习生。不仅操作上简单,在可用性和稳定性上也是经得起考验。性能上,笔者使用腾讯云1核1G的机器测试:单次识别平均在12ms左右,再也不需要GPU部署了,CPU一样可以日调百万。
不少初学者和笔者反应,安装环境太难了,没关系,都给你们安排好了,一行pip就能搞定环境的MuggleOCR。
仓库地址:https://pypi.org/project/muggle-ocr
MuggleOCR的体积有6MB,其中附带了两个通用模型:简单通用验证码,普通OCR。简而言之就是,再也不用愁验证码的样本不好标注了,它将是各位标注样本的利器,简单的验证码识别率能有95%以上,复杂的也有50%-70%左右,只需要结合官网校验,轻松下载几万标注样本。
除此之外,它可以支持调用使用本文框架(captcha_trainer)训练的模型。调用只需要三行核心代码:
34;1.png&34;rb&步骤1
importmuggle_ocr
步骤3
text=sdk.predict(image_bytes=img_bytes)
print(text)
是不是很简单,用它应付一般的验证码识别足矣。
本项目旨在降低图像识别的门槛,让深度学习技术能够进入更多人的视线。任何人经过简单的介绍,都可以轻易使用这项技术训练一个商业化的成品。
笔者选用的时下最为流行的CNNBackbone+RNN+CTC(CRNN)进行端到端的不定长验证码识别,代码中预留了CNNX/MobileNet/DenseNet121/ResNet50等。其中可能你们搜不到CNN5和CNNX,因为是小编自己拼凑的网络选项,专门为验证码优化定制的,在配置界面中可以随意切换网络组合。
前面介绍这么多还没进入正题,各位是不是好奇它到底是什么模样呢?
运行方法:
1.可通过编译版的可执行文件运行
2.在项目中运行app.py来启动GUI的界面
训练项目源码:https://github.com/kerlomz/captcha_trainer
编译版下载地址:https://github.com/kerlomz/captcha_trainer/releases
部署项目源码:https://github.com/kerlomz/captcha_platform
编译版下载地址:https://github.com/kerlomz/captcha_platform/releases
注意:在Windows服务器版中使用编译版如果出现闪退,可以用CMD执行可执行文件来查看报错,如果报错为cv2ImportError:Dllloadfailed请按照步骤:我的电脑——属性——管理——添加角色和功能——勾选桌面体验,点击安装,安装之后重启即可。
H16/H64指的是隐藏神经元个数,根据上面的数据可知,训练使用GPU,部署预测使用CPU足矣。
2.环境依赖:
环境依赖花了超长篇幅,主要是写给零开发基础的使用者,有基础的可以随便跳过,也欢迎使用编译版,可在上一章末尾找到下载地址。
关于CUDA和cuDNN版本的问题,就让不少人望而却步,其实很简单,如果使用pypi仓库安装的TensorFlow,那么Linux系统使用CUDA9.0,Windows使用CUDA10.0,因为仓库中的whl安装文件都是根据对应的CUDA版本编译的。也就是版本绑定死了,如果有需要可以去搜索TensorFlowWheel找第三方编译的版本,如果妄图自行编译我这里劝退一下,坑很多。
2.1项目使用环境
以下是通过测试的环境:
本训练项目主要的环境依赖清单如下
在项目中的requirements.txt已经整理好所有依赖模块。一键
pipinstall-rrequirements.txt
安装即可
1)安装相关依赖不用理会上面的清单,在项目中的requirements.txt已经整理好所有依赖模块。可以直接在项目路径下执行
pip3install-rrequirements.txt
安装所有依赖。
注意默认情况会安装到全局的Python环境下,笔者强烈建议在虚拟环境进行,做好项目间的环境隔离,可以借助Virtualenv或Anaconda等等实现。笔者个人使用的是Virtualenv,如果有修改代码需求的,可直接在PyCharm上操作。
virtualenv-p/usr/bin/python3venv进入环境.
sourcebin/activatecaptcha_trainer是项目名.
pip3install-rrequirements.txt39;你&39;好&39;世&39;界&39;北&39;京&39;大&39;学&34;飞机&34;鞋子&34;水杯&34;面包&34;横幅&34;订书机&34;壁画&34;猫砂&34;飞机&34;鞋子&34;水杯&34;面包&34;横幅&34;订书机&34;壁画&34;猫砂&34;start_pos&34;interval_size&34;corp_num&34;corp_size&34;start_pos&34;interval_size&34;corp_num&34;corp_size&端口19952
python3tornado_server.py
Flask
方案2,使用gunicorn,端口5000
pipinstallgunicorn
gunicorn-cdeploy.conf.pyflask_server:app
Sanic:
端口50054
python3grpc_server.py
编译版(基于Tornado)
后台运行
nohup./captcha_platform_tornado&
Windows:Windows平台下都是通过python3xxx_server.py启动对应的服务,注意,Tornado、Flask、Sanic的性能在Windows平台都大打折扣,gRPC是Google开源的RPC服务,有较为优越的性能。编译版直接运行编译后的exe可执行文件即可。
3.4调用/测试
1.Tornado服务:
具体参数:
请求为JSON格式,形如:{&34;:&34;}
返回结果:
该返回为JSON格式,形如:{&39;:&34;,&34;:&34;,&34;:0,&34;:true}
2.Flask服务:
请求参数和返回格式同上
3.Sanic服务:
请求参数和返回格式同上
4.gRPC服务:需要安装依赖,grpcio、grpcio_tools和对应的grpc.proto文件,可以直接从项目中的示例代码demo.py中提取。
python-mgrpc_tools.protoc-I.–python_out=.–grpc_python_out=../grpc.proto
grpcio、grpcio_tools是根据grpc.proto使用上述命令生成的。
classGoogleRPC(object):
def__init__(self,host:str):
self._url=&39;.format(host)
self.true_count=0
self.total_count=0
defrequest(self,image,model_type=None,model_site=None):
importgrpc
importgrpc_pb2
importgrpc_pb2_grpc
channel=grpc.insecure_channel(self._url)
stub=grpc_pb2_grpc.PredictStub(channel)
response=stub.predict(grpc_pb2.PredictRequest(
image=image,split_char=&39;,model_type=model_type,model_site=model_site
))
return{&34;:response.result,&34;:response.code,&34;:response.success}
if__name__==&39;:
result=GoogleRPC().request(&34;)
print(result)
3.5奇技淫巧
举一个比较不常见的例子,以下例子不代表任何网站。
正常情况下会想到以下1和2.1的方法:
1.颜色提取的思路,可以采用HSV/K-means聚类进行颜色的分离提取:效果如下:
弊端显而易见,会有较大的特征丢失,识别率有较大的提升瓶颈,经过测试,中英文+汉字的识别率在90%左右。
2.不分离颜色的思路,该方案有两种处理方法:
(1)同时预测颜色和字符内容,这种方法看起来比较正统,但是成本较高,需要标注每张图的颜色和字符内容,这个要求有多高呢,一般的打码平台是无法提供这样的结果的,打码平台只返回对应颜色的内容,只能人工标注,那么需要多少样本呢?按照笔者训练的识别率98的模型用了100w左右的样本。一张这样的样本标注假设需要0.1元,那么100w样本需要10w标注费用,假设0.01元,也要1w的标注费用。但是验证码高质量的人工标注几乎是不存在的,因为很多样本,人眼的识别率是不如机器的,总体标注的准确率大概也只能在85左右。看起来并不可取,有一种节约成本的办法,可以通过算法生成样本,但是呢,生成的识别率英文数字还可以,中文的识别率就低的可怜了。
(2)每个颜色分别训练一个模型,这种方法看起来有点蠢,但是确实比较合适有效的办法了,可以轻松借助打码平台的返回结果标注样本。需要的颜色可以通过官网提供的字段取到,返回结果通过打码平台识别得到,这样一组合,样本就有了。这种方法的成本相对较低,样本数不变的前提下,打码价格低于人工标注的成本。但是笔者训练的是一种颜色的样本用了100w。每个颜色分别训练这样成本还是下不来。四种颜色就是500w样本。官网的每次获取图片的时候颜色随机出现的概率也不一定是1/4。
(3)把所有颜色都通过颜色变换为一种颜色,整体思路同(2)。如下图,笔者将黑色转换为红色,但是样本成本只有采集一种颜色的成本。看起来是目前位置最佳的方案了,事实也是如此的。但是呢,100w的样本对于普通人来说也是一笔不小的花销,即便有了样本能做出来也需要花费不少的时间和精力。
不过采集样本不是单纯的接打码平台就完事了,需要经过官网判断,只有通过验证,正确的样本才保存下来。这样有效的样本对提高识别率才有帮助。
经过笔者实验,2.3的方法性能效果最佳。
笔者实时对接官网对实验模型进行检验,结果如上图,测试了200+次,识别率达到98%以上,识别速度的话,相较于1.1的方法省去了颜色提取,大大缩短了时间,CPU大概5-8毫秒左右,模型大概3mb。
所以选择合适的方案解决问题才是最终的目的,希望这个项目和这篇介绍能带大家入门企业级的验证码识别。
网站项目源码分享和网站源码推荐的问题分享结束啦,以上的文章解决了您的问题吗?欢迎您下次再来哦!
