基于CRNN的中文文本识别--Tensorflow2.X版本

凡对本文有任何疑惑可加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。

Tensorboard

服务端部署

在生产层级的应用上,一般以tfserving的方式来构建服务端(相对于用web框架的方式构建,具有更强的并发能力及处理速度)。但是,要利用tfserving构建服务端之前,需要先将模型结果的文件转为对映pd格式文件。


image.png

接下来便可以开始搭建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。

模型效果

以下为模型在部分中文文本上的测试效果。
1.png

参考项目

https://github.com/chineseocr/chineseocr
https://github.com/FLming/CRNN.tf2

你可能感兴趣的:(基于CRNN的中文文本识别--Tensorflow2.X版本)