中国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文件到编译器?   java写入文件和I/O   java日历返回错误的当前日期安卓   if语句if变量等于1(java)   java很难让Joda有时间使用我的bukkit插件   json如何创建基于java的应用程序,该应用程序将从网站获取输入   java如何在多页中打印大型JPanel   java my spinner在添加从firebase数据库中选择的多个值时被覆盖   java用Play框架覆盖HTTP方法   试图获取所有用户时,java错误请求400。Dto和表格   java支持bean加载图像后javascript自动调用JS函数   java在MTOM的@StreamingAttachment(Metro)中,Parsely的意思是什么   具有可抢占线程队列的多线程java执行器   Java Opencv connectedComponentsWithStats   java如何向数组中添加2D数组的数目   eclipse为什么我的Java Zork克隆不能正确循环?   java在哪里放置定制的第二个web。xml   java如何更改最近应用列表中显示的快照?   java Browser#getText()返回空字符串