網(wǎng)上有很多關(guān)于pos機用戶(hù)號碼采集,這里有一個(gè)入門(mén)企業(yè)級驗證碼識別項目的知識,也有很多人為大家解答關(guān)于pos機用戶(hù)號碼采集的問(wèn)題,今天pos機之家(www.xjcwpx.cn)為大家整理了關(guān)于這方面的知識,讓我們一起來(lái)看下吧!
本文目錄一覽:
pos機用戶(hù)號碼采集
機器之心專(zhuān)欄
作者:kerlomz
網(wǎng)上關(guān)于驗證碼識別的開(kāi)源項目眾多,但大多是學(xué)術(shù)型文章或者僅僅是一個(gè)測試 demo,那么企業(yè)級的驗證碼識別究竟是怎樣的呢?
1. 前言
網(wǎng)上關(guān)于驗證么識別的開(kāi)源項目眾多,但大多是學(xué)術(shù)型文章或者僅僅是一個(gè)測試 demo,那么企業(yè)級的驗證碼識別究竟是怎樣的呢?前方高能預警,這是一個(gè)生產(chǎn)水準的驗證碼識別項目,筆者可以向你們保證,它一定會(huì )是各位所見(jiàn)過(guò)的文章中最實(shí)用的,你甚至可以不需要懂代碼寫(xiě)代碼就能輕松使用它訓練一個(gè) 99 識別率的模型。這才是企業(yè)級應該有的樣子:算法開(kāi)發(fā)負責框架,訓練只需要一個(gè)實(shí)習生。不僅操作上簡(jiǎn)單,在可用性和穩定性上也是經(jīng)得起考驗。性能上,筆者使用騰訊云 1 核 1G 的機器測試:?jiǎn)未巫R別平均在 12ms 左右,再也不需要 GPU 部署了,CPU 一樣可以日調百萬(wàn)。
不少初學(xué)者和筆者反應,安裝環(huán)境太難了,沒(méi)關(guān)系,都給你們安排好了,一行 pip 就能搞定環(huán)境的 MuggleOCR。
倉庫地址:https://pypi.org/project/muggle-ocr
MuggleOCR 的體積有 6MB,其中附帶了兩個(gè)通用模型:簡(jiǎn)單通用驗證碼,普通 OCR。簡(jiǎn)而言之就是,再也不用愁驗證碼的樣本不好標注了,它將是各位標注樣本的利器,簡(jiǎn)單的驗證碼識別率能有 95% 以上,復雜的也有 50%-70% 左右,只需要結合官網(wǎng)校驗,輕松下載幾萬(wàn)標注樣本。
除此之外,它可以支持調用使用本文框架(captcha_trainer)訓練的模型。調用只需要三行核心代碼:
# 打開(kāi)一張驗證碼圖片
with open(r"1.png", "rb") as f:
img_bytes = f.read()
# 步驟 1
import muggle_ocr
# 步驟 2
sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)
# 步驟 3
text = sdk.predict(image_bytes=img_bytes)
print(text)
是不是很簡(jiǎn)單,用它應付一般的驗證碼識別足矣。
本項目旨在降低圖像識別的門(mén)檻,讓深度學(xué)習技術(shù)能夠進(jìn)入更多人的視線(xiàn)。任何人經(jīng)過(guò)簡(jiǎn)單的介紹,都可以輕易使用這項技術(shù)訓練一個(gè)商業(yè)化的成品。
筆者選用的時(shí)下最為流行的 CNN Backbone+RNN+CTC(CRNN)進(jìn)行端到端的不定長(cháng)驗證碼識別,代碼中預留了 CNNX/MobileNet/DenseNet121/ResNet50 等。其中可能你們搜不到 CNN5 和 CNNX,因為是小編自己拼湊的網(wǎng)絡(luò )選項,專(zhuān)門(mén)為驗證碼優(yōu)化定制的,在配置界面中可以隨意切換網(wǎng)絡(luò )組合。
前面介紹這么多還沒(méi)進(jìn)入正題,各位是不是好奇它到底是什么模樣呢?
運行方法:
1. 可通過(guò)編譯版的可執行文件運行
2. 在項目中運行 app.py 來(lái)啟動(dòng) 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 服務(wù)器版中使用編譯版如果出現閃退,可以用 CMD 執行可執行文件來(lái)查看報錯,如果報錯為 cv2 ImportError: Dll load failed 請按照步驟:我的電腦——屬性——管理——添加角色和功能——勾選桌面體驗,點(diǎn)擊安裝,安裝之后重啟即可。
H16/H64 指的是隱藏神經(jīng)元個(gè)數,根據上面的數據可知,訓練使用 GPU,部署預測使用 CPU 足矣。
2. 環(huán)境依賴(lài):
環(huán)境依賴(lài)花了超長(cháng)篇幅,主要是寫(xiě)給零開(kāi)發(fā)基礎的使用者,有基礎的可以隨便跳過(guò),也歡迎使用編譯版,可在上一章末尾找到下載地址。
關(guān)于 CUDA 和 cuDNN 版本的問(wèn)題,就讓不少人望而卻步,其實(shí)很簡(jiǎn)單,如果使用 pypi 倉庫安裝的 TensorFlow,那么 Linux 系統使用 CUDA 9.0,Windows 使用 CUDA 10.0,因為倉庫中的 whl 安裝文件都是根據對應的 CUDA 版本編譯的。也就是版本綁定死了,如果有需要可以去搜索 TensorFlow Wheel 找第三方編譯的版本,如果妄圖自行編譯我這里勸退一下,坑很多。
2.1 項目使用環(huán)境
以下是通過(guò)測試的環(huán)境:
本訓練項目主要的環(huán)境依賴(lài)清單如下
在項目中的 requirements.txt 已經(jīng)整理好所有依賴(lài)模塊。一鍵
pip install -r requirements.txt
安裝即可
1)安裝相關(guān)依賴(lài) 不用理會(huì )上面的清單,在項目中的 requirements.txt 已經(jīng)整理好所有依賴(lài)模塊??梢灾苯釉陧椖柯窂较聢绦?/p>
pip3 install -r requirements.txt
安裝所有依賴(lài)。
注意默認情況會(huì )安裝到全局的 Python 環(huán)境下,筆者強烈建議在虛擬環(huán)境進(jìn)行,做好項目間的環(huán)境隔離,可以借助 Virtualenv 或 Anaconda 等等實(shí)現。筆者個(gè)人使用的是 Virtualenv,如果有修改代碼需求的,可直接在 PyCharm 上操作。
virtualenv -p /usr/bin/python3 venv # venv 是虛擬環(huán)境的名稱(chēng),也是路徑名.
cd venv/ # 進(jìn)入環(huán)境.
source bin/activate # 激活當前環(huán)境.
cd captcha_trainer # captcha_trainer 是項目名.
pip3 install -r requirements.txt # 在剛剛創(chuàng )建的環(huán)境下安裝當前項目的依賴(lài)
2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN
網(wǎng)上很多教程,但是靠譜的不多,自己在不同的機器上部署過(guò)幾次,以身說(shuō)法,14.04 桌面版支持不好,需要主板支持關(guān)閉 SecureBoot,Ubuntu 16.04 的坑少一點(diǎn),大多的坑都發(fā)生在安裝好之后,在登陸界面無(wú)限循環(huán)無(wú)法進(jìn)入桌面。網(wǎng)上很多教程提示要加驅動(dòng)黑名單什么的,筆者親測沒(méi)那個(gè)必要。就簡(jiǎn)單的幾步:1. 下載好安裝包 必須下載 runfile 類(lèi)型的安裝包,即后綴名為. run 的安裝包,因為 deb 安裝包默認安裝自帶驅動(dòng),這是導致登陸循環(huán)的罪魁禍首。
NVIDIA 驅動(dòng)下載:https://www.geforce.cn/drivers
CUDA 下載地址:https://developer.nvidia.com/cuda-10.0-download-archive
cuDNN 下載地址:https://developer.nvidia.com/cudnn (需要注冊 NVIDIA 賬號且登陸,下載 deb 安裝包)
2. 關(guān)閉圖形界面 進(jìn)入字符界面,快捷鍵 Ctrl+alt+F1,將 GUI 服務(wù)關(guān)閉
sudo service lightdm stop
3. 安裝 Nvidia Driver
命令中的版本自己對應下載的版本改,在上面的下載地址根據自己的顯卡型號下載最新版,切記是 runfile 格式的安裝包。以下 3xx.xx 為版本號,請下載最新驅動(dòng)。
sudo chmod a+x NVIDIA-Linux-x86_64-3xx.xx.run //獲取執行權限
sudo ./NVIDIA-Linux-x86_64-3xx.xx.run –no-x-check –no-nouveau-check –no-opengl-files //安裝驅動(dòng)
安裝后使用 nvidia-smi 命令驗證,若出現顯卡信息,則表示安裝成功
4. 安裝 CUDA
1)先安裝一些系統依賴(lài)庫
sudo apt-get install build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa-dev libgl1-mesa-glx libglu1-mesa freeglut3-dev
2) 執行安裝程序,按提示繼續就好了,直到出現是否安裝驅動(dòng)選項,選擇不安裝即可。
sudo sh cuda_9.0.176_384.81_linux.run
安裝完成還需要配置環(huán)境變量,將以下內容就追加到 ~/.bashrc 文件的尾部
export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
最后在終端執行 sudo ldconfig 命令更新環(huán)境變量,重啟機器,重新啟用 GUI 即可。
sudo service lightdm start
2.1.3 Windows 系統
一直有人說(shuō) Windows 不適合做深度學(xué)習,其實(shí)筆者覺(jué)得還是蠻友好的。巨硬的系統安裝環(huán)境簡(jiǎn)單一百倍,只要到官網(wǎng)下載對應的安裝包,本項目建議 CUDA 10.0,Windows 2019 的話(huà)可以使用 Win10 版替代,CUDA 安裝的時(shí)候同樣不安裝驅動(dòng),包括一個(gè) VS 的選項也去掉(不取消安裝會(huì )很慢并可能安裝失?。?,然后下載對應的 cuDNN 替換到 CUDA 安裝路徑即可,一般為:C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.0。
3 使用
開(kāi)始之前,先解決一個(gè)世紀疑惑,有不少朋友常常私信我 “訓練一個(gè) x 位數英文數字驗證碼需要多少樣本?” 諸如此類(lèi)的問(wèn)題,筆者在此統一回復,樣本需要多少數量需要根據樣本的特征復雜程度來(lái)決定。
特征復雜度評價(jià)指標:
變形
旋轉
模糊
背景干擾
前景干擾
字體種類(lèi)
標簽數目 / 驗證碼位數
分類(lèi)數目 / 字符集大小
一般只包含以上 1-2 種的為簡(jiǎn)單,2-3 種為復雜,3 種以上屬于特別復雜。樣本量依次遞增,從幾百,幾千,幾萬(wàn),到幾十萬(wàn)不等,其中,分類(lèi)數目(字符集帶)多寡對數量級影響較大,例如中文幾千字符集的驗證碼一般 10w 起步,筆者文中末尾的驗證碼用了 100w 樣本。
PS:親們不要再考驗框架的健壯性了,樣本量連一個(gè) Batch Size 都達不到的,千萬(wàn)不要嘗試,根本跑不起來(lái)。
目前為止,入坑準備工作還差一步,巧婦難為無(wú)米之炊,首先,既然是訓練,得要先有數據,筆者這里提供一份路人皆知的 mnist 手寫(xiě)識別的數據集。
可以在騰訊云下載:https://share.weiyun.com/5pzGF4V
現在萬(wàn)事俱備,只欠東風(fēng)。
3.1 定義一個(gè)模型
本項目所有配置都是參數化的,不需要改動(dòng)任何代碼,可以直接通過(guò)可視化界面操作,訓練幾乎圖片驗證碼。訓練框架界面可以大致劃分為幾個(gè)部分:
1.Neural Network - 神經(jīng)網(wǎng)絡(luò )區
2.Project Configuration - 項目配置區
3.Sample Source - 樣本源配置區
4.Training Configuration - 訓練配置區
5.Buttons - 功能控制區
依此類(lèi)推的訓練配置的步驟如下:
1. 神經(jīng)網(wǎng)絡(luò )區 的配置項看起來(lái)很多,對于新手來(lái)說(shuō),只需先選擇好使用的網(wǎng)絡(luò ),在樣本配置區選擇樣本路徑之后,會(huì )自動(dòng)配置圖片有關(guān)的參數,保持默認推薦參數即可。筆者一般使用 CNNX+GRU+CTC 網(wǎng)絡(luò )進(jìn)行不定長(cháng)驗證碼的訓練。
2. 項目配置區 的配置項在網(wǎng)絡(luò )選好之后配置項目名,按回車(chē)或者點(diǎn)擊空白處確認。
3. 樣本源配置區 的配置項用來(lái)配置樣本源的路徑,訓練樣本是根據此路徑進(jìn)行打包成 TFRecords 格式,驗證樣本可以不指定,使用 [Validation Set Num] 參數隨機從訓練集總抽樣成驗證集,這里默認隨機抽取數目為 300 個(gè),可以在界面上自行修改。
4. 訓練配置區 的配置項負責定義訓練完成的條件如:結束準確率,結束 COST,結束 Epochs,批次大小。如果最后無(wú)法滿(mǎn)足可以手動(dòng)停止,然后點(diǎn)擊 [Compile] 編譯導出最新的訓練模型。
5. 功能控制區 的配置項,設置完上面步驟,先點(diǎn)擊 [Make Dataset] 打包樣本,再點(diǎn)擊[Start Training] 開(kāi)始訓練。
以下部分有基礎的讀者們可以了解一下:
如若使用 CrossEntropy 作為解碼器需要注意標簽數 LabelNum 和圖片尺寸需要滿(mǎn)足的關(guān)系,因為網(wǎng)絡(luò )為多標簽而設計(一般的多標簽采用直接連接多個(gè)分類(lèi)器,這也是有一部分網(wǎng)上的開(kāi)源代碼你們修改了圖片就無(wú)法運行的原因之一),卷積層的輸出 outputs 經(jīng)過(guò)了以下變換:
Reshape([label_num, int(outputs_shape[1] / label_num)])
為了保證 int(outputsshape[1] / labelnum) 運算能夠得到正整數維度,這意味著(zhù)他們之間存在某種數學(xué)關(guān)系,對 CNN5+Cross Entropy 網(wǎng)絡(luò )結構而言,Conv2D 層的步長(cháng)皆為 1,那么需要保證以下等式成立:
所以有時(shí)候需要對輸入的圖片 Resize,一般 4 位驗證碼不容易出現這種問(wèn)題,位數為 3,5,6,7 容易出現不滿(mǎn)足等式的問(wèn)題,這個(gè)等價(jià)關(guān)系如果不好計算的話(huà),建議使用 CTC Loss。
例如使用 CNN5+CrossEntropy 組合,則輸入寬度與輸入高度需要滿(mǎn)足:
同理如果 CNN5+RNN+CTC,卷積層之后的輸出經(jīng)過(guò)以下變換:
Reshape([-1, outputs_shape[2] * outputs_shape[3]])
原輸出(batchsize, outputsshape[1], outputsshape[2], outputsshape[3]),RNN 層的輸入輸出要求為(batch, timesteps, num_classes),為了接入 RNN 層,經(jīng)過(guò)以上的操作,又引出一個(gè) Time Step(時(shí)間步長(cháng))的概念。
可以把 timesteps 可以理解為圖片切片,每個(gè)切片需要和標簽對應。進(jìn)入 RNN 層之后 timesteps 的值也是經(jīng)過(guò)卷積池化變換之后 outputsshape[1],而 CTC Loss 的輸入要求為 [batchsize, frames, num_labels],若 timesteps 小于標簽數目,可以理解為圖片切片數小于標簽數,一個(gè)切片對應了多個(gè)標簽,那么肯定是無(wú)法計算損失的,也就是無(wú)法從損失函數中找到極小值,梯度無(wú)法下降。
timesteps 最合理的值一般是標簽數的 2 倍,為了達到目的,也可以通過(guò)對輸入 Resize 來(lái)間接調整卷積池化之后的 outputs_shape[1],一般情況下 timesteps 直接關(guān)聯(lián)于圖片寬度,大多情況只需按比例 Resize 寬度即可。
ExtractRegex 參數:
注意:如果訓練集的命名方式和我提供的新手訓練集不一樣,可以根據實(shí)際情況修改 ExtractRegex 的正則表達式。強烈建議不知道如何寫(xiě)正則表達式的朋友按照筆者的定義規范命名。目前這個(gè)功能只支持在 yaml 配置文件中修改,GUI 界面尚不支持修改該參數。DatasetPath 和 SourcePath 參數允許配置多個(gè)路徑,如果需要把多種樣式的圖片混合一起訓練,或者打算訓練一套通用識別模型的用戶(hù),這非常方便。分類(lèi)數目 / 字符集(Category)已經(jīng)包括了大多數驗證碼和 OCR 的情況,大多數情況下不需要自定義,一般的圖形驗證碼是大小寫(xiě)不敏感的,一般不要輕易選擇區分大小寫(xiě)的分類(lèi),推薦默認的 ALPHANUMERIC_LOWER ,會(huì )自動(dòng)將大寫(xiě)的轉為小寫(xiě),字符集定義很靈活,除了配置備注上提供的幾種范式,還支持訓練中文,自定義字符集用 list 表示,參考如下:
Category: ['你', '好', '世', '界', '北', '京', '大', '學(xué)']
如果是單標簽分類(lèi),可以配合 LabelNum=1,例如:
Category: ["飛機", "鞋子", "水杯", "面包", "橫幅", "訂書(shū)機", "壁畫(huà)", "貓砂", ......]
其文件名示例:飛機_0123456789012.png
如果是多標簽分類(lèi),可以配合 LabelSplit=&,例如:
Category: ["飛機", "鞋子", "水杯", "面包", "橫幅", "訂書(shū)機", "壁畫(huà)", "貓砂", ......]
其文件名示例:飛機 & 鞋子 & 水杯_1231290424123.png
注意:中文字符集一般比數字英文大很多,收斂時(shí)間較長(cháng),同樣也需要更多的樣本量,千萬(wàn)不要想著(zhù)幾千張圖片訓練幾千字符集的驗證碼,畢竟機器也不是神
形如上圖的圖片能輕松訓練到 98% 以上的識別率。
Imagewidth="360px",height="auto" />
Pretreatment 參數:
這個(gè) Pretreatment 參數主要是圖片預處理用的,例如下面這個(gè)有趣的 GIF 動(dòng)圖,
通過(guò)觀(guān)察,滾動(dòng)勻速,位數固定,那么一定存在某兩個(gè)固定的幀,完全包含前三和后三位的內容。這種就可以采用拼接的形式,將包含完整 6 位的內容的圖片拼接為一張,使用 Pretreatment/ConcatFrames 參數,選取前后兩個(gè)幀進(jìn)行水平拼接,適用于處理滾動(dòng)型 GIF,而閃爍型 GIF 可以使用 BlendFrames 參數進(jìn)行圖層融合。
3.2 開(kāi)始訓練
1. 經(jīng)過(guò) 采集標注樣本形如 xxx_隨機數. png
2. 樣本打包 可以通過(guò) GUI 界面的 [Make Dataset],或者使用 make_dataset.py 手動(dòng)配置打包樣本,打包的目的主要是為了減少硬盤(pán)的 IO 讀寫(xiě)。有時(shí)候準備的樣本比較少,訓練結果不滿(mǎn)意,重新采集了一部分樣本怎么加入訓練呢?對于增量的樣本打包可以使用[Attach Dataset],無(wú)需重新打包。PS:使用源碼的同學(xué)需要具備一定的編程基礎,盡量不去修改核心函數和靜態(tài)定義以免出現錯誤,修改代碼的時(shí)候請確保配套的部署項目對應的地方也一并修改了。
按照上面的介紹,講解雖多,但實(shí)際上只需要配置極少數的參數,就可以開(kāi)始訓練了,高級玩家一般配置不超過(guò) 10 秒。
開(kāi)始訓練:
1. 創(chuàng )建好項目后,在 PyCharm 中運行 trains.py,也可以在激活 Virtualenv 下使用終端亦或在安裝依賴(lài)的全局環(huán)境下執行
2. 本文建議全程使用 GUI 界面進(jìn)行操作,源碼使用 GUI 僅需啟動(dòng) app.py 即可。
python3 trains.py
下圖為訓練通用模型的過(guò)程截圖,耐心等待訓練結束即可。
訓練結束會(huì )在項目路徑的 out 下看到以下結構的文件,pb 為模型,yaml 為模型配置文件,下面該到部署環(huán)節了。
3.3 部署
一般驗證碼識別在企業(yè)中很少以 SDK 的形式被使用,大多是以微服務(wù)出現的,獨立于其他的業(yè)務(wù),獨立運營(yíng)和維護,那么企業(yè)級的部署服務(wù)又是怎樣的呢?
項目地址:https://github.com/kerlomz/captcha_platform
可以為各位提供一個(gè)參考,Tornado 服務(wù)僅作為一個(gè)例子,企業(yè)一般采用 gRPC 集群遠程調用。
如需要集成到項目里通過(guò) sdk 調用的,可以參考 MuggleOCR 的做法,它的核心繼承了 captcha_platform/sdk/pb/sdk.py:
https://pypi.org/project/muggle-ocr/
模型的調用方法:
可以通過(guò) muggle-ocr 調用訓練框架生產(chǎn)的模型(pypi 文檔有介紹),
也可以提取 sdk.py 根據需要自行修改。
還可以直接使用編譯版(免去安裝 Python 和 TensorFlow 環(huán)境,目前同時(shí)支持 Ubuntu/MacOS/Windows 三大平臺),第一章末尾有鏈接。
部署服務(wù)的特性:
支持多模型部署
支持模型熱拔插
版本控制靈活
支持批量識別
智能模型分發(fā)
筆者封裝了 Graph 會(huì )話(huà)管理,設計會(huì )話(huà)池,允許同時(shí)管理多模型,實(shí)現多模型動(dòng)態(tài)部署方案。
1) 訓練好的 pb 模型只要放在 graph 路徑下,yaml 文件放在 model 路徑下(操作順序很重要,yaml 主要用于服務(wù)發(fā)現,通過(guò) ModelName 參數定位對應的 pb 模型,如果順序顛倒,服務(wù)是無(wú)法加載尚未放置進(jìn)來(lái)的模型的)。
使用 SDK 調用時(shí),yaml 和 pb 模型必須在同一路徑下。
2) 卸載一個(gè)正在服務(wù)的模型,只需要刪除 yaml 和對應的 pb 模型即可。(模型已加載于內存所以無(wú)所謂順序)
3) 更新一個(gè)已經(jīng)部署加載的模型,只需按先后順序放置 pb 模型和高版本的 yaml 文件,服務(wù)會(huì )自動(dòng)發(fā)現并加載,舊模型優(yōu)先級被取代,不會(huì )再被調用,便可按上述方法卸載棄用的模型釋放內存。一切管理操作均無(wú)需重啟服務(wù),可以無(wú)感知切換,方便維護提高了可用性。
其次,如果讀者有很多驗證碼需求需要逐個(gè)定制,訓練時(shí)將所有尺寸一樣的圖片訓練成一個(gè)模型,服務(wù)根據圖片尺寸會(huì )自動(dòng)定位對應的模型。當然也可以通過(guò)傳遞 model_name 參數精確控制多模型調用,這樣的設計允許定制化和通用性共存,當讀者們積累到一定量的樣本集時(shí)可以像 MuggleOCR 一樣訓練一套通用識別模型作為備用模型。模型之間亦彼此獨立,每增加部署一個(gè)模型,僅僅增加了少量的內存或顯存占用,不少小企業(yè)也吃過(guò)定制模型的虧,找個(gè)人定制模型,每個(gè)模型都要獨立啟用一個(gè)服務(wù),無(wú)形增加了成本,每個(gè)進(jìn)程若重復加載一遍整個(gè)框架無(wú)疑是極大的資源浪費。
前面有提到批量識別,有這種需求的用戶(hù)相對較少,這里只做簡(jiǎn)單介紹,給一個(gè) 12306 的例子,如圖所示:
一張圖中包含了多個(gè)需要識別的部分,而框架中的 CorpParams 支持將大圖切割為小圖一并傳入,原本一個(gè)請求對于服務(wù)只能傳一張圖,現在可以通過(guò)裁剪功能一次傳入 9 張圖。代碼如下:
FieldParam:
CorpParams: [
{
"start_pos": [118, 0],
"interval_size": [0, 0],
"corp_num": [1, 1],
"corp_size": [60, 30]
},
{
"start_pos": [5, 40],
"interval_size": [5, 5],
"corp_num": [4, 2],
"corp_size": [66, 66]
}
]
OutputCoord: True
FieldParam/CorpParams 參數可以裁剪合并批次,該用法可避免多次調用。
但是識別項目提供多種后端實(shí)現版本:Tornado/Flask/gRPC/Sanic,其中 Flask 和 Tornado 搭載了加密接口 / captcha/auth/v2,類(lèi)似于微信公眾號開(kāi)發(fā)接口的 SecretKey 和 AccessKey 接口,有興趣的可以在 demo.py 中閱讀調用源碼了解。
部署服務(wù)可以使用 package.py 編譯為可執行文件,本文中提供的編譯版也是基于 Pyinstaller 打包編譯的,編譯版不需要考慮更換機器需要重新安裝環(huán)境,若使用源碼部署的話(huà),環(huán)境配置同訓練項目一樣,使用項目中提供的 requirements.txt 一鍵安裝全部依賴(lài),部署服務(wù)默認推薦的是 CPU 版的 TensorFlow。
部署服務(wù)推薦 Tornado 后端,目前最穩定的版本。
Linux:
Tornado:
# 端口 19952
python3 tornado_server.py
Flask
# 方案1,裸啟動(dòng), 端口 19951
python flask_server.py
# 方案2,使用gunicorn,端口 5000
pip install gunicorn
gunicorn -c deploy.conf.py flask_server:app
Sanic:
# 端口 19953
python3 sanic_server.py
gRPC:
# 端口 50054
python3 grpc_server.py
編譯版(基于 Tornado)
# 前臺運行
./captcha_platform_tornado
#后臺運行
nohup ./captcha_platform_tornado &
Windows:Windows 平臺下都是通過(guò) python3 xxx_server.py 啟動(dòng)對應的服務(wù),注意,Tornado、Flask、Sanic 的性能在 Windows 平臺都大打折扣,gRPC 是 Google 開(kāi)源的 RPC 服務(wù),有較為優(yōu)越的性能。編譯版直接運行編譯后的 exe 可執行文件即可。
3.4 調用 / 測試
1. Tornado 服務(wù):
具體參數:
請求為 JSON 格式,形如:{"image": "iVBORw0KGgoAAAANSUhEUgAAAFoAAAAjCAIAAA...base64 編碼后的圖像二進(jìn)制流"}
返回結果:
該返回為 JSON 格式,形如:{'uid': "9b5a6a34-9693-11ea-b6f9-525400a21e62", "message": "xxxx", "code": 0, "success": true}
2. Flask 服務(wù):
請求參數和返回格式同上
3. Sanic 服務(wù):
請求參數和返回格式同上
4. gRPC 服務(wù):需要安裝依賴(lài),grpcio、grpcio_tools 和對應的 grpc.proto 文件,可以直接從項目中的示例代碼 demo.py 中提取。
python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./grpc.proto
grpcio、grpcio_tools 是根據 grpc.proto 使用上述命令生成的。
class GoogleRPC(object):
def __init__(self, host: str):
self._url = '{}:50054'.format(host)
self.true_count = 0
self.total_count = 0
def request(self, image, model_type=None, model_site=None):
import grpc
import grpc_pb2
import grpc_pb2_grpc
channel = grpc.insecure_channel(self._url)
stub = grpc_pb2_grpc.PredictStub(channel)
response = stub.predict(grpc_pb2.PredictRequest(
image=image, split_char=',', model_type=model_type, model_site=model_site
))
return {"message": response.result, "code": response.code, "success": response.success}
if __name__ == '__main__':
result = GoogleRPC().request("base64編碼后的圖片二進(jìn)制流")
print(result)
3.5 奇技淫巧
舉一個(gè)比較不常見(jiàn)的例子,以下例子不代表任何網(wǎng)站。
正常情況下會(huì )想到以下 1 和 2.1 的方法:
1. 顏色提取的思路,可以采用 HSV/K-means 聚類(lèi)進(jìn)行顏色的分離提?。盒Ч缦拢?/p>
弊端顯而易見(jiàn),會(huì )有較大的特征丟失,識別率有較大的提升瓶頸,經(jīng)過(guò)測試,中英文 + 漢字的識別率在 90% 左右。
2. 不分離顏色的思路,該方案有兩種處理方法:
(1)同時(shí)預測顏色和字符內容,這種方法看起來(lái)比較正統,但是成本較高,需要標注每張圖的顏色和字符內容,這個(gè)要求有多高呢,一般的打碼平臺是無(wú)法提供這樣的結果的,打碼平臺只返回對應顏色的內容,只能人工標注,那么需要多少樣本呢?按照筆者訓練的識別率 98 的模型用了 100w 左右的樣本。一張這樣的樣本標注假設需要 0.1 元,那么 100w 樣本需要 10w 標注費用,假設 0.01 元,也要 1w 的標注費用。但是驗證碼高質(zhì)量的人工標注幾乎是不存在的,因為很多樣本,人眼的識別率是不如機器的,總體標注的準確率大概也只能在 85 左右??雌饋?lái)并不可取,有一種節約成本的辦法,可以通過(guò)算法生成樣本,但是呢,生成的識別率英文數字還可以,中文的識別率就低的可憐了。
(2)每個(gè)顏色分別訓練一個(gè)模型, 這種方法看起來(lái)有點(diǎn)蠢,但是確實(shí)比較合適有效的辦法了,可以輕松借助打碼平臺的返回結果標注樣本。需要的顏色可以通過(guò)官網(wǎng)提供的字段取到,返回結果通過(guò)打碼平臺識別得到,這樣一組合,樣本就有了。這種方法的成本相對較低,樣本數不變的前提下,打碼價(jià)格低于人工標注的成本。但是筆者訓練的是一種顏色的樣本用了 100w。每個(gè)顏色分別訓練這樣成本還是下不來(lái)。四種顏色就是 500w 樣本。官網(wǎng)的每次獲取圖片的時(shí)候顏色隨機出現的概率也不一定是 1/4。
(3)把所有顏色都通過(guò)顏色變換為一種顏色,整體思路同(2)。如下圖,筆者將黑色轉換為紅色,但是樣本成本只有采集一種顏色的成本??雌饋?lái)是目前位置最佳的方案了,事實(shí)也是如此的。但是呢,100w 的樣本對于普通人來(lái)說(shuō)也是一筆不小的花銷(xiāo),即便有了樣本能做出來(lái)也需要花費不少的時(shí)間和精力。
不過(guò)采集樣本不是單純的接打碼平臺就完事了,需要經(jīng)過(guò)官網(wǎng)判斷,只有通過(guò)驗證,正確的樣本才保存下來(lái)。這樣有效的樣本對提高識別率才有幫助。
經(jīng)過(guò)筆者實(shí)驗,2.3 的方法性能效果最佳。
筆者實(shí)時(shí)對接官網(wǎng)對實(shí)驗模型進(jìn)行檢驗,結果如上圖,測試了 200 + 次,識別率達到 98% 以上,識別速度的話(huà),相較于 1.1 的方法省去了顏色提取,大大縮短了時(shí)間,CPU 大概 5-8 毫秒左右,模型大概 3mb。
所以選擇合適的方案解決問(wèn)題才是最終的目的,希望這個(gè)項目和這篇介紹能帶大家入門(mén)企業(yè)級的驗證碼識別。
以上就是關(guān)于pos機用戶(hù)號碼采集,這里有一個(gè)入門(mén)企業(yè)級驗證碼識別項目的知識,后面我們會(huì )繼續為大家整理關(guān)于pos機用戶(hù)號碼采集的知識,希望能夠幫助到大家!
