国税总局发票查验平台验证码识别方案,识别率达98%「建议收藏」

国税总局发票查验平台验证码识别方案,识别率达98%「建议收藏」这是一篇含金量很高的干货文章,国家税务总局全国增值税发票查验平台验证码识别方案和具体思路,实验结果测试了200+次,识别率达到98%以上,识别速度的话,CPU大概5-8毫秒左右,模型大概3mb。

大家好,又见面了,我是你们的朋友全栈君。

全国增值税发票查验平台验证码


2020.04.30

已经同步更新,测试网址不变


手动置顶:验证码识别测试页面(可视化操作)

识别率97.5%,图片接口支持手动测试,以图片形式返回结果;文本接口需要联系作者,测试额度1000次限24小时内使用。

1.本地提交一张【90×35】大小的图片;
2. 选择需要识别的【颜色】;
3. 点击【提交】即可;

在这里插入图片描述

测试地址:
http://152.136.207.29:19812/preview?model_name=TAX

在这里插入图片描述
识别速度如上图所示5毫秒左右,机器配置如下图:
在这里插入图片描述
可见,低配1核CPU足以支撑业务日调用1.7千万级别的负载调用,加之识别率一直是全网最高,业内不少头部的财税服务提供商都是使用笔者的版本,因保密协议不得透露合作关系,在此不举例,毕竟大多数公司都会说自己并非使用爬虫技术实现查验功能,行内人应该都知道的,可自行查证。敢在合同上写下识别率指标的不存在一丝丝水分。

7.14 更新(验证码识别率截至15号有97.5%了其实)

后来想想94不好看,就跑到96%了,测试次数为一万个官网请求,这样又是全网最高识别率。
在这里插入图片描述
在这里插入图片描述

7.13 更新(识别率回归,初步到94%)

由于没有更高的需求,中文字符集训练过于耗时,GPU资源也不能一直用来跑这个,决定停止训练,目前版本官网实测5千次请求,94.3%准确率。

7.12 更新(生成器调参思路)

最新的思路:样本生成器自动调参的方法,当然了写生成器需要有一定的技术含量,需要弄清楚哪些是变量,CSDN有位大佬写过python版本的生成器,我下载来生成了一波,发现相似度比我简书放出的钓鱼版本还低hhhh,通过预留参数接口基于给出的一张样图,生成各种参数的生成样本,自动对比生成样本和给定对照样本的相似度,取最佳参数即可获得官网算法的最佳参数,调参成本也就生成w级别的样本即可找出最佳参数,对于计算机而言1分钟不到。这样只要掌握的通用生成器,只要在一定范围内更新都不是问题。此方法过于偏门,其实就算公开了思路,但是能写出来的人估计也没几个。有钱的大公司每次更新无脑去人工打码采集样本就好了,小公司还是不要做什么发票查验了,实力劝退。

7.6 更新(官网更新,识别率翻车到90%)

由于官网会测试本接口,对生成参数进行算法微调,不论是字体样式,颜色配比,字符集等等都针对这CSDN的两篇文章的生成器做了对抗,由于之前训练的时候尽可能考虑到模型的泛化能力,测试接口识别率降比不大,目前仍有90%的识别率,为了保证模型的持续抗更新能力,目前在线接口已不再进行更新。

之前技术不精,思路略显笨拙,新的模型辅助了全新的生成器算法,能更好的对抗和适应各种参数的更新,后续或会开放最新的防更新思路,如何提高模型的泛化能力,最新接口请直接联系我,白嫖勿扰。

6.19 更新(训练和部署源码+JS逆向思路)

有人说我文章没有干货只有思路,这里我分享一下源码,训练及部署的教程:
https://blog.csdn.net/kerlomz/article/details/86706542

至于国税总局的发票查验平台JS这块的逆向可以参考:
https://blog.csdn.net/qq_35228149/article/details/106818057


验证码分析

如图所示:图像验证码,识别指定颜色的文字。
在这里插入图片描述

识别思路

首先有几条道路可以通向罗马,这里不分先后优劣一一讲述。

  1. 颜色提取的思路,可以采用HSV/K-means聚类进行颜色的分离提取:效果如下:
    在这里插入图片描述
    弊端显而易见,会有较大的特征丢失,识别率有较大的提升瓶颈,经过测试,中英文+汉字的识别率在90%左右。
  2. 不分离颜色的思路,该方案有两种处理方法:
    (1)同时预测颜色和字符内容,这种方法看起来比较正统,但是成本较高,需要标注每张图的颜色字符内容,这个要求有多高呢,一般的打码平台是无法提供这样的结果的,打码平台只返回对应颜色的内容,只能人工标注,那么需要多少样本呢?笔者训练的识别率98的模型用了100w左右的样本。一张这样的样本标注假设需要0.1元,那么100w样本需要10w标注费用,假设0.01元,也要1w的标注费用。但是验证码高质量的人工标注几乎是不存在的,因为很多样本,人眼的识别率是不如机器的,其次,标注团队不一定都是高学历,官网使用的字符集并不一定寻常人都认识,大多不会去深究,再者,相似的汉字也是容易混淆的,一个汉字旋转之后像另一个汉字是很常见的现象,所以总而言之,总体标注的准确率大概率不会超过85%。 所以即使有钱,也不一定能获得最好的资源,这方法看起来并不可取,有一种节约成本的办法,可以通过算法生成样本,但是呢,生成的识别率英文数字还可以,中文的识别率就低的可怜了。附上生成方法:https://www.jianshu.com/p/da1b972e24f2 ,当然这个生成算法是需要修改加工的,原始算法识别率不会超过40%。综合多个维度的算法微调去和官网的算法进行碰撞匹配,才能达到最终的效果,所以在此先劝退伸手党。CSDN也有另一篇Python版的生成算法,可以自行测试,生成的图片比我这个还不像hhhh,也是需要自行修改的。
    (2)每个颜色分别训练一个模型, 这种方法看起来有点蠢,但是确实比较合适有效的办法了,可以轻松借助打码平台的返回结果标注样本。需要的颜色可以通过官网提供的字段取到,返回结果通过打码平台识别得到,这样一组合,样本就有了。这种方法的成本相对较低,样本数不变的前提下,打码价格低于人工标注的成本。不过人工打码响应平均在10-20秒之间,采集如此大量的样本数据可能要把业务都熬没了,其次还是一个认知水平问题,打码平台的打手普遍学历不高,尚有不少汉字是人不齐全的,很有可能导致样本极度不均衡,字符集不全等等,归根到底高质量的样本还是得从生成算法入手,慢慢提升模型对汉字的辨识度,笔者训练的样本用了100w。每个颜色分别训练这样成本还是下不来。四种颜色就是500w样本。官网的每次获取图片的时候颜色随机出现的概率也不一定是1/4。
    在这里插入图片描述

(3)把所有颜色都通过颜色变换为一种颜色,整体思路同(2)。如下图,笔者将黑色转换为红色。我们只需要训练红色的图片:蓝转红、黄转红、黑转红,样本成本只有采集一种颜色的成本。看起来是目前位置最佳的方案了,事实也是如此的。但是呢,100w的总样本量对于普通人来说也是一笔不小的花销,即便有了样本能做出来也需要花费不少的时间和精力。

有些算法工作者可能会低估样本的实际需求量,3.6k分类,中文字体小,容易混淆相似的字多,不同的角度重叠干扰都会大大增加,过于复杂的网络对性能的要求也高,为了平衡性能和准确率,足够数量的样本支撑是必须的,100w样本量其实不大,一点都不要惊讶,7月之后的版本笔者用了6k字符集做的抗更新模型,训练足足花了1周。

不过采集样本不是单纯的接打码平台就完事了,需要经过官网判断,只有通过验证,正确的样本才保存下来。这样有效的样本对提高识别率才有帮助。
在这里插入图片描述

实验成果

在这里插入图片描述
在这里插入图片描述
笔者实时对接官网对实验模型进行检验,结果如上图,测试了200+次,识别率达到98%以上,识别速度的话,CPU大概5-8毫秒左右,部署腾讯云1核1G服务器实测10ms-12ms,模型大概3mb。

附上接口仅供测试,为了防止滥用,接口每天只支持请求500次(此接口已不返回文本识别结果,采用图片结果代替,请在上面提供的测试页面中测试):

http://152.136.207.29:19812/preview

请求地址 Content-Type 参数形式 请求方法
http://152.136.207.29:19812/captcha/v1 application/json JSON POST

具体参数:

参数名 必选 类型 说明
image Yes String Base64 编码
param_key No String 颜色,red\blue\black\yellow

请求为JSON格式,形如:
{"image": "iVBORw0KGgoAAAANSUhEUgAAAFoAAAAjCAIAAA...base64编码后的图像二进制流", "param_key ": "blue"}

注意:图片只能是 90×35 尺寸的原图,请勿截图

也请勿使用 模拟浏览器 的截图获取,如果不知道如何使用协议获取验证码,可以参考这个文章的方法:
https://blog.csdn.net/kerlomz/article/details/106793781
若对最新的JS逆向感兴趣可以关注作者。

若以上方法都不清楚,可以【另存为图片】,本模型针对【原图】训练。
截图无法识别,不理解的可以先了解下深度学习 图像识别原理 ,或咨询 作者

返回结果:

参数名 类型 说明
message String 识别结果或错误消息
code String 状态码
success String 是否请求成功

该返回为JSON格式,形如:
{'uid': "9b5a6a34-9693-11ea-b6f9-525400a21e62", "message": "xxxx", "code": 0, "success": true}

请勿恶意使用,若超出当日限制将返回:
{'uid': "9b5a6a34-9693-11ea-b6f9-525400a21e62", 'message': '超出当日请求限制,请联系作者QQ:27009583', 'success': False, 'code': -555}

若返回 400 则表示数据包格式有误,请检查是否符合JSON标准。
若返回 405 则请检查确保使用POST方式请求。

Python示例:

import requests
import base64

with open(r"C:\1.png", "rb") as f:
    b = f.read()

# param_key: black-全黑色,red-红色,blue-蓝色,yellow-黄色
r = requests.post("http://152.136.207.29:19812/captcha/v1", json={ 
   
    "image": base64.b64encode(b).decode(), "param_key": "yellow"
})
print(r.json())
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/160835.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • UML学习入门就这一篇文章

    1.1UML基础知识扫盲UML这三个字母的全称是UnifiedModelingLanguage,直接翻译就是统一建模语言,简单地说就是一种有特殊用途的语言。你可能会问:这明明是一种图形,为什么说是语言呢?伟大的汉字还不是从图形(象形文字)开始的吗?语言是包括文字和图形的!其实有很多内容文字是无法表达的,你见过建筑设计图纸吗?里面还不是很多图形,光用文字能表达清楚建筑设计吗?在建筑界,…

  • 无名汉化组官网_什么是并查集

    无名汉化组官网_什么是并查集永无乡包含 n 座岛,编号从 1 到 n ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 n 座岛排名,名次用 1 到 n 来表示。某些岛之间由巨大的桥连接,通过桥可以从一个岛到达另一个岛。如果从岛 a 出发经过若干座(含 0 座)桥可以到达岛 b ,则称岛 a 和岛 b 是连通的。现在有两种操作:B x y 表示在岛 x 与岛 y 之间修建一座新桥。Q x k 表示询问当前与岛 x 连通的所有岛中第 k 重要的是哪座岛,即所有与岛 x 连通的岛中重要度排名第 k 小的岛是哪座,请你输出那

  • 去除字符串中重复字符

    去除字符串中重复字符去除字符串中重复字符:import java.util.LinkedHashSet;public class 去除重复字符串 { public static void main(String[] args) { String str = "aaaabbbccc"; char[] arr = str.toCharArray(); LinkedHashSet<Chara…

  • 公平洗牌算法_随机洗牌算法

    公平洗牌算法_随机洗牌算法要求:给定一个长度为n的有序数组,要求将其完全打乱,每个元素在任何位置出现的概率均为1/n。随机洗牌算法有好几个,这里讲其中的一个,Fisher-Yatesshuffle算法(时间复杂度为O(n)),其思路如下:(1)从数组中随机选取一个数p。(2)将p与数组中最后(也可以是最前)的元素交换。(如果随机选中的是最后的元素,则相当于没有发生交换)(3)去掉最后的元素(这里并没有删除操作,而是缩小索

  • Eclipse java SE版本解决无法新建web项目问题「建议收藏」

    Eclipse java SE版本解决无法新建web项目问题「建议收藏」Eclipse java SE版本解决无法新建web项目问题

  • IOS_OC_地图与定位

    IOS_OC_地图与定位知识点介绍一.定位实现一次定位CLLocation对象介绍实现持续定位请求用户授权二.地理编码正地理编码反地理编码三.地图的基本使用显示用户位置设置地图显示类型根据用户位置显示对应的大头针信息设置以用户所在位置为中心点监听地图显示区域改变iOS9新特性-显示交通状况/显示比例/显示指…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号