凡对本文有任何疑惑可加QQ群交流:1081332609
Github地址:https://github.com/lvjianjin/crnn_by_tensorflow2.2.0
CRNN是不定长文本识别的主流算法,但是Github上的项目多以Pytorch、keras版本为主。Tensorflow1.x由于其学习成本陡峭的原因一直被广大开发者所吐槽,Google于2019年发布Tensorflow2.x版本,其框架生态的完整性、官方文档的完整性以及对于新手的友好度,使得其再次成为深度学习框架的首选。本人基于Tensorflow2.2.0重新实现并训练了一个基于CRNN的中文不定长文本识别模型,并实现了基于Tensorflow serving的生产环境下的服务端构建及其调用方式。
数据集准备
下载并解压800万数据集,并划分训练集、验证集、测试集。
模型结构
模型的结构采用华中科技大学的白翔老师的CRNN模型。该模型通过CNN将图片的特征提取出来后,再采用RNN对所提取出来的序列特征进行预测,最后通过一个CTC的翻译层得到最终结果。具体的模型结构代码可参见crnn.py。
模型训练
将800万数据放进去训练,经过19个epoch的训练,在验证集上面的表现就已经接近72%了。代码可参照train.ipynb。
服务端部署
在生产层级的应用上,一般以tfserving的方式来构建服务端(相对于用web框架的方式构建,具有更强的并发能力及处理速度)。但是,要利用tfserving构建服务端之前,需要先将模型结果的文件转为对映pd格式文件。
接下来便可以开始搭建tfserving服务端,这采用docker来进行服务端的构建(关于docker的安装可自行百度)。安装完docker之后便可拉取,tfserving的镜像,
docker pull tensorflow/serving
镜像拉取完成后,以如下语句启动服务端,其中source后接的是刚才模型生成的versions文件夹对应路径。
CPU环境
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环境
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服务进行调用,代码可参照client.ipynb。
模型效果
以下为模型在部分中文文本上的测试效果。参考项目
https://github.com/chineseocr/chineseocr
https://github.com/FLming/CRNN.tf2