English | 中文
CnSTD
Update 2024.06.16:发布 V1.2.4
主要变更:
- 支持基于 Ultralytics 的 YOLO Detector。
Update 2023.06.30:发布 V1.2.3
主要变更:
- 基于新标注的数据,重新训练了 MFD YoloV7 模型,目前新模型已部署到 P2T网页版 。具体说明见:Pix2Text (P2T) 新版公式检测模型 | Breezedeus.com 。
- 之前的 MFD YoloV7 模型已开放给星球会员下载,具体说明见:P2T YoloV7 数学公式检测模型开放给星球会员下载 | Breezedeus.com 。
- 增加了一些Label Studio相关的脚本,见 scripts 。如:利用 CnSTD 自带的 MFD 模型对目录中的图片进行公式检测后生成可导入到Label Studio中的JSON文件;以及,Label Studio标注后把导出的JSON文件转换成训练 MFD 模型所需的数据格式。注意,MFD 模型的训练代码在 yolov7 (
dev
branch)中。
了解更多:RELEASE.md 。
CnSTD 是 Python 3 下的场景文字检测(Scene Text Detection,简称STD)工具包,支持中文、英文等语言的文字检测,自带了多个训练好的检测模型,安装后即可直接使用。CnSTD 自 V1.2.1 版本开始,加入了数学公式检测(Mathematical Formula Detection,简称MFD)模型,并提供训练好的模型可直接用于检测图片中包含的数学公式(行内公式 embedding
与独立行公式 isolated
)。
欢迎扫码加入微信交流群:
作者也维护 知识星球 CnOCR/CnSTD/P2T私享群,欢迎加入。知识星球私享群会陆续发布一些CnOCR/CnSTD/P2T相关的私有资料,包括更详细的训练教程,未公开的模型,使用过程中遇到的难题解答等。本群也会发布OCR/STD相关的最新研究资料。
自 V1.0.0 版本开始,CnSTD 从之前基于 MXNet 实现转为基于 PyTorch 实现。新模型的训练合并了 ICPR MTWI 2018、ICDAR RCTW-17 和 ICDAR2019-LSVT 三个数据集,包括了 46447
个训练样本,和 1534
个测试样本。
相较于之前版本, 新版本的变化主要包括:
- 加入了对 PaddleOCR 检测模型的支持;
- 部分调整了检测结果中
box
的表达方式,统一为4
个点的坐标值; - 修复了已知bugs。
如需要识别文本框中的文字,可以结合 OCR 工具包 cnocr 一起使用。
示例
场景文字检测(STD)
数学公式检测(MFD)
MFD 模型检测图片中包含的数学公式,其中行内的公式检测为 embedding
类别,独立行的公式检测为 isolated
。模型训练使用了英文 IBEM 和中文 CnMFD_Dataset 两个数据集。
版面分析(Layout Analysis)
版面分析模型识别图片中的不同排版元素。模型训练使用的是 CDLA 数据集。可识别以下10中版面元素:
正文 | 标题 | 图片 | 图片标题 | 表格 | 表格标题 | 页眉 | 页脚 | 注释 | 公式 |
---|---|---|---|---|---|---|---|---|---|
Text | Title | Figure | Figure caption | Table | Table caption | Header | Footer | Reference | Equation |
安装
嗯,顺利的话很简单(bless)。
pip install cnstd
如果需要使用 ONNX 模型(model_backend=onnx
),请使用以下命令安装:
- CPU环境使用 ONNX 模型:
pip install cnstd[ort-cpu]
- GPU环境使用 ONNX 模型:
pip install cnstd[ort-gpu]
- 注意:如果当前环境已经安装了
onnxruntime
包,请先手动卸载(pip uninstall onnxruntime
)后再运行上面的命令。
- 注意:如果当前环境已经安装了
安装速度慢的话,可以指定国内的安装源,如使用豆瓣源:
pip install cnstd -i https://mirrors.aliyun.com/pypi/simple
【注意】:
- 请使用 Python3 (3.6以及之后版本应该都行),没测过Python2下是否ok。
- 依赖 opencv,所以可能需要额外安装opencv。
已有STD模型
CnSTD 从 V1.2 开始,可直接使用的模型包含两类:1)CnSTD 自己训练的模型,通常会包含 PyTorch 和 ONNX 版本;2)从其他ocr引擎搬运过来的训练好的外部模型,ONNX化后用于 CnSTD 中。
直接使用的模型都放在 cnstd-cnocr-models 项目中,可免费下载使用。
1. CnSTD 自己训练的模型
当前版本(Since V1.1.0)的文字检测模型使用的是 DBNet,相较于 V0.1 使用的 PSENet 模型, DBNet 的检测耗时几乎下降了一个量级,同时检测精度也得到了极大的提升。
目前包含以下已训练好的模型:
模型名称 | 参数规模 | 模型文件大小 | 测试集精度(IoU) | 平均推断耗时 (秒/张) | 下载方式 |
---|---|---|---|---|---|
db_resnet34 | 22.5 M | 86 M | 0.7322 | 3.11 | 自动 |
db_resnet18 | 12.3 M | 47 M | 0.7294 | 1.93 | 自动 |
db_mobilenet_v3 | 4.2 M | 16 M | 0.7269 | 1.76 | 自动 |
db_mobilenet_v3_small | 2.0 M | 7.9 M | 0.7054 | 1.24 | 自动 |
db_shufflenet_v2 | 4.7 M | 18 M | 0.7238 | 1.73 | 自动 |
db_shufflenet_v2_small | 3.0 M | 12 M | 0.7190 | 1.29 | 自动 |
db_shufflenet_v2_tiny | 1.9 M | 7.5 M | 0.7172 | 1.14 | 下载链接 |
上表耗时基于本地 Mac 获得,绝对值无太大参考价值,相对值可供参考。IoU的计算方式经过调整,仅相对值可供参考。
相对于两个基于 ResNet 的模型,基于 MobileNet 和 ShuffleNet 的模型体积更小,速度更快,建议在轻量级场景使用。
2. 外部模型
以下模型是 PaddleOCR 中模型的 ONNX 版本,所以不会依赖 PaddlePaddle 相关工具包,故而也不支持基于这些模型在自己的领域数据上继续精调模型。这些模型支持检测竖排文字。
model_name | PyTorch 版本 | ONNX 版本 | 支持检测的语言 | 模型文件大小 |
---|---|---|---|---|
ch_PP-OCRv3_det | X | √ | 简体中问、英文、数字 | 2.3 M |
ch_PP-OCRv2_det | X | √ | 简体中问、英文、数字 | 2.2 M |
en_PP-OCRv3_det | X | √ | 英文、数字 | 2.3 M |
更多模型可参考 PaddleOCR/models_list.md 。如有其他外语(如日、韩等)检测需求,可在 知识星球 CnOCR/CnSTD私享群 中向作者提出建议。
使用方法
首次使用 CnSTD 时,系统会自动下载zip格式的模型压缩文件,并存放于 ~/.cnstd
目录(Windows下默认路径为 C:\Users\<username>\AppData\Roaming\cnstd
)。下载速度超快。下载后的zip文件代码会自动对其解压,然后把解压后的模型相关目录放于~/.cnstd/1.2
目录中。
如果系统无法自动成功下载zip文件,则需要手动从 百度云盘(提取码为 nstd
)下载对应的zip文件并把它存放于 ~/.cnstd/1.2
(Windows下为 C:\Users\<username>\AppData\Roaming\cnstd\1.2
)目录中。模型也可从 cnstd-cnocr-models 中下载。放置好zip文件后,后面的事代码就会自动执行了。
场景文字检测(STD)
使用类 CnStd
进行场景文字的检测。类 CnStd
的初始化函数如下:
class CnStd(object):
"""
场景文字检测器(Scene Text Detection)。虽然名字中有个"Cn"(Chinese),但其实也可以轻松识别英文的。
"""
def __init__(
self,
model_name: str = 'ch_PP-OCRv3_det',
*,
auto_rotate_whole_image: bool = False,
rotated_bbox: bool = True,
context: str = 'cpu',
model_fp: Optional[str] = None,
model_backend: str = 'onnx', # ['pytorch', 'onnx']
root: Union[str, Path] = data_dir(),
use_angle_clf: bool = False,
angle_clf_configs: Optional[dict] = None,
**kwargs,
):
其中的几个参数含义如下:
-
model_name
: 模型名称,即前面模型表格第一列中的值。默认为 ch_PP-OCRv3_det 。 -
auto_rotate_whole_image
: