<p align="center">
<img src="docs/toddleocr.png" align="middle" width = "600"/>
<p align="center">
<p align="left">
<a href="./LICENSE"><img src="https://img.shields.io/badge/license-Apache%202-dfd.svg"></a>
<a href=""><img src="https://img.shields.io/badge/python-3.7+-aff.svg"></a>
<a href=""><img src="https://img.shields.io/badge/os-linux%2C%20win%2C%20mac-pink.svg"></a>
<a href="https://github.com/arry-lee/ToddleOCR/stargazers"><img src="https://img.shields.io/github/stars/arry-lee/ToddleOCR?color=ccf"></a>
</p>
# ToddleOCR 拓牍
ToddleOCR是一个基于Torch实现的OCR(光学字符识别)项目,它fork自PaddleOCR,并经过作者进行了改进和优化。该项目旨在通过使用Torch框架来学习和理解OCR技术的实现原理。
## 项目名称的含义
ToddleOCR这个名称有三层意思:
1. 结合了Torch和Paddle两个框架的特点,因此命名为Toddle。
2. "Toddle"在英文中意味着蹒跚学步,也代表这个项目是作者在学习过程中的探索和尝试。
3. "Toddle"在中文中音译为"拓牍",意指从竹片上拓印文字,引申为从图片中提取文字。
## 项目状态
目前,ToddleOCR处于探索阶段,仍在不断地进行改进和优化。欢迎开发者和研究者参与其中,一起探索OCR技术的前沿。~~项目文档目前还是PaddleOCR的文档~~。
## 功能特点
在ToddleOCR中,你可以期望以下功能特点:
- 文字检测:能够在图像中准确地检测出文字区域的位置和边界框。
- 文字识别:能够将检测到的文字区域进行识别,输出对应的文字内容。
- 表格识别:能够将检测到的单元格重建成表格
- 关键信息提取: 包括语言实体识别(SER),关系抽取(RE)
- 多语言支持:支持多种语言的文字检测和识别,包括中文、英文等常见语言。
~~- 高性能:经过优化的算法和模型结构,能够在保证准确性的同时提高处理速度。~~
## 快速开始
### 环境要求
在开始之前,请确保你已经安装了以下环境:
* Python 3.x
* Torch 2.x
其他依赖库(具体依赖请参考项目文档)
### 安装
1. 克隆项目代码到本地:
```shell
git clone https://github.com/arry-lee/ToddleOCR.git
```
或者
```shell
pip install toddleocr
```
2. 进入项目目录:
```shell
cd ToddleOCR
```
3. 安装依赖:
```shell
pip install -r requirements.txt
```
4. 下载模型
目前提供的模型可以在[这里](https://github.com/arry-lee/ToddleOCR/releases/weights)手动下载,代码运行时也会自动下载:
- [x] [zh_ocr_cls_v1.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_ocr_cls_v1.rar) 文本角度分类模型
- [x] [zh_ocr_det_v3.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_ocr_det_v3.rar) 中英文检测模型
- [x] [zh_ocr_rec_v3.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_ocr_rec_v3.rar) 中英文识别模型
- [x] [zh_str_tab_m2.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_str_tab_m2.rar) 表格识别重建模型
### 使用示例
1. 准备输入图像文件,例如input.jpg。
2. 运行OCR示例脚本:
```shell
python toddleocr input.jpg
```
这将输出检测到的文字区域和对应的识别结果。
## 如何配置新的算法
与PaddleOCR相比,本项目摒弃yaml的配置方法,采用纯python语言,类yaml的配置方法,但更灵活,而且可以使用复杂的引用计算,并且所见即所得,具体的请参考
ptocr/config.py 中的ConfigModel类,继承并重写你的参数。
关于配置的语法,只有两点需要特别注意的,为了方便配置和简化配置量 ,项目内部定义了一个辅助类,提供了一些语法糖,如下:
1. 使用 _ 类,这是一个多功能的辅助类,有以下几个语法功能:
1. 类似偏函数的偏类:`_(DBHead,arg1=0,arg2=1) ==> partial(DBHead, **kwargs)`
2. 字符串动态导入类:`_("DBHead",arg1=0,arg2=1) ==> partial(DBHead, **kwargs)`
3. 没有位置参数等效于字典:`_(arg1=0,arg2=1) ==> dict(arg1=0,arg2=1)`
4. 预热学习率规划器:
5. 等效并列列表,用于 Transformers: `_[train:eval:infer,train:eval:...]`,
切片语法的三个位置分别表示训练,测试,推理模式下的预处理器,
特别的:...省略号表示同前一个,
空的或None表示该位置不需要这个预处理器,例如[DecodeLabel:...:]表示训练和测试需要DecodeLabel,推理不需要,这种表示方法是为了
**简化配置,共享处理器减少实例的创建**
```python
class _:
def __new__(cls, class_=None, /, **kwargs):
if class_ is None:
return kwargs
if issubclass(class_, LRScheduler) and "warmup_epoch" in kwargs:
warmup_epochs = kwargs.pop("warmup_epoch")
class_ = warmup_scheduler(class_, warmup_epochs)
return partial(class_, **kwargs)
if isinstance(class_, type | types.FunctionType):
return partial(class_, **kwargs)
if isinstance(class_, str):
from tools.modelhub import Hub
hub = Hub(os.path.dirname(__file__)) # 这个操作很耗时,尽量不使用字符串形式的导入
class_ = hub(class_)
return partial(class_, **kwargs)
def __class_getitem__(cls, item):
out = [[], [], []]
for i in item:
if isinstance(i, slice):
ls = [i.start, i.stop, i.step]
last = None
for one in ls:
if one is not None:
last = one
break
for i, one in enumerate(ls):
if one is ...:
out[i].append(last)
elif one:
out[i].append(one)
else:
for one in out:
one.append(i)
return out
```
2. 使用注解语法区分训练参数和测试参数
ConfigModel 有两个内部类 Data 和 Loader 子类可以采用注解语法区分训练时配置和测试时配置,例如:
```python
class Loader:
shuffle:False = True
drop_last:True = False
batch_size:1 = 8
num_workers: 0 = 4
```
**等号后面表示训练时参数,冒号后面表示测试时参数**,没有冒号则相同
这种表示方法同样是为了简化配置
更多的可以参考已经实现的算法,例如`models/det/det_db_rvd.py`
## 贡献
如果你对ToddleOCR感兴趣,并且希望为项目做出贡献,欢迎提交问题、提出建议或者发送Pull Request。我们乐于接受来自社区的贡献,共同推动项目的发展。
## 帮助与支持
如果你在使用过程中遇到任何问题,或者需要进一步的帮助与支持,请参考项目文档或者联系我们的团队。
## 相关链接
- 项目主页:https://github.com/arry-lee/ToddleOCR
- PaddleOCR:https://github.com/paddlepaddle/PaddleOCR
- 文档:https://github.com/arry-lee/ToddleOCR/docs
## 许可证
本项目的发布受<a href="https://github.com/arry-lee/ToddleOCR/blob/torchocr/LICENSE">Apache 2.0 license</a>许可认证。
Raw data
{
"_id": null,
"home_page": "https://github.com/arry-lee/ToddleOCR",
"name": "toddleocr",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": "",
"keywords": "ocr textdetection textrecognition toddleocr crnn east star-net rosetta ocrlite db chineseocr chinesetextdetection chinesetextrecognition",
"author": "",
"author_email": "",
"download_url": "https://files.pythonhosted.org/packages/d4/26/f0aaa8f1e8bf6c9b6a43875dd630dedf73e2c54730bb5ed6b56f5711a176/toddleocr-1.2.8.tar.gz",
"platform": null,
"description": "<p align=\"center\">\n <img src=\"docs/toddleocr.png\" align=\"middle\" width = \"600\"/>\n<p align=\"center\">\n<p align=\"left\">\n <a href=\"./LICENSE\"><img src=\"https://img.shields.io/badge/license-Apache%202-dfd.svg\"></a>\n <a href=\"\"><img src=\"https://img.shields.io/badge/python-3.7+-aff.svg\"></a>\n <a href=\"\"><img src=\"https://img.shields.io/badge/os-linux%2C%20win%2C%20mac-pink.svg\"></a>\n <a href=\"https://github.com/arry-lee/ToddleOCR/stargazers\"><img src=\"https://img.shields.io/github/stars/arry-lee/ToddleOCR?color=ccf\"></a>\n</p>\n\n# ToddleOCR \u62d3\u724d\n\nToddleOCR\u662f\u4e00\u4e2a\u57fa\u4e8eTorch\u5b9e\u73b0\u7684OCR\uff08\u5149\u5b66\u5b57\u7b26\u8bc6\u522b\uff09\u9879\u76ee\uff0c\u5b83fork\u81eaPaddleOCR\uff0c\u5e76\u7ecf\u8fc7\u4f5c\u8005\u8fdb\u884c\u4e86\u6539\u8fdb\u548c\u4f18\u5316\u3002\u8be5\u9879\u76ee\u65e8\u5728\u901a\u8fc7\u4f7f\u7528Torch\u6846\u67b6\u6765\u5b66\u4e60\u548c\u7406\u89e3OCR\u6280\u672f\u7684\u5b9e\u73b0\u539f\u7406\u3002\n\n## \u9879\u76ee\u540d\u79f0\u7684\u542b\u4e49\n\nToddleOCR\u8fd9\u4e2a\u540d\u79f0\u6709\u4e09\u5c42\u610f\u601d\uff1a\n\n1. \u7ed3\u5408\u4e86Torch\u548cPaddle\u4e24\u4e2a\u6846\u67b6\u7684\u7279\u70b9\uff0c\u56e0\u6b64\u547d\u540d\u4e3aToddle\u3002\n2. \"Toddle\"\u5728\u82f1\u6587\u4e2d\u610f\u5473\u7740\u8e52\u8dda\u5b66\u6b65\uff0c\u4e5f\u4ee3\u8868\u8fd9\u4e2a\u9879\u76ee\u662f\u4f5c\u8005\u5728\u5b66\u4e60\u8fc7\u7a0b\u4e2d\u7684\u63a2\u7d22\u548c\u5c1d\u8bd5\u3002\n3. \"Toddle\"\u5728\u4e2d\u6587\u4e2d\u97f3\u8bd1\u4e3a\"\u62d3\u724d\"\uff0c\u610f\u6307\u4ece\u7af9\u7247\u4e0a\u62d3\u5370\u6587\u5b57\uff0c\u5f15\u7533\u4e3a\u4ece\u56fe\u7247\u4e2d\u63d0\u53d6\u6587\u5b57\u3002\n\n## \u9879\u76ee\u72b6\u6001\n\n\u76ee\u524d\uff0cToddleOCR\u5904\u4e8e\u63a2\u7d22\u9636\u6bb5\uff0c\u4ecd\u5728\u4e0d\u65ad\u5730\u8fdb\u884c\u6539\u8fdb\u548c\u4f18\u5316\u3002\u6b22\u8fce\u5f00\u53d1\u8005\u548c\u7814\u7a76\u8005\u53c2\u4e0e\u5176\u4e2d\uff0c\u4e00\u8d77\u63a2\u7d22OCR\u6280\u672f\u7684\u524d\u6cbf\u3002~~\u9879\u76ee\u6587\u6863\u76ee\u524d\u8fd8\u662fPaddleOCR\u7684\u6587\u6863~~\u3002\n\n## \u529f\u80fd\u7279\u70b9\n\n\u5728ToddleOCR\u4e2d\uff0c\u4f60\u53ef\u4ee5\u671f\u671b\u4ee5\u4e0b\u529f\u80fd\u7279\u70b9\uff1a\n\n- \u6587\u5b57\u68c0\u6d4b\uff1a\u80fd\u591f\u5728\u56fe\u50cf\u4e2d\u51c6\u786e\u5730\u68c0\u6d4b\u51fa\u6587\u5b57\u533a\u57df\u7684\u4f4d\u7f6e\u548c\u8fb9\u754c\u6846\u3002\n- \u6587\u5b57\u8bc6\u522b\uff1a\u80fd\u591f\u5c06\u68c0\u6d4b\u5230\u7684\u6587\u5b57\u533a\u57df\u8fdb\u884c\u8bc6\u522b\uff0c\u8f93\u51fa\u5bf9\u5e94\u7684\u6587\u5b57\u5185\u5bb9\u3002\n- \u8868\u683c\u8bc6\u522b\uff1a\u80fd\u591f\u5c06\u68c0\u6d4b\u5230\u7684\u5355\u5143\u683c\u91cd\u5efa\u6210\u8868\u683c\n- \u5173\u952e\u4fe1\u606f\u63d0\u53d6\uff1a \u5305\u62ec\u8bed\u8a00\u5b9e\u4f53\u8bc6\u522b(SER)\uff0c\u5173\u7cfb\u62bd\u53d6(RE)\n- \u591a\u8bed\u8a00\u652f\u6301\uff1a\u652f\u6301\u591a\u79cd\u8bed\u8a00\u7684\u6587\u5b57\u68c0\u6d4b\u548c\u8bc6\u522b\uff0c\u5305\u62ec\u4e2d\u6587\u3001\u82f1\u6587\u7b49\u5e38\u89c1\u8bed\u8a00\u3002\n~~- \u9ad8\u6027\u80fd\uff1a\u7ecf\u8fc7\u4f18\u5316\u7684\u7b97\u6cd5\u548c\u6a21\u578b\u7ed3\u6784\uff0c\u80fd\u591f\u5728\u4fdd\u8bc1\u51c6\u786e\u6027\u7684\u540c\u65f6\u63d0\u9ad8\u5904\u7406\u901f\u5ea6\u3002~~\n\n## \u5feb\u901f\u5f00\u59cb\n\n### \u73af\u5883\u8981\u6c42\n\n\u5728\u5f00\u59cb\u4e4b\u524d\uff0c\u8bf7\u786e\u4fdd\u4f60\u5df2\u7ecf\u5b89\u88c5\u4e86\u4ee5\u4e0b\u73af\u5883\uff1a\n\n* Python 3.x\n* Torch 2.x\n\n\u5176\u4ed6\u4f9d\u8d56\u5e93\uff08\u5177\u4f53\u4f9d\u8d56\u8bf7\u53c2\u8003\u9879\u76ee\u6587\u6863\uff09\n\n### \u5b89\u88c5\n\n1. \u514b\u9686\u9879\u76ee\u4ee3\u7801\u5230\u672c\u5730\uff1a\n\n```shell\ngit clone https://github.com/arry-lee/ToddleOCR.git\n```\n\u6216\u8005\n\n```shell\npip install toddleocr\n```\n\n2. \u8fdb\u5165\u9879\u76ee\u76ee\u5f55\uff1a\n\n```shell\ncd ToddleOCR\n```\n\n3. \u5b89\u88c5\u4f9d\u8d56\uff1a\n\n```shell\npip install -r requirements.txt\n```\n\n4. \u4e0b\u8f7d\u6a21\u578b\n\u76ee\u524d\u63d0\u4f9b\u7684\u6a21\u578b\u53ef\u4ee5\u5728[\u8fd9\u91cc](https://github.com/arry-lee/ToddleOCR/releases/weights)\u624b\u52a8\u4e0b\u8f7d\uff0c\u4ee3\u7801\u8fd0\u884c\u65f6\u4e5f\u4f1a\u81ea\u52a8\u4e0b\u8f7d\uff1a\n\n- [x] [zh_ocr_cls_v1.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_ocr_cls_v1.rar) \u6587\u672c\u89d2\u5ea6\u5206\u7c7b\u6a21\u578b\n- [x] [zh_ocr_det_v3.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_ocr_det_v3.rar) \u4e2d\u82f1\u6587\u68c0\u6d4b\u6a21\u578b\n- [x] [zh_ocr_rec_v3.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_ocr_rec_v3.rar) \u4e2d\u82f1\u6587\u8bc6\u522b\u6a21\u578b\n- [x] [zh_str_tab_m2.rar](https://github.com/arry-lee/ToddleOCR/releases/download/weights/zh_str_tab_m2.rar) \u8868\u683c\u8bc6\u522b\u91cd\u5efa\u6a21\u578b\n\n### \u4f7f\u7528\u793a\u4f8b\n\n1. \u51c6\u5907\u8f93\u5165\u56fe\u50cf\u6587\u4ef6\uff0c\u4f8b\u5982input.jpg\u3002\n\n2. \u8fd0\u884cOCR\u793a\u4f8b\u811a\u672c\uff1a\n\n```shell\npython toddleocr input.jpg\n```\n\n\u8fd9\u5c06\u8f93\u51fa\u68c0\u6d4b\u5230\u7684\u6587\u5b57\u533a\u57df\u548c\u5bf9\u5e94\u7684\u8bc6\u522b\u7ed3\u679c\u3002\n\n## \u5982\u4f55\u914d\u7f6e\u65b0\u7684\u7b97\u6cd5\n\n\u4e0ePaddleOCR\u76f8\u6bd4\uff0c\u672c\u9879\u76ee\u6452\u5f03yaml\u7684\u914d\u7f6e\u65b9\u6cd5\uff0c\u91c7\u7528\u7eafpython\u8bed\u8a00\uff0c\u7c7byaml\u7684\u914d\u7f6e\u65b9\u6cd5\uff0c\u4f46\u66f4\u7075\u6d3b\uff0c\u800c\u4e14\u53ef\u4ee5\u4f7f\u7528\u590d\u6742\u7684\u5f15\u7528\u8ba1\u7b97\uff0c\u5e76\u4e14\u6240\u89c1\u5373\u6240\u5f97\uff0c\u5177\u4f53\u7684\u8bf7\u53c2\u8003\nptocr/config.py \u4e2d\u7684ConfigModel\u7c7b\uff0c\u7ee7\u627f\u5e76\u91cd\u5199\u4f60\u7684\u53c2\u6570\u3002\n\n\u5173\u4e8e\u914d\u7f6e\u7684\u8bed\u6cd5\uff0c\u53ea\u6709\u4e24\u70b9\u9700\u8981\u7279\u522b\u6ce8\u610f\u7684\uff0c\u4e3a\u4e86\u65b9\u4fbf\u914d\u7f6e\u548c\u7b80\u5316\u914d\u7f6e\u91cf ,\u9879\u76ee\u5185\u90e8\u5b9a\u4e49\u4e86\u4e00\u4e2a\u8f85\u52a9\u7c7b\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e9b\u8bed\u6cd5\u7cd6\uff0c\u5982\u4e0b\uff1a\n\n1. \u4f7f\u7528 _ \u7c7b\uff0c\u8fd9\u662f\u4e00\u4e2a\u591a\u529f\u80fd\u7684\u8f85\u52a9\u7c7b\uff0c\u6709\u4ee5\u4e0b\u51e0\u4e2a\u8bed\u6cd5\u529f\u80fd\uff1a\n 1. \u7c7b\u4f3c\u504f\u51fd\u6570\u7684\u504f\u7c7b\uff1a`_(DBHead,arg1=0,arg2=1) ==> partial(DBHead, **kwargs)`\n 2. \u5b57\u7b26\u4e32\u52a8\u6001\u5bfc\u5165\u7c7b\uff1a`_(\"DBHead\",arg1=0,arg2=1) ==> partial(DBHead, **kwargs)`\n 3. \u6ca1\u6709\u4f4d\u7f6e\u53c2\u6570\u7b49\u6548\u4e8e\u5b57\u5178\uff1a`_(arg1=0,arg2=1) ==> dict(arg1=0,arg2=1)`\n 4. \u9884\u70ed\u5b66\u4e60\u7387\u89c4\u5212\u5668\uff1a\n 5. \u7b49\u6548\u5e76\u5217\u5217\u8868,\u7528\u4e8e Transformers\uff1a `_[train:eval:infer,train:eval:...]`,\n \u5207\u7247\u8bed\u6cd5\u7684\u4e09\u4e2a\u4f4d\u7f6e\u5206\u522b\u8868\u793a\u8bad\u7ec3\uff0c\u6d4b\u8bd5\uff0c\u63a8\u7406\u6a21\u5f0f\u4e0b\u7684\u9884\u5904\u7406\u5668\uff0c\n \u7279\u522b\u7684\uff1a...\u7701\u7565\u53f7\u8868\u793a\u540c\u524d\u4e00\u4e2a\uff0c\n \u7a7a\u7684\u6216None\u8868\u793a\u8be5\u4f4d\u7f6e\u4e0d\u9700\u8981\u8fd9\u4e2a\u9884\u5904\u7406\u5668\uff0c\u4f8b\u5982[DecodeLabel:...:]\u8868\u793a\u8bad\u7ec3\u548c\u6d4b\u8bd5\u9700\u8981DecodeLabel\uff0c\u63a8\u7406\u4e0d\u9700\u8981,\u8fd9\u79cd\u8868\u793a\u65b9\u6cd5\u662f\u4e3a\u4e86\n **\u7b80\u5316\u914d\u7f6e\uff0c\u5171\u4eab\u5904\u7406\u5668\u51cf\u5c11\u5b9e\u4f8b\u7684\u521b\u5efa**\n\n ```python\n class _:\n \n def __new__(cls, class_=None, /, **kwargs):\n if class_ is None:\n return kwargs\n \n if issubclass(class_, LRScheduler) and \"warmup_epoch\" in kwargs:\n warmup_epochs = kwargs.pop(\"warmup_epoch\")\n class_ = warmup_scheduler(class_, warmup_epochs)\n return partial(class_, **kwargs)\n \n if isinstance(class_, type | types.FunctionType):\n return partial(class_, **kwargs)\n \n if isinstance(class_, str):\n from tools.modelhub import Hub\n hub = Hub(os.path.dirname(__file__)) # \u8fd9\u4e2a\u64cd\u4f5c\u5f88\u8017\u65f6\uff0c\u5c3d\u91cf\u4e0d\u4f7f\u7528\u5b57\u7b26\u4e32\u5f62\u5f0f\u7684\u5bfc\u5165\n \n class_ = hub(class_)\n return partial(class_, **kwargs)\n \n def __class_getitem__(cls, item):\n out = [[], [], []]\n for i in item:\n if isinstance(i, slice):\n ls = [i.start, i.stop, i.step]\n last = None\n for one in ls:\n if one is not None:\n last = one\n break\n for i, one in enumerate(ls):\n if one is ...:\n out[i].append(last)\n elif one:\n out[i].append(one)\n else:\n for one in out:\n one.append(i)\n return out\n ```\n\n2. \u4f7f\u7528\u6ce8\u89e3\u8bed\u6cd5\u533a\u5206\u8bad\u7ec3\u53c2\u6570\u548c\u6d4b\u8bd5\u53c2\u6570\n ConfigModel \u6709\u4e24\u4e2a\u5185\u90e8\u7c7b Data \u548c Loader \u5b50\u7c7b\u53ef\u4ee5\u91c7\u7528\u6ce8\u89e3\u8bed\u6cd5\u533a\u5206\u8bad\u7ec3\u65f6\u914d\u7f6e\u548c\u6d4b\u8bd5\u65f6\u914d\u7f6e\uff0c\u4f8b\u5982\uff1a\n ```python\n class Loader:\n shuffle:False = True\n drop_last:True = False\n batch_size:1 = 8\n num_workers: 0 = 4\n ```\n **\u7b49\u53f7\u540e\u9762\u8868\u793a\u8bad\u7ec3\u65f6\u53c2\u6570\uff0c\u5192\u53f7\u540e\u9762\u8868\u793a\u6d4b\u8bd5\u65f6\u53c2\u6570**\uff0c\u6ca1\u6709\u5192\u53f7\u5219\u76f8\u540c\n \u8fd9\u79cd\u8868\u793a\u65b9\u6cd5\u540c\u6837\u662f\u4e3a\u4e86\u7b80\u5316\u914d\u7f6e\n\n\u66f4\u591a\u7684\u53ef\u4ee5\u53c2\u8003\u5df2\u7ecf\u5b9e\u73b0\u7684\u7b97\u6cd5\uff0c\u4f8b\u5982`models/det/det_db_rvd.py`\n\n## \u8d21\u732e\n\n\u5982\u679c\u4f60\u5bf9ToddleOCR\u611f\u5174\u8da3\uff0c\u5e76\u4e14\u5e0c\u671b\u4e3a\u9879\u76ee\u505a\u51fa\u8d21\u732e\uff0c\u6b22\u8fce\u63d0\u4ea4\u95ee\u9898\u3001\u63d0\u51fa\u5efa\u8bae\u6216\u8005\u53d1\u9001Pull Request\u3002\u6211\u4eec\u4e50\u4e8e\u63a5\u53d7\u6765\u81ea\u793e\u533a\u7684\u8d21\u732e\uff0c\u5171\u540c\u63a8\u52a8\u9879\u76ee\u7684\u53d1\u5c55\u3002\n\n## \u5e2e\u52a9\u4e0e\u652f\u6301\n\n\u5982\u679c\u4f60\u5728\u4f7f\u7528\u8fc7\u7a0b\u4e2d\u9047\u5230\u4efb\u4f55\u95ee\u9898\uff0c\u6216\u8005\u9700\u8981\u8fdb\u4e00\u6b65\u7684\u5e2e\u52a9\u4e0e\u652f\u6301\uff0c\u8bf7\u53c2\u8003\u9879\u76ee\u6587\u6863\u6216\u8005\u8054\u7cfb\u6211\u4eec\u7684\u56e2\u961f\u3002\n\n## \u76f8\u5173\u94fe\u63a5\n\n- \u9879\u76ee\u4e3b\u9875\uff1ahttps://github.com/arry-lee/ToddleOCR\n- PaddleOCR\uff1ahttps://github.com/paddlepaddle/PaddleOCR\n- \u6587\u6863\uff1ahttps://github.com/arry-lee/ToddleOCR/docs\n\n## \u8bb8\u53ef\u8bc1\n\n\u672c\u9879\u76ee\u7684\u53d1\u5e03\u53d7<a href=\"https://github.com/arry-lee/ToddleOCR/blob/torchocr/LICENSE\">Apache 2.0 license</a>\u8bb8\u53ef\u8ba4\u8bc1\u3002\n",
"bugtrack_url": null,
"license": "Apache License 2.0",
"summary": "Awesome OCR toolkits based on Torch \uff088.6M ultra-lightweight pre-trained model, support training and deployment among server, mobile, embedded and IoT devices",
"version": "1.2.8",
"project_urls": {
"Download": "https://github.com/arry-lee/ToddleOCR.git",
"Homepage": "https://github.com/arry-lee/ToddleOCR"
},
"split_keywords": [
"ocr",
"textdetection",
"textrecognition",
"toddleocr",
"crnn",
"east",
"star-net",
"rosetta",
"ocrlite",
"db",
"chineseocr",
"chinesetextdetection",
"chinesetextrecognition"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "1d4bec1a70c4ad1ba0b5e1681cb8e164751ffbcbd3b5ecb6c48bc3120989af69",
"md5": "9582297ef8adba85bf26bc8f25583994",
"sha256": "3458b2be5681a1eaf5330dfcd686562cdabf99511b169316c71a37bd83123df6"
},
"downloads": -1,
"filename": "toddleocr-1.2.8-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9582297ef8adba85bf26bc8f25583994",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 448820,
"upload_time": "2023-11-17T09:07:34",
"upload_time_iso_8601": "2023-11-17T09:07:34.445028Z",
"url": "https://files.pythonhosted.org/packages/1d/4b/ec1a70c4ad1ba0b5e1681cb8e164751ffbcbd3b5ecb6c48bc3120989af69/toddleocr-1.2.8-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "d426f0aaa8f1e8bf6c9b6a43875dd630dedf73e2c54730bb5ed6b56f5711a176",
"md5": "b15e795322483b7d1659db5561bf2931",
"sha256": "11e91c149c879c402fa6ff9bcd55afd34f192d727f7e2777323541553e63f028"
},
"downloads": -1,
"filename": "toddleocr-1.2.8.tar.gz",
"has_sig": false,
"md5_digest": "b15e795322483b7d1659db5561bf2931",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 348915,
"upload_time": "2023-11-17T09:07:36",
"upload_time_iso_8601": "2023-11-17T09:07:36.227415Z",
"url": "https://files.pythonhosted.org/packages/d4/26/f0aaa8f1e8bf6c9b6a43875dd630dedf73e2c54730bb5ed6b56f5711a176/toddleocr-1.2.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-11-17 09:07:36",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "arry-lee",
"github_project": "ToddleOCR",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "toddleocr"
}