国税总局发票查验平台验证码识别方案,识别率达98%
全國增值稅發票查驗平臺驗證碼
2020.04.30
已經同步更新,測試網址不變
手動置頂:驗證碼識別測試頁面(可視化操作)
識別率97.5%,圖片接口支持手動測試,以圖片形式返回結果;文本接口需要聯系作者,測試額度1000次限24小時內使用。
1.本地提交一張【90x35】大小的圖片;
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
驗證碼分析
如圖所示:圖像驗證碼,識別指定顏色的文字。
識別思路
首先有幾條道路可以通向羅馬,這里不分先后優劣一一講述。
弊端顯而易見,會有較大的特征丟失,識別率有較大的提升瓶頸,經過測試,中英文+漢字的識別率在90%左右。
(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
| 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 base64with 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())總結
以上是生活随笔為你收集整理的国税总局发票查验平台验证码识别方案,识别率达98%的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OPPO Java后端校招提前批面试
- 下一篇: 深入浅出理解reedsolomon库数据