cnstd


Namecnstd JSON
Version 1.2.5.1 PyPI version JSON
download
home_pagehttps://github.com/breezedeus/cnstd
SummaryPython3 package for Chinese/English Scene Text Detection (STD), Mathematical Formula Detection (MFD), and Layout Analysis, with free pretrained models
upload_time2024-11-30 01:53:06
maintainerNone
docs_urlNone
authorbreezedeus
requires_pythonNone
licenseApache 2.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            <div align="center">
	<img src="./docs/logo.png" width="250px"/>
  <div>&nbsp;</div>

[![Downloads](https://static.pepy.tech/personalized-badge/cnstd?period=total&units=international_system&left_color=grey&right_color=orange&left_text=Downloads)](https://pepy.tech/project/cnstd)
[![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Fbreezedeus%2FCnSTD&label=Visitors&countColor=%23f5c791&style=flat&labelStyle=none)](https://visitorbadge.io/status?path=https%3A%2F%2Fgithub.com%2Fbreezedeus%2FCnSTD)
[![license](https://img.shields.io/github/license/breezedeus/cnstd)](./LICENSE)
[![PyPI version](https://badge.fury.io/py/cnstd.svg)](https://badge.fury.io/py/cnstd)
[![forks](https://img.shields.io/github/forks/breezedeus/cnstd)](https://img.shields.io/github/forks/breezedeus/cnstd)
[![stars](https://img.shields.io/github/stars/breezedeus/cnstd)](https://github.com/breezedeus/cnocr)
![last-releast](https://img.shields.io/github/release-date/breezedeus/cnstd?style=plastic)
![last-commit](https://img.shields.io/github/last-commit/breezedeus/cnstd)
[![Twitter](https://img.shields.io/twitter/url?url=https%3A%2F%2Ftwitter.com%2Fbreezedeus)](https://twitter.com/breezedeus)

</div>

<div align="center">

[English](./README_en.md) | 中文

</div>


# CnSTD
## Update 2024.11.24:发布 V1.2.5

主要变更:

* 基于 RapidOCR 集成 PPOCRv4 最新版文本检测功能,提供更快的推理速度
  * 新增支持 PP-OCRv4 检测模型,包括标准版和服务器版
* 优化模型下载功能,支持从国内镜像下载模型文件

## Update 2024.06.16:发布 V1.2.4

主要变更:

* 支持基于 Ultralytics 的 YOLO Detector。


## Update 2023.06.30:发布 V1.2.3

主要变更:

* 基于新标注的数据,重新训练了 **MFD YoloV7** 模型,目前新模型已部署到 [P2T网页版](https://p2t.behye.com) 。具体说明见:[Pix2Text (P2T) 新版公式检测模型 | Breezedeus.com](https://www.breezedeus.com/article/p2t-mfd-20230613) 。
* 之前的 MFD YoloV7 模型已开放给星球会员下载,具体说明见:[P2T YoloV7 数学公式检测模型开放给星球会员下载 | Breezedeus.com](https://www.breezedeus.com/article/p2t-yolov7-for-zsxq-20230619) 。
* 增加了一些Label Studio相关的脚本,见 [scripts](scripts) 。如:利用 CnSTD 自带的 MFD 模型对目录中的图片进行公式检测后生成可导入到Label Studio中的JSON文件;以及,Label Studio标注后把导出的JSON文件转换成训练 MFD 模型所需的数据格式。注意,MFD 模型的训练代码在 [yolov7](https://github.com/breezedeus/yolov7) (`dev` branch)中。

了解更多:[RELEASE.md](./RELEASE.md) 。

---



**CnSTD** 是 **Python 3** 下的**场景文字检测**(**Scene Text Detection**,简称**STD**)工具包,支持**中文**、**英文**等语言的文字检测,自带了多个训练好的检测模型,安装后即可直接使用。**CnSTD** 自 **V1.2.1** 版本开始,加入了**数学公式检测**(**Mathematical Formula Detection**,简称**MFD**)模型,并提供训练好的模型可直接用于检测图片中包含的数学公式(**行内公式** `embedding` 与**独立行公式** `isolated` )。

欢迎扫码加入微信交流群:

<div align="center">
  <img src="https://huggingface.co/datasets/breezedeus/cnocr-wx-qr-code/resolve/main/wx-qr-code.JPG" alt="微信群二维码" width="300px"/>
</div>

作者也维护 **知识星球** [**CnOCR/CnSTD/P2T私享群**](https://t.zsxq.com/FEYZRJQ),欢迎加入。**知识星球私享群**会陆续发布一些CnOCR/CnSTD/P2T相关的私有资料,包括**更详细的训练教程**,**未公开的模型**,使用过程中遇到的难题解答等。本群也会发布OCR/STD相关的最新研究资料。

自 **V1.0.0** 版本开始,**CnSTD** 从之前基于 MXNet 实现转为基于 **PyTorch** 实现。新模型的训练合并了  **ICPR MTWI 2018**、**ICDAR RCTW-17** 和 **ICDAR2019-LSVT** 三个数据集,包括了 **`46447`** 个训练样本,和 **`1534`** 个测试样本。

相较于之前版本, 新版本的变化主要包括:

* 加入了对 [**PaddleOCR**](https://github.com/PaddlePaddle/PaddleOCR) 检测模型的支持;
* 部分调整了检测结果中 `box` 的表达方式,统一为 `4` 个点的坐标值;  
* 修复了已知bugs。

如需要识别文本框中的文字,可以结合 **OCR** 工具包 **[cnocr](https://github.com/breezedeus/cnocr)** 一起使用。


## 示例

### 场景文字检测(STD)

<div align="center">
  <img src="./docs/cases.png" alt="STD效果" width="700px"/>
</div>

### 数学公式检测(MFD)

MFD 模型检测图片中包含的数学公式,其中行内的公式检测为 `embedding` 类别,独立行的公式检测为 `isolated`。模型训练使用了英文 [IBEM](https://zenodo.org/record/4757865) 和中文 [CnMFD_Dataset](https://github.com/breezedeus/CnMFD_Dataset) 两个数据集。

<div align="center">
  <img src="./examples/mfd/out-zh4.jpg" alt="中文MFD效果" width="700px"/>
</div>  
<div align="center">
  <img src="./examples/mfd/out-zh5.jpg" alt="中文MFD效果" width="700px"/>
</div>
<div align="center">
  <img src="./examples/mfd/out-en2.jpg" alt="英文MFD效果" width="700px"/>
</div> 


### 版面分析(Layout Analysis)

版面分析模型识别图片中的不同排版元素。模型训练使用的是 [CDLA](https://github.com/buptlihang/CDLA) 数据集。可识别以下10中版面元素:

|正文|标题|图片|图片标题|表格|表格标题|页眉|页脚|注释|公式|
|---|---|---|---|---|---|---|---|---|---|
|Text|Title|Figure|Figure caption|Table|Table caption|Header|Footer|Reference|Equation|

<div align="center">
  <img src="./examples/layout/out-zh.jpg" alt="版面分析效果" width="700px"/>
</div>  


## 安装

嗯,顺利的话很简单(bless)。

```bash
pip install cnstd
```

如果需要使用 ONNX 模型(`model_backend=onnx`),请使用以下命令安装:

* CPU环境使用 ONNX 模型:
  ```bash
  pip install cnstd[ort-cpu]
  ```
* GPU环境使用 ONNX 模型:
  ```bash
  pip install cnstd[ort-gpu]
  ```
  * 注意:如果当前环境已经安装了 `onnxruntime` 包,请先手动卸载(`pip uninstall onnxruntime`)后再运行上面的命令。

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

```bash
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**](https://huggingface.co/breezedeus/cnstd-cnocr-models) 项目中,可免费下载使用。

### 1. CnSTD 自己训练的模型

当前版本(Since **V1.1.0**)的文字检测模型使用的是 [**DBNet**](https://github.com/MhLiao/DB),相较于 V0.1 使用的 [PSENet](https://github.com/whai362/PSENet) 模型, DBNet 的检测耗时几乎下降了一个量级,同时检测精度也得到了极大的提升。

目前包含以下已训练好的模型:

| 模型名称                       | 参数规模      | 模型文件大小    | 测试集精度(IoU) | 平均推断耗时<br />(秒/张) | 下载方式                                                      |
| -------------------------- | --------- | --------- | ---------- | ----------------- | --------------------------------------------------------- |
| 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              | 自动                                                        |

> 上表耗时基于本地 Mac 获得,绝对值无太大参考价值,相对值可供参考。IoU的计算方式经过调整,仅相对值可供参考。

相对于两个基于 **ResNet** 的模型,基于 **MobileNet** 和 **ShuffleNet** 的模型体积更小,速度更快,建议在轻量级场景使用。

### 2. 外部模型

以下模型是 [**PaddleOCR**](https://github.com/PaddlePaddle/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  |
| ch_PP-OCRv4_det | X          | √       | 简体中问、英文、数字 | 4.5 M  |
| ch_PP-OCRv4_det_server | X          | √       | 简体中问、英文、数字 | 108 M  |

更多模型可参考 [PaddleOCR/models_list.md](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.5/doc/doc_ch/models_list.md) 。如有其他外语(如日、韩等)检测需求,可在 **知识星球** [**CnOCR/CnSTD私享群**](https://t.zsxq.com/FEYZRJQ) 中向作者提出建议。

## 使用方法

首次使用 **CnSTD** 时,系统会自动下载zip格式的模型压缩文件,并存放于 `~/.cnstd`目录(Windows下默认路径为 `C:\Users\<username>\AppData\Roaming\cnstd`)。下载速度超快。下载后的zip文件代码会自动对其解压,然后把解压后的模型相关目录放于`~/.cnstd/1.2`目录中。

如果系统无法自动成功下载zip文件,则需要手动从 [百度云盘](https://pan.baidu.com/s/1zDMzArCDrrXHWL0AWxwYQQ?pwd=nstd)(提取码为 `nstd`)下载对应的zip文件并把它存放于 `~/.cnstd/1.2`(Windows下为 `C:\Users\<username>\AppData\Roaming\cnstd\1.2`)目录中。模型也可从 **[cnstd-cnocr-models](https://huggingface.co/breezedeus/cnstd-cnocr-models)** 中下载。放置好zip文件后,后面的事代码就会自动执行了。

### 场景文字检测(STD)

使用类 `CnStd` 进行场景文字的检测。类 `CnStd` 的初始化函数如下:

```python
class CnStd(object):
    """
    场景文字检测器(Scene Text Detection)。虽然名字中有个"Cn"(Chinese),但其实也可以轻松识别英文的。
    """

    def __init__(
        self,
        model_name: str = 'ch_PP-OCRv4_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-OCRv4_det** 。

* `auto_rotate_whole_image`:  是否自动对整张图片进行旋转调整。默认为`False`。

* `rotated_bbox`:  是否支持检测带角度的文本框;默认为 `True`,表示支持;取值为 `False` 时,只检测水平或垂直的文本。

* `context`:预测使用的机器资源,可取值为字符串`cpu`、`gpu`、`cuda:0`。

* `model_fp`:  如果不使用系统自带的模型,可以通过此参数直接指定所使用的模型文件(`.ckpt`文件)。

* `model_backend` (str): 'pytorch', or 'onnx'。表明预测时是使用 PyTorch 版本模型,还是使用 ONNX 版本模型。  同样的模型,ONNX 版本的预测速度一般是 PyTorch 版本的2倍左右。默认为 `onnx`。

* `root`: 模型文件所在的根目录。
  
  * Linux/Mac下默认值为 `~/.cnstd`,表示模型文件所处文件夹类似 `~/.cnstd/1.2/db_shufflenet_v2_small`。
  * Windows下默认值为 `C:\Users\<username>\AppData\Roaming\cnstd`。

* `use_angle_clf` (bool): 对于检测出的文本框,是否使用角度分类模型进行调整(检测出的文本框可能会存在倒转180度的情况)。默认为 `False`

* `angle_clf_configs` (dict): 角度分类模型对应的参数取值,主要包含以下值:
  
  - `model_name`: 模型名称。默认为 'ch_ppocr_mobile_v2.0_cls'
  - `model_fp`: 如果不使用系统自带的模型,可以通过此参数直接指定所使用的模型文件('.onnx' 文件)。默认为 `None`。具体可参考类 `AngleClassifier` 的说明

每个参数都有默认取值,所以可以不传入任何参数值进行初始化:`std = CnStd()`。

文本检测使用类`CnOcr`的函数 **`detect()`**,以下是详细说明:

#### 类函数`CnStd.detect()`

```python
    def detect(
        self,
        img_list: Union[
            str,
            Path,
            Image.Image,
            np.ndarray,
            List[Union[str, Path, Image.Image, np.ndarray]],
        ],
        resized_shape: Union[int, Tuple[int, int]] = (768, 768),
        preserve_aspect_ratio: bool = True,
        min_box_size: int = 8,
        box_score_thresh: float = 0.3,
        batch_size: int = 20,
        **kwargs,
    ) -> Union[Dict[str, Any], List[Dict[str, Any]]]:
```

**函数说明**:

函数输入参数包括:

- `img_list`: 支持对单个图片或者多个图片(列表)的检测。每个值可以是图片路径,或者已经读取进来 `PIL.Image.Image` 或 `np.ndarray`,  格式应该是 `RGB` 3 通道,shape: `(height, width, 3)`, 取值范围:`[0, 255]`。

- `resized_shape`: `int` or `tuple`, `tuple` 含义为 `(height, width)`, `int` 则表示高宽都为此值;  
   检测前,先把原始图片resize到接近此大小(只是接近,未必相等)。默认为 `(768, 768)`。
  
  > **Note** **(注意)**
  > 这个取值对检测结果的影响较大,可以针对自己的应用多尝试几组值,再选出最优值。例如 `(512, 768)`, `(768, 768)`, `(768, 1024)`等。

- `preserve_aspect_ratio`: 对原始图片 resize 时是否保持高宽比不变。默认为 `True`。

- `min_box_size`: 过滤掉高度或者宽度小于此值的文本框。默认为 `8`,也即高或者宽小于 `8` 的文本框会被过滤去掉。

- `box_score_thresh`: 过滤掉得分低于此值的文本框。默认为 `0.3`。

- `batch_size`: 待处理图片很多时,需要分批处理,每批图片的数量由此参数指定。默认为 `20`。

- `kwargs`: 保留参数,目前未被使用。

函数输出类型为`list`,其中每个元素是一个字典,对应一张图片的检测结果。字典中包含以下 `keys`:

- `rotated_angle`: `float`, 整张图片旋转的角度。只有 `auto_rotate_whole_image==True` 才可能非 `0`。

- `detected_texts`: `list`, 每个元素存储了检测出的一个框的信息,使用词典记录,包括以下几个值:
  
  - `box`:检测出的文字对应的矩形框;`np.ndarray`, shape: `(4, 2)`,对应 box 4个点的坐标值 `(x, y)`;
  
  - `score`:得分;`float` 类型;分数越高表示越可靠;
  
  - `cropped_img`:对应 "box" 中的图片patch(`RGB`格式),会把倾斜的图片旋转为水平。`np.ndarray`类型,`shape: (height, width, 3)`,  取值范围:`[0, 255]`;
  
  - 示例:
    
    ```python
      [{'box': array([[416,  77],
                      [486,  13],
                      [800, 325],
                      [730, 390]], dtype=int32),
        'score': 1.0, 
        'cropped_img': array([[[25, 20, 24],
                               [26, 21, 25],
                               [25, 20, 24],
                              ...,
                               [11, 11, 13],
                               [11, 11, 13],
                               [11, 11, 13]]], dtype=uint8)},
       ...
      ]
    ```

#### 调用示例

```python
from cnstd import CnStd
std = CnStd()
box_info_list = std.detect('examples/taobao.jpg')
```

或:

```python
from PIL import Image
from cnstd import CnStd

std = CnStd()
img_fp = 'examples/taobao.jpg'
img = Image.open(img_fp)
box_infos = std.detect(img)
```

### 识别检测框中的文字(OCR)

上面示例识别结果中"cropped_img"对应的值可以直接交由 **[cnocr](https://github.com/breezedeus/cnocr)** 中的 **`CnOcr`** 进行文字识别。如上例可以结合  **`CnOcr`** 进行文字识别:

```python
from cnstd import CnStd
from cnocr import CnOcr

std = CnStd()
cn_ocr = CnOcr()

box_infos = std.detect('examples/taobao.jpg')

for box_info in box_infos['detected_texts']:
    cropped_img = box_info['cropped_img']
    ocr_res = cn_ocr.ocr_for_single_line(cropped_img)
    print('ocr result: %s' % str(ocr_res))
```

注:运行上面示例需要先安装  **[cnocr](https://github.com/breezedeus/cnocr)** :

```bash
pip install cnocr
```



### 数学公式检测(MFD)与 版面分析(Layout Analysis)

数学公式检测(MFD)与 版面分析(Layout Analysis)都是检测图片中感兴趣的元素,它们使用的都是基于YOLOv7的检测架构,在CnSTD都来源于相同的类 `LayoutAnalyzer`,差别只是训练模型使用的数据不同。

> 这两个模型的训练代码在 [yolov7](https://github.com/breezedeus/yolov7) 中(Forked from [WongKinYiu/yolov7](https://github.com/WongKinYiu/yolov7),感谢原作者。)



类 `LayoutAnalyzer` 的初始化函数如下:

```python
class LayoutAnalyzer(object):
    def __init__(
        self,
        model_name: str = 'mfd',  # 'layout' or 'mfd'
        *,
        model_type: str = 'yolov7_tiny',  # 当前支持 [`yolov7_tiny`, `yolov7`]'
        model_backend: str = 'pytorch',
        model_categories: Optional[List[str]] = None,
        model_fp: Optional[str] = None,
        model_arch_yaml: Optional[str] = None,
        root: Union[str, Path] = data_dir(),
        device: str = 'cpu',
        **kwargs,
    )
```

其中的参数含义如下:

- `model_name`: 字符串类型,表示模型类型。可选值:'mfd' 表示数学公式检测;'layout' 表示版面分析。默认值:'mfd'

- `model_type`: 字符串类型,表示模型类型。当前支持 'yolov7_tiny' 和 'yolov7';默认值:'yolov7_tiny'。'yolov7' 模型暂不开源,当前仅开放给星球会员下载,具体说明见:[P2T YoloV7 数学公式检测模型开放给星球会员下载 | Breezedeus.com](https://www.breezedeus.com/article/p2t-yolov7-for-zsxq-20230619) 。

- `model_backend`: 字符串类型,表示backend。当前仅支持: 'pytorch';默认值:'pytorch'

- `model_categories`: 模型的检测类别名称。默认值:None,表示基于 `model_name` 自动决定

- `model_fp`: 字符串类型,表示模型文件的路径。默认值:`None`,表示使用默认的文件路径

- `model_arch_yaml`: 架构文件路径,例如 'yolov7-mfd.yaml';默认值为 None,表示将自动选择。

- `root`: 字符串或`Path`类型,表示模型文件所在的根目录。
  - Linux/Mac下默认值为 `~/.cnstd`,表示模型文件所处文件夹类似 `~/.cnstd/1.2/analysis`
  - Windows下默认值为 `C:/Users/<username>/AppData/Roaming/cnstd`。
  
- `device`: 字符串类型,表示运行模型的设备,可选值:'cpu' 或 'gpu';默认值:'cpu'

- `**kwargs`: 额外的参数。




#### 类函数`LayoutAnalyzer.analyze()`

对指定图片(列表)进行版面分析。

```python
def analyze(
    self,
    img_list: Union[
        str,
        Path,
        Image.Image,
        np.ndarray,
        List[Union[str, Path, Image.Image, np.ndarray]],
    ],
    resized_shape: Union[int, Tuple[int, int]] = 700,
    box_margin: int = 2,
    conf_threshold: float = 0.25,
    iou_threshold: float = 0.45,
) -> Union[List[Dict[str, Any]], List[List[Dict[str, Any]]]]:
```



**函数说明**:

函数输入参数包括:

* `img_list` (str or list): 待识别图片或图片列表;如果是 `np.ndarray`,则应该是shape为 `[H, W, 3]` 的 RGB 格式数组
* `resized_shape` (int or tuple): (H, W); 把图片resize到此大小再做分析;默认值为 `700`
* `box_margin` (int): 对识别出的内容框往外扩展的像素大小;默认值为 `2`
* `conf_threshold` (float): 分数阈值;默认值为 `0.25`
* `iou_threshold` (float): IOU阈值;默认值为 `0.45`
* `**kwargs`: 额外的参数。

函数输出结果为一个`list`(如果 `img_list` 为 `list`,返回为两层嵌套的 `list`,其中每个元素为对应图片的检测结果),其中每个元素表示识别出的版面中的一个元素,包含以下信息:

* type: 版面元素对应的类型;可选值来自:`self.categories` ;
* box: 版面元素对应的矩形框;`np.ndarray`, shape: (4, 2),对应 box 4个点的坐标值 `(x, y)` ;
* score: 得分,越高表示越可信 。




#### 调用示例

```python
from cnstd import LayoutAnalyzer
img_fp = 'examples/mfd/zh5.jpg'
analyzer = LayoutAnalyzer('mfd')
out = analyzer.analyze(img_fp, resized_shape=700)
print(out)
```





### 脚本使用

**cnstd** 包含了几个命令行工具,安装 **cnstd** 后即可使用。

#### STD 预测单个文件或文件夹中所有图片

使用命令 **`cnstd predict`** 预测单个文件或文件夹中所有图片,以下是使用说明:

```bash
(venv) ➜  cnstd git:(master) ✗ cnstd predict -h
Usage: cnstd predict [OPTIONS]

  预测单个文件,或者指定目录下的所有图片

Options:
  -m, --model-name [ch_PP-OCRv2_det|ch_PP-OCRv3_det|ch_PP-OCRv4_det|ch_PP-OCRv4_det_server|db_mobilenet_v3|db_mobilenet_v3_small|db_resnet18|db_resnet34|db_shufflenet_v2|db_shufflenet_v2_small|en_PP-OCRv3_det]
                                  模型名称。默认值为 db_shufflenet_v2_small
  -b, --model-backend [pytorch|onnx]
                                  模型类型。默认值为 `onnx`
  -p, --pretrained-model-fp TEXT  使用训练好的模型。默认为 `None`,表示使用系统自带的预训练模型
  -r, --rotated-bbox              是否检测带角度(非水平和垂直)的文本框。默认为 `True`
  --resized-shape TEXT            格式:"height,width";
                                  预测时把图片resize到此大小再进行预测。两个值都需要是32的倍数。默认为
                                  `768,768`

  --box-score-thresh FLOAT        检测结果只保留分数大于此值的文本框。默认值为 `0.3`
  --preserve-aspect-ratio BOOLEAN
                                  resize时是否保留图片原始比例。默认值为 `True`
  --context TEXT                  使用cpu还是 `gpu` 运行代码,也可指定为特定gpu,如`cuda:0`。默认为
                                  `cpu`

  -i, --img-file-or-dir TEXT      输入图片的文件路径或者指定的文件夹
  -o, --output-dir TEXT           检测结果存放的文件夹。默认为 `./predictions`
  -h, --help                      Show this message and exit.
```

例如可以使用以下命令对图片 `examples/taobao.jpg`进行检测,并把检测结果存放在目录 `outputs`中:

```bash
cnstd predict -i examples/taobao.jpg -o outputs
```

具体使用也可参考文件 [Makefile](./Makefile) 。



#### MFD or Layout Analysis 预测单个文件

使用命令 **`cnstd analyze`** 获得单个文件的 MFD 或者 Layout Analysis 结果,以下是使用说明:

```bash
(venv) ➜  cnstd git:(master) ✗ cnstd analyze -h
Usage: cnstd analyze [OPTIONS]

  对给定图片进行 MFD 或者 版面分析。

Options:
  -m, --model-name TEXT           模型类型。`mfd` 表示数学公式检测,`layout`
                                  表示版面分析;默认为:`mfd`
  -t, --model-type TEXT           模型类型。当前支持 [`yolov7_tiny`, `yolov7`]
  -b, --model-backend [pytorch|onnx]
                                  模型后端架构。当前仅支持 `pytorch`
  -c, --model-categories TEXT     模型的检测类别名称(","分割)。默认值:None,表示基于 `model_name`
                                  自动决定
  -p, --model-fp TEXT             使用训练好的模型。默认为 `None`,表示使用系统自带的预训练模型
  -y, --model-arch-yaml TEXT      模型的配置文件路径
  --device TEXT                   cuda device, i.e. 0 or 0,1,2,3 or cpu
  -i, --img-fp TEXT               待分析的图片路径或图片目录
  -o, --output-fp TEXT            分析结果输出的图片路径。默认为 `None`,会存储在当前文件夹,文件名称为输入文件名称
                                  前面增加`out-`;如输入文件名为 `img.jpg`, 输出文件名即为 `out-
                                  img.jpg`;如果输入为目录,则此路径也应该是一个目录,会将输出文件存储在此目录下
  --resized-shape INTEGER         分析时把图片resize到此大小再进行。默认为 `608`
  --conf-thresh FLOAT             Confidence Threshold。默认值为 `0.25`
  --iou-thresh FLOAT              IOU threshold for NMS。默认值为 `0.45`
  -h, --help                      Show this message and exit.
```

例如可以使用以下命令对图片 `examples/mfd/zh.jpg` 进行 MFD,并把检测结果存放在文件 `out-zh.jpg` 中:

```bash
(venv) ➜  cnstd analyze -m mfd --conf-thresh 0.25 --resized-shape 800 -i examples/mfd/zh.jpg -o out-zh.jpg
```

具体使用也可参考文件 [Makefile](./Makefile) 。

#### 模型训练

使用命令 **`cnstd train`**  训练文本检测模型,以下是使用说明:

```bash
(venv) ➜  cnstd git:(master) ✗ cnstd train -h
Usage: cnstd train [OPTIONS]

  训练文本检测模型

Options:
  -m, --model-name [db_resnet50|db_resnet34|db_resnet18|db_mobilenet_v3|db_mobilenet_v3_small|db_shufflenet_v2|db_shufflenet_v2_small|db_shufflenet_v2_tiny]
                                  模型名称。默认值为 `db_shufflenet_v2_small`
  -i, --index-dir TEXT            索引文件所在的文件夹,会读取文件夹中的 `train.tsv` 和 `dev.tsv` 文件
                                  [required]

  --train-config-fp TEXT          训练使用的json配置文件  [required]
  -r, --resume-from-checkpoint TEXT
                                  恢复此前中断的训练状态,继续训练
  -p, --pretrained-model-fp TEXT  导入的训练好的模型,作为初始模型。优先级低于 "--restore-training-
                                  fp",当传入"--restore-training-fp"时,此传入失效

  -h, --help                      Show this message and exit.
```

具体使用可参考文件 [Makefile](./Makefile) 。

#### 模型转存

训练好的模型会存储训练状态,使用命令 **`cnstd resave`**  去掉与预测无关的数据,降低模型大小。

```bash
(venv) ➜  cnstd git:(master) ✗ cnstd resave -h
Usage: cnstd resave [OPTIONS]

  训练好的模型会存储训练状态,使用此命令去掉预测时无关的数据,降低模型大小

Options:
  -i, --input-model-fp TEXT   输入的模型文件路径  [required]
  -o, --output-model-fp TEXT  输出的模型文件路径  [required]
  -h, --help                  Show this message and exit.
```

## 未来工作

* [x] 进一步精简模型结构,降低模型大小
* [x] PSENet速度上还是比较慢,尝试更快的STD算法
* [x] 加入更多的训练数据
* [x] 加入对外部模型的支持
* [x] 加入数学公式检测(MFD)与 版面分析(Layout Analysis)模型
* [ ] 加入对文档结构与表格的检测



## 给作者来杯咖啡

开源不易,如果此项目对您有帮助,可以考虑 [给作者来杯咖啡 ☕️](https://cnocr.readthedocs.io/zh/latest/buymeacoffee/) 。

---

官方代码库:[https://github.com/breezedeus/cnstd](https://github.com/breezedeus/cnstd)。


            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/breezedeus/cnstd",
    "name": "cnstd",
    "maintainer": null,
    "docs_url": null,
    "requires_python": null,
    "maintainer_email": null,
    "keywords": null,
    "author": "breezedeus",
    "author_email": "breezedeus@163.com",
    "download_url": "https://files.pythonhosted.org/packages/eb/b8/a8167d727f20d905cfeb1c8f3861be36594b454fb99401a6cd1cb281d871/cnstd-1.2.5.1.tar.gz",
    "platform": "Mac",
    "description": "<div align=\"center\">\n\t<img src=\"./docs/logo.png\" width=\"250px\"/>\n  <div>&nbsp;</div>\n\n[![Downloads](https://static.pepy.tech/personalized-badge/cnstd?period=total&units=international_system&left_color=grey&right_color=orange&left_text=Downloads)](https://pepy.tech/project/cnstd)\n[![Visitors](https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fgithub.com%2Fbreezedeus%2FCnSTD&label=Visitors&countColor=%23f5c791&style=flat&labelStyle=none)](https://visitorbadge.io/status?path=https%3A%2F%2Fgithub.com%2Fbreezedeus%2FCnSTD)\n[![license](https://img.shields.io/github/license/breezedeus/cnstd)](./LICENSE)\n[![PyPI version](https://badge.fury.io/py/cnstd.svg)](https://badge.fury.io/py/cnstd)\n[![forks](https://img.shields.io/github/forks/breezedeus/cnstd)](https://img.shields.io/github/forks/breezedeus/cnstd)\n[![stars](https://img.shields.io/github/stars/breezedeus/cnstd)](https://github.com/breezedeus/cnocr)\n![last-releast](https://img.shields.io/github/release-date/breezedeus/cnstd?style=plastic)\n![last-commit](https://img.shields.io/github/last-commit/breezedeus/cnstd)\n[![Twitter](https://img.shields.io/twitter/url?url=https%3A%2F%2Ftwitter.com%2Fbreezedeus)](https://twitter.com/breezedeus)\n\n</div>\n\n<div align=\"center\">\n\n[English](./README_en.md) | \u4e2d\u6587\n\n</div>\n\n\n# CnSTD\n## Update 2024.11.24\uff1a\u53d1\u5e03 V1.2.5\n\n\u4e3b\u8981\u53d8\u66f4\uff1a\n\n* \u57fa\u4e8e RapidOCR \u96c6\u6210 PPOCRv4 \u6700\u65b0\u7248\u6587\u672c\u68c0\u6d4b\u529f\u80fd\uff0c\u63d0\u4f9b\u66f4\u5feb\u7684\u63a8\u7406\u901f\u5ea6\n  * \u65b0\u589e\u652f\u6301 PP-OCRv4 \u68c0\u6d4b\u6a21\u578b\uff0c\u5305\u62ec\u6807\u51c6\u7248\u548c\u670d\u52a1\u5668\u7248\n* \u4f18\u5316\u6a21\u578b\u4e0b\u8f7d\u529f\u80fd\uff0c\u652f\u6301\u4ece\u56fd\u5185\u955c\u50cf\u4e0b\u8f7d\u6a21\u578b\u6587\u4ef6\n\n## Update 2024.06.16\uff1a\u53d1\u5e03 V1.2.4\n\n\u4e3b\u8981\u53d8\u66f4\uff1a\n\n* \u652f\u6301\u57fa\u4e8e Ultralytics \u7684 YOLO Detector\u3002\n\n\n## Update 2023.06.30\uff1a\u53d1\u5e03 V1.2.3\n\n\u4e3b\u8981\u53d8\u66f4\uff1a\n\n* \u57fa\u4e8e\u65b0\u6807\u6ce8\u7684\u6570\u636e\uff0c\u91cd\u65b0\u8bad\u7ec3\u4e86 **MFD YoloV7** \u6a21\u578b\uff0c\u76ee\u524d\u65b0\u6a21\u578b\u5df2\u90e8\u7f72\u5230 [P2T\u7f51\u9875\u7248](https://p2t.behye.com) \u3002\u5177\u4f53\u8bf4\u660e\u89c1\uff1a[Pix2Text (P2T) \u65b0\u7248\u516c\u5f0f\u68c0\u6d4b\u6a21\u578b | Breezedeus.com](https://www.breezedeus.com/article/p2t-mfd-20230613) \u3002\n* \u4e4b\u524d\u7684 MFD YoloV7 \u6a21\u578b\u5df2\u5f00\u653e\u7ed9\u661f\u7403\u4f1a\u5458\u4e0b\u8f7d\uff0c\u5177\u4f53\u8bf4\u660e\u89c1\uff1a[P2T YoloV7 \u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\u6a21\u578b\u5f00\u653e\u7ed9\u661f\u7403\u4f1a\u5458\u4e0b\u8f7d | Breezedeus.com](https://www.breezedeus.com/article/p2t-yolov7-for-zsxq-20230619) \u3002\n* \u589e\u52a0\u4e86\u4e00\u4e9bLabel Studio\u76f8\u5173\u7684\u811a\u672c\uff0c\u89c1 [scripts](scripts) \u3002\u5982\uff1a\u5229\u7528 CnSTD \u81ea\u5e26\u7684 MFD \u6a21\u578b\u5bf9\u76ee\u5f55\u4e2d\u7684\u56fe\u7247\u8fdb\u884c\u516c\u5f0f\u68c0\u6d4b\u540e\u751f\u6210\u53ef\u5bfc\u5165\u5230Label Studio\u4e2d\u7684JSON\u6587\u4ef6\uff1b\u4ee5\u53ca\uff0cLabel Studio\u6807\u6ce8\u540e\u628a\u5bfc\u51fa\u7684JSON\u6587\u4ef6\u8f6c\u6362\u6210\u8bad\u7ec3 MFD \u6a21\u578b\u6240\u9700\u7684\u6570\u636e\u683c\u5f0f\u3002\u6ce8\u610f\uff0cMFD \u6a21\u578b\u7684\u8bad\u7ec3\u4ee3\u7801\u5728 [yolov7](https://github.com/breezedeus/yolov7) \uff08`dev` branch\uff09\u4e2d\u3002\n\n\u4e86\u89e3\u66f4\u591a\uff1a[RELEASE.md](./RELEASE.md) \u3002\n\n---\n\n\n\n**CnSTD** \u662f **Python 3** \u4e0b\u7684**\u573a\u666f\u6587\u5b57\u68c0\u6d4b**\uff08**Scene Text Detection**\uff0c\u7b80\u79f0**STD**\uff09\u5de5\u5177\u5305\uff0c\u652f\u6301**\u4e2d\u6587**\u3001**\u82f1\u6587**\u7b49\u8bed\u8a00\u7684\u6587\u5b57\u68c0\u6d4b\uff0c\u81ea\u5e26\u4e86\u591a\u4e2a\u8bad\u7ec3\u597d\u7684\u68c0\u6d4b\u6a21\u578b\uff0c\u5b89\u88c5\u540e\u5373\u53ef\u76f4\u63a5\u4f7f\u7528\u3002**CnSTD** \u81ea **V1.2.1** \u7248\u672c\u5f00\u59cb\uff0c\u52a0\u5165\u4e86**\u6570\u5b66\u516c\u5f0f\u68c0\u6d4b**\uff08**Mathematical Formula Detection**\uff0c\u7b80\u79f0**MFD**\uff09\u6a21\u578b\uff0c\u5e76\u63d0\u4f9b\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u53ef\u76f4\u63a5\u7528\u4e8e\u68c0\u6d4b\u56fe\u7247\u4e2d\u5305\u542b\u7684\u6570\u5b66\u516c\u5f0f\uff08**\u884c\u5185\u516c\u5f0f** `embedding` \u4e0e**\u72ec\u7acb\u884c\u516c\u5f0f** `isolated` \uff09\u3002\n\n\u6b22\u8fce\u626b\u7801\u52a0\u5165\u5fae\u4fe1\u4ea4\u6d41\u7fa4\uff1a\n\n<div align=\"center\">\n  <img src=\"https://huggingface.co/datasets/breezedeus/cnocr-wx-qr-code/resolve/main/wx-qr-code.JPG\" alt=\"\u5fae\u4fe1\u7fa4\u4e8c\u7ef4\u7801\" width=\"300px\"/>\n</div>\n\n\u4f5c\u8005\u4e5f\u7ef4\u62a4 **\u77e5\u8bc6\u661f\u7403** [**CnOCR/CnSTD/P2T\u79c1\u4eab\u7fa4**](https://t.zsxq.com/FEYZRJQ)\uff0c\u6b22\u8fce\u52a0\u5165\u3002**\u77e5\u8bc6\u661f\u7403\u79c1\u4eab\u7fa4**\u4f1a\u9646\u7eed\u53d1\u5e03\u4e00\u4e9bCnOCR/CnSTD/P2T\u76f8\u5173\u7684\u79c1\u6709\u8d44\u6599\uff0c\u5305\u62ec**\u66f4\u8be6\u7ec6\u7684\u8bad\u7ec3\u6559\u7a0b**\uff0c**\u672a\u516c\u5f00\u7684\u6a21\u578b**\uff0c\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u9047\u5230\u7684\u96be\u9898\u89e3\u7b54\u7b49\u3002\u672c\u7fa4\u4e5f\u4f1a\u53d1\u5e03OCR/STD\u76f8\u5173\u7684\u6700\u65b0\u7814\u7a76\u8d44\u6599\u3002\n\n\u81ea **V1.0.0** \u7248\u672c\u5f00\u59cb\uff0c**CnSTD** \u4ece\u4e4b\u524d\u57fa\u4e8e MXNet \u5b9e\u73b0\u8f6c\u4e3a\u57fa\u4e8e **PyTorch** \u5b9e\u73b0\u3002\u65b0\u6a21\u578b\u7684\u8bad\u7ec3\u5408\u5e76\u4e86  **ICPR MTWI 2018**\u3001**ICDAR RCTW-17** \u548c **ICDAR2019-LSVT** \u4e09\u4e2a\u6570\u636e\u96c6\uff0c\u5305\u62ec\u4e86 **`46447`** \u4e2a\u8bad\u7ec3\u6837\u672c\uff0c\u548c **`1534`** \u4e2a\u6d4b\u8bd5\u6837\u672c\u3002\n\n\u76f8\u8f83\u4e8e\u4e4b\u524d\u7248\u672c\uff0c \u65b0\u7248\u672c\u7684\u53d8\u5316\u4e3b\u8981\u5305\u62ec\uff1a\n\n* \u52a0\u5165\u4e86\u5bf9 [**PaddleOCR**](https://github.com/PaddlePaddle/PaddleOCR) \u68c0\u6d4b\u6a21\u578b\u7684\u652f\u6301\uff1b\n* \u90e8\u5206\u8c03\u6574\u4e86\u68c0\u6d4b\u7ed3\u679c\u4e2d `box` \u7684\u8868\u8fbe\u65b9\u5f0f\uff0c\u7edf\u4e00\u4e3a `4` \u4e2a\u70b9\u7684\u5750\u6807\u503c\uff1b  \n* \u4fee\u590d\u4e86\u5df2\u77e5bugs\u3002\n\n\u5982\u9700\u8981\u8bc6\u522b\u6587\u672c\u6846\u4e2d\u7684\u6587\u5b57\uff0c\u53ef\u4ee5\u7ed3\u5408 **OCR** \u5de5\u5177\u5305 **[cnocr](https://github.com/breezedeus/cnocr)** \u4e00\u8d77\u4f7f\u7528\u3002\n\n\n## \u793a\u4f8b\n\n### \u573a\u666f\u6587\u5b57\u68c0\u6d4b\uff08STD\uff09\n\n<div align=\"center\">\n  <img src=\"./docs/cases.png\" alt=\"STD\u6548\u679c\" width=\"700px\"/>\n</div>\n\n### \u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\uff08MFD\uff09\n\nMFD \u6a21\u578b\u68c0\u6d4b\u56fe\u7247\u4e2d\u5305\u542b\u7684\u6570\u5b66\u516c\u5f0f\uff0c\u5176\u4e2d\u884c\u5185\u7684\u516c\u5f0f\u68c0\u6d4b\u4e3a `embedding` \u7c7b\u522b\uff0c\u72ec\u7acb\u884c\u7684\u516c\u5f0f\u68c0\u6d4b\u4e3a `isolated`\u3002\u6a21\u578b\u8bad\u7ec3\u4f7f\u7528\u4e86\u82f1\u6587 [IBEM](https://zenodo.org/record/4757865) \u548c\u4e2d\u6587 [CnMFD_Dataset](https://github.com/breezedeus/CnMFD_Dataset) \u4e24\u4e2a\u6570\u636e\u96c6\u3002\n\n<div align=\"center\">\n  <img src=\"./examples/mfd/out-zh4.jpg\" alt=\"\u4e2d\u6587MFD\u6548\u679c\" width=\"700px\"/>\n</div>  \n<div align=\"center\">\n  <img src=\"./examples/mfd/out-zh5.jpg\" alt=\"\u4e2d\u6587MFD\u6548\u679c\" width=\"700px\"/>\n</div>\n<div align=\"center\">\n  <img src=\"./examples/mfd/out-en2.jpg\" alt=\"\u82f1\u6587MFD\u6548\u679c\" width=\"700px\"/>\n</div> \n\n\n### \u7248\u9762\u5206\u6790\uff08Layout Analysis\uff09\n\n\u7248\u9762\u5206\u6790\u6a21\u578b\u8bc6\u522b\u56fe\u7247\u4e2d\u7684\u4e0d\u540c\u6392\u7248\u5143\u7d20\u3002\u6a21\u578b\u8bad\u7ec3\u4f7f\u7528\u7684\u662f [CDLA](https://github.com/buptlihang/CDLA) \u6570\u636e\u96c6\u3002\u53ef\u8bc6\u522b\u4ee5\u4e0b10\u4e2d\u7248\u9762\u5143\u7d20\uff1a\n\n|\u6b63\u6587|\u6807\u9898|\u56fe\u7247|\u56fe\u7247\u6807\u9898|\u8868\u683c|\u8868\u683c\u6807\u9898|\u9875\u7709|\u9875\u811a|\u6ce8\u91ca|\u516c\u5f0f|\n|---|---|---|---|---|---|---|---|---|---|\n|Text|Title|Figure|Figure caption|Table|Table caption|Header|Footer|Reference|Equation|\n\n<div align=\"center\">\n  <img src=\"./examples/layout/out-zh.jpg\" alt=\"\u7248\u9762\u5206\u6790\u6548\u679c\" width=\"700px\"/>\n</div>  \n\n\n## \u5b89\u88c5\n\n\u55ef\uff0c\u987a\u5229\u7684\u8bdd\u5f88\u7b80\u5355\uff08bless\uff09\u3002\n\n```bash\npip install cnstd\n```\n\n\u5982\u679c\u9700\u8981\u4f7f\u7528 ONNX \u6a21\u578b\uff08`model_backend=onnx`\uff09\uff0c\u8bf7\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5b89\u88c5\uff1a\n\n* CPU\u73af\u5883\u4f7f\u7528 ONNX \u6a21\u578b\uff1a\n  ```bash\n  pip install cnstd[ort-cpu]\n  ```\n* GPU\u73af\u5883\u4f7f\u7528 ONNX \u6a21\u578b\uff1a\n  ```bash\n  pip install cnstd[ort-gpu]\n  ```\n  * \u6ce8\u610f\uff1a\u5982\u679c\u5f53\u524d\u73af\u5883\u5df2\u7ecf\u5b89\u88c5\u4e86 `onnxruntime` \u5305\uff0c\u8bf7\u5148\u624b\u52a8\u5378\u8f7d\uff08`pip uninstall onnxruntime`\uff09\u540e\u518d\u8fd0\u884c\u4e0a\u9762\u7684\u547d\u4ee4\u3002\n\n\u5b89\u88c5\u901f\u5ea6\u6162\u7684\u8bdd\uff0c\u53ef\u4ee5\u6307\u5b9a\u56fd\u5185\u7684\u5b89\u88c5\u6e90\uff0c\u5982\u4f7f\u7528\u8c46\u74e3\u6e90\uff1a\n\n```bash\npip install cnstd -i https://mirrors.aliyun.com/pypi/simple\n```\n\n\u3010\u6ce8\u610f\u3011\uff1a\n\n* \u8bf7\u4f7f\u7528 **Python3** (3.6\u4ee5\u53ca\u4e4b\u540e\u7248\u672c\u5e94\u8be5\u90fd\u884c)\uff0c\u6ca1\u6d4b\u8fc7Python2\u4e0b\u662f\u5426ok\u3002\n* \u4f9d\u8d56 **opencv**\uff0c\u6240\u4ee5\u53ef\u80fd\u9700\u8981\u989d\u5916\u5b89\u88c5opencv\u3002\n\n## \u5df2\u6709STD\u6a21\u578b\n\nCnSTD \u4ece **V1.2** \u5f00\u59cb\uff0c\u53ef\u76f4\u63a5\u4f7f\u7528\u7684\u6a21\u578b\u5305\u542b\u4e24\u7c7b\uff1a1\uff09CnSTD \u81ea\u5df1\u8bad\u7ec3\u7684\u6a21\u578b\uff0c\u901a\u5e38\u4f1a\u5305\u542b PyTorch \u548c ONNX \u7248\u672c\uff1b2\uff09\u4ece\u5176\u4ed6ocr\u5f15\u64ce\u642c\u8fd0\u8fc7\u6765\u7684\u8bad\u7ec3\u597d\u7684\u5916\u90e8\u6a21\u578b\uff0cONNX\u5316\u540e\u7528\u4e8e CnSTD \u4e2d\u3002\n\n\u76f4\u63a5\u4f7f\u7528\u7684\u6a21\u578b\u90fd\u653e\u5728 [**cnstd-cnocr-models**](https://huggingface.co/breezedeus/cnstd-cnocr-models) \u9879\u76ee\u4e2d\uff0c\u53ef\u514d\u8d39\u4e0b\u8f7d\u4f7f\u7528\u3002\n\n### 1. CnSTD \u81ea\u5df1\u8bad\u7ec3\u7684\u6a21\u578b\n\n\u5f53\u524d\u7248\u672c\uff08Since **V1.1.0**\uff09\u7684\u6587\u5b57\u68c0\u6d4b\u6a21\u578b\u4f7f\u7528\u7684\u662f [**DBNet**](https://github.com/MhLiao/DB)\uff0c\u76f8\u8f83\u4e8e V0.1 \u4f7f\u7528\u7684 [PSENet](https://github.com/whai362/PSENet) \u6a21\u578b\uff0c DBNet \u7684\u68c0\u6d4b\u8017\u65f6\u51e0\u4e4e\u4e0b\u964d\u4e86\u4e00\u4e2a\u91cf\u7ea7\uff0c\u540c\u65f6\u68c0\u6d4b\u7cbe\u5ea6\u4e5f\u5f97\u5230\u4e86\u6781\u5927\u7684\u63d0\u5347\u3002\n\n\u76ee\u524d\u5305\u542b\u4ee5\u4e0b\u5df2\u8bad\u7ec3\u597d\u7684\u6a21\u578b\uff1a\n\n| \u6a21\u578b\u540d\u79f0                       | \u53c2\u6570\u89c4\u6a21      | \u6a21\u578b\u6587\u4ef6\u5927\u5c0f    | \u6d4b\u8bd5\u96c6\u7cbe\u5ea6\uff08IoU\uff09 | \u5e73\u5747\u63a8\u65ad\u8017\u65f6<br />\uff08\u79d2/\u5f20\uff09 | \u4e0b\u8f7d\u65b9\u5f0f                                                      |\n| -------------------------- | --------- | --------- | ---------- | ----------------- | --------------------------------------------------------- |\n| db_resnet34                | 22.5 M    | 86 M      | **0.7322** | 3.11              | \u81ea\u52a8                                                        |\n| db_resnet18                | 12.3 M    | 47 M      | 0.7294     | 1.93              | \u81ea\u52a8                                                        |\n| db_mobilenet_v3            | 4.2 M     | 16 M      | **0.7269** | 1.76              | \u81ea\u52a8                                                        |\n| db_mobilenet_v3_small      | 2.0 M     | 7.9 M     | 0.7054     | 1.24              | \u81ea\u52a8                                                        |\n| db_shufflenet_v2           | 4.7 M     | 18 M      | 0.7238     | 1.73              | \u81ea\u52a8                                                        |\n| **db_shufflenet_v2_small** | 3.0 M     | 12 M      | 0.7190     | 1.29              | \u81ea\u52a8                                                        |\n\n> \u4e0a\u8868\u8017\u65f6\u57fa\u4e8e\u672c\u5730 Mac \u83b7\u5f97\uff0c\u7edd\u5bf9\u503c\u65e0\u592a\u5927\u53c2\u8003\u4ef7\u503c\uff0c\u76f8\u5bf9\u503c\u53ef\u4f9b\u53c2\u8003\u3002IoU\u7684\u8ba1\u7b97\u65b9\u5f0f\u7ecf\u8fc7\u8c03\u6574\uff0c\u4ec5\u76f8\u5bf9\u503c\u53ef\u4f9b\u53c2\u8003\u3002\n\n\u76f8\u5bf9\u4e8e\u4e24\u4e2a\u57fa\u4e8e **ResNet** \u7684\u6a21\u578b\uff0c\u57fa\u4e8e **MobileNet** \u548c **ShuffleNet** \u7684\u6a21\u578b\u4f53\u79ef\u66f4\u5c0f\uff0c\u901f\u5ea6\u66f4\u5feb\uff0c\u5efa\u8bae\u5728\u8f7b\u91cf\u7ea7\u573a\u666f\u4f7f\u7528\u3002\n\n### 2. \u5916\u90e8\u6a21\u578b\n\n\u4ee5\u4e0b\u6a21\u578b\u662f [**PaddleOCR**](https://github.com/PaddlePaddle/PaddleOCR) \u4e2d\u6a21\u578b\u7684 **ONNX** \u7248\u672c\uff0c\u6240\u4ee5\u4e0d\u4f1a\u4f9d\u8d56 **PaddlePaddle** \u76f8\u5173\u5de5\u5177\u5305\uff0c\u6545\u800c\u4e5f\u4e0d\u652f\u6301\u57fa\u4e8e\u8fd9\u4e9b\u6a21\u578b\u5728\u81ea\u5df1\u7684\u9886\u57df\u6570\u636e\u4e0a\u7ee7\u7eed\u7cbe\u8c03\u6a21\u578b\u3002\u8fd9\u4e9b\u6a21\u578b\u652f\u6301\u68c0\u6d4b**\u7ad6\u6392\u6587\u5b57**\u3002\n\n| `model_name`    | PyTorch \u7248\u672c | ONNX \u7248\u672c | \u652f\u6301\u68c0\u6d4b\u7684\u8bed\u8a00    | \u6a21\u578b\u6587\u4ef6\u5927\u5c0f |\n| --------------- | ---------- | ------- | ---------- | ------ |\n| ch_PP-OCRv3_det | X          | \u221a       | \u7b80\u4f53\u4e2d\u95ee\u3001\u82f1\u6587\u3001\u6570\u5b57 | 2.3 M  |\n| ch_PP-OCRv2_det | X          | \u221a       | \u7b80\u4f53\u4e2d\u95ee\u3001\u82f1\u6587\u3001\u6570\u5b57 | 2.2 M  |\n| en_PP-OCRv3_det | X          | \u221a       | **\u82f1\u6587**\u3001\u6570\u5b57  | 2.3 M  |\n| ch_PP-OCRv4_det | X          | \u221a       | \u7b80\u4f53\u4e2d\u95ee\u3001\u82f1\u6587\u3001\u6570\u5b57 | 4.5 M  |\n| ch_PP-OCRv4_det_server | X          | \u221a       | \u7b80\u4f53\u4e2d\u95ee\u3001\u82f1\u6587\u3001\u6570\u5b57 | 108 M  |\n\n\u66f4\u591a\u6a21\u578b\u53ef\u53c2\u8003 [PaddleOCR/models_list.md](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.5/doc/doc_ch/models_list.md) \u3002\u5982\u6709\u5176\u4ed6\u5916\u8bed\uff08\u5982\u65e5\u3001\u97e9\u7b49\uff09\u68c0\u6d4b\u9700\u6c42\uff0c\u53ef\u5728 **\u77e5\u8bc6\u661f\u7403** [**CnOCR/CnSTD\u79c1\u4eab\u7fa4**](https://t.zsxq.com/FEYZRJQ) \u4e2d\u5411\u4f5c\u8005\u63d0\u51fa\u5efa\u8bae\u3002\n\n## \u4f7f\u7528\u65b9\u6cd5\n\n\u9996\u6b21\u4f7f\u7528 **CnSTD** \u65f6\uff0c\u7cfb\u7edf\u4f1a\u81ea\u52a8\u4e0b\u8f7dzip\u683c\u5f0f\u7684\u6a21\u578b\u538b\u7f29\u6587\u4ef6\uff0c\u5e76\u5b58\u653e\u4e8e `~/.cnstd`\u76ee\u5f55\uff08Windows\u4e0b\u9ed8\u8ba4\u8def\u5f84\u4e3a `C:\\Users\\<username>\\AppData\\Roaming\\cnstd`\uff09\u3002\u4e0b\u8f7d\u901f\u5ea6\u8d85\u5feb\u3002\u4e0b\u8f7d\u540e\u7684zip\u6587\u4ef6\u4ee3\u7801\u4f1a\u81ea\u52a8\u5bf9\u5176\u89e3\u538b\uff0c\u7136\u540e\u628a\u89e3\u538b\u540e\u7684\u6a21\u578b\u76f8\u5173\u76ee\u5f55\u653e\u4e8e`~/.cnstd/1.2`\u76ee\u5f55\u4e2d\u3002\n\n\u5982\u679c\u7cfb\u7edf\u65e0\u6cd5\u81ea\u52a8\u6210\u529f\u4e0b\u8f7dzip\u6587\u4ef6\uff0c\u5219\u9700\u8981\u624b\u52a8\u4ece [\u767e\u5ea6\u4e91\u76d8](https://pan.baidu.com/s/1zDMzArCDrrXHWL0AWxwYQQ?pwd=nstd)\uff08\u63d0\u53d6\u7801\u4e3a `nstd`\uff09\u4e0b\u8f7d\u5bf9\u5e94\u7684zip\u6587\u4ef6\u5e76\u628a\u5b83\u5b58\u653e\u4e8e `~/.cnstd/1.2`\uff08Windows\u4e0b\u4e3a `C:\\Users\\<username>\\AppData\\Roaming\\cnstd\\1.2`\uff09\u76ee\u5f55\u4e2d\u3002\u6a21\u578b\u4e5f\u53ef\u4ece **[cnstd-cnocr-models](https://huggingface.co/breezedeus/cnstd-cnocr-models)** \u4e2d\u4e0b\u8f7d\u3002\u653e\u7f6e\u597dzip\u6587\u4ef6\u540e\uff0c\u540e\u9762\u7684\u4e8b\u4ee3\u7801\u5c31\u4f1a\u81ea\u52a8\u6267\u884c\u4e86\u3002\n\n### \u573a\u666f\u6587\u5b57\u68c0\u6d4b\uff08STD\uff09\n\n\u4f7f\u7528\u7c7b `CnStd` \u8fdb\u884c\u573a\u666f\u6587\u5b57\u7684\u68c0\u6d4b\u3002\u7c7b `CnStd` \u7684\u521d\u59cb\u5316\u51fd\u6570\u5982\u4e0b\uff1a\n\n```python\nclass CnStd(object):\n    \"\"\"\n    \u573a\u666f\u6587\u5b57\u68c0\u6d4b\u5668\uff08Scene Text Detection\uff09\u3002\u867d\u7136\u540d\u5b57\u4e2d\u6709\u4e2a\"Cn\"\uff08Chinese\uff09\uff0c\u4f46\u5176\u5b9e\u4e5f\u53ef\u4ee5\u8f7b\u677e\u8bc6\u522b\u82f1\u6587\u7684\u3002\n    \"\"\"\n\n    def __init__(\n        self,\n        model_name: str = 'ch_PP-OCRv4_det',\n        *,\n        auto_rotate_whole_image: bool = False,\n        rotated_bbox: bool = True,\n        context: str = 'cpu',\n        model_fp: Optional[str] = None,\n        model_backend: str = 'onnx',  # ['pytorch', 'onnx']\n        root: Union[str, Path] = data_dir(),\n        use_angle_clf: bool = False,\n        angle_clf_configs: Optional[dict] = None,\n        **kwargs,\n    ):\n```\n\n\u5176\u4e2d\u7684\u51e0\u4e2a\u53c2\u6570\u542b\u4e49\u5982\u4e0b\uff1a\n\n* `model_name`:  \u6a21\u578b\u540d\u79f0\uff0c\u5373\u524d\u9762\u6a21\u578b\u8868\u683c\u7b2c\u4e00\u5217\u4e2d\u7684\u503c\u3002\u9ed8\u8ba4\u4e3a **ch_PP-OCRv4_det** \u3002\n\n* `auto_rotate_whole_image`:  \u662f\u5426\u81ea\u52a8\u5bf9\u6574\u5f20\u56fe\u7247\u8fdb\u884c\u65cb\u8f6c\u8c03\u6574\u3002\u9ed8\u8ba4\u4e3a`False`\u3002\n\n* `rotated_bbox`:  \u662f\u5426\u652f\u6301\u68c0\u6d4b\u5e26\u89d2\u5ea6\u7684\u6587\u672c\u6846\uff1b\u9ed8\u8ba4\u4e3a `True`\uff0c\u8868\u793a\u652f\u6301\uff1b\u53d6\u503c\u4e3a `False` \u65f6\uff0c\u53ea\u68c0\u6d4b\u6c34\u5e73\u6216\u5782\u76f4\u7684\u6587\u672c\u3002\n\n* `context`\uff1a\u9884\u6d4b\u4f7f\u7528\u7684\u673a\u5668\u8d44\u6e90\uff0c\u53ef\u53d6\u503c\u4e3a\u5b57\u7b26\u4e32`cpu`\u3001`gpu`\u3001`cuda:0`\u3002\n\n* `model_fp`:  \u5982\u679c\u4e0d\u4f7f\u7528\u7cfb\u7edf\u81ea\u5e26\u7684\u6a21\u578b\uff0c\u53ef\u4ee5\u901a\u8fc7\u6b64\u53c2\u6570\u76f4\u63a5\u6307\u5b9a\u6240\u4f7f\u7528\u7684\u6a21\u578b\u6587\u4ef6\uff08`.ckpt`\u6587\u4ef6\uff09\u3002\n\n* `model_backend` (str): 'pytorch', or 'onnx'\u3002\u8868\u660e\u9884\u6d4b\u65f6\u662f\u4f7f\u7528 PyTorch \u7248\u672c\u6a21\u578b\uff0c\u8fd8\u662f\u4f7f\u7528 ONNX \u7248\u672c\u6a21\u578b\u3002  \u540c\u6837\u7684\u6a21\u578b\uff0cONNX \u7248\u672c\u7684\u9884\u6d4b\u901f\u5ea6\u4e00\u822c\u662f PyTorch \u7248\u672c\u76842\u500d\u5de6\u53f3\u3002\u9ed8\u8ba4\u4e3a `onnx`\u3002\n\n* `root`: \u6a21\u578b\u6587\u4ef6\u6240\u5728\u7684\u6839\u76ee\u5f55\u3002\n  \n  * Linux/Mac\u4e0b\u9ed8\u8ba4\u503c\u4e3a `~/.cnstd`\uff0c\u8868\u793a\u6a21\u578b\u6587\u4ef6\u6240\u5904\u6587\u4ef6\u5939\u7c7b\u4f3c `~/.cnstd/1.2/db_shufflenet_v2_small`\u3002\n  * Windows\u4e0b\u9ed8\u8ba4\u503c\u4e3a `C:\\Users\\<username>\\AppData\\Roaming\\cnstd`\u3002\n\n* `use_angle_clf` (bool): \u5bf9\u4e8e\u68c0\u6d4b\u51fa\u7684\u6587\u672c\u6846\uff0c\u662f\u5426\u4f7f\u7528\u89d2\u5ea6\u5206\u7c7b\u6a21\u578b\u8fdb\u884c\u8c03\u6574\uff08\u68c0\u6d4b\u51fa\u7684\u6587\u672c\u6846\u53ef\u80fd\u4f1a\u5b58\u5728\u5012\u8f6c180\u5ea6\u7684\u60c5\u51b5\uff09\u3002\u9ed8\u8ba4\u4e3a `False`\n\n* `angle_clf_configs` (dict): \u89d2\u5ea6\u5206\u7c7b\u6a21\u578b\u5bf9\u5e94\u7684\u53c2\u6570\u53d6\u503c\uff0c\u4e3b\u8981\u5305\u542b\u4ee5\u4e0b\u503c\uff1a\n  \n  - `model_name`: \u6a21\u578b\u540d\u79f0\u3002\u9ed8\u8ba4\u4e3a 'ch_ppocr_mobile_v2.0_cls'\n  - `model_fp`: \u5982\u679c\u4e0d\u4f7f\u7528\u7cfb\u7edf\u81ea\u5e26\u7684\u6a21\u578b\uff0c\u53ef\u4ee5\u901a\u8fc7\u6b64\u53c2\u6570\u76f4\u63a5\u6307\u5b9a\u6240\u4f7f\u7528\u7684\u6a21\u578b\u6587\u4ef6\uff08'.onnx' \u6587\u4ef6\uff09\u3002\u9ed8\u8ba4\u4e3a `None`\u3002\u5177\u4f53\u53ef\u53c2\u8003\u7c7b `AngleClassifier` \u7684\u8bf4\u660e\n\n\u6bcf\u4e2a\u53c2\u6570\u90fd\u6709\u9ed8\u8ba4\u53d6\u503c\uff0c\u6240\u4ee5\u53ef\u4ee5\u4e0d\u4f20\u5165\u4efb\u4f55\u53c2\u6570\u503c\u8fdb\u884c\u521d\u59cb\u5316\uff1a`std = CnStd()`\u3002\n\n\u6587\u672c\u68c0\u6d4b\u4f7f\u7528\u7c7b`CnOcr`\u7684\u51fd\u6570 **`detect()`**\uff0c\u4ee5\u4e0b\u662f\u8be6\u7ec6\u8bf4\u660e\uff1a\n\n#### \u7c7b\u51fd\u6570`CnStd.detect()`\n\n```python\n    def detect(\n        self,\n        img_list: Union[\n            str,\n            Path,\n            Image.Image,\n            np.ndarray,\n            List[Union[str, Path, Image.Image, np.ndarray]],\n        ],\n        resized_shape: Union[int, Tuple[int, int]] = (768, 768),\n        preserve_aspect_ratio: bool = True,\n        min_box_size: int = 8,\n        box_score_thresh: float = 0.3,\n        batch_size: int = 20,\n        **kwargs,\n    ) -> Union[Dict[str, Any], List[Dict[str, Any]]]:\n```\n\n**\u51fd\u6570\u8bf4\u660e**\uff1a\n\n\u51fd\u6570\u8f93\u5165\u53c2\u6570\u5305\u62ec\uff1a\n\n- `img_list`: \u652f\u6301\u5bf9\u5355\u4e2a\u56fe\u7247\u6216\u8005\u591a\u4e2a\u56fe\u7247\uff08\u5217\u8868\uff09\u7684\u68c0\u6d4b\u3002\u6bcf\u4e2a\u503c\u53ef\u4ee5\u662f\u56fe\u7247\u8def\u5f84\uff0c\u6216\u8005\u5df2\u7ecf\u8bfb\u53d6\u8fdb\u6765 `PIL.Image.Image` \u6216 `np.ndarray`,  \u683c\u5f0f\u5e94\u8be5\u662f `RGB` 3 \u901a\u9053\uff0cshape: `(height, width, 3)`, \u53d6\u503c\u8303\u56f4\uff1a`[0, 255]`\u3002\n\n- `resized_shape`: `int` or `tuple`, `tuple` \u542b\u4e49\u4e3a `(height, width)`, `int` \u5219\u8868\u793a\u9ad8\u5bbd\u90fd\u4e3a\u6b64\u503c\uff1b  \n   \u68c0\u6d4b\u524d\uff0c\u5148\u628a\u539f\u59cb\u56fe\u7247resize\u5230\u63a5\u8fd1\u6b64\u5927\u5c0f\uff08\u53ea\u662f\u63a5\u8fd1\uff0c\u672a\u5fc5\u76f8\u7b49\uff09\u3002\u9ed8\u8ba4\u4e3a `(768, 768)`\u3002\n  \n  > **Note** **\uff08\u6ce8\u610f\uff09**\n  > \u8fd9\u4e2a\u53d6\u503c\u5bf9\u68c0\u6d4b\u7ed3\u679c\u7684\u5f71\u54cd\u8f83\u5927\uff0c\u53ef\u4ee5\u9488\u5bf9\u81ea\u5df1\u7684\u5e94\u7528\u591a\u5c1d\u8bd5\u51e0\u7ec4\u503c\uff0c\u518d\u9009\u51fa\u6700\u4f18\u503c\u3002\u4f8b\u5982 `(512, 768)`, `(768, 768)`, `(768, 1024)`\u7b49\u3002\n\n- `preserve_aspect_ratio`: \u5bf9\u539f\u59cb\u56fe\u7247 resize \u65f6\u662f\u5426\u4fdd\u6301\u9ad8\u5bbd\u6bd4\u4e0d\u53d8\u3002\u9ed8\u8ba4\u4e3a `True`\u3002\n\n- `min_box_size`: \u8fc7\u6ee4\u6389\u9ad8\u5ea6\u6216\u8005\u5bbd\u5ea6\u5c0f\u4e8e\u6b64\u503c\u7684\u6587\u672c\u6846\u3002\u9ed8\u8ba4\u4e3a `8`\uff0c\u4e5f\u5373\u9ad8\u6216\u8005\u5bbd\u5c0f\u4e8e `8` \u7684\u6587\u672c\u6846\u4f1a\u88ab\u8fc7\u6ee4\u53bb\u6389\u3002\n\n- `box_score_thresh`: \u8fc7\u6ee4\u6389\u5f97\u5206\u4f4e\u4e8e\u6b64\u503c\u7684\u6587\u672c\u6846\u3002\u9ed8\u8ba4\u4e3a `0.3`\u3002\n\n- `batch_size`: \u5f85\u5904\u7406\u56fe\u7247\u5f88\u591a\u65f6\uff0c\u9700\u8981\u5206\u6279\u5904\u7406\uff0c\u6bcf\u6279\u56fe\u7247\u7684\u6570\u91cf\u7531\u6b64\u53c2\u6570\u6307\u5b9a\u3002\u9ed8\u8ba4\u4e3a `20`\u3002\n\n- `kwargs`: \u4fdd\u7559\u53c2\u6570\uff0c\u76ee\u524d\u672a\u88ab\u4f7f\u7528\u3002\n\n\u51fd\u6570\u8f93\u51fa\u7c7b\u578b\u4e3a`list`\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5143\u7d20\u662f\u4e00\u4e2a\u5b57\u5178\uff0c\u5bf9\u5e94\u4e00\u5f20\u56fe\u7247\u7684\u68c0\u6d4b\u7ed3\u679c\u3002\u5b57\u5178\u4e2d\u5305\u542b\u4ee5\u4e0b `keys`\uff1a\n\n- `rotated_angle`: `float`, \u6574\u5f20\u56fe\u7247\u65cb\u8f6c\u7684\u89d2\u5ea6\u3002\u53ea\u6709 `auto_rotate_whole_image==True` \u624d\u53ef\u80fd\u975e `0`\u3002\n\n- `detected_texts`: `list`, \u6bcf\u4e2a\u5143\u7d20\u5b58\u50a8\u4e86\u68c0\u6d4b\u51fa\u7684\u4e00\u4e2a\u6846\u7684\u4fe1\u606f\uff0c\u4f7f\u7528\u8bcd\u5178\u8bb0\u5f55\uff0c\u5305\u62ec\u4ee5\u4e0b\u51e0\u4e2a\u503c\uff1a\n  \n  - `box`\uff1a\u68c0\u6d4b\u51fa\u7684\u6587\u5b57\u5bf9\u5e94\u7684\u77e9\u5f62\u6846\uff1b`np.ndarray`, shape: `(4, 2)`\uff0c\u5bf9\u5e94 box 4\u4e2a\u70b9\u7684\u5750\u6807\u503c `(x, y)`;\n  \n  - `score`\uff1a\u5f97\u5206\uff1b`float` \u7c7b\u578b\uff1b\u5206\u6570\u8d8a\u9ad8\u8868\u793a\u8d8a\u53ef\u9760\uff1b\n  \n  - `cropped_img`\uff1a\u5bf9\u5e94 \"box\" \u4e2d\u7684\u56fe\u7247patch\uff08`RGB`\u683c\u5f0f\uff09\uff0c\u4f1a\u628a\u503e\u659c\u7684\u56fe\u7247\u65cb\u8f6c\u4e3a\u6c34\u5e73\u3002`np.ndarray`\u7c7b\u578b\uff0c`shape: (height, width, 3)`,  \u53d6\u503c\u8303\u56f4\uff1a`[0, 255]`\uff1b\n  \n  - \u793a\u4f8b:\n    \n    ```python\n      [{'box': array([[416,  77],\n                      [486,  13],\n                      [800, 325],\n                      [730, 390]], dtype=int32),\n        'score': 1.0, \n        'cropped_img': array([[[25, 20, 24],\n                               [26, 21, 25],\n                               [25, 20, 24],\n                              ...,\n                               [11, 11, 13],\n                               [11, 11, 13],\n                               [11, 11, 13]]], dtype=uint8)},\n       ...\n      ]\n    ```\n\n#### \u8c03\u7528\u793a\u4f8b\n\n```python\nfrom cnstd import CnStd\nstd = CnStd()\nbox_info_list = std.detect('examples/taobao.jpg')\n```\n\n\u6216\uff1a\n\n```python\nfrom PIL import Image\nfrom cnstd import CnStd\n\nstd = CnStd()\nimg_fp = 'examples/taobao.jpg'\nimg = Image.open(img_fp)\nbox_infos = std.detect(img)\n```\n\n### \u8bc6\u522b\u68c0\u6d4b\u6846\u4e2d\u7684\u6587\u5b57\uff08OCR\uff09\n\n\u4e0a\u9762\u793a\u4f8b\u8bc6\u522b\u7ed3\u679c\u4e2d\"cropped_img\"\u5bf9\u5e94\u7684\u503c\u53ef\u4ee5\u76f4\u63a5\u4ea4\u7531 **[cnocr](https://github.com/breezedeus/cnocr)** \u4e2d\u7684 **`CnOcr`** \u8fdb\u884c\u6587\u5b57\u8bc6\u522b\u3002\u5982\u4e0a\u4f8b\u53ef\u4ee5\u7ed3\u5408  **`CnOcr`** \u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff1a\n\n```python\nfrom cnstd import CnStd\nfrom cnocr import CnOcr\n\nstd = CnStd()\ncn_ocr = CnOcr()\n\nbox_infos = std.detect('examples/taobao.jpg')\n\nfor box_info in box_infos['detected_texts']:\n    cropped_img = box_info['cropped_img']\n    ocr_res = cn_ocr.ocr_for_single_line(cropped_img)\n    print('ocr result: %s' % str(ocr_res))\n```\n\n\u6ce8\uff1a\u8fd0\u884c\u4e0a\u9762\u793a\u4f8b\u9700\u8981\u5148\u5b89\u88c5  **[cnocr](https://github.com/breezedeus/cnocr)** \uff1a\n\n```bash\npip install cnocr\n```\n\n\n\n### \u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\uff08MFD\uff09\u4e0e \u7248\u9762\u5206\u6790\uff08Layout Analysis\uff09\n\n\u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\uff08MFD\uff09\u4e0e \u7248\u9762\u5206\u6790\uff08Layout Analysis\uff09\u90fd\u662f\u68c0\u6d4b\u56fe\u7247\u4e2d\u611f\u5174\u8da3\u7684\u5143\u7d20\uff0c\u5b83\u4eec\u4f7f\u7528\u7684\u90fd\u662f\u57fa\u4e8eYOLOv7\u7684\u68c0\u6d4b\u67b6\u6784\uff0c\u5728CnSTD\u90fd\u6765\u6e90\u4e8e\u76f8\u540c\u7684\u7c7b `LayoutAnalyzer`\uff0c\u5dee\u522b\u53ea\u662f\u8bad\u7ec3\u6a21\u578b\u4f7f\u7528\u7684\u6570\u636e\u4e0d\u540c\u3002\n\n> \u8fd9\u4e24\u4e2a\u6a21\u578b\u7684\u8bad\u7ec3\u4ee3\u7801\u5728 [yolov7](https://github.com/breezedeus/yolov7) \u4e2d\uff08Forked from [WongKinYiu/yolov7](https://github.com/WongKinYiu/yolov7)\uff0c\u611f\u8c22\u539f\u4f5c\u8005\u3002\uff09\n\n\n\n\u7c7b `LayoutAnalyzer` \u7684\u521d\u59cb\u5316\u51fd\u6570\u5982\u4e0b\uff1a\n\n```python\nclass LayoutAnalyzer(object):\n    def __init__(\n        self,\n        model_name: str = 'mfd',  # 'layout' or 'mfd'\n        *,\n        model_type: str = 'yolov7_tiny',  # \u5f53\u524d\u652f\u6301 [`yolov7_tiny`, `yolov7`]'\n        model_backend: str = 'pytorch',\n        model_categories: Optional[List[str]] = None,\n        model_fp: Optional[str] = None,\n        model_arch_yaml: Optional[str] = None,\n        root: Union[str, Path] = data_dir(),\n        device: str = 'cpu',\n        **kwargs,\n    )\n```\n\n\u5176\u4e2d\u7684\u53c2\u6570\u542b\u4e49\u5982\u4e0b\uff1a\n\n- `model_name`: \u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u8868\u793a\u6a21\u578b\u7c7b\u578b\u3002\u53ef\u9009\u503c\uff1a'mfd' \u8868\u793a\u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\uff1b'layout' \u8868\u793a\u7248\u9762\u5206\u6790\u3002\u9ed8\u8ba4\u503c\uff1a'mfd'\n\n- `model_type`: \u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u8868\u793a\u6a21\u578b\u7c7b\u578b\u3002\u5f53\u524d\u652f\u6301 'yolov7_tiny' \u548c 'yolov7'\uff1b\u9ed8\u8ba4\u503c\uff1a'yolov7_tiny'\u3002'yolov7' \u6a21\u578b\u6682\u4e0d\u5f00\u6e90\uff0c\u5f53\u524d\u4ec5\u5f00\u653e\u7ed9\u661f\u7403\u4f1a\u5458\u4e0b\u8f7d\uff0c\u5177\u4f53\u8bf4\u660e\u89c1\uff1a[P2T YoloV7 \u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\u6a21\u578b\u5f00\u653e\u7ed9\u661f\u7403\u4f1a\u5458\u4e0b\u8f7d | Breezedeus.com](https://www.breezedeus.com/article/p2t-yolov7-for-zsxq-20230619) \u3002\n\n- `model_backend`: \u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u8868\u793abackend\u3002\u5f53\u524d\u4ec5\u652f\u6301: 'pytorch'\uff1b\u9ed8\u8ba4\u503c\uff1a'pytorch'\n\n- `model_categories`: \u6a21\u578b\u7684\u68c0\u6d4b\u7c7b\u522b\u540d\u79f0\u3002\u9ed8\u8ba4\u503c\uff1aNone\uff0c\u8868\u793a\u57fa\u4e8e `model_name` \u81ea\u52a8\u51b3\u5b9a\n\n- `model_fp`: \u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u8868\u793a\u6a21\u578b\u6587\u4ef6\u7684\u8def\u5f84\u3002\u9ed8\u8ba4\u503c\uff1a`None`\uff0c\u8868\u793a\u4f7f\u7528\u9ed8\u8ba4\u7684\u6587\u4ef6\u8def\u5f84\n\n- `model_arch_yaml`: \u67b6\u6784\u6587\u4ef6\u8def\u5f84\uff0c\u4f8b\u5982 'yolov7-mfd.yaml'\uff1b\u9ed8\u8ba4\u503c\u4e3a None\uff0c\u8868\u793a\u5c06\u81ea\u52a8\u9009\u62e9\u3002\n\n- `root`: \u5b57\u7b26\u4e32\u6216`Path`\u7c7b\u578b\uff0c\u8868\u793a\u6a21\u578b\u6587\u4ef6\u6240\u5728\u7684\u6839\u76ee\u5f55\u3002\n  - Linux/Mac\u4e0b\u9ed8\u8ba4\u503c\u4e3a `~/.cnstd`\uff0c\u8868\u793a\u6a21\u578b\u6587\u4ef6\u6240\u5904\u6587\u4ef6\u5939\u7c7b\u4f3c `~/.cnstd/1.2/analysis`\n  - Windows\u4e0b\u9ed8\u8ba4\u503c\u4e3a `C:/Users/<username>/AppData/Roaming/cnstd`\u3002\n  \n- `device`: \u5b57\u7b26\u4e32\u7c7b\u578b\uff0c\u8868\u793a\u8fd0\u884c\u6a21\u578b\u7684\u8bbe\u5907\uff0c\u53ef\u9009\u503c\uff1a'cpu' \u6216 'gpu'\uff1b\u9ed8\u8ba4\u503c\uff1a'cpu'\n\n- `**kwargs`: \u989d\u5916\u7684\u53c2\u6570\u3002\n\n\n\n\n#### \u7c7b\u51fd\u6570`LayoutAnalyzer.analyze()`\n\n\u5bf9\u6307\u5b9a\u56fe\u7247\uff08\u5217\u8868\uff09\u8fdb\u884c\u7248\u9762\u5206\u6790\u3002\n\n```python\ndef analyze(\n    self,\n    img_list: Union[\n        str,\n        Path,\n        Image.Image,\n        np.ndarray,\n        List[Union[str, Path, Image.Image, np.ndarray]],\n    ],\n    resized_shape: Union[int, Tuple[int, int]] = 700,\n    box_margin: int = 2,\n    conf_threshold: float = 0.25,\n    iou_threshold: float = 0.45,\n) -> Union[List[Dict[str, Any]], List[List[Dict[str, Any]]]]:\n```\n\n\n\n**\u51fd\u6570\u8bf4\u660e**\uff1a\n\n\u51fd\u6570\u8f93\u5165\u53c2\u6570\u5305\u62ec\uff1a\n\n* `img_list` (str or list): \u5f85\u8bc6\u522b\u56fe\u7247\u6216\u56fe\u7247\u5217\u8868\uff1b\u5982\u679c\u662f `np.ndarray`\uff0c\u5219\u5e94\u8be5\u662fshape\u4e3a `[H, W, 3]` \u7684 RGB \u683c\u5f0f\u6570\u7ec4\n* `resized_shape` (int or tuple): (H, W); \u628a\u56fe\u7247resize\u5230\u6b64\u5927\u5c0f\u518d\u505a\u5206\u6790\uff1b\u9ed8\u8ba4\u503c\u4e3a `700`\n* `box_margin` (int): \u5bf9\u8bc6\u522b\u51fa\u7684\u5185\u5bb9\u6846\u5f80\u5916\u6269\u5c55\u7684\u50cf\u7d20\u5927\u5c0f\uff1b\u9ed8\u8ba4\u503c\u4e3a `2`\n* `conf_threshold` (float): \u5206\u6570\u9608\u503c\uff1b\u9ed8\u8ba4\u503c\u4e3a `0.25`\n* `iou_threshold` (float): IOU\u9608\u503c\uff1b\u9ed8\u8ba4\u503c\u4e3a `0.45`\n* `**kwargs`: \u989d\u5916\u7684\u53c2\u6570\u3002\n\n\u51fd\u6570\u8f93\u51fa\u7ed3\u679c\u4e3a\u4e00\u4e2a`list`\uff08\u5982\u679c `img_list` \u4e3a `list`\uff0c\u8fd4\u56de\u4e3a\u4e24\u5c42\u5d4c\u5957\u7684 `list`\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5143\u7d20\u4e3a\u5bf9\u5e94\u56fe\u7247\u7684\u68c0\u6d4b\u7ed3\u679c\uff09\uff0c\u5176\u4e2d\u6bcf\u4e2a\u5143\u7d20\u8868\u793a\u8bc6\u522b\u51fa\u7684\u7248\u9762\u4e2d\u7684\u4e00\u4e2a\u5143\u7d20\uff0c\u5305\u542b\u4ee5\u4e0b\u4fe1\u606f\uff1a\n\n* type: \u7248\u9762\u5143\u7d20\u5bf9\u5e94\u7684\u7c7b\u578b\uff1b\u53ef\u9009\u503c\u6765\u81ea\uff1a`self.categories` ;\n* box: \u7248\u9762\u5143\u7d20\u5bf9\u5e94\u7684\u77e9\u5f62\u6846\uff1b`np.ndarray`, shape: (4, 2)\uff0c\u5bf9\u5e94 box 4\u4e2a\u70b9\u7684\u5750\u6807\u503c `(x, y)` ;\n* score: \u5f97\u5206\uff0c\u8d8a\u9ad8\u8868\u793a\u8d8a\u53ef\u4fe1 \u3002\n\n\n\n\n#### \u8c03\u7528\u793a\u4f8b\n\n```python\nfrom cnstd import LayoutAnalyzer\nimg_fp = 'examples/mfd/zh5.jpg'\nanalyzer = LayoutAnalyzer('mfd')\nout = analyzer.analyze(img_fp, resized_shape=700)\nprint(out)\n```\n\n\n\n\n\n### \u811a\u672c\u4f7f\u7528\n\n**cnstd** \u5305\u542b\u4e86\u51e0\u4e2a\u547d\u4ee4\u884c\u5de5\u5177\uff0c\u5b89\u88c5 **cnstd** \u540e\u5373\u53ef\u4f7f\u7528\u3002\n\n#### STD \u9884\u6d4b\u5355\u4e2a\u6587\u4ef6\u6216\u6587\u4ef6\u5939\u4e2d\u6240\u6709\u56fe\u7247\n\n\u4f7f\u7528\u547d\u4ee4 **`cnstd predict`** \u9884\u6d4b\u5355\u4e2a\u6587\u4ef6\u6216\u6587\u4ef6\u5939\u4e2d\u6240\u6709\u56fe\u7247\uff0c\u4ee5\u4e0b\u662f\u4f7f\u7528\u8bf4\u660e\uff1a\n\n```bash\n(venv) \u279c  cnstd git:(master) \u2717 cnstd predict -h\nUsage: cnstd predict [OPTIONS]\n\n  \u9884\u6d4b\u5355\u4e2a\u6587\u4ef6\uff0c\u6216\u8005\u6307\u5b9a\u76ee\u5f55\u4e0b\u7684\u6240\u6709\u56fe\u7247\n\nOptions:\n  -m, --model-name [ch_PP-OCRv2_det|ch_PP-OCRv3_det|ch_PP-OCRv4_det|ch_PP-OCRv4_det_server|db_mobilenet_v3|db_mobilenet_v3_small|db_resnet18|db_resnet34|db_shufflenet_v2|db_shufflenet_v2_small|en_PP-OCRv3_det]\n                                  \u6a21\u578b\u540d\u79f0\u3002\u9ed8\u8ba4\u503c\u4e3a db_shufflenet_v2_small\n  -b, --model-backend [pytorch|onnx]\n                                  \u6a21\u578b\u7c7b\u578b\u3002\u9ed8\u8ba4\u503c\u4e3a `onnx`\n  -p, --pretrained-model-fp TEXT  \u4f7f\u7528\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u3002\u9ed8\u8ba4\u4e3a `None`\uff0c\u8868\u793a\u4f7f\u7528\u7cfb\u7edf\u81ea\u5e26\u7684\u9884\u8bad\u7ec3\u6a21\u578b\n  -r, --rotated-bbox              \u662f\u5426\u68c0\u6d4b\u5e26\u89d2\u5ea6\uff08\u975e\u6c34\u5e73\u548c\u5782\u76f4\uff09\u7684\u6587\u672c\u6846\u3002\u9ed8\u8ba4\u4e3a `True`\n  --resized-shape TEXT            \u683c\u5f0f\uff1a\"height,width\";\n                                  \u9884\u6d4b\u65f6\u628a\u56fe\u7247resize\u5230\u6b64\u5927\u5c0f\u518d\u8fdb\u884c\u9884\u6d4b\u3002\u4e24\u4e2a\u503c\u90fd\u9700\u8981\u662f32\u7684\u500d\u6570\u3002\u9ed8\u8ba4\u4e3a\n                                  `768,768`\n\n  --box-score-thresh FLOAT        \u68c0\u6d4b\u7ed3\u679c\u53ea\u4fdd\u7559\u5206\u6570\u5927\u4e8e\u6b64\u503c\u7684\u6587\u672c\u6846\u3002\u9ed8\u8ba4\u503c\u4e3a `0.3`\n  --preserve-aspect-ratio BOOLEAN\n                                  resize\u65f6\u662f\u5426\u4fdd\u7559\u56fe\u7247\u539f\u59cb\u6bd4\u4f8b\u3002\u9ed8\u8ba4\u503c\u4e3a `True`\n  --context TEXT                  \u4f7f\u7528cpu\u8fd8\u662f `gpu` \u8fd0\u884c\u4ee3\u7801\uff0c\u4e5f\u53ef\u6307\u5b9a\u4e3a\u7279\u5b9agpu\uff0c\u5982`cuda:0`\u3002\u9ed8\u8ba4\u4e3a\n                                  `cpu`\n\n  -i, --img-file-or-dir TEXT      \u8f93\u5165\u56fe\u7247\u7684\u6587\u4ef6\u8def\u5f84\u6216\u8005\u6307\u5b9a\u7684\u6587\u4ef6\u5939\n  -o, --output-dir TEXT           \u68c0\u6d4b\u7ed3\u679c\u5b58\u653e\u7684\u6587\u4ef6\u5939\u3002\u9ed8\u8ba4\u4e3a `./predictions`\n  -h, --help                      Show this message and exit.\n```\n\n\u4f8b\u5982\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5bf9\u56fe\u7247 `examples/taobao.jpg`\u8fdb\u884c\u68c0\u6d4b\uff0c\u5e76\u628a\u68c0\u6d4b\u7ed3\u679c\u5b58\u653e\u5728\u76ee\u5f55 `outputs`\u4e2d\uff1a\n\n```bash\ncnstd predict -i examples/taobao.jpg -o outputs\n```\n\n\u5177\u4f53\u4f7f\u7528\u4e5f\u53ef\u53c2\u8003\u6587\u4ef6 [Makefile](./Makefile) \u3002\n\n\n\n#### MFD or Layout Analysis \u9884\u6d4b\u5355\u4e2a\u6587\u4ef6\n\n\u4f7f\u7528\u547d\u4ee4 **`cnstd analyze`** \u83b7\u5f97\u5355\u4e2a\u6587\u4ef6\u7684 MFD \u6216\u8005 Layout Analysis \u7ed3\u679c\uff0c\u4ee5\u4e0b\u662f\u4f7f\u7528\u8bf4\u660e\uff1a\n\n```bash\n(venv) \u279c  cnstd git:(master) \u2717 cnstd analyze -h\nUsage: cnstd analyze [OPTIONS]\n\n  \u5bf9\u7ed9\u5b9a\u56fe\u7247\u8fdb\u884c MFD \u6216\u8005 \u7248\u9762\u5206\u6790\u3002\n\nOptions:\n  -m, --model-name TEXT           \u6a21\u578b\u7c7b\u578b\u3002`mfd` \u8868\u793a\u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\uff0c`layout`\n                                  \u8868\u793a\u7248\u9762\u5206\u6790\uff1b\u9ed8\u8ba4\u4e3a\uff1a`mfd`\n  -t, --model-type TEXT           \u6a21\u578b\u7c7b\u578b\u3002\u5f53\u524d\u652f\u6301 [`yolov7_tiny`, `yolov7`]\n  -b, --model-backend [pytorch|onnx]\n                                  \u6a21\u578b\u540e\u7aef\u67b6\u6784\u3002\u5f53\u524d\u4ec5\u652f\u6301 `pytorch`\n  -c, --model-categories TEXT     \u6a21\u578b\u7684\u68c0\u6d4b\u7c7b\u522b\u540d\u79f0\uff08\",\"\u5206\u5272\uff09\u3002\u9ed8\u8ba4\u503c\uff1aNone\uff0c\u8868\u793a\u57fa\u4e8e `model_name`\n                                  \u81ea\u52a8\u51b3\u5b9a\n  -p, --model-fp TEXT             \u4f7f\u7528\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u3002\u9ed8\u8ba4\u4e3a `None`\uff0c\u8868\u793a\u4f7f\u7528\u7cfb\u7edf\u81ea\u5e26\u7684\u9884\u8bad\u7ec3\u6a21\u578b\n  -y, --model-arch-yaml TEXT      \u6a21\u578b\u7684\u914d\u7f6e\u6587\u4ef6\u8def\u5f84\n  --device TEXT                   cuda device, i.e. 0 or 0,1,2,3 or cpu\n  -i, --img-fp TEXT               \u5f85\u5206\u6790\u7684\u56fe\u7247\u8def\u5f84\u6216\u56fe\u7247\u76ee\u5f55\n  -o, --output-fp TEXT            \u5206\u6790\u7ed3\u679c\u8f93\u51fa\u7684\u56fe\u7247\u8def\u5f84\u3002\u9ed8\u8ba4\u4e3a `None`\uff0c\u4f1a\u5b58\u50a8\u5728\u5f53\u524d\u6587\u4ef6\u5939\uff0c\u6587\u4ef6\u540d\u79f0\u4e3a\u8f93\u5165\u6587\u4ef6\u540d\u79f0\n                                  \u524d\u9762\u589e\u52a0`out-`\uff1b\u5982\u8f93\u5165\u6587\u4ef6\u540d\u4e3a `img.jpg`, \u8f93\u51fa\u6587\u4ef6\u540d\u5373\u4e3a `out-\n                                  img.jpg`\uff1b\u5982\u679c\u8f93\u5165\u4e3a\u76ee\u5f55\uff0c\u5219\u6b64\u8def\u5f84\u4e5f\u5e94\u8be5\u662f\u4e00\u4e2a\u76ee\u5f55\uff0c\u4f1a\u5c06\u8f93\u51fa\u6587\u4ef6\u5b58\u50a8\u5728\u6b64\u76ee\u5f55\u4e0b\n  --resized-shape INTEGER         \u5206\u6790\u65f6\u628a\u56fe\u7247resize\u5230\u6b64\u5927\u5c0f\u518d\u8fdb\u884c\u3002\u9ed8\u8ba4\u4e3a `608`\n  --conf-thresh FLOAT             Confidence Threshold\u3002\u9ed8\u8ba4\u503c\u4e3a `0.25`\n  --iou-thresh FLOAT              IOU threshold for NMS\u3002\u9ed8\u8ba4\u503c\u4e3a `0.45`\n  -h, --help                      Show this message and exit.\n```\n\n\u4f8b\u5982\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u547d\u4ee4\u5bf9\u56fe\u7247 `examples/mfd/zh.jpg` \u8fdb\u884c MFD\uff0c\u5e76\u628a\u68c0\u6d4b\u7ed3\u679c\u5b58\u653e\u5728\u6587\u4ef6 `out-zh.jpg` \u4e2d\uff1a\n\n```bash\n(venv) \u279c  cnstd analyze -m mfd --conf-thresh 0.25 --resized-shape 800 -i examples/mfd/zh.jpg -o out-zh.jpg\n```\n\n\u5177\u4f53\u4f7f\u7528\u4e5f\u53ef\u53c2\u8003\u6587\u4ef6 [Makefile](./Makefile) \u3002\n\n#### \u6a21\u578b\u8bad\u7ec3\n\n\u4f7f\u7528\u547d\u4ee4 **`cnstd train`**  \u8bad\u7ec3\u6587\u672c\u68c0\u6d4b\u6a21\u578b\uff0c\u4ee5\u4e0b\u662f\u4f7f\u7528\u8bf4\u660e\uff1a\n\n```bash\n(venv) \u279c  cnstd git:(master) \u2717 cnstd train -h\nUsage: cnstd train [OPTIONS]\n\n  \u8bad\u7ec3\u6587\u672c\u68c0\u6d4b\u6a21\u578b\n\nOptions:\n  -m, --model-name [db_resnet50|db_resnet34|db_resnet18|db_mobilenet_v3|db_mobilenet_v3_small|db_shufflenet_v2|db_shufflenet_v2_small|db_shufflenet_v2_tiny]\n                                  \u6a21\u578b\u540d\u79f0\u3002\u9ed8\u8ba4\u503c\u4e3a `db_shufflenet_v2_small`\n  -i, --index-dir TEXT            \u7d22\u5f15\u6587\u4ef6\u6240\u5728\u7684\u6587\u4ef6\u5939\uff0c\u4f1a\u8bfb\u53d6\u6587\u4ef6\u5939\u4e2d\u7684 `train.tsv` \u548c `dev.tsv` \u6587\u4ef6\n                                  [required]\n\n  --train-config-fp TEXT          \u8bad\u7ec3\u4f7f\u7528\u7684json\u914d\u7f6e\u6587\u4ef6  [required]\n  -r, --resume-from-checkpoint TEXT\n                                  \u6062\u590d\u6b64\u524d\u4e2d\u65ad\u7684\u8bad\u7ec3\u72b6\u6001\uff0c\u7ee7\u7eed\u8bad\u7ec3\n  -p, --pretrained-model-fp TEXT  \u5bfc\u5165\u7684\u8bad\u7ec3\u597d\u7684\u6a21\u578b\uff0c\u4f5c\u4e3a\u521d\u59cb\u6a21\u578b\u3002\u4f18\u5148\u7ea7\u4f4e\u4e8e \"--restore-training-\n                                  fp\"\uff0c\u5f53\u4f20\u5165\"--restore-training-fp\"\u65f6\uff0c\u6b64\u4f20\u5165\u5931\u6548\n\n  -h, --help                      Show this message and exit.\n```\n\n\u5177\u4f53\u4f7f\u7528\u53ef\u53c2\u8003\u6587\u4ef6 [Makefile](./Makefile) \u3002\n\n#### \u6a21\u578b\u8f6c\u5b58\n\n\u8bad\u7ec3\u597d\u7684\u6a21\u578b\u4f1a\u5b58\u50a8\u8bad\u7ec3\u72b6\u6001\uff0c\u4f7f\u7528\u547d\u4ee4 **`cnstd resave`**  \u53bb\u6389\u4e0e\u9884\u6d4b\u65e0\u5173\u7684\u6570\u636e\uff0c\u964d\u4f4e\u6a21\u578b\u5927\u5c0f\u3002\n\n```bash\n(venv) \u279c  cnstd git:(master) \u2717 cnstd resave -h\nUsage: cnstd resave [OPTIONS]\n\n  \u8bad\u7ec3\u597d\u7684\u6a21\u578b\u4f1a\u5b58\u50a8\u8bad\u7ec3\u72b6\u6001\uff0c\u4f7f\u7528\u6b64\u547d\u4ee4\u53bb\u6389\u9884\u6d4b\u65f6\u65e0\u5173\u7684\u6570\u636e\uff0c\u964d\u4f4e\u6a21\u578b\u5927\u5c0f\n\nOptions:\n  -i, --input-model-fp TEXT   \u8f93\u5165\u7684\u6a21\u578b\u6587\u4ef6\u8def\u5f84  [required]\n  -o, --output-model-fp TEXT  \u8f93\u51fa\u7684\u6a21\u578b\u6587\u4ef6\u8def\u5f84  [required]\n  -h, --help                  Show this message and exit.\n```\n\n## \u672a\u6765\u5de5\u4f5c\n\n* [x] \u8fdb\u4e00\u6b65\u7cbe\u7b80\u6a21\u578b\u7ed3\u6784\uff0c\u964d\u4f4e\u6a21\u578b\u5927\u5c0f\n* [x] PSENet\u901f\u5ea6\u4e0a\u8fd8\u662f\u6bd4\u8f83\u6162\uff0c\u5c1d\u8bd5\u66f4\u5feb\u7684STD\u7b97\u6cd5\n* [x] \u52a0\u5165\u66f4\u591a\u7684\u8bad\u7ec3\u6570\u636e\n* [x] \u52a0\u5165\u5bf9\u5916\u90e8\u6a21\u578b\u7684\u652f\u6301\n* [x] \u52a0\u5165\u6570\u5b66\u516c\u5f0f\u68c0\u6d4b\uff08MFD\uff09\u4e0e \u7248\u9762\u5206\u6790\uff08Layout Analysis\uff09\u6a21\u578b\n* [ ] \u52a0\u5165\u5bf9\u6587\u6863\u7ed3\u6784\u4e0e\u8868\u683c\u7684\u68c0\u6d4b\n\n\n\n## \u7ed9\u4f5c\u8005\u6765\u676f\u5496\u5561\n\n\u5f00\u6e90\u4e0d\u6613\uff0c\u5982\u679c\u6b64\u9879\u76ee\u5bf9\u60a8\u6709\u5e2e\u52a9\uff0c\u53ef\u4ee5\u8003\u8651 [\u7ed9\u4f5c\u8005\u6765\u676f\u5496\u5561 \u2615\ufe0f](https://cnocr.readthedocs.io/zh/latest/buymeacoffee/) \u3002\n\n---\n\n\u5b98\u65b9\u4ee3\u7801\u5e93\uff1a[https://github.com/breezedeus/cnstd](https://github.com/breezedeus/cnstd)\u3002\n\n",
    "bugtrack_url": null,
    "license": "Apache 2.0",
    "summary": "Python3 package for Chinese/English Scene Text Detection (STD), Mathematical Formula Detection (MFD), and Layout Analysis, with free pretrained models",
    "version": "1.2.5.1",
    "project_urls": {
        "Homepage": "https://github.com/breezedeus/cnstd"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "2e0d55c930de0a2a07576b8e0032c066ef59c58329b75d093947e15117fe4589",
                "md5": "41bc2aa5a800b6df61f6a3eb7281cf63",
                "sha256": "6e001a2952124ef9bc4ac2e01f5eb99c2790bc80da7d008d88d50825eb16e6f9"
            },
            "downloads": -1,
            "filename": "cnstd-1.2.5.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "41bc2aa5a800b6df61f6a3eb7281cf63",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": null,
            "size": 253337,
            "upload_time": "2024-11-30T01:52:35",
            "upload_time_iso_8601": "2024-11-30T01:52:35.040121Z",
            "url": "https://files.pythonhosted.org/packages/2e/0d/55c930de0a2a07576b8e0032c066ef59c58329b75d093947e15117fe4589/cnstd-1.2.5.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "ebb8a8167d727f20d905cfeb1c8f3861be36594b454fb99401a6cd1cb281d871",
                "md5": "6da82ff157361d410c2f1cbbb6780d2f",
                "sha256": "fd91fe263e5607f928bc52eb64d03a2b96a9f75aef84240f85045910752448c2"
            },
            "downloads": -1,
            "filename": "cnstd-1.2.5.1.tar.gz",
            "has_sig": false,
            "md5_digest": "6da82ff157361d410c2f1cbbb6780d2f",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": null,
            "size": 208966,
            "upload_time": "2024-11-30T01:53:06",
            "upload_time_iso_8601": "2024-11-30T01:53:06.454376Z",
            "url": "https://files.pythonhosted.org/packages/eb/b8/a8167d727f20d905cfeb1c8f3861be36594b454fb99401a6cd1cb281d871/cnstd-1.2.5.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-11-30 01:53:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "breezedeus",
    "github_project": "cnstd",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "requirements": [],
    "lcname": "cnstd"
}
        
Elapsed time: 0.43485s