中国OCR软件包,可在安装后使用,无需训练自己的OCR模型

cnocr的Python项目详细描述


中粮中文README.

更新2019.07.25:发布cnocr v1.0.0

cnocrv1.0.0被释放,这对预测更有效。模型的新版本与以前的版本不兼容。因此,如果要升级,请再次下载最新的模型文件。详情见下文(同上)。

主要变化如下:

  • 新的crnn模型支持可变宽度图像文件的预测,因此预测效率更高。
  • 支持具体数据对现有模型进行微调。
  • 修复错误,例如train accuracy总是0
  • 依赖包mxnet1.3.1升级到1.4.1

CNOCR

一个面向中国ocr的python包,提供了经过训练的模型。 所以安装后可以直接使用。

当前crnn模型的精度约为98.8%

这个项目源于我们自己的(爱因互动 Ein+)内部需求。 感谢内部支持。

更改

大多数代码都是由crnn-mxnet-chinese-text-recognition改编的。 非常感谢作者。

一些更改是:

  • 使用原始MXNET CTC损耗,而不是WARPCTC损耗。没有更复杂的安装。
  • 为任何人准备的公共培训模型。不要再训练几天了。
  • 添加联机predict函数和脚本。使用方便。

安装

pip install cnocr

Please use Python3 (3.4, 3.5, 3.6 should work). Python2 is not tested.

用法

第一次使用cnocr时,模型文件将自动从 Dropbox~/.cnocr

将提取zip文件,默认情况下,您可以在~/.cnocr/models中找到生成的模型文件。 如果自动下载无法正常运行,可以手动下载zip文件 从提取代码为ss81Baidu NetDisk,并将zip文件放到~/.cnocr。代码可以做其他事情。

预测

提供了三种预测功能。

1.CnOcr.ocr(img_fp)

函数cnOcr.ocr (img_fp)可以识别包含多行(或单行)文本的图像中的文本。

函数描述

  • 输入参数img_fp:图像文件路径;或彩色图像mx.nd.NDArraynp.ndarray,形状为(height, width, 3),通道应为rgb格式。
  • 返回:List(List(Char)),例如:[['第', '一', '行'], ['第', '二', '行'], ['第', '三', '行']]

使用案例

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

或:

importmxnetasmxfromcnocrimportCnOcrocr=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

ocr结果应该是:

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,形状为[height, width][height, width, channel]。可选通道应该是1(灰色图像)或3(彩色图像)。
  • 返回:List(Char),例如:['你', '好']

使用情况

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

或:

importmxnetasmxfromcnocrimportCnOcrocr=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

ocr结果应该是:

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:图像列表,其中每个元素应该是一个行图像数组,类型为mx.nd.NDArraynp.ndarray。每个元素都应该是一个张量,其值从0255不等,并且具有[height, width][height, width, channel]形状。可选通道应该是1(灰色图像)或3(彩色图像)。
  • 返回:List(List(Char)),例如:[['第', '一', '行'], ['第', '二', '行'], ['第', '三', '行']]

使用案例**:

importmxnetasmxfromcnocrimportCnOcrocr=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_imgforline_img,_inline_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

(无需)列车

你可以不用火车就用这个包裹。但如果你真的想训练自己的模特,请遵循以下步骤:

python scripts/cnocr_train.py --cpu 2 --num_proc 4 --loss ctc --dataset cn_ocr
<> P>利用现有模型的特定数据对模型进行微调。请参考以下命令:

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

可以在scripts/run_cnocr_train.sh找到更多引用。

未来工作

  • [X]支持多行字符识别(Done
  • [X]CRNN模型支持可变宽度图像文件的预测(Done
  • [X]添加单元测试(Doing
  • [X]错误修复(Doing
  • []支持空间识别(已尝试,但目前尚未成功)
  • []尝试其他型号,如Densenet、Resnet

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java使用哪个地图/集合?   bluej Java:计算税   由于性能问题,java双精度字符串替代方案   java Eclipse CDT生成设置因重新启动而丢失   如何在java控制台中显示字节流值   java获取url地址,其中是包含我的页面的iframe   java 403禁止的spring启动API调用错误?   如果一个方法返回true,java将停止计时器   使用JavaNIO获取文件创建日期   在Java中从整数转换为二进制时保留整个字节的字符串   java AspectJ&Maven警告:“未应用……中定义的建议?”   java为什么我得到3,我不应该得到+7   java当一个方法包含多个返回的if语句时,如何从该方法中获取返回值?   在运行时循环java(scan.nextLine()!="$")   java配置休眠。cfg。春天的xml   java使用HtmlUnit模拟用户,错误   java CLI如何持续检查更改   java最大素因子(返回)