Awesome
<div align="center"> <img src="./docs/figs/cnocr-logo.jpg" width="250px"/> <div> </div>📖 文档 | 🛠️ 安装 | 🧳 可用模型 | 🕹 模型训练 | 🛀🏻 在线Demo | 💬 交流群
</div> <div align="center">English | 中文
</div>CnOCR
<div align="center"> <strong>Tech should serve the people, not enslave them!</strong> <br> <strong>请勿将此项目用于文字审查!</strong> <br> --- </div>[Update 2024.11.30]:发布 V2.3.1
主要变更:
- 基于 RapidOCR 集成 PPOCRv4 最新版 OCR 模型,提供更多的模型选择
- 新增支持 PP-OCRv4 识别模型,包括标准版和服务器版
- 修改读文件实现方式,支持 Windows 的中文路径
- 修复Bug:当使用多个进程时,transform_func 无法序列化
- 修复Bug:与 albumentations=1.4.* 兼容
[Update 2023.12.24]:发布 V2.3
主要变更:
- 重新训练了所有的模型,比上一版精度更高。
- 按使用场景把模型分为几大类场景(见 识别模型列表):
scene
:场景图片,适合识别一般拍照图片中的文字。此类模型以scene-
开头,如模型scene-densenet_lite_136-gru
。doc
:文档图片,适合识别规则文档的截图图片,如书籍扫描件等。此类模型以doc-
开头,如模型doc-densenet_lite_136-gru
。number
:仅识别纯数字(只能识别0~9
十个数字)图片,适合银行卡号、身份证号等场景。此类模型以number-
开头,如模型number-densenet_lite_136-gru
。general
: 通用场景,适合图片无明显倾向的一般图片。此类模型无特定开头,与旧版模型名称保持一致,如模型densenet_lite_136-gru
。
注意 ⚠️:以上说明仅为参考,具体选择模型时建议以实际效果为准。
- 加入了两个更大的系列模型:
*-densenet_lite_246-gru_base
:优先供 知识星球 CnOCR/CnSTD私享群 会员使用,一个月后会免费开源。*-densenet_lite_666-gru_large
:Pro 模型,购买后可使用。
更多细节请参考:CnOCR V2.3 新版发布:模型更好、更多、更大 | Breezedeus.com。
CnOCR 是 Python 3 下的文字识别(Optical Character Recognition,简称OCR)工具包,支持简体中文、繁体中文(部分模型)、英文和数字的常见字符识别,支持竖排文字的识别。自带了20+个 训练好的模型,适用于不同应用场景,安装后即可直接使用。同时,CnOCR也提供简单的训练命令供使用者训练自己的模型。欢迎扫码加小助手为好友,备注 ocr
,小助手会定期统一邀请大家入群:
作者也维护 知识星球 CnOCR/CnSTD私享群 ,这里面的提问会较快得到作者的回复,欢迎加入。知识星球会员 可享受以下福利:
- 可免费下载部分未开源的付费模型;
- 购买其他所有的付费模型一律八折优化;
- 作者快速回复使用过程中遇到的各种困难;
- 作者每月提供两次免费特有数据的训练服务。
- 星球会陆续发布一些CnOCR/CnSTD相关的私有资料;
- 星球会持续发布 OCR/STD/CV 等相关的最新研究资料。
详细文档
见 CnOCR在线文档 。
使用说明
CnOCR 从 V2.2 开始,内部自动调用文字检测引擎 CnSTD 进行文字检测和定位。所以 CnOCR V2.2 不仅能识别排版简单的印刷体文字图片,如截图图片,扫描件等,也能识别一般图片中的场景文字。
以下是一些不同场景的调用示例。
不同场景的调用示例
常见的图片识别
所有参数都使用默认值即可。如果发现效果不够好,多调整下各个参数看效果,最终往往能获得比较理想的精度。
from cnocr import CnOcr
img_fp = './docs/examples/huochepiao.jpeg'
ocr = CnOcr() # 所有参数都使用默认值
out = ocr.ocr(img_fp)
print(out)
识别结果:
<div align="center"> <img src="./docs/predict-outputs/huochepiao.jpeg-result.jpg" alt="火车票识别" width="800px"/> </div>排版简单的印刷体截图图片识别
针对 排版简单的印刷体文字图片,如截图图片,扫描件图片等,可使用 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)
识别结果:
<div align="center">图片 | OCR结果 |
---|---|
网络支付并无本质的区别,因为<br />每一个手机号码和邮件地址背后<br />都会对应着一个账户--这个账<br />户可以是信用卡账户、借记卡账<br />户,也包括邮局汇款、手机代<br />收、电话代收、预付费卡和点卡<br />等多种形式。 |
竖排文字识别
采用来自 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)
识别结果:
<div align="center"> <img src="./docs/predict-outputs/shupai.png-result.jpg" alt="竖排文字识别" width="800px"/> </div>英文识别
虽然中文检测和识别模型也能识别英文,但专为英文文字训练的检测器和识别器往往精度更高。如果是纯英文的应用场景,建议使用来自 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)
识别结果:
<div align="center"> <img src="./docs/predict-outputs/en_book1.jpeg-result.jpg" alt="英文识别" width="600px"/> </div>繁体中文识别
采用来自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)
使用此模型时请注意以下问题:
-
识别精度一般,不是很好;
-
除了繁体字,对标点、英文、数字的识别都不好;
-
此模型不支持竖排文字的识别。
识别结果:
<div align="center"> <img src="./docs/predict-outputs/fanti.jpg-result.jpg" alt="繁体中文识别" width="700px"/> </div>单行文字的图片识别
如果明确知道待识别的图片是单行文字图片(如下图),可以使用类函数 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
如果电脑中从未安装过
PyTorch
,OpenCV
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_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-OCRv4_det | X | √ | ppocr | 4.5 M | 简体中文、繁体中文、英文、数字 | √ |
ch_PP-OCRv4_det_server | X | √ | ppocr | 108 M | 简体中文、繁体中文、英文、数字 | √ |
ch_PP-OCRv3_det | X | √ | ppocr | 2.3 M | 简体中文、繁体中文、英文、数字 | √ |
en_PP-OCRv3_det | X | √ | ppocr | 2.3 M | 英文、数字 | √ |
可使用的识别模型
相比于 CnOCR V2.2.* 版本,V2.3 中的大部分模型都经过了重新训练和精调,精度比旧版模型更高。同时,加入了两个参数量更多的模型系列:
*-densenet_lite_246-gru_base
:优先供 知识星球 CnOCR/CnSTD私享群 会员使用,后续会免费开源。*-densenet_lite_666-gru_large
:Pro 模型,购买后可使用。购买链接见文档:
V2.3 中的模型按使用场景可以分为以下几大类:
scene
:场景图片,适合识别一般拍照图片中的文字。此类模型以scene-
开头,如模型scene-densenet_lite_136-gru
。doc
:文档图片,适合识别规则文档的截图图片,如书籍扫描件等。此类模型以doc-
开头,如模型doc-densenet_lite_136-gru
。number
:仅识别纯数字(只能识别0~9
十个数字)图片,适合银行卡号、身份证号等场景。此类模型以number-
开头,如模型number-densenet_lite_136-gru
。general
: 通用场景,适合图片无明显倾向的一般图片。此类模型无特定开头,与旧版模型名称保持一致,如模型densenet_lite_136-gru
。
注意 ⚠️:以上说明仅供参考,具体选择模型时建议以实际效果为准。
更多说明见:可用模型。
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 🆕 <br /> (星球会员专享) | √ | √ | cnocr | 25 M | 简体中文、英文、数字 | X |
scene-densenet_lite_246-gru_base 🆕 <br /> (星球会员专享) | √ | √ | cnocr | 25 M | 简体中文、英文、数字 | X |
doc-densenet_lite_246-gru_base 🆕 <br /> (星球会员专享) | √ | √ | cnocr | 25 M | 简体中文、英文、数字 | X |
densenet_lite_666-gru_large 🆕 <br />(购买链接:B站、Lemon Squeezy) | √ | √ | cnocr | 82 M | 简体中文、英文、数字 | X |
scene-densenet_lite_666-gru_large 🆕 <br />(购买链接:B站、Lemon Squeezy) | √ | √ | cnocr | 82 M | 简体中文、英文、数字 | X |
doc-densenet_lite_666-gru_large 🆕 <br />(购买链接:B站、Lemon Squeezy) | √ | √ | cnocr | 82 M | 简体中文、英文、数字 | X |
number-densenet_lite_136-fc 🆕 | √ | √ | cnocr | 2.7 M | 纯数字(仅包含 0~9 十个数字) | X |
number-densenet_lite_136-gru 🆕 <br /> (星球会员专享) | √ | √ | cnocr | 5.5 M | 纯数字(仅包含 0~9 十个数字) | X |
number-densenet_lite_666-gru_large 🆕 <br />(购买链接:B站、Lemon Squeezy) | √ | √ | cnocr | 55 M | 纯数字(仅包含 0~9 十个数字) | X |
ch_PP-OCRv4 | X | √ | ppocr | 10 M | 简体中文、英文、数字 | √ |
ch_PP-OCRv4_server | X | √ | ppocr | 86 M | 简体中文、英文、数字 | √ |
ch_PP-OCRv3 | X | √ | ppocr | 10 M | 简体中文、英文、数字 | √ |
ch_ppocr_mobile_v2.0 | X | √ | ppocr | 4.2 M | 简体中文、英文、数字 | √ |
en_PP-OCRv4 | X | √ | ppocr | 8.6 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 |
japan_PP-OCRv3 | X | √ | ppocr | 9.6 M | 日文、英文、数字 | √ |
korean_PP-OCRv3 | X | √ | ppocr | 9.4 M | 韩文、英文、数字 | √ |
latin_PP-OCRv3 | X | √ | ppocr | 8.6 M | 拉丁文、英文、数字 | √ |
arabic_PP-OCRv3 | X | √ | ppocr | 8.6 M | 阿拉伯文、英文、数字 | √ |
未来工作
- 支持图片包含多行文字 (
Done
) - crnn模型支持可变长预测,提升灵活性 (since
V1.0.0
) - 完善测试用例 (
Doing
) - 修bugs(目前代码还比较凌乱。。) (
Doing
) - 支持
空格
识别(sinceV1.1.0
) - 尝试新模型,如 DenseNet,进一步提升识别准确率(since
V1.1.0
) - 优化训练集,去掉不合理的样本;在此基础上,重新训练各个模型
- 由 MXNet 改为 PyTorch 架构(since
V2.0.0
) - 基于 PyTorch 训练更高效的模型
- 支持列格式的文字识别
- 打通与 CnSTD 的无缝衔接(since
V2.2
) - 模型精度进一步优化
- 支持更多的应用场景
给作者来杯咖啡
开源不易,如果此项目对您有帮助,可以考虑 给作者加点油🥤,鼓鼓气💪🏻 。