pos機(jī)用戶號(hào)碼采集,這里有一個(gè)入門企業(yè)級(jí)驗(yàn)證碼識(shí)別項(xiàng)目

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

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

本文目錄一覽:

1、pos機(jī)用戶號(hào)碼采集

pos機(jī)用戶號(hào)碼采集

機(jī)器之心專欄

作者:kerlomz

網(wǎng)上關(guān)于驗(yàn)證碼識(shí)別的開(kāi)源項(xiàng)目眾多,但大多是學(xué)術(shù)型文章或者僅僅是一個(gè)測(cè)試 demo,那么企業(yè)級(jí)的驗(yàn)證碼識(shí)別究竟是怎樣的呢?

1. 前言

網(wǎng)上關(guān)于驗(yàn)證么識(shí)別的開(kāi)源項(xiàng)目眾多,但大多是學(xué)術(shù)型文章或者僅僅是一個(gè)測(cè)試 demo,那么企業(yè)級(jí)的驗(yàn)證碼識(shí)別究竟是怎樣的呢?前方高能預(yù)警,這是一個(gè)生產(chǎn)水準(zhǔn)的驗(yàn)證碼識(shí)別項(xiàng)目,筆者可以向你們保證,它一定會(huì)是各位所見(jiàn)過(guò)的文章中最實(shí)用的,你甚至可以不需要懂代碼寫代碼就能輕松使用它訓(xùn)練一個(gè) 99 識(shí)別率的模型。這才是企業(yè)級(jí)應(yīng)該有的樣子:算法開(kāi)發(fā)負(fù)責(zé)框架,訓(xùn)練只需要一個(gè)實(shí)習(xí)生。不僅操作上簡(jiǎn)單,在可用性和穩(wěn)定性上也是經(jīng)得起考驗(yàn)。性能上,筆者使用騰訊云 1 核 1G 的機(jī)器測(cè)試:?jiǎn)未巫R(shí)別平均在 12ms 左右,再也不需要 GPU 部署了,CPU 一樣可以日調(diào)百萬(wàn)。

不少初學(xué)者和筆者反應(yīng),安裝環(huán)境太難了,沒(méi)關(guān)系,都給你們安排好了,一行 pip 就能搞定環(huán)境的 MuggleOCR。

倉(cāng)庫(kù)地址:https://pypi.org/project/muggle-ocr

MuggleOCR 的體積有 6MB,其中附帶了兩個(gè)通用模型:簡(jiǎn)單通用驗(yàn)證碼,普通 OCR。簡(jiǎn)而言之就是,再也不用愁驗(yàn)證碼的樣本不好標(biāo)注了,它將是各位標(biāo)注樣本的利器,簡(jiǎn)單的驗(yàn)證碼識(shí)別率能有 95% 以上,復(fù)雜的也有 50%-70% 左右,只需要結(jié)合官網(wǎng)校驗(yàn),輕松下載幾萬(wàn)標(biāo)注樣本。

除此之外,它可以支持調(diào)用使用本文框架(captcha_trainer)訓(xùn)練的模型。調(diào)用只需要三行核心代碼:

# 打開(kāi)一張驗(yàn)證碼圖片

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)單,用它應(yīng)付一般的驗(yàn)證碼識(shí)別足矣。

本項(xiàng)目旨在降低圖像識(shí)別的門檻,讓深度學(xué)習(xí)技術(shù)能夠進(jìn)入更多人的視線。任何人經(jīng)過(guò)簡(jiǎn)單的介紹,都可以輕易使用這項(xiàng)技術(shù)訓(xùn)練一個(gè)商業(yè)化的成品。

筆者選用的時(shí)下最為流行的 CNN Backbone+RNN+CTC(CRNN)進(jìn)行端到端的不定長(zhǎng)驗(yàn)證碼識(shí)別,代碼中預(yù)留了 CNNX/MobileNet/DenseNet121/ResNet50 等。其中可能你們搜不到 CNN5 和 CNNX,因?yàn)槭切【幾约浩礈惖木W(wǎng)絡(luò)選項(xiàng),專門為驗(yàn)證碼優(yōu)化定制的,在配置界面中可以隨意切換網(wǎng)絡(luò)組合。

前面介紹這么多還沒(méi)進(jìn)入正題,各位是不是好奇它到底是什么模樣呢?

運(yùn)行方法:

1. 可通過(guò)編譯版的可執(zhí)行文件運(yùn)行

2. 在項(xiàng)目中運(yùn)行 app.py 來(lái)啟動(dòng) GUI 的界面

訓(xùn)練項(xiàng)目源碼:https://github.com/kerlomz/captcha_trainer

編譯版下載地址:https://github.com/kerlomz/captcha_trainer/releases

部署項(xiàng)目源碼:https://github.com/kerlomz/captcha_platform

編譯版下載地址:https://github.com/kerlomz/captcha_platform/releases

注意:在 Windows 服務(wù)器版中使用編譯版如果出現(xiàn)閃退,可以用 CMD 執(zhí)行可執(zhí)行文件來(lái)查看報(bào)錯(cuò),如果報(bào)錯(cuò)為 cv2 ImportError: Dll load failed 請(qǐng)按照步驟:我的電腦——屬性——管理——添加角色和功能——勾選桌面體驗(yàn),點(diǎn)擊安裝,安裝之后重啟即可。

H16/H64 指的是隱藏神經(jīng)元個(gè)數(shù),根據(jù)上面的數(shù)據(jù)可知,訓(xùn)練使用 GPU,部署預(yù)測(cè)使用 CPU 足矣。

2. 環(huán)境依賴:

環(huán)境依賴花了超長(zhǎng)篇幅,主要是寫給零開(kāi)發(fā)基礎(chǔ)的使用者,有基礎(chǔ)的可以隨便跳過(guò),也歡迎使用編譯版,可在上一章末尾找到下載地址。

關(guān)于 CUDA 和 cuDNN 版本的問(wèn)題,就讓不少人望而卻步,其實(shí)很簡(jiǎn)單,如果使用 pypi 倉(cāng)庫(kù)安裝的 TensorFlow,那么 Linux 系統(tǒng)使用 CUDA 9.0,Windows 使用 CUDA 10.0,因?yàn)閭}(cāng)庫(kù)中的 whl 安裝文件都是根據(jù)對(duì)應(yīng)的 CUDA 版本編譯的。也就是版本綁定死了,如果有需要可以去搜索 TensorFlow Wheel 找第三方編譯的版本,如果妄圖自行編譯我這里勸退一下,坑很多。

2.1 項(xiàng)目使用環(huán)境

以下是通過(guò)測(cè)試的環(huán)境:

本訓(xùn)練項(xiàng)目主要的環(huán)境依賴清單如下

在項(xiàng)目中的 requirements.txt 已經(jīng)整理好所有依賴模塊。一鍵

pip install -r requirements.txt

安裝即可

1)安裝相關(guān)依賴 不用理會(huì)上面的清單,在項(xiàng)目中的 requirements.txt 已經(jīng)整理好所有依賴模塊??梢灾苯釉陧?xiàng)目路徑下執(zhí)行

pip3 install -r requirements.txt

安裝所有依賴。

注意默認(rèn)情況會(huì)安裝到全局的 Python 環(huán)境下,筆者強(qiáng)烈建議在虛擬環(huán)境進(jìn)行,做好項(xiàng)目間的環(huán)境隔離,可以借助 Virtualenv 或 Anaconda 等等實(shí)現(xiàn)。筆者個(gè)人使用的是 Virtualenv,如果有修改代碼需求的,可直接在 PyCharm 上操作。

virtualenv -p /usr/bin/python3 venv # venv 是虛擬環(huán)境的名稱,也是路徑名.

cd venv/ # 進(jìn)入環(huán)境.

source bin/activate # 激活當(dāng)前環(huán)境.

cd captcha_trainer # captcha_trainer 是項(xiàng)目名.

pip3 install -r requirements.txt # 在剛剛創(chuàng)建的環(huán)境下安裝當(dāng)前項(xiàng)目的依賴

2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN

網(wǎng)上很多教程,但是靠譜的不多,自己在不同的機(jī)器上部署過(guò)幾次,以身說(shuō)法,14.04 桌面版支持不好,需要主板支持關(guān)閉 SecureBoot,Ubuntu 16.04 的坑少一點(diǎn),大多的坑都發(fā)生在安裝好之后,在登陸界面無(wú)限循環(huán)無(wú)法進(jìn)入桌面。網(wǎng)上很多教程提示要加驅(qū)動(dòng)黑名單什么的,筆者親測(cè)沒(méi)那個(gè)必要。就簡(jiǎn)單的幾步:1. 下載好安裝包 必須下載 runfile 類型的安裝包,即后綴名為. run 的安裝包,因?yàn)?deb 安裝包默認(rèn)安裝自帶驅(qū)動(dòng),這是導(dǎo)致登陸循環(huán)的罪魁禍?zhǔn)住?/p>

NVIDIA 驅(qū)動(dòng)下載:https://www.geforce.cn/drivers

CUDA 下載地址:https://developer.nvidia.com/cuda-10.0-download-archive

cuDNN 下載地址:https://developer.nvidia.com/cudnn (需要注冊(cè) NVIDIA 賬號(hào)且登陸,下載 deb 安裝包)

2. 關(guān)閉圖形界面 進(jìn)入字符界面,快捷鍵 Ctrl+alt+F1,將 GUI 服務(wù)關(guān)閉

sudo service lightdm stop

3. 安裝 Nvidia Driver

命令中的版本自己對(duì)應(yīng)下載的版本改,在上面的下載地址根據(jù)自己的顯卡型號(hào)下載最新版,切記是 runfile 格式的安裝包。以下 3xx.xx 為版本號(hào),請(qǐng)下載最新驅(qū)動(dòng)。

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ū)動(dòng)

安裝后使用 nvidia-smi 命令驗(yàn)證,若出現(xiàn)顯卡信息,則表示安裝成功

4. 安裝 CUDA

1)先安裝一些系統(tǒng)依賴庫(kù)

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ū)動(dòng)選項(xiàng),選擇不安裝即可。

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)境變量,重啟機(jī)器,重新啟用 GUI 即可。

sudo service lightdm start

2.1.3 Windows 系統(tǒng)

一直有人說(shuō) Windows 不適合做深度學(xué)習(xí),其實(shí)筆者覺(jué)得還是蠻友好的。巨硬的系統(tǒng)安裝環(huán)境簡(jiǎn)單一百倍,只要到官網(wǎng)下載對(duì)應(yīng)的安裝包,本項(xiàng)目建議 CUDA 10.0,Windows 2019 的話可以使用 Win10 版替代,CUDA 安裝的時(shí)候同樣不安裝驅(qū)動(dòng),包括一個(gè) VS 的選項(xiàng)也去掉(不取消安裝會(huì)很慢并可能安裝失?。?,然后下載對(duì)應(yīng)的 cuDNN 替換到 CUDA 安裝路徑即可,一般為:C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v10.0。

3 使用

開(kāi)始之前,先解決一個(gè)世紀(jì)疑惑,有不少朋友常常私信我 “訓(xùn)練一個(gè) x 位數(shù)英文數(shù)字驗(yàn)證碼需要多少樣本?” 諸如此類的問(wèn)題,筆者在此統(tǒng)一回復(fù),樣本需要多少數(shù)量需要根據(jù)樣本的特征復(fù)雜程度來(lái)決定。

特征復(fù)雜度評(píng)價(jià)指標(biāo):

變形

旋轉(zhuǎn)

模糊

背景干擾

前景干擾

字體種類

標(biāo)簽數(shù)目 / 驗(yàn)證碼位數(shù)

分類數(shù)目 / 字符集大小

一般只包含以上 1-2 種的為簡(jiǎn)單,2-3 種為復(fù)雜,3 種以上屬于特別復(fù)雜。樣本量依次遞增,從幾百,幾千,幾萬(wàn),到幾十萬(wàn)不等,其中,分類數(shù)目(字符集帶)多寡對(duì)數(shù)量級(jí)影響較大,例如中文幾千字符集的驗(yàn)證碼一般 10w 起步,筆者文中末尾的驗(yàn)證碼用了 100w 樣本。

PS:親們不要再考驗(yàn)框架的健壯性了,樣本量連一個(gè) Batch Size 都達(dá)不到的,千萬(wàn)不要嘗試,根本跑不起來(lái)。

目前為止,入坑準(zhǔn)備工作還差一步,巧婦難為無(wú)米之炊,首先,既然是訓(xùn)練,得要先有數(shù)據(jù),筆者這里提供一份路人皆知的 mnist 手寫識(shí)別的數(shù)據(jù)集。

可以在騰訊云下載:https://share.weiyun.com/5pzGF4V

現(xiàn)在萬(wàn)事俱備,只欠東風(fēng)。

3.1 定義一個(gè)模型

本項(xiàng)目所有配置都是參數(shù)化的,不需要改動(dòng)任何代碼,可以直接通過(guò)可視化界面操作,訓(xùn)練幾乎圖片驗(yàn)證碼。訓(xùn)練框架界面可以大致劃分為幾個(gè)部分:

1.Neural Network - 神經(jīng)網(wǎng)絡(luò)區(qū)

2.Project Configuration - 項(xiàng)目配置區(qū)

3.Sample Source - 樣本源配置區(qū)

4.Training Configuration - 訓(xùn)練配置區(qū)

5.Buttons - 功能控制區(qū)

依此類推的訓(xùn)練配置的步驟如下:

1. 神經(jīng)網(wǎng)絡(luò)區(qū) 的配置項(xiàng)看起來(lái)很多,對(duì)于新手來(lái)說(shuō),只需先選擇好使用的網(wǎng)絡(luò),在樣本配置區(qū)選擇樣本路徑之后,會(huì)自動(dòng)配置圖片有關(guān)的參數(shù),保持默認(rèn)推薦參數(shù)即可。筆者一般使用 CNNX+GRU+CTC 網(wǎng)絡(luò)進(jìn)行不定長(zhǎng)驗(yàn)證碼的訓(xùn)練。

2. 項(xiàng)目配置區(qū) 的配置項(xiàng)在網(wǎng)絡(luò)選好之后配置項(xiàng)目名,按回車或者點(diǎn)擊空白處確認(rèn)。

3. 樣本源配置區(qū) 的配置項(xiàng)用來(lái)配置樣本源的路徑,訓(xùn)練樣本是根據(jù)此路徑進(jìn)行打包成 TFRecords 格式,驗(yàn)證樣本可以不指定,使用 [Validation Set Num] 參數(shù)隨機(jī)從訓(xùn)練集總抽樣成驗(yàn)證集,這里默認(rèn)隨機(jī)抽取數(shù)目為 300 個(gè),可以在界面上自行修改。

4. 訓(xùn)練配置區(qū) 的配置項(xiàng)負(fù)責(zé)定義訓(xùn)練完成的條件如:結(jié)束準(zhǔn)確率,結(jié)束 COST,結(jié)束 Epochs,批次大小。如果最后無(wú)法滿足可以手動(dòng)停止,然后點(diǎn)擊 [Compile] 編譯導(dǎo)出最新的訓(xùn)練模型。

5. 功能控制區(qū) 的配置項(xiàng),設(shè)置完上面步驟,先點(diǎn)擊 [Make Dataset] 打包樣本,再點(diǎn)擊[Start Training] 開(kāi)始訓(xùn)練。

以下部分有基礎(chǔ)的讀者們可以了解一下:

如若使用 CrossEntropy 作為解碼器需要注意標(biāo)簽數(shù) LabelNum 和圖片尺寸需要滿足的關(guān)系,因?yàn)榫W(wǎng)絡(luò)為多標(biāo)簽而設(shè)計(jì)(一般的多標(biāo)簽采用直接連接多個(gè)分類器,這也是有一部分網(wǎng)上的開(kāi)源代碼你們修改了圖片就無(wú)法運(yùn)行的原因之一),卷積層的輸出 outputs 經(jīng)過(guò)了以下變換:

Reshape([label_num, int(outputs_shape[1] / label_num)])

為了保證 int(outputsshape[1] / labelnum) 運(yùn)算能夠得到正整數(shù)維度,這意味著他們之間存在某種數(shù)學(xué)關(guān)系,對(duì) CNN5+Cross Entropy 網(wǎng)絡(luò)結(jié)構(gòu)而言,Conv2D 層的步長(zhǎng)皆為 1,那么需要保證以下等式成立:

所以有時(shí)候需要對(duì)輸入的圖片 Resize,一般 4 位驗(yàn)證碼不容易出現(xiàn)這種問(wèn)題,位數(shù)為 3,5,6,7 容易出現(xiàn)不滿足等式的問(wèn)題,這個(gè)等價(jià)關(guān)系如果不好計(jì)算的話,建議使用 CTC Loss。

例如使用 CNN5+CrossEntropy 組合,則輸入寬度與輸入高度需要滿足:

同理如果 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í)間步長(zhǎng))的概念。

可以把 timesteps 可以理解為圖片切片,每個(gè)切片需要和標(biāo)簽對(duì)應(yīng)。進(jìn)入 RNN 層之后 timesteps 的值也是經(jīng)過(guò)卷積池化變換之后 outputsshape[1],而 CTC Loss 的輸入要求為 [batchsize, frames, num_labels],若 timesteps 小于標(biāo)簽數(shù)目,可以理解為圖片切片數(shù)小于標(biāo)簽數(shù),一個(gè)切片對(duì)應(yīng)了多個(gè)標(biāo)簽,那么肯定是無(wú)法計(jì)算損失的,也就是無(wú)法從損失函數(shù)中找到極小值,梯度無(wú)法下降。

timesteps 最合理的值一般是標(biāo)簽數(shù)的 2 倍,為了達(dá)到目的,也可以通過(guò)對(duì)輸入 Resize 來(lái)間接調(diào)整卷積池化之后的 outputs_shape[1],一般情況下 timesteps 直接關(guān)聯(lián)于圖片寬度,大多情況只需按比例 Resize 寬度即可。

ExtractRegex 參數(shù):

注意:如果訓(xùn)練集的命名方式和我提供的新手訓(xùn)練集不一樣,可以根據(jù)實(shí)際情況修改 ExtractRegex 的正則表達(dá)式。強(qiáng)烈建議不知道如何寫正則表達(dá)式的朋友按照筆者的定義規(guī)范命名。目前這個(gè)功能只支持在 yaml 配置文件中修改,GUI 界面尚不支持修改該參數(shù)。DatasetPath 和 SourcePath 參數(shù)允許配置多個(gè)路徑,如果需要把多種樣式的圖片混合一起訓(xùn)練,或者打算訓(xùn)練一套通用識(shí)別模型的用戶,這非常方便。分類數(shù)目 / 字符集(Category)已經(jīng)包括了大多數(shù)驗(yàn)證碼和 OCR 的情況,大多數(shù)情況下不需要自定義,一般的圖形驗(yàn)證碼是大小寫不敏感的,一般不要輕易選擇區(qū)分大小寫的分類,推薦默認(rèn)的 ALPHANUMERIC_LOWER ,會(huì)自動(dòng)將大寫的轉(zhuǎn)為小寫,字符集定義很靈活,除了配置備注上提供的幾種范式,還支持訓(xùn)練中文,自定義字符集用 list 表示,參考如下:

Category: ['你', '好', '世', '界', '北', '京', '大', '學(xué)']

如果是單標(biāo)簽分類,可以配合 LabelNum=1,例如:

Category: ["飛機(jī)", "鞋子", "水杯", "面包", "橫幅", "訂書機(jī)", "壁畫", "貓砂", ......]

其文件名示例:飛機(jī)_0123456789012.png

如果是多標(biāo)簽分類,可以配合 LabelSplit=&,例如:

Category: ["飛機(jī)", "鞋子", "水杯", "面包", "橫幅", "訂書機(jī)", "壁畫", "貓砂", ......]

其文件名示例:飛機(jī) & 鞋子 & 水杯_1231290424123.png

注意:中文字符集一般比數(shù)字英文大很多,收斂時(shí)間較長(zhǎng),同樣也需要更多的樣本量,千萬(wàn)不要想著幾千張圖片訓(xùn)練幾千字符集的驗(yàn)證碼,畢竟機(jī)器也不是神

形如上圖的圖片能輕松訓(xùn)練到 98% 以上的識(shí)別率。

Imagewidth="360px",height="auto" />

Pretreatment 參數(shù):

這個(gè) Pretreatment 參數(shù)主要是圖片預(yù)處理用的,例如下面這個(gè)有趣的 GIF 動(dòng)圖,

通過(guò)觀察,滾動(dòng)勻速,位數(shù)固定,那么一定存在某兩個(gè)固定的幀,完全包含前三和后三位的內(nèi)容。這種就可以采用拼接的形式,將包含完整 6 位的內(nèi)容的圖片拼接為一張,使用 Pretreatment/ConcatFrames 參數(shù),選取前后兩個(gè)幀進(jìn)行水平拼接,適用于處理滾動(dòng)型 GIF,而閃爍型 GIF 可以使用 BlendFrames 參數(shù)進(jìn)行圖層融合。

3.2 開(kāi)始訓(xùn)練

1. 經(jīng)過(guò) 采集標(biāo)注樣本形如 xxx_隨機(jī)數(shù). png

2. 樣本打包 可以通過(guò) GUI 界面的 [Make Dataset],或者使用 make_dataset.py 手動(dòng)配置打包樣本,打包的目的主要是為了減少硬盤的 IO 讀寫。有時(shí)候準(zhǔn)備的樣本比較少,訓(xùn)練結(jié)果不滿意,重新采集了一部分樣本怎么加入訓(xùn)練呢?對(duì)于增量的樣本打包可以使用[Attach Dataset],無(wú)需重新打包。PS:使用源碼的同學(xué)需要具備一定的編程基礎(chǔ),盡量不去修改核心函數(shù)和靜態(tài)定義以免出現(xiàn)錯(cuò)誤,修改代碼的時(shí)候請(qǐng)確保配套的部署項(xiàng)目對(duì)應(yīng)的地方也一并修改了。

按照上面的介紹,講解雖多,但實(shí)際上只需要配置極少數(shù)的參數(shù),就可以開(kāi)始訓(xùn)練了,高級(jí)玩家一般配置不超過(guò) 10 秒。

開(kāi)始訓(xùn)練:

1. 創(chuàng)建好項(xiàng)目后,在 PyCharm 中運(yùn)行 trains.py,也可以在激活 Virtualenv 下使用終端亦或在安裝依賴的全局環(huán)境下執(zhí)行

2. 本文建議全程使用 GUI 界面進(jìn)行操作,源碼使用 GUI 僅需啟動(dòng) app.py 即可。

python3 trains.py

下圖為訓(xùn)練通用模型的過(guò)程截圖,耐心等待訓(xùn)練結(jié)束即可。

訓(xùn)練結(jié)束會(huì)在項(xiàng)目路徑的 out 下看到以下結(jié)構(gòu)的文件,pb 為模型,yaml 為模型配置文件,下面該到部署環(huán)節(jié)了。

3.3 部署

一般驗(yàn)證碼識(shí)別在企業(yè)中很少以 SDK 的形式被使用,大多是以微服務(wù)出現(xiàn)的,獨(dú)立于其他的業(yè)務(wù),獨(dú)立運(yùn)營(yíng)和維護(hù),那么企業(yè)級(jí)的部署服務(wù)又是怎樣的呢?

項(xiàng)目地址:https://github.com/kerlomz/captcha_platform

可以為各位提供一個(gè)參考,Tornado 服務(wù)僅作為一個(gè)例子,企業(yè)一般采用 gRPC 集群遠(yuǎn)程調(diào)用。

如需要集成到項(xiàng)目里通過(guò) sdk 調(diào)用的,可以參考 MuggleOCR 的做法,它的核心繼承了 captcha_platform/sdk/pb/sdk.py:

https://pypi.org/project/muggle-ocr/

模型的調(diào)用方法:

可以通過(guò) muggle-ocr 調(diào)用訓(xùn)練框架生產(chǎn)的模型(pypi 文檔有介紹),

也可以提取 sdk.py 根據(jù)需要自行修改。

還可以直接使用編譯版(免去安裝 Python 和 TensorFlow 環(huán)境,目前同時(shí)支持 Ubuntu/MacOS/Windows 三大平臺(tái)),第一章末尾有鏈接。

部署服務(wù)的特性:

支持多模型部署

支持模型熱拔插

版本控制靈活

支持批量識(shí)別

智能模型分發(fā)

筆者封裝了 Graph 會(huì)話管理,設(shè)計(jì)會(huì)話池,允許同時(shí)管理多模型,實(shí)現(xiàn)多模型動(dòng)態(tài)部署方案。

1) 訓(xùn)練好的 pb 模型只要放在 graph 路徑下,yaml 文件放在 model 路徑下(操作順序很重要,yaml 主要用于服務(wù)發(fā)現(xiàn),通過(guò) ModelName 參數(shù)定位對(duì)應(yīng)的 pb 模型,如果順序顛倒,服務(wù)是無(wú)法加載尚未放置進(jìn)來(lái)的模型的)。

使用 SDK 調(diào)用時(shí),yaml 和 pb 模型必須在同一路徑下。

2) 卸載一個(gè)正在服務(wù)的模型,只需要?jiǎng)h除 yaml 和對(duì)應(yīng)的 pb 模型即可。(模型已加載于內(nèi)存所以無(wú)所謂順序)

3) 更新一個(gè)已經(jīng)部署加載的模型,只需按先后順序放置 pb 模型和高版本的 yaml 文件,服務(wù)會(huì)自動(dòng)發(fā)現(xiàn)并加載,舊模型優(yōu)先級(jí)被取代,不會(huì)再被調(diào)用,便可按上述方法卸載棄用的模型釋放內(nèi)存。一切管理操作均無(wú)需重啟服務(wù),可以無(wú)感知切換,方便維護(hù)提高了可用性。

其次,如果讀者有很多驗(yàn)證碼需求需要逐個(gè)定制,訓(xùn)練時(shí)將所有尺寸一樣的圖片訓(xùn)練成一個(gè)模型,服務(wù)根據(jù)圖片尺寸會(huì)自動(dòng)定位對(duì)應(yīng)的模型。當(dāng)然也可以通過(guò)傳遞 model_name 參數(shù)精確控制多模型調(diào)用,這樣的設(shè)計(jì)允許定制化和通用性共存,當(dāng)讀者們積累到一定量的樣本集時(shí)可以像 MuggleOCR 一樣訓(xùn)練一套通用識(shí)別模型作為備用模型。模型之間亦彼此獨(dú)立,每增加部署一個(gè)模型,僅僅增加了少量的內(nèi)存或顯存占用,不少小企業(yè)也吃過(guò)定制模型的虧,找個(gè)人定制模型,每個(gè)模型都要獨(dú)立啟用一個(gè)服務(wù),無(wú)形增加了成本,每個(gè)進(jìn)程若重復(fù)加載一遍整個(gè)框架無(wú)疑是極大的資源浪費(fèi)。

前面有提到批量識(shí)別,有這種需求的用戶相對(duì)較少,這里只做簡(jiǎn)單介紹,給一個(gè) 12306 的例子,如圖所示:

一張圖中包含了多個(gè)需要識(shí)別的部分,而框架中的 CorpParams 支持將大圖切割為小圖一并傳入,原本一個(gè)請(qǐng)求對(duì)于服務(wù)只能傳一張圖,現(xiàn)在可以通過(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ù)可以裁剪合并批次,該用法可避免多次調(diào)用。

但是識(shí)別項(xiàng)目提供多種后端實(shí)現(xiàn)版本:Tornado/Flask/gRPC/Sanic,其中 Flask 和 Tornado 搭載了加密接口 / captcha/auth/v2,類似于微信公眾號(hào)開(kāi)發(fā)接口的 SecretKey 和 AccessKey 接口,有興趣的可以在 demo.py 中閱讀調(diào)用源碼了解。

部署服務(wù)可以使用 package.py 編譯為可執(zhí)行文件,本文中提供的編譯版也是基于 Pyinstaller 打包編譯的,編譯版不需要考慮更換機(jī)器需要重新安裝環(huán)境,若使用源碼部署的話,環(huán)境配置同訓(xùn)練項(xiàng)目一樣,使用項(xiàng)目中提供的 requirements.txt 一鍵安裝全部依賴,部署服務(wù)默認(rèn)推薦的是 CPU 版的 TensorFlow。

部署服務(wù)推薦 Tornado 后端,目前最穩(wěn)定的版本。

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)

# 前臺(tái)運(yùn)行

./captcha_platform_tornado

#后臺(tái)運(yùn)行

nohup ./captcha_platform_tornado &

Windows:Windows 平臺(tái)下都是通過(guò) python3 xxx_server.py 啟動(dòng)對(duì)應(yīng)的服務(wù),注意,Tornado、Flask、Sanic 的性能在 Windows 平臺(tái)都大打折扣,gRPC 是 Google 開(kāi)源的 RPC 服務(wù),有較為優(yōu)越的性能。編譯版直接運(yùn)行編譯后的 exe 可執(zhí)行文件即可。

3.4 調(diào)用 / 測(cè)試

1. Tornado 服務(wù):

具體參數(shù):

請(qǐng)求為 JSON 格式,形如:{"image": "iVBORw0KGgoAAAANSUhEUgAAAFoAAAAjCAIAAA...base64 編碼后的圖像二進(jìn)制流"}

返回結(jié)果:

該返回為 JSON 格式,形如:{'uid': "9b5a6a34-9693-11ea-b6f9-525400a21e62", "message": "xxxx", "code": 0, "success": true}

2. Flask 服務(wù):

請(qǐng)求參數(shù)和返回格式同上

3. Sanic 服務(wù):

請(qǐng)求參數(shù)和返回格式同上

4. gRPC 服務(wù):需要安裝依賴,grpcio、grpcio_tools 和對(duì)應(yīng)的 grpc.proto 文件,可以直接從項(xiàng)目中的示例代碼 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編碼后的圖片二進(jìn)制流")

print(result)

3.5 奇技淫巧

舉一個(gè)比較不常見(jiàn)的例子,以下例子不代表任何網(wǎng)站。

正常情況下會(huì)想到以下 1 和 2.1 的方法:

1. 顏色提取的思路,可以采用 HSV/K-means 聚類進(jìn)行顏色的分離提?。盒Ч缦拢?/p>

弊端顯而易見(jiàn),會(huì)有較大的特征丟失,識(shí)別率有較大的提升瓶頸,經(jīng)過(guò)測(cè)試,中英文 + 漢字的識(shí)別率在 90% 左右。

2. 不分離顏色的思路,該方案有兩種處理方法:

(1)同時(shí)預(yù)測(cè)顏色和字符內(nèi)容,這種方法看起來(lái)比較正統(tǒng),但是成本較高,需要標(biāo)注每張圖的顏色和字符內(nèi)容,這個(gè)要求有多高呢,一般的打碼平臺(tái)是無(wú)法提供這樣的結(jié)果的,打碼平臺(tái)只返回對(duì)應(yīng)顏色的內(nèi)容,只能人工標(biāo)注,那么需要多少樣本呢?按照筆者訓(xùn)練的識(shí)別率 98 的模型用了 100w 左右的樣本。一張這樣的樣本標(biāo)注假設(shè)需要 0.1 元,那么 100w 樣本需要 10w 標(biāo)注費(fèi)用,假設(shè) 0.01 元,也要 1w 的標(biāo)注費(fèi)用。但是驗(yàn)證碼高質(zhì)量的人工標(biāo)注幾乎是不存在的,因?yàn)楹芏鄻颖?,人眼的識(shí)別率是不如機(jī)器的,總體標(biāo)注的準(zhǔn)確率大概也只能在 85 左右??雌饋?lái)并不可取,有一種節(jié)約成本的辦法,可以通過(guò)算法生成樣本,但是呢,生成的識(shí)別率英文數(shù)字還可以,中文的識(shí)別率就低的可憐了。

(2)每個(gè)顏色分別訓(xùn)練一個(gè)模型, 這種方法看起來(lái)有點(diǎn)蠢,但是確實(shí)比較合適有效的辦法了,可以輕松借助打碼平臺(tái)的返回結(jié)果標(biāo)注樣本。需要的顏色可以通過(guò)官網(wǎng)提供的字段取到,返回結(jié)果通過(guò)打碼平臺(tái)識(shí)別得到,這樣一組合,樣本就有了。這種方法的成本相對(duì)較低,樣本數(shù)不變的前提下,打碼價(jià)格低于人工標(biāo)注的成本。但是筆者訓(xùn)練的是一種顏色的樣本用了 100w。每個(gè)顏色分別訓(xùn)練這樣成本還是下不來(lái)。四種顏色就是 500w 樣本。官網(wǎng)的每次獲取圖片的時(shí)候顏色隨機(jī)出現(xiàn)的概率也不一定是 1/4。

(3)把所有顏色都通過(guò)顏色變換為一種顏色,整體思路同(2)。如下圖,筆者將黑色轉(zhuǎn)換為紅色,但是樣本成本只有采集一種顏色的成本??雌饋?lái)是目前位置最佳的方案了,事實(shí)也是如此的。但是呢,100w 的樣本對(duì)于普通人來(lái)說(shuō)也是一筆不小的花銷,即便有了樣本能做出來(lái)也需要花費(fèi)不少的時(shí)間和精力。

不過(guò)采集樣本不是單純的接打碼平臺(tái)就完事了,需要經(jīng)過(guò)官網(wǎng)判斷,只有通過(guò)驗(yàn)證,正確的樣本才保存下來(lái)。這樣有效的樣本對(duì)提高識(shí)別率才有幫助。

經(jīng)過(guò)筆者實(shí)驗(yàn),2.3 的方法性能效果最佳。

筆者實(shí)時(shí)對(duì)接官網(wǎng)對(duì)實(shí)驗(yàn)?zāi)P瓦M(jìn)行檢驗(yàn),結(jié)果如上圖,測(cè)試了 200 + 次,識(shí)別率達(dá)到 98% 以上,識(shí)別速度的話,相較于 1.1 的方法省去了顏色提取,大大縮短了時(shí)間,CPU 大概 5-8 毫秒左右,模型大概 3mb。

所以選擇合適的方案解決問(wèn)題才是最終的目的,希望這個(gè)項(xiàng)目和這篇介紹能帶大家入門企業(yè)級(jí)的驗(yàn)證碼識(shí)別。

以上就是關(guān)于pos機(jī)用戶號(hào)碼采集,這里有一個(gè)入門企業(yè)級(jí)驗(yàn)證碼識(shí)別項(xiàng)目的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于pos機(jī)用戶號(hào)碼采集的知識(shí),希望能夠幫助到大家!

轉(zhuǎn)發(fā)請(qǐng)帶上網(wǎng)址:http://m.afbey.com/newsone/54332.html

你可能會(huì)喜歡:

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