pos機用戶(hù)號碼采集,這里有一個(gè)入門(mén)企業(yè)級驗證碼識別項目

 新聞資訊2  |   2023-05-25 10:50  |  投稿人:pos機之家

網(wǎng)上有很多關(guān)于pos機用戶(hù)號碼采集,這里有一個(gè)入門(mén)企業(yè)級驗證碼識別項目的知識,也有很多人為大家解答關(guān)于pos機用戶(hù)號碼采集的問(wèn)題,今天pos機之家(www.xjcwpx.cn)為大家整理了關(guān)于這方面的知識,讓我們一起來(lái)看下吧!

本文目錄一覽:

1、pos機用戶(hù)號碼采集

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ù)號碼采集的知識,希望能夠幫助到大家!

轉發(fā)請帶上網(wǎng)址:http://www.xjcwpx.cn/newsone/54332.html

你可能會(huì )喜歡:

版權聲明:本文內容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻,該文觀(guān)點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權,不承擔相關(guān)法律責任。如發(fā)現本站有涉嫌抄襲侵權/違法違規的內容, 請發(fā)送郵件至 babsan@163.com 舉報,一經(jīng)查實(shí),本站將立刻刪除。