breezedeus / CnOCR

CnOCR: Awesome Chinese/English OCR Python toolkits based on PyTorch. It comes with 20+ well-trained models for different application scenarios and can be used directly after installation. 【基于 PyTorch/MXNet 的中文/英文 OCR Python 包。】
https://www.breezedeus.com/article/cnocr
Apache License 2.0
3.27k stars 506 forks source link
chinese-character-recognition english-character-recognition ocr ocr-python pytorch
 
[![Discord](https://img.shields.io/discord/1200765964434821260?label=Discord)](https://discord.gg/GgD87WM8Tf) [![Downloads](https://static.pepy.tech/personalized-badge/cnocr?period=total&units=international_system&left_color=grey&right_color=orange&left_text=Downloads)](https://pepy.tech/project/cnocr) [![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Fbreezedeus%2FCnOCR&label=Visitors&countColor=%23f5c791&style=flat&labelStyle=none)](https://visitorbadge.io/status?path=https%3A%2F%2Fgithub.com%2Fbreezedeus%2FCnOCR) [![license](https://img.shields.io/github/license/breezedeus/cnocr)](./LICENSE) [![Docs](https://readthedocs.org/projects/cnocr/badge/?version=latest)](https://cnocr.readthedocs.io/zh-cn/stable/?badge=latest) [![PyPI version](https://badge.fury.io/py/cnocr.svg)](https://badge.fury.io/py/cnocr) [![forks](https://img.shields.io/github/forks/breezedeus/cnocr)](https://github.com/breezedeus/cnocr) [![stars](https://img.shields.io/github/stars/breezedeus/cnocr)](https://github.com/breezedeus/cnocr) ![last-releast](https://img.shields.io/github/release-date/breezedeus/cnocr) ![last-commit](https://img.shields.io/github/last-commit/breezedeus/cnocr) [![Twitter](https://img.shields.io/twitter/url?url=https%3A%2F%2Ftwitter.com%2Fbreezedeus)](https://twitter.com/breezedeus) [📖 文档](https://cnocr.readthedocs.io/zh-cn/stable/) | [🛠️ 安装](https://cnocr.readthedocs.io/zh-cn/stable/install/) | [🧳 可用模型](https://cnocr.readthedocs.io/zh-cn/stable/models/) | [🕹 模型训练](https://cnocr.readthedocs.io/zh-cn/stable/train/) | [🛀🏻 在线Demo](https://huggingface.co/spaces/breezedeus/CnOCR-Demo) | [💬 交流群](https://www.breezedeus.com/article/join-group)
[English](./README_en.md) | 中文

CnOCR

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

[Update 2023.12.24]:发布 V2.3

主要变更:

更多细节请参考:CnOCR V2.3 新版发布:模型更好、更多、更大 | Breezedeus.com

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

微信群二维码

作者也维护 知识星球 CnOCR/CnSTD私享群 ,这里面的提问会较快得到作者的回复,欢迎加入。知识星球会员 可享受以下福利:

详细文档

CnOCR在线文档

使用说明

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

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

不同场景的调用示例

常见的图片识别

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

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](./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[ort-cpu]

如果是 GPU 环境使用 ONNX 模型,请使用以下命令进行安装:

$ pip install cnocr[ort-gpu]

如果要训练自己的模型,,可以使用以下命令安装:

$ pip install cnocr[dev]

安装速度慢的话,可以指定国内的安装源,如使用阿里云的安装源:

$ pip install cnocr[ort-cpu] -i https://mirrors.aliyun.com/pypi/simple

Note

请使用 Python3(3.7.*~3.10.*之间的版本应该都行),没测过Python2下是否ok。

更多说明可见 安装文档

Warning

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

Docker Image

可以从 Docker Hub 直接拉取已安装好 CnOCR 的镜像使用。

$ docker pull breezedeus/cnocr:latest

更多说明可见 安装文档

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 的调用方式自行实现。

可使用的模型

可使用的检测模型

具体参考 CnSTD的下载说明

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 英文、数字

可使用的识别模型

相比于 CnOCR V2.2.* 版本,V2.3 中的大部分模型都经过了重新训练和精调,精度比旧版模型更高。同时,加入了两个参数量更多的模型系列:

V2.3 中的模型按使用场景可以分为以下几大类:

注意 ⚠️:以上说明仅供参考,具体选择模型时建议以实际效果为准。

更多说明见:可用模型

rec_model_name PyTorch 版本 ONNX 版本 模型原始来源 模型文件大小 支持语言 是否支持竖排文字识别
densenet_lite_136-gru 🆕 cnocr 12 M 简体中文、英文、数字 X
scene-densenet_lite_136-gru 🆕 cnocr 12 M 简体中文、英文、数字 X
doc-densenet_lite_136-gru 🆕 cnocr 12 M 简体中文、英文、数字 X
densenet_lite_246-gru_base 🆕
(星球会员专享)
cnocr 25 M 简体中文、英文、数字 X
scene-densenet_lite_246-gru_base 🆕
(星球会员专享)
cnocr 25 M 简体中文、英文、数字 X
doc-densenet_lite_246-gru_base 🆕
(星球会员专享)
cnocr 25 M 简体中文、英文、数字 X
densenet_lite_666-gru_large 🆕
(购买链接:B站Lemon Squeezy
cnocr 82 M 简体中文、英文、数字 X
scene-densenet_lite_666-gru_large 🆕
(购买链接:B站Lemon Squeezy
cnocr 82 M 简体中文、英文、数字 X
doc-densenet_lite_666-gru_large 🆕
(购买链接:B站Lemon Squeezy
cnocr 82 M 简体中文、英文、数字 X
number-densenet_lite_136-fc 🆕 cnocr 2.7 M 纯数字(仅包含 0~9 十个数字) X
number-densenet_lite_136-gru 🆕
(星球会员专享)
cnocr 5.5 M 纯数字(仅包含 0~9 十个数字) X
number-densenet_lite_666-gru_large 🆕
(购买链接:B站Lemon Squeezy
cnocr 55 M 纯数字(仅包含 0~9 十个数字) 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

未来工作

给作者来杯咖啡

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


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