凡對本文有任何疑惑可加QQ群交流:1081332609
Github地址:https://github.com/lvjianjin/crnn_by_tensorflow2.2.0
CRNN是不定長文本識別的主流算法,但是Github上的項目多以Pytorch、keras版本為主。Tensorflow1.x由于其學(xué)習(xí)成本陡峭的原因一直被廣大開發(fā)者所吐槽,Google于2019年發(fā)布Tensorflow2.x版本,其框架生態(tài)的完整性、官方文檔的完整性以及對于新手的友好度,使得其再次成為深度學(xué)習(xí)框架的首選。本人基于Tensorflow2.2.0重新實(shí)現(xiàn)并訓(xùn)練了一個基于CRNN的中文不定長文本識別模型,并實(shí)現(xiàn)了基于Tensorflow serving的生產(chǎn)環(huán)境下的服務(wù)端構(gòu)建及其調(diào)用方式。
數(shù)據(jù)集準(zhǔn)備
下載并解壓800萬數(shù)據(jù)集,并劃分訓(xùn)練集、驗(yàn)證集、測試集。

模型結(jié)構(gòu)
模型的結(jié)構(gòu)采用華中科技大學(xué)的白翔老師的CRNN模型。該模型通過CNN將圖片的特征提取出來后,再采用RNN對所提取出來的序列特征進(jìn)行預(yù)測,最后通過一個CTC的翻譯層得到最終結(jié)果。具體的模型結(jié)構(gòu)代碼可參見crnn.py。

模型訓(xùn)練
將800萬數(shù)據(jù)放進(jìn)去訓(xùn)練,經(jīng)過19個epoch的訓(xùn)練,在驗(yàn)證集上面的表現(xiàn)就已經(jīng)接近72%了。代碼可參照train.ipynb。

服務(wù)端部署
在生產(chǎn)層級的應(yīng)用上,一般以tfserving的方式來構(gòu)建服務(wù)端(相對于用web框架的方式構(gòu)建,具有更強(qiáng)的并發(fā)能力及處理速度)。但是,要利用tfserving構(gòu)建服務(wù)端之前,需要先將模型結(jié)果的文件轉(zhuǎn)為對映pd格式文件。

接下來便可以開始搭建tfserving服務(wù)端,這采用docker來進(jìn)行服務(wù)端的構(gòu)建(關(guān)于docker的安裝可自行百度)。安裝完docker之后便可拉取,tfserving的鏡像,
docker pull tensorflow/serving
鏡像拉取完成后,以如下語句啟動服務(wù)端,其中source后接的是剛才模型生成的versions文件夾對應(yīng)路徑。
CPU環(huán)境
docker run --name tfserving-crnn \
--hostname tfserving-crnn \
-tid \
--restart=on-failure:10 \
-p 8500:8500 \
-p 8501:8501 \
--mount type=bind,source=/root/python_project/crnn_by_tensorflow2.2.0/output,target=/models \
-e MODEL_NAME=crnn \
-t tensorflow/serving &
GPU環(huán)境
docker run --name tfserving-crnn \
--hostname tfserving-crnn \
-tid \
--restart=on-failure:10 \
-p 8500:8500 \
-p 8501:8501 \
--mount type=bind,source=/root/python_project/crnn_by_tensorflow2.2.0/output,target=/models \
-e MODEL_NAME=crnn \
-t tensorflow/serving:latest-gpu &
客戶端
接下來我們就可以通過HTTP、gRPC兩種方式對tsendorflow-serving服務(wù)進(jìn)行調(diào)用,代碼可參照client.ipynb。
模型效果
以下為模型在部分中文文本上的測試效果。
參考項目
https://github.com/chineseocr/chineseocr
https://github.com/FLming/CRNN.tf2