Skip to content

Latest commit

 

History

History
235 lines (133 loc) · 8.19 KB

README_cn.md

File metadata and controls

235 lines (133 loc) · 8.19 KB

Update 2019.07.25: 发布 cnocr V1.0.0

cnocr发布了预测效率更高的新版本v1.0.0。新版本的模型跟以前版本的模型不兼容。所以如果大家是升级的话,需要重新下载最新的模型文件。具体说明见下面(流程和原来相同)。

主要改动如下:

  • crnn模型支持可变长预测,提升预测效率
  • 支持利用特定数据对现有模型进行精调(继续训练)
  • 修复bugs,如训练时accuracy一直为0
  • 依赖的 mxnet 版本从1.3.1更新至 1.4.1

cnocr

cnocr是用来做中文OCR的Python 3包。cnocr自带了训练好的识别模型,所以安装后即可直接使用。

目前使用的识别模型是crnn,识别准确度约为 98.8%

本项目起源于我们自己 (爱因互动 Ein+) 内部的项目需求,所以非常感谢公司的支持。

特色

本项目的大部分代码都fork自 crnn-mxnet-chinese-text-recognition,感谢作者。

但源项目使用起来不够方便,所以我在此基础上做了一些封装和重构。主要变化如下:

  • 不再使用需要额外安装的MXNet WarpCTC Loss,改用原生的 MXNet CTC Loss。所以安装极简!
  • 自带训练好的中文OCR识别模型。不再需要额外训练!
  • 增加了预测(或推断)接口。所以使用方便!

安装

pip install cnocr

注意:请使用Python3 (3.4, 3.5, 3.6以及之后版本应该都行),没测过Python2下是否ok。

使用方法

首次使用cnocr时,系统会自动从Dropbox下载zip格式的模型压缩文件,并存于 ~/.cnocr目录。 下载后的zip文件代码会自动对其解压,然后把解压后的模型相关文件放于~/.cnocr/models目录。

如果系统不能自动从Dropbox成功下载zip文件,则需要手动下载此zip文件并把它放于 ~/.cnocr目录。 另一个下载地址是百度云盘(提取码为ss81)。 放置好zip文件后,后面的事代码就会自动执行了。

代码预测

主要包含三个函数,下面分别说明。

1. 函数CnOcr.ocr(img_fp)

函数CnOcr.ocr(img_fp)可以对包含多行文字(或单行)的图片进行文字识别。

函数说明

  • 输入参数 img_fp: 可以是需要识别的图片文件路径(如上例);或者是已经从图片文件中读入的数组,类型可以为mx.nd.NDArraynp.ndarray,取值应该是[0,255]的整数,维数应该是(height, width, 3),第三个维度是channel,它应该是RGB格式的。
  • 返回值:为一个嵌套的list,类似这样[['第', '一', '行'], ['第', '二', '行'], ['第', '三', '行']]

调用示例

from cnocr import CnOcr
ocr = CnOcr()
res = ocr.ocr('examples/multi-line_cn1.png')
print("Predicted Chars:", res)

或:

import mxnet as mx
from cnocr import CnOcr
ocr = CnOcr()
img_fp = 'examples/multi-line_cn1.png'
img = mx.image.imread(img_fp, 1)
res = ocr.ocr(img)
print("Predicted Chars:", res)

上面使用的图片文件 examples/multi-line_cn1.png内容如下:

examples/multi-line_cn1.png

上面预测代码段的返回结果如下:

Predicted Chars: [['', '', '', '', '', '', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '', '', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '', '', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '', '', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '', '', '', '', '', '', '', '', '', ''],
                  ['', '', '', '', '', '']]

2. 函数CnOcr.ocr_for_single_line(img_fp)

如果明确知道要预测的图片中只包含了单行文字,可以使用函数CnOcr.ocr_for_single_line(img_fp)进行识别。和 CnOcr.ocr()相比,CnOcr.ocr_for_single_line()结果可靠性更强,因为它不需要做额外的分行处理。

函数说明

  • 输入参数 img_fp: 可以是需要识别的单行文字图片文件路径(如上例);或者是已经从图片文件中读入的数组,类型可以为mx.nd.NDArraynp.ndarray,取值应该是[0,255]的整数,维数应该是(height, width)(height, width, channel)。如果没有channel,表示传入的就是灰度图片。第三个维度channel可以是1(灰度图片)或者3(彩色图片)。如果是彩色图片,它应该是RGB格式的。
  • 返回值:为一个list,类似这样['你', '好']

调用示例

from cnocr import CnOcr
ocr = CnOcr()
res = ocr.ocr_for_single_line('examples/rand_cn1.png')
print("Predicted Chars:", res)

或:

import mxnet as mx
from cnocr import CnOcr
ocr = CnOcr()
img_fp = 'examples/rand_cn1.png'
img = mx.image.imread(img_fp, 1)
res = ocr.ocr_for_single_line(img)
print("Predicted Chars:", res)

对图片文件 examples/rand_cn1.png

examples/rand_cn1.png

的预测结果如下:

Predicted Chars: ['', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ''] 

3. 函数CnOcr.ocr_for_single_lines(img_list)

函数CnOcr.ocr_for_single_lines(img_list)可以对多个单行文字图片进行批量预测。函数CnOcr.ocr(img_fp)CnOcr.ocr_for_single_line(img_fp)内部其实都是调用的函数CnOcr.ocr_for_single_lines(img_list)

函数说明

  • 输入参数 img_list: 为一个list;其中每个元素是已经从图片文件中读入的数组,类型可以为mx.nd.NDArraynp.ndarray,取值应该是[0,255]的整数,维数应该是(height, width)(height, width, channel)。如果没有channel,表示传入的就是灰度图片。第三个维度channel可以是1(灰度图片)或者3(彩色图片)。如果是彩色图片,它应该是RGB格式的。
  • 返回值:为一个嵌套的list,类似这样[['第', '一', '行'], ['第', '二', '行'], ['第', '三', '行']]

调用示例

import mxnet as mx
from cnocr import CnOcr
ocr = CnOcr()
img_fp = 'examples/multi-line_cn1.png'
img = mx.image.imread(img_fp, 1).asnumpy()
line_imgs = line_split(img, blank=True)
line_img_list = [line_img for line_img, _ in line_imgs]
res = ocr.ocr_for_single_lines(line_img_list)
print("Predicted Chars:", res)

更详细的使用方法,可参考tests/test_cnocr.py中提供的测试用例。

脚本引用

也可以使用脚本模式预测:

python scripts/cnocr_predict.py --file examples/multi-line_cn1.png

返回结果同上面。

训练自己的模型

cnocr安装后即可直接使用,但如果你非要训练自己的模型,请参考下面命令:

python scripts/cnocr_train.py --cpu 2 --num_proc 4 --loss ctc --dataset cn_ocr

现在也支持从已有模型利用特定数据精调模型,请参考下面命令:

python scripts/cnocr_train.py --cpu 2 --num_proc 4 --loss ctc --dataset cn_ocr --load_epoch 20

更多可参考脚本scripts/run_cnocr_train.sh中的命令。

未来工作

  • 支持图片包含多行文字 (Done)
  • crnn模型支持可变长预测,提升灵活性 (Done)
  • 完善测试用例 (Doing)
  • 修bugs(目前代码还比较凌乱。。) (Doing)
  • 支持空格识别(V1.0.0在训练集中加入了空格,但从预测结果看,空格依旧是识别不出来)
  • 尝试新模型,如 DenseNet、ResNet,进一步提升识别准确率