README.md

    English | 中文

    CnOCR

    Tech should serve the people, not enslave them!
    请勿将此项目用于文字审查!
    ---

    CnOCRPython 3 下的文字识别Optical Character Recognition,简称OCR)工具包,支持简体中文繁体中文(部分模型)、英文数字的常见字符识别,支持竖排文字的识别。自带了20+个 训练好的模型,适用于不同应用场景,安装后即可直接使用。同时,CnOCR也提供简单的训练命令供使用者训练自己的模型。欢迎扫码加小助手为好友,备注 ocr,小助手会定期统一邀请大家入群:

    微信群二维码

    作者也维护 知识星球 CnOCR/CnSTD私享群 ,这里面的提问会较快得到作者的回复,欢迎加入。知识星球私享群也会陆续发布一些CnOCR/CnSTD相关的私有资料,包括更详细的训练教程未公开的模型不同应用场景的调用代码,使用过程中遇到的难题解答等。本群也会发布OCR/STD相关的最新研究资料。此外,私享群中作者每月提供两次免费特有数据的训练服务

    详细文档

    CnOCR在线文档

    使用说明

    CnOCRV2.2 开始,内部自动调用文字检测引擎 CnSTD 进行文字检测和定位。所以 CnOCR V2.2 不仅能识别排版简单的印刷体文字图片,如截图图片,扫描件等,也能识别一般图片中的场景文字

    以下是一些不同场景的调用示例。

    在 Cloud IDE 中预览

    https://idegithub.com/breezedeus/CnOCR

    不同场景的调用示例

    常见的图片识别

    所有参数都使用默认值即可。如果发现效果不够好,多调整下各个参数看效果,最终往往能获得比较理想的精度。

    from cnocr import CnOcr
    
    img_fp = './docs/examples/huochepiao.jpeg'
    ocr = CnOcr()  # 所有参数都使用默认值
    out = ocr.ocr(img_fp)
    
    print(out)

    识别结果:

    火车票识别

    排版简单的印刷体截图图片识别

    针对 排版简单的印刷体文字图片,如截图图片,扫描件图片等,可使用 det_model_name='naive_det',相当于不使用文本检测模型,而使用简单的规则进行分行。

    Note

    det_model_name='naive_det' 的效果相当于 V2.2 之前(V2.0.*, V2.1.*)的 CnOCR 版本。

    使用 det_model_name='naive_det' 的最大优势是速度快,劣势是对图片比较挑剔。如何判断是否该使用此检测模型呢?最简单的方式就是拿应用图片试试效果,效果好就用,不好就不用。

    from cnocr import CnOcr
    
    img_fp = './docs/examples/multi-line_cn1.png'
    ocr = CnOcr(det_model_name='naive_det') 
    out = ocr.ocr(img_fp)
    
    print(out)

    识别结果:

    图片 OCR结果
    docs/examples/multi-line_cn1.png 网络支付并无本质的区别,因为
    每一个手机号码和邮件地址背后
    都会对应着一个账户--这个账
    户可以是信用卡账户、借记卡账
    户,也包括邮局汇款、手机代
    收、电话代收、预付费卡和点卡
    等多种形式。

    竖排文字识别

    采用来自 PaddleOCR(之后简称 ppocr)的中文识别模型 rec_model_name='ch_PP-OCRv3' 进行识别。

    from cnocr import CnOcr
    
    img_fp = './docs/examples/shupai.png'
    ocr = CnOcr(rec_model_name='ch_PP-OCRv3')
    out = ocr.ocr(img_fp)
    
    print(out)

    识别结果:

    竖排文字识别

    英文识别

    虽然中文检测和识别模型也能识别英文,但专为英文文字训练的检测器和识别器往往精度更高。如果是纯英文的应用场景,建议使用来自 ppocr 的英文检测模型 det_model_name='en_PP-OCRv3_det', 和英文识别模型 rec_model_name='en_PP-OCRv3'

    from cnocr import CnOcr
    
    img_fp = './docs/examples/en_book1.jpeg'
    ocr = CnOcr(det_model_name='en_PP-OCRv3_det', rec_model_name='en_PP-OCRv3')
    out = ocr.ocr(img_fp)
    
    print(out)

    识别结果:

    英文识别

    繁体中文识别

    采用来自ppocr的繁体识别模型 rec_model_name='chinese_cht_PP-OCRv3' 进行识别。

    from cnocr import CnOcr
    
    img_fp = './docs/examples/fanti.jpg'
    ocr = CnOcr(rec_model_name='chinese_cht_PP-OCRv3')  # 识别模型使用繁体识别模型
    out = ocr.ocr(img_fp)
    
    print(out)

    使用此模型时请注意以下问题:

    • 识别精度一般,不是很好;

    • 除了繁体字,对标点、英文、数字的识别都不好;

    • 此模型不支持竖排文字的识别。

    识别结果:

    繁体中文识别

    单行文字的图片识别

    如果明确知道待识别的图片是单行文字图片(如下图),可以使用类函数 CnOcr.ocr_for_single_line() 进行识别。这样就省掉了文字检测的时间,速度会快一倍以上。

    单行文本识别
    调用代码如下:
    from cnocr import CnOcr
    
    img_fp = './docs/examples/helloworld.jpg'
    ocr = CnOcr()
    out = ocr.ocr_for_single_line(img_fp)
    print(out)

    更多应用示例

    • 核酸疫苗截图识别
    核酸疫苗截图识别
    • 身份证识别
    身份证识别
    • 饭店小票识别
    饭店小票识别

    安装

    嗯,顺利的话一行命令即可。

    pip install cnocr

    安装速度慢的话,可以指定国内的安装源,如使用豆瓣源:

    pip install cnocr -i https://pypi.doubanio.com/simple

    Note

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

    更多说明可见 安装文档

    Warning

    如果电脑中从未安装过 PyTorchOpenCV python包,初次安装可能会遇到问题,但一般都是常见问题,可以自行百度/Google解决。

    HTTP服务

    CnOCR V2.2.1 加入了基于 FastAPI 的HTTP服务。开启服务需要安装几个额外的包,可以使用以下命令安装:

    pip install cnocr[serve]

    安装完成后,可以通过以下命令启动HTTP服务(-p 后面的数字是端口,可以根据需要自行调整):

    cnocr serve -p 8501

    服务开启后,可以使用以下方式调用服务。

    命令行

    比如待识别文件为 docs/examples/huochepiao.jpeg,如下使用 curl 调用服务:

    > curl -F image=@docs/examples/huochepiao.jpeg http://0.0.0.0:8501/ocr

    Python

    使用如下方式调用服务:

    import requests
    
    image_fp = 'docs/examples/huochepiao.jpeg'
    r = requests.post(
        'http://0.0.0.0:8501/ocr', files={'image': (image_fp, open(image_fp, 'rb'), 'image/png')},
    )
    ocr_out = r.json()['results']
    print(ocr_out)

    具体也可参考文件 scripts/screenshot_daemon_with_server.py

    其他语言

    请参照 curl 的调用方式自行实现。

    可使用的模型

    可使用的检测模型

    det_model_name PyTorch 版本 ONNX 版本 模型原始来源 模型文件大小 支持语言 是否支持竖排文字识别
    db_shufflenet_v2 X cnocr 18 M 简体中文、繁体中文、英文、数字
    db_shufflenet_v2_small X cnocr 12 M 简体中文、繁体中文、英文、数字
    db_shufflenet_v2_tiny X cnocr 7.5 M 简体中文、繁体中文、英文、数字
    db_mobilenet_v3 X cnocr 16 M 简体中文、繁体中文、英文、数字
    db_mobilenet_v3_small X cnocr 7.9 M 简体中文、繁体中文、英文、数字
    db_resnet34 X cnocr 86 M 简体中文、繁体中文、英文、数字
    db_resnet18 X cnocr 47 M 简体中文、繁体中文、英文、数字
    ch_PP-OCRv3_det X ppocr 2.3 M 简体中文、繁体中文、英文、数字
    ch_PP-OCRv2_det X ppocr 2.2 M 简体中文、繁体中文、英文、数字
    en_PP-OCRv3_det X ppocr 2.3 M 英文、数字

    可使用的识别模型

    rec_model_name PyTorch 版本 ONNX 版本 模型原始来源 模型文件大小 支持语言 是否支持竖排文字识别
    densenet_lite_114-fc cnocr 4.9 M 简体中文、英文、数字 X
    densenet_lite_124-fc cnocr 5.1 M 简体中文、英文、数字 X
    densenet_lite_134-fc cnocr 5.4 M 简体中文、英文、数字 X
    densenet_lite_136-fc cnocr 5.9 M 简体中文、英文、数字 X
    densenet_lite_134-gru X cnocr 11 M 简体中文、英文、数字 X
    densenet_lite_136-gru X cnocr 12 M 简体中文、英文、数字 X
    ch_PP-OCRv3 X ppocr 10 M 简体中文、英文、数字
    ch_ppocr_mobile_v2.0 X ppocr 4.2 M 简体中文、英文、数字
    en_PP-OCRv3 X ppocr 8.5 M 英文、数字
    en_number_mobile_v2.0 X ppocr 1.8 M 英文、数字
    chinese_cht_PP-OCRv3 X ppocr 11 M 繁体中文、英文、数字 X

    未来工作

    • 支持图片包含多行文字 (Done)
    • crnn模型支持可变长预测,提升灵活性 (since V1.0.0)
    • 完善测试用例 (Doing)
    • 修bugs(目前代码还比较凌乱。。) (Doing)
    • 支持空格识别(since V1.1.0
    • 尝试新模型,如 DenseNet,进一步提升识别准确率(since V1.1.0
    • 优化训练集,去掉不合理的样本;在此基础上,重新训练各个模型
    • 由 MXNet 改为 PyTorch 架构(since V2.0.0
    • 基于 PyTorch 训练更高效的模型
    • 支持列格式的文字识别
    • 打通与 CnSTD 的无缝衔接(since V2.2
    • 支持更多的应用场景,如公式识别、表格识别、版面分析等

    给作者来杯咖啡

    开源不易,如果此项目对您有帮助,可以考虑 给作者加点油🥤,鼓鼓气💪🏻


    官方代码库:https://github.com/breezedeus/cnocr

    项目简介

    CnOCR 是 Python 3 下的文字识别(Optical Character Recognition,简称OCR)工具包,支持简体中文、繁体中文(部分模型)、英文和数字的常见字符识别,支持竖排文字的识别。自带了20+个 训练好的模型,适用于不同应用场景,安装后即可直接使用。

    发行版本 24

    fix: export_to_onnx

    全部发行版

    贡献者 9

    开发语言

    • Python 99.4 %
    • Makefile 0.4 %
    • Dockerfile 0.1 %