中国OCR软件包,可在安装后使用,无需训练自己的OCR模型
cnocr的Python项目详细描述
中粮中文README.
更新2019.07.25:发布cnocr v1.0.0
cnocr
v1.0.0
被释放,这对预测更有效。模型的新版本与以前的版本不兼容。因此,如果要升级,请再次下载最新的模型文件。详情见下文(同上)。
主要变化如下:
- 新的crnn模型支持可变宽度图像文件的预测,因此预测效率更高。 支持具体数据对现有模型进行微调。
- 修复错误,例如
train accuracy
总是0
。 - 依赖包
mxnet
从1.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文件
从提取代码为ss81
的Baidu NetDisk,并将zip文件放到~/.cnocr
。代码可以做其他事情。
预测
提供了三种预测功能。
1.CnOcr.ocr(img_fp)
函数cnOcr.ocr (img_fp)
可以识别包含多行(或单行)文本的图像中的文本。
函数描述
- 输入参数
img_fp
:图像文件路径;或彩色图像mx.nd.NDArray
或np.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:
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.NDArray
或np.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:
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.NDArray
或np.ndarray
。每个元素都应该是一个张量,其值从0
到255
不等,并且具有[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