赞
踩
向AI转型的程序员都关注了这个号????????????
机器学习AI算法工程 公众号:datayx
cnocr是用来做中文OCR的Python 3包。cnocr自带了训练好的识别模型,安装后即可直接使用。
cnocr主要针对的是排版简单的印刷体文字图片,如截图图片,扫描件等。cnocr目前内置的文字检测和分行模块无法处理复杂的文字排版定位。如果要用于场景文字图片的识别,需要结合其他的场景文字检测引擎使用。
安装真的很简单
pip install cnocr
请使用Python3 (3.4, 3.5, 3.6以及之后版本应该都行
cnocr的ocr模型可以分为两阶段:第一阶段是获得ocr图片的局部编码向量,第二部分是对局部编码向量进行序列学习,获得序列编码向量。目前两个阶段分别包含以下的模型:
局部编码模型(emb model)
conv
:多层的卷积网络;
conv-lite
:更小的多层卷积网络;
densenet
:一个小型的densenet
网络;
densenet-lite
:一个更小的densenet
网络。
序列编码模型(seq model)
lstm
:两层的LSTM网络;
gru
:两层的GRU网络;
fc
:两层的全连接网络。
cnocr目前包含以下可直接使用的模型,训练好的模型都放在 cnocr-models 项目中,可免费下载使用:
模型名称是由局部编码模型和序列编码模型名称拼接而成。
图片预测速度是在多核CPU机器上做的测试, 绝对值依赖机器资源,意义不大;但不同模型之间的相对值是可以参考的。
虽然上表中给出的多个模型在测试集上的准确率都是 98.6%
,但从实际使用经验看,综合中英文的识别效果,conv-lite-fc
是效果最好的,其次是 densenet-lite-lstm
和 conv-lite-lstm
。对于中文识别且识别困难(如文字比较模糊)的场景,建议尝试模型 conv-lite-lstm
。对于简单的中文识别场景,可以使用模型 densenet-lite-lstm
或 densenet-lite-fc
,或者利用自己的训练数据对它们进行精调。
模型 conv-lstm
把图片长度压缩到 1/8
再做预测,其他模型是压缩到1/4
再做预测,所以 conv-lstm
虽然比 conv-lite-lstm
有更多参数,但预测速度却快了一倍。
首次使用cnocr时,系统会自动从 cnocr-models 下载zip格式的模型压缩文件,并存于 ~/.cnocr
目录。下载后的zip文件代码会自动对其解压,然后把解压后的模型相关目录放于~/.cnocr/1.1.0
目录中。
如果系统不能自动从 cnocr-models 成功下载zip文件,则需要手动下载此zip文件并把它放于 ~/.cnocr/1.1.0
目录。如果Github下载太慢,也可以从 百度云盘 下载。
项目地址、模型下载地址 获取:
关注微信公众号 datayx 然后回复 OCR 即可获取。
放置好zip文件后,后面的事代码就会自动执行了。
图片预测
类CnOcr
是OCR的主类,包含了三个函数针对不同场景进行文字识别。类CnOcr
的初始化函数如下:
其中的几个参数含义如下:
model_name
: 模型名称,即上面表格第一列中的值。默认为 conv-lite-fc
。
model_epoch
: 模型迭代次数。默认为 None
,表示使用默认的迭代次数值。对于模型名称 conv-lite-fc
就是 27
。
cand_alphabet
: 待识别字符所在的候选集合。默认为 None
,表示不限定识别字符范围。cnocr.consts
中内置了两个候选集合:(1) 数字和标点 NUMBERS
;(2) 英文字母、数字和标点 ENG_LETTERS
。
例如对于图片
,不做约束时识别结果为 o12345678
;如果加入数字约束时(ocr = CnOcr(cand_alphabet=NUMBERS)
),识别结果为 012345678
。
root
: 模型文件所在的根目录。
Linux/Mac下默认值为 ~/.cnocr
,表示模型文件所处文件夹类似 ~/.cnocr/1.1.0/conv-lite-fc
。
Windows下默认值为 C:\Users\<username>\AppData\Roaming\cnocr
。
每个参数都有默认取值,所以可以不传入任何参数值进行初始化:ocr = CnOcr()
。
类CnOcr
主要包含三个函数,下面分别说明。
CnOcr.ocr(img_fp)
函数CnOcr.ocr(img_fp)
可以对包含多行文字(或单行)的图片进行文字识别。
函数说明:
输入参数 img_fp
: 可以是需要识别的图片文件路径(如上例);或者是已经从图片文件中读入的数组,类型可以为mx.nd.NDArray
或 np.ndarray
,取值应该是[0,255]
的整数,维数应该是(height, width, 3)
,第三个维度是channel,它应该是RGB
格式的。
返回值:为一个嵌套的list
,类似这样[['第', '一', '行'], ['第', '二', '行'], ['第', '三', '行']]
。
调用示例:
上面使用的图片文件 examples/multi-line_cn1.png内容如下:
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.NDArray
或 np.ndarray
,取值应该是[0,255]
的整数,维数应该是(height, width)
或(height, width, channel)
。如果没有channel,表示传入的就是灰度图片。第三个维度channel可以是1
(灰度图片)或者3
(彩色图片)。如果是彩色图片,它应该是RGB
格式的。
返回值:为一个list
,类似这样['你', '好']
。
调用示例:
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.NDArray
或 np.ndarray
,取值应该是[0,255]
的整数,维数应该是(height, width)
或(height, width, channel)
。如果没有channel,表示传入的就是灰度图片。第三个维度channel可以是1
(灰度图片)或者3
(彩色图片)。如果是彩色图片,它应该是RGB
格式的。
返回值:为一个嵌套的list
,类似这样[['第', '一', '行'], ['第', '二', '行'], ['第', '三', '行']]
。
调用示例:
cnocr自带训练好的模型, 安装后即可直接使用。但如果你需要训练自己的模型,请参考下面的步骤。所有代码均可在文件 Makefile 中找到。
为了提升训练效率,在开始训练之前,需要使用mxnet的recordio
首先把数据转换成二进制格式:
如果需要在GPU上训练,把上面命令中的参数 --gpu 0
改为--gpu <num_gpu>
,其中的<num_gpu>
为使用的GPU数量。注意,使用GPU训练需要安装mxnet的GPU版本,如mxnet-cu101
。
评估模型的代码依赖一些额外的python包,使用下面命令安装这些额外的包:
阅读过本文的人还看了以下文章:
《深度学习入门:基于Python的理论与实现》高清中文PDF+源码
2019最新《PyTorch自然语言处理》英、中文版PDF+源码
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
PyTorch深度学习快速实战入门《pytorch-handbook》
【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》
李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材
【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类
如何利用全新的决策树集成级联结构gcForest做特征工程并打分?
Machine Learning Yearning 中文翻译稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。