國稅總局全國發票查驗平台驗證碼識別,98%准確率


全國增值稅發票查驗平台驗證碼

2021/04/30


官網更新,已同步最新

測試接口


在這里插入圖片描述
識別速度如上圖所示5毫秒左右,機器配置如下圖:
在這里插入圖片描述
可見,低配1核CPU足以支撐業務日調用1.7千萬級別的負載調用,加之識別率一直是全網最高,業內不少頭部的財稅服務提供商都是使用筆者的版本,因保密協議不得透露合作關系,在此不舉例,畢竟大多數公司都會說自己並非使用爬蟲技術實現查驗功能,行內人應該都知道的,可自行查證。敢在合同上寫下識別率指標的不存在一絲絲水分。

測試地址:http://152.136.207.29:19812/preview?model_name=TAX

使用方法本篇博客就不贅述了,從官網保存驗證碼原圖,選擇需要識別的顏色,上傳圖片識別即可。

本接口防止白嫖設立了一定的風控,如有商業合作意願可聯系本人QQ(27009583)或合伙人QQ(1095085167),獲取文本接口測試。

7.16 更新(關於發票查驗服務本身)

驗證碼識別率是不需要更高了,我看有人找我了解發票查驗這塊,也順帶給個測試好了,目前支持全發票種類,你們看到的沒錯,是全發票種類,市面上的API接口也不一定能支持,其中包括(湊字數):增值稅專用發票、增值稅專用發票帶清單、貨物運輸業增值稅專用發票、增值稅普通發票、增值稅電子專用發票、增值稅電子普通發票、增值稅普通發票(卷票)、通行費xxx增值稅電子普通發票、二手車銷售統一發票。

恕我直言,就算是專門做查驗服務的企業也不一定有我們業余開發的專業,不信的盡管來對比測試hhhh。

查驗服務可視化測試

http://www.inv-veri.com/

查驗服務測試接口:

請求地址 Content-Type 參數形式 請求方法
http://106.53.31.110:8080/check?fpdm=3100171320&fphm=79262007&date=20170620&code=184553&channel=yd url JSON GET

具體參數:

參數名 必選 類型 說明
fpdm Yes String 發票代碼
fphm Yes String 發票號碼
date Yes String 發票時間
code Yes String 開具金額或者校驗六位。不知道就不填,服務器會返回提示之后再根據填寫。
channel Yes String 你猜,不填就拉閘

返回結果:

參數名 類型 說明
message String 結果提示
code String 0為成功處理
time String 請求所花費的時間(毫秒)
data String 解析的數據
info String 原始數據

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"}

注意:圖片只能是 90x35 尺寸的原圖,請勿截圖

也請勿使用 模擬瀏覽器 的截圖獲取,如果不知道如何使用協議獲取驗證碼,可以參考這個文章的方法:
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())


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM