注意:若使用云服務(wù)器 (Windows Server版) 遇到閃退,請按照步驟:我的電腦——屬性——管理——添加角色和功能——勾選桌面體驗,點(diǎn)擊安裝,安裝之后重啟即可。
想必各位只是偶然間搜到這篇文章,網(wǎng)上文章參差不齊,標題黨很多,能跑起來(lái)的開(kāi)源代碼很少,對于能跑起來(lái)的代碼,也經(jīng)常遇到以下問(wèn)題如:內存泄漏,網(wǎng)絡(luò )參數寫(xiě)死導致更換訓練集報錯,網(wǎng)絡(luò )跑其他樣本識別率低,沒(méi)有調用示例等等。
再往下看之前,我可以向你們保證,它絕對會(huì )是你所見(jiàn)過(guò)的所有驗證碼有關(guān)的文章中最實(shí)用,最接近生產(chǎn)水平的。
對小白: 你可以不需要動(dòng)手寫(xiě)任何一行代碼。
對小企業(yè): 它的可用性和穩定性是經(jīng)得起考驗的,在性能上也是同行領(lǐng)先的,可以放心入坑。

添加描述
因為小編打算轉行了,離開(kāi)這個(gè)行業(yè)之前總要留下點(diǎn)什么證明自己來(lái)過(guò),總有人和我說(shuō)的這個(gè)部署不會(huì )調用,可能你們想要的是一行pip就搞定環(huán)境的,所以今天給你們安排了麻瓜OCR(MuggleOCR)。
https://pypi.org/project/muggle-ocr 它整合了簡(jiǎn)單驗證碼識別通用模型+印刷文字通用識別,并且支持調用本文框架訓練的模型。調用只需要三行核心代碼:
import time# STEP 1import muggle_ocrimport os# STEP 2sdk = muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)root_dir = r"./imgs"for i in os.listdir(root_dir): n = os.path.join(root_dir, i) with open(n, "rb") as f: b = f.read() st = time.time() # STEP 3 text = sdk.predict(image_bytes=b) print(i, text, time.time() - st)
這真的很簡(jiǎn)單,應付一般的文字識別和驗證碼都足夠了。(文字識別過(guò)幾天會(huì )更新一下新模型,畢竟0601模型就跑了半天。
本項目適用于Python3.7,GPU>=NVIDIA GTX1050Ti,原master分支新增了GUI配置界面以及編譯版本了,是時(shí)候寫(xiě)一篇新的文章了。
長(cháng)話(huà)短說(shuō),開(kāi)門(mén)見(jiàn)山,網(wǎng)絡(luò )上現有的代碼以教學(xué)研究為主,本項目是為實(shí)用主義者定制的,只要基本的環(huán)境安裝常識,便可很好的訓練出期望的模型,重定義幾個(gè)簡(jiǎn)單的參數任何人都能使用深度學(xué)習技術(shù)訓練一個(gè)商業(yè)化成品。
筆者選用的時(shí)下最為流行的CNN+BLSTM+CTC(CRNN)進(jìn)行端到端的不定長(cháng)驗證碼識別,代碼中預留了CNNX(搜不到因為是小編自己拼湊的)/MobileNet/DenseNet121/ResNet50等選項,可以在配置界面中直接選用。首先,介紹個(gè)大概吧。
添加描述
網(wǎng)格結構 | predict-CPU | predict-GPU | 模型大小 |
|---|---|---|---|
CNN5+Bi-LSTM+H64+CTC | 15ms | 8ms | 2mb |
CNN5+CrossEntropy | 8ms | 2ms | 1.5mb |
H16/H64指的是Bi-LSTM的隱藏神經(jīng)元個(gè)數UnitsNum,所以本項目使用GPU訓練,使用CPU進(jìn)行預測。
預測服務(wù)部署項目源碼請移步此處:https://github.com/kerlomz/captcha_platform
部署項目的編譯版下載地址:https://github.com/kerlomz/captcha_platform/releases
花了超長(cháng)篇幅介紹了訓練環(huán)境的基本搭建,主要是給尚未入門(mén)的讀者看的,老鳥(niǎo)們隨便跳過(guò),若不希望在環(huán)境上面浪費時(shí)間的,歡迎使用編譯版,可在文章開(kāi)頭找到下載地址。
關(guān)于CUDA和cuDNN版本的問(wèn)題,不少人很糾結,這里就列出官方通過(guò)pip安裝的TensorFlow的版本對應表:
Version | Python version | Compiler | Build tools | cuDNN | CUDA |
|---|---|---|---|---|---|
tensorflow_gpu-1.14.0 | 3.7 | GCC 4.8 | Bazel 0.15.0 | 7.6 | 9 |
Version | Python version | Compiler | Build tools | cuDNN | CUDA |
|---|---|---|---|---|---|
tensorflow_gpu-1.14.0 | 3.7 | MSVC 2015 update 3 | Bazel 0.15.0 | 7.6 | 10 |
如果希望使用上面對應之外的搭配的CUDA和cuDNN,可以自行編譯TensorFlow,或者去Github上搜索TensorFlow Wheel找到第三方編譯的對應版本的whl安裝包。提前預警,若是自己編譯將會(huì )苦難重重,坑很多,這里就不展開(kāi)了。
目前在以下主流操作系統平臺均測試通過(guò):
操作系統 | 最低支持版本 |
|---|---|
Ubuntu | 16.04 |
Windows | 7 SP1 |
MacOS | N/A |
本訓練項目主要的環(huán)境依賴(lài)清單如下
依賴(lài) | 最低支持版本 |
|---|---|
Python | 3.7 |
TensorFlow-GPU | 1.14.0 |
Opencv-Python | 4.1.2.30 |
Numpy | 1.16.0 |
Pillow | 4.3.0 |
PyYaml | 3.13 |
tqdm | N/A |
1)先安裝Python環(huán)境(有Python 3.7環(huán)境的可以忽略)
sudo apt-get install openssl sudo apt-get install libssl-devsudo apt-get install libc6-dev gcc sudo apt-get install -y make build-essential zlib1g-dev libbz2-dev libreadline-dev $ libsqlite3-dev wget curl llvm tk-dev wget https://www.python.org/ftp/python/3.7.6/Python-3.7.6.tgztar -vxf Python-3.7.6.tar.xzcd Python-3.7.6./configure --prefix=/usr/local --enable-sharedmake -j8sudo make install -j8
經(jīng)過(guò)上面指令就安裝好Python3.7環(huán)境了,如果提示找不到libpython3.7m.so.1.0就到/usr/local/lib路徑下將該文件復制一份到/usr/lib和/usr/lib64路徑下。 2)安裝相關(guān)依賴(lài)(這一步Windows和Linux通用) 可以直接在項目路徑下執行pip3 install -r requirements.txt安裝所有依賴(lài),注意這一步是安裝在全局Python環(huán)境下的,強烈建議使用虛擬環(huán)境進(jìn)行項目間的環(huán)境隔離,如Virtualenv或Anaconda等等。 我一般使用的是Virtualenv,有修改代碼需要的,建議安裝PyCharm作為Python IDE
virtualenv -p /usr/bin/python3 venv # venv is the name of the virtual environment.cd venv/ # venv is the name of the virtual environment.source bin/activate # to activate the current virtual environment.cd captcha_trainer # captcha_trainer is the project path.pip3 install -r requirements.txt
網(wǎng)上看到過(guò)很多教程,我自己也部署過(guò)很多次,Ubuntu 16.04遇到的坑還是比較少的。14.04支持就沒(méi)那么好,如果主板不支持關(guān)閉SecureBoot的話(huà)千萬(wàn)不要安裝Desktop版,因為安裝好之后一定會(huì )無(wú)限循環(huán)在登陸界面無(wú)法進(jìn)入桌面。 網(wǎng)上教程說(shuō)要加驅動(dòng)黑名單什么的我直接跳過(guò)了,親測沒(méi)那個(gè)必要。就簡(jiǎn)單的幾步: 1. 下載好安裝包 注意下載runfile類(lèi)型的安裝包,deb安裝會(huì )自動(dòng)安裝默認驅動(dòng),極有可能導致登陸循環(huán) NVIDIA 驅動(dòng)下載:https://www.geforce.cn/drivers CUDA 下載地址:https://developer.nvidia.com/cuda-downloads cuDNN 下載地址:https://developer.nvidia.com/cudnn (需要注冊NVIDIA賬號且登陸,下載deb安裝包)
2. 關(guān)閉圖形界面 Ctrl+alt+F1進(jìn)入字符界面,關(guān)閉圖形界面
sudo service lightdm stop
3. 安裝Nvidia Driver
命令中的版本自己對應下載的版本改,在上面的下載地址根據自己的顯卡型號下載最新版,切記是runfile格式的安裝包。
sudo chmod a+x NVIDIA-Linux-x86_64-384.90.run //獲取執行權限sudo ./NVIDIA-Linux-x86_64-384.90.run –no-x-check –no-nouveau-check –no-opengl-files //安裝驅動(dòng)
安裝成功以后使用以下命令驗證,如果顯示顯卡信息則表示安裝成功
nvidia-smi
4. 安裝CUDA
1)先安裝一些系統依賴(lài)庫
sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev
2) 執行安裝程序,按指示無(wú)腦繼續就好了,如果提示是否安裝驅動(dòng)選不安裝。
sudo sh cuda_9.0.176_384.81_linux.run
安裝完如果環(huán)境變量沒(méi)配上去,就寫(xiě)到 ~/.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更新,安裝完畢就可以重啟機器重啟圖形界面了。
sudo service lightdm start
在Windows其實(shí)簡(jiǎn)單很多,只要到官網(wǎng)下載安裝包無(wú)腦安裝就可以了,下載連接同Ubuntu,先安裝Python,顯卡驅動(dòng),CUDA,然后下載對應的cuDNN替換到對應路徑即可。
在訓練之前,有不少群友經(jīng)常問(wèn)我“訓練4位數英文數字需要多少樣本?”諸如此類(lèi)的問(wèn)題,我這里統一做個(gè)回復,樣本數量主要是看樣本的特征復雜度而定。
這里可以提供幾個(gè)參考依據: 是否變形?是否旋轉?是否有復雜背景干擾?是否多種字體?字符集(分類(lèi)數)多大?位數(標簽數)多少?
一般簡(jiǎn)單的幾百個(gè)樣本(需要自行調整 驗證集大小 和 驗證批次大小 )即可。
稍微復雜的幾千個(gè)樣本一般都能搞定。
特別復雜的幾萬(wàn)樣本起。
中文這種幾千個(gè)分類(lèi)的一般十萬(wàn)起。
注:只準備一百個(gè)不到樣本的親們,千萬(wàn)不要嘗試訓練測試,因為根本跑不起來(lái)。
入手的第一步環(huán)境搭建好了,那就是準備跑代碼了,還是有幾個(gè)必要的條件,巧婦難為無(wú)米之炊,首先,既然是訓練,要先有訓練集,有一個(gè)新手嘗鮮的訓練集,是mnist手寫(xiě)識別的例子,可以在騰訊云下載:https://share.weiyun.com/5pzGF4V ,現在萬(wàn)事俱備,只欠東風(fēng)。
本項目基于參數化配置,不需要改動(dòng)任何代碼,可以通過(guò)可視化界面操作訓練幾乎任何字符型圖片驗證碼。訓練框架界面可以大致劃分為幾個(gè)部分:
Neural Network - 神經(jīng)網(wǎng)絡(luò )區
添加描述
Project Configuration - 項目配置區
添加描述
Sample Source - 樣本源配置區
添加描述
Training Configuration - 訓練配置區
添加描述
Buttons - 功能控制區
添加描述
依此類(lèi)推的訓練配置的步驟如下:
神經(jīng)網(wǎng)絡(luò )區 的配置項看起來(lái)很多,對于新手來(lái)說(shuō),可以直接使用默認的配置:CNNX+GRU+CTC+C1組合(CNN前置網(wǎng)絡(luò )+GRU+CTC+單通道)。
項目配置區 的配置項在網(wǎng)絡(luò )選好之后配置項目名,按回車(chē)或者點(diǎn)擊空白處確認。
樣本源配置區 的配置項用來(lái)配置樣本源的路徑,訓練樣本是根據此路徑進(jìn)行打包成TFRecords格式,驗證樣本可以不指定,使用Validation Set Num參數隨機從訓練集總抽樣成驗證集。
訓練配置區 的配置項負責定義訓練完成的條件如:結束準確率,結束COST,結束Epochs,批次大小
功能控制區 的配置項,設置完上面步驟,先點(diǎn)擊Make Dataset 打包樣本,再點(diǎn)擊Start Training開(kāi)始訓練。
如若使用CrossEntropy作為解碼器需要注意標簽數LabelNum和圖片尺寸需要滿(mǎn)足的關(guān)系,因為網(wǎng)絡(luò )為多標簽而設計(一般的多標簽采用直接連接多個(gè)分類(lèi)器),卷積層的輸出 outputs 經(jīng)過(guò)了以下變換:
Reshape([label_num, int(outputs_shape[1] / label_num)])
為了保證運算 int(outputs_shape1 / label_num) 能夠取得正整數,也意味著(zhù)他們之間存在某種關(guān)系,對于CNN5+Cross Entropy的網(wǎng)絡(luò )結構,Conv2D層的步長(cháng)皆為1,那么需要保證以下關(guān)系成立:
輸入寬度輸入高度輸出層參數池化步長(cháng)池化層數標簽數
所以有時(shí)候需要Resize網(wǎng)絡(luò )輸入的Shape
網(wǎng)絡(luò ) | 池化步長(cháng)^池化層數 | 輸出層參數 |
|---|---|---|
CNN5 | 16 | 64 |
CNNX | 8 | 64 |
ResNet50 | 16 | 1024 |
DenseNet | 32 | 2048 |
例如使用CNN5+CrossEntropy組合,則輸入寬度與輸入高度需要滿(mǎn)足:
輸入寬度輸入高度標簽數
同理如果CNN5+RNN+CTC,卷積層之后的輸出經(jīng)過(guò)以下變換:
Reshape([-1, outputs_shape[2] * outputs_shape[3]])
原輸出(batch_size, outputs_shape1, outputs_shape2, outputs_shape3),RNN層的輸入輸出要求為(batch, timesteps, num_classes),為了接入RNN經(jīng)過(guò)以上操作,那么又引出一個(gè)Time Step的概念,所以timesteps的值也是 outputs_shape1,而CTC Loss要求的輸入為 batch_size, frames, num_labels,若是 timesteps 小于標簽數則無(wú)法計算損失,也就無(wú)法找損失函數中找到極小值,梯度何以下降。timesteps 最合理的值一般是標簽數的2倍,為了達到目的,也可以通過(guò)Resize網(wǎng)絡(luò )輸入的Shape解決,一般情況timesteps直接關(guān)聯(lián)于圖片寬度,大多情況只要按比例放大寬度即可。
注意:如果訓練集的命名格式和我提供的新手訓練集不一樣,請根據實(shí)際情況修改ExtractRegex的正則表達式。目前只支持在yaml配置文件中直接修改,尚未提供GUI界面修改的支持。 DatasetPath 和SourcePath參數允許多個(gè)路徑,這種操作適用于需要將多種樣本訓練為一個(gè)模型,或者希望訓練一套通用泛化模型的人。 字符集Category其實(shí)大多數情況下不需要修改,一般的圖形驗證碼離不開(kāi)數字和英文,而且一般來(lái)說(shuō)是大小寫(xiě)不敏感的,不區分大小寫(xiě),因為打碼平臺收集的訓練集質(zhì)量參差不齊,有些大寫(xiě)有些小寫(xiě),不如全部統一為小寫(xiě),默認ALPHANUMERIC_LOWER則會(huì )自動(dòng)將大寫(xiě)的轉為小寫(xiě),字符集可定制化很靈活,除了配置備注上提供的幾種類(lèi)型,還可以訓練中文,自定義字符集用list表示,示例如下:
Category: ['常', '世', '寧', '慢', '南', '制', '根', '難']
如果是單標簽分類(lèi),可以配合LabelNum=1,例如:
Category: ["航母", "雨靴", "毛線(xiàn)", "安全帽", "調色板", "海鷗", "日歷", "網(wǎng)球拍", ......]
其文件名示例:航母_1231290424123.png
如果是多標簽分類(lèi),可以配合LabelSplit=&,例如:
Category: ["航母", "雨靴", "毛線(xiàn)", "安全帽", "調色板", "海鷗", "日歷", "網(wǎng)球拍", ......]
其文件名示例:航母&雨靴&毛線(xiàn)_1231290424123.png
可以自己根據收集訓練集的實(shí)際字符集使用率來(lái)定義,也可以無(wú)腦網(wǎng)上找3500常用字來(lái)訓練,注意:中文字符集一般比數字英文大很多,剛開(kāi)始收斂比較慢,需要更久的訓練時(shí)間,也需要更多的樣本量,請量力而行
添加描述
形如上圖的圖片能輕松訓練到95%以上的識別率。 ImageWidth、ImageHeight只要和當前圖片尺寸匹配即可,其實(shí)這里的配置主要是為了方便后面的部署智能策略。
該參數是用來(lái)做圖片預處理的,例如形如以下的GIF動(dòng)圖,
添加描述
可以使用ConcatFrames參數選取幀對兩幀進(jìn)行水平拼接,適用于處理滾動(dòng)型GIF,而閃爍型GIF可以使用BlendFrames參數進(jìn)行融合。
經(jīng)過(guò) 采集標注樣本形如 xxx_隨機數.png
添加描述
打包樣本 通過(guò)GUI界面的 Make Dataset 或者 make_dataset.py 直接打包。 注意:使用源碼運行本項目的功能模塊需要具備一定的語(yǔ)言基礎,參數修改的部分和示例已預留好,盡量不修改核心類(lèi)或函數的代碼以免出現錯誤。
按照上面的介紹,配置只要修改極少數的參數對應的值,就可以開(kāi)啟正式的訓練之旅了,具體操作如下: 可以直接使用 PyCharm 的 Run,執行 trains.py,也可以在激活Virtualenv下使用終端亦或在安裝依賴(lài)的全局環(huán)境下執行,但本文建議全程使用GUI界面進(jìn)行操作,使用GUI僅需啟動(dòng) app.py 即可。
python3 trains.py
剩下的就是等了,看過(guò)程,等結果。 正常開(kāi)始訓練的模樣應該是這樣的:
訓練結束會(huì )在項目的out路徑下生成一個(gè)包含pb文件的graph目錄和包含yaml文件的model目錄,下面該到部署環(huán)節了。
真的很有必要認真的介紹一下部署項目,比起訓練,這個(gè)部署項目?jì)A注了筆者更多的心血,為什么呢? 項目地址:https://github.com/kerlomz/captcha_platform
如希望將本系統集成于自己的項目中的可以參考python-sdk的使用: https://pypi.org/project/muggle-ocr/ 該項目的核心基于 captcha_platform/sdk/pb/sdk.py 可以根據需要自行修改,抑或直接使用MuggleOCR 調用訓練框架生產(chǎn)的模型。(具體調用方法可點(diǎn)擊上面鏈接有對應的文檔介紹)
編譯版:https://github.com/kerlomz/captcha_platform/releases,使用編譯版無(wú)需安裝Python和TensorFlow環(huán)境。
同時(shí)管理多個(gè)模型,支持模型熱拔插
靈活的版本控制
支持批量識別
服務(wù)智能路由策略
首先筆者重寫(xiě)了TensorFlow的Graph會(huì )話(huà)管理,設計會(huì )話(huà)池,允許同時(shí)管理多模型,實(shí)現多模型動(dòng)態(tài)部署方案。
1) 訓練好的 pb模型只要放在部署項目的graph路徑下,yaml模型配置文件放在model, 即可被服務(wù)發(fā)現并加載。(用SDK調用時(shí),兩者置于同一目錄下)
2) 如果需要卸載一個(gè)正在服務(wù)的模型,只需要在model中刪除該模型的yaml配置文件,在graph中刪除對應的pb模型即可。
3) 如果需要更新一個(gè)已經(jīng)服務(wù)中的模型,只需修改新版的模型yaml配置文件的版本號高于原模型的版本號,按先放pb后放yaml的順序,服務(wù)便會(huì )自動(dòng)發(fā)現新版的模型并加載使用,舊的模型將因版本低于新版模型不會(huì )被調用,可以按照上述的卸載方法卸載已被棄用的模型釋放內存。 上面的操作中無(wú)需重啟服務(wù),完全的無(wú)縫切換
其次,一套服務(wù)想要服務(wù)于各式各樣的圖像識別需求,可以定義一套策略,訓練時(shí)將所有尺寸一樣的圖片訓練成一個(gè)模型,服務(wù)根據圖片尺寸自動(dòng)選擇使用哪個(gè)模型,這樣的設計使定制化和通用性共存,等積累到一定多樣的訓練集時(shí)可以將所有的訓練集合到一起訓練一個(gè)通用模型,亦可以彼此獨立,每個(gè)模型的疊加僅僅增加了少量的內存或顯存,網(wǎng)上的方案大多是不同的模型單獨部署一套服務(wù),每個(gè)進(jìn)程加載了一整套TensorFlow框架勢必是過(guò)于龐大和多余的。
用到批量識別需求的人相對少很多這里就不展開(kāi)介紹了。但是這里給出一個(gè)12306的例子:
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該參數可以用于大圖的裁剪組成一批小圖作為一個(gè)批次的輸入,改用法可以避免多次調用。
但是識別項目提供了多套可選的服務(wù)有:gRPC,Flask,Tornado,Sanic,其中Flask和Tornado提供了加密接口,類(lèi)似于微信公眾號開(kāi)發(fā)接口的SecretKey和AccessKey接口,感興趣的可以在demo.py中閱讀調用源碼了解。
部署的使用可以經(jīng)過(guò)package.py編譯為可執行文件,這樣可以免去更換機器環(huán)境安裝的煩惱,部署項目安裝流程同訓練項目,項目中提供的requirements.txt已經(jīng)將所需的依賴(lài)都列清楚了,強烈建議部署項目安裝cpu版TensorFlow。
本項目部署推薦使用Tornado版,功能最齊全,性能最為穩定。
Linux:
Tornado:
# 端口 19952python3 tornado_server.py
Flask
# 方案1,裸啟動(dòng), 端口 19951python flask_server.py # 方案2,使用gunicorn,端口 5000pip install gunicorn gunicorn -c deploy.conf.py flask_server:app
Sanic:
# 端口 19953python3 sanic_server.py
gRPC:
# 端口 50054python3 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可執行文件即可。
1. Tornado服務(wù):
請求地址 | Content-Type | 參數形式 | 請求方法 |
|---|---|---|---|
http://[部署IP]:19952/captcha/v1 | application/json | JSON | POST |
具體參數:
參數名 | 必選 | 類(lèi)型 | 說(shuō)明 |
|---|---|---|---|
image | Yes | String | Base64 編碼 |
model_name | No | String | 模型名,yaml配置中可綁定 |
need_color | No | String | 顏色過(guò)濾,black/red/blue/yellow/green/white |
output_split | No | String | 多標簽分割字符 |
請求為JSON格式,形如:{"image": "base64編碼后的圖像二進(jìn)制流"}
返回結果:
參數名 | 類(lèi)型 | 說(shuō)明 |
|---|---|---|
message | String | 識別結果或錯誤消息 |
code | String | 狀態(tài)碼 |
success | String | 是否請求成功 |
該返回為JSON格式,形如:{"message": "xxxx", "code": 0, "success": true}
2. Flask服務(wù):
請求地址 | Content-Type | 參數形式 | 請求方法 |
|---|---|---|---|
http://[部署IP]:19951/captcha/v1 | application/json | JSON | POST |
請求參數和返回格式同上
3. Sanic服務(wù):
請求地址 | Content-Type | 參數形式 | 請求方法 |
|---|---|---|---|
http://[部署IP]:19953/captcha/v1 | application/json | JSON | POST |
請求參數和返回格式同上
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)該項目還可以直接用于識別帶顏色的驗證碼,部署項目middleware/impl/color_extractor.py基于k-means實(shí)現了顏色分離模塊,可用于處理如下形式的驗證碼:
添加描述
還有一種方案是同時(shí)預測驗證碼和每個(gè)字符對應的顏色,不過(guò)這需要修改現有的神經(jīng)網(wǎng)絡(luò )進(jìn)行支持,在最后一層修改為雙輸出,一個(gè)輸出顏色,一個(gè)輸出對應字符,這對于樣本標注的要求較高,也提高的成本,所以如果能用無(wú)限生成樣本,那問(wèn)題就迎刃而解了,比如上圖,筆者就寫(xiě)了樣本生成代碼,感興趣的可以移步: https://www.jianshu.com/p/da1b972e24f2 其實(shí)還有很多很多技巧,例如,用生成的樣本代替訓練集,其實(shí)網(wǎng)上的圖片驗證碼大多是采用開(kāi)源的,稍作修改而已,大多數情況都能被近似生成出來(lái),上述展示的驗證碼圖片不代表任何實(shí)際的網(wǎng)站,如有雷同,純屬巧合,該項目只能用于學(xué)習和交流用途,不得用于非法用途。
如果文章描述不夠詳盡或需要技術(shù)支持的,可以加群 857149419 咨詢(xún),或在開(kāi)源項目中提issue,很榮幸能為開(kāi)源社區貢獻綿薄之力。
聯(lián)系客服