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