Copy disabled (too large)
Download .txt
Showing preview only (39,685K chars total). Download the full file to get everything.
Repository: PaddleOCR-Community/Dive-into-OCR
Branch: main
Commit: 6d6e21261a13
Files: 40
Total size: 37.6 MB
Directory structure:
gitextract_wepobalr/
├── LICENSE
├── README.md
├── README_ch.md
├── notebook_ch/
│ ├── .ipynb_checkpoints/
│ │ └── 如何使用本书-checkpoint.ipynb
│ ├── 1.introduction/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── OCR技术导论-checkpoint.ipynb
│ │ └── OCR技术导论.ipynb
│ ├── 2.text_detection/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 文本检测FAQ-checkpoint.ipynb
│ │ │ ├── 文本检测实践篇-checkpoint.ipynb
│ │ │ └── 文本检测理论篇-checkpoint.ipynb
│ │ ├── 文本检测FAQ.ipynb
│ │ ├── 文本检测实践篇.ipynb
│ │ └── 文本检测理论篇.ipynb
│ ├── 3.text_recognition/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 文本识别实践部分-checkpoint.ipynb
│ │ │ └── 文本识别理论部分-checkpoint.ipynb
│ │ ├── 文本识别实践部分.ipynb
│ │ └── 文本识别理论部分.ipynb
│ ├── 4.ppcor_system_strategy/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── PP-OCR系统及优化策略-checkpoint.ipynb
│ │ └── PP-OCR系统及优化策略.ipynb
│ ├── 4.ppocr_system_strategy/
│ │ └── PP-OCR系统及优化策略.ipynb
│ ├── 5.ppocrv2_inference_deployment/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── PP-OCRv2预测部署实战-checkpoint.ipynb
│ │ └── PP-OCRv2预测部署实战.ipynb
│ ├── 6.document_analysis/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 文档分析实战-VQA-checkpoint.ipynb
│ │ │ ├── 文档分析实战-表格识别-checkpoint.ipynb
│ │ │ └── 文档分析理论-checkpoint.ipynb
│ │ ├── 文档分析实战-VQA.ipynb
│ │ ├── 文档分析实战-表格识别.ipynb
│ │ └── 文档分析理论.ipynb
│ └── 如何使用本书.ipynb
└── notebook_en/
├── 1.introduction/
│ └── introduction_to_OCR_technology.ipynb
├── 2.text_detection/
│ ├── text_detection_FAQ.ipynb
│ ├── text_detection_practice.ipynb
│ └── text_detection_theory.ipynb
├── 3.text_recognition/
│ ├── text_recognition_practice.ipynb
│ └── text_recognition_theory.ipynb
├── 4.ppocr_system_strategy/
│ └── ppocr_system_strategy.ipynb
├── 5.ppocrv2_inference_deployment/
│ └── ppocrv2_inference_deployment_practice.ipynb
├── 6.document_analysis/
│ ├── document_analysis_practice-VQA.ipynb
│ ├── document_analysis_practice-form_recognition.ipynb
│ └── document_analysis_theory.ipynb
└── how_to_use_these_notebooks.ipynb
================================================
FILE CONTENTS
================================================
================================================
FILE: LICENSE
================================================
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
================================================
FILE: README.md
================================================
English | [简体中文](README_ch.md)
# E-book: *Dive Into OCR*
"Dive Into OCR" is a textbook that combines OCR theory and practice, written by the PaddleOCR team, the main features are as follows:
- OCR full-stack technology covering text detection, recognition and document analysis
- Closely integrate theory and practice, cross the code implementation gap, and supporting instructional videos
- Jupyter Notebook textbook, flexibly modifying code for instant results
## Structure
- The first part is the preliminary knowledge of the book, including the knowledge index and resource links needed in the process of positioning and using the book content of the book
- The second part is chapters 4-8 of the book, which introduce the concepts, applications, and industry practices related to the detection and identification capabilities of the OCR engine. In the "Introduction to OCR Technology", the application scenarios and challenges of OCR, the basic concepts of technology, and the pain points in industrial applications are comprehensively explained. Then, in the two chapters of "Text Detection" and "Text Recognition", the two basic tasks of OCR are introduced. In each chapter, an algorithm is accompanied by a detailed explanation of the code and practical exercises. Chapters 6 and 7 are a detailed introduction to the PP-OCR series model, PP-OCR is a set of OCR systems for industrial applications, on the basis of the basic detection and identification model, after a series of optimization strategies to achieve the general field of industrial SOTA model, while opening up a variety of predictive deployment solutions, enabling enterprises to quickly land OCR applications.
- The third part is chapter 9-12 of the book, which introduces applications other than the two-stage OCR engine, including data synthesis, preprocessing algorithm, and end-to-end model, focusing on OCR's layout analysis, table recognition, visual document question and answer capabilities in the document scene, and also through the combination of algorithm and code, so that readers can deeply understand and apply.
## Address
- [E-book: *Dive Into OCR* ](https://paddleocr.bj.bcebos.com/ebook/Dive_into_OCR.pdf)
- Videos: [Chinese](https://aistudio.baidu.com/aistudio/education/group/info/25207), [English version coming soon]()
================================================
FILE: README_ch.md
================================================
[English](README.md) | 简体中文
# 《动手学OCR》电子书
《动手学OCR》是PaddleOCR团队**携手华中科技大学博导/教授,IAPR Fellow 白翔、复旦大学青年研究员陈智能、中国移动研究院视觉领域资深专家黄文辉、中国工商银行大数据人工智能实验室研究员等产学研同仁**,以及OCR开发者共同打造的结合OCR前沿理论与代码实践的教材。主要特色如下:
- 覆盖从文本检测识别到文档分析的OCR全栈技术
- 紧密结合理论实践,跨越代码实现鸿沟,并配套教学视频
- Notebook交互式学习,灵活修改代码,即刻获得结果
## 本书结构

- 第一部分是本书的推荐序、序言与预备知识,包含本书的定位与使用书籍内容的过程中需要用到的知识索引、资源链接等
- 第二部分是本书的4-8章,介绍与OCR核心的检测、识别能力相关的概念、应用与产业实践。在“OCR技术导论”中总括性的解释OCR的应用场景和挑战、技术基本概念以及在产业应用中的痛点问题。然后在
“文本检测”与“文本识别”两章中介绍OCR的两个基本任务,并在每章中配套一个算法展开代码详解与实战练习。第6、7章是关于PP-OCR系列模型的详细介绍,PP-OCR是一套面向产业应用的OCR系统,在
基础检测和识别模型的基础之上经过一系列优化策略达到通用领域的产业级SOTA模型,同时打通多种预测部署方案,赋能企业快速落地OCR应用。
- 第三部分是本书的9-12章,介绍两阶段OCR引擎之外的应用,包括数据合成、预处理算法、端到端模型,重点展开了OCR在文档场景下的版面分析、表格识别、视觉文档问答的能力,同样通过算法与代码结
合的方式使得读者能够深入理解并应用。
## 资料地址
- [教学视频与notebook教程](https://aistudio.baidu.com/aistudio/education/group/info/25207)
- 中文版电子书下载请扫描以下二维码填写问卷后入群后领取
<div align="center">
<img src="https://raw.githubusercontent.com/PaddlePaddle/PaddleOCR/dygraph/doc/joinus.PNG" width = "200" height = "200" />
</div>
================================================
FILE: notebook_ch/.ipynb_checkpoints/如何使用本书-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. 课程预备知识\n",
"\n",
"本课所涉及的OCR模型建立在深度学习的基础之上,因此与其相关的基础知识、环境配置、项目工程与其他资料将在本节介绍,尤其对深度学习不熟悉的读者可以查看和学习相应内容。\n",
"\n",
"### 1.1 预备知识\n",
"\n",
"深度学习的“学习”由机器学习中的神经元、感知机、多层神经网络等内容一路发展而来,因此了解基础的机器学习算法对于深度学习的理解和应用有很大帮助。而深度学习的“深”则体现在对大量信息处理过程中使用的卷积、池化等一系列以向量为基础的数学运算。如果缺乏这两者的理论基础,可以学习李宏毅老师的[线性代数](https://aistudio.baidu.com/aistudio/course/introduce/2063)和[机器学习](https://aistudio.baidu.com/aistudio/course/introduce/1978)课程。\n",
"\n",
"对于深度学习本身的理解,可以参考百度杰出架构师毕然老师的零基础课程:[百度架构师手把手带你零基础实践深度学习](https://aistudio.baidu.com/aistudio/course/introduce/1297),其中覆盖了深度学习的发展历史,通过一个经典案例介绍深度学习的完整组成部分,是一套以实践为导向的深度学习课程。\n",
"\n",
"对于理论知识的实践,[Python基础知识](https://aistudio.baidu.com/aistudio/course/introduce/1224)必不可少,同时为了快速复现深度学习模型,本课程使用的深度学习框架为:飞桨PaddlePaddle。如果你已经使用过其他框架,通过[快速上手文档](https://www.paddlepaddle.org.cn/documentation/docs/zh/practices/quick_start/hello_paddle.html)可以迅速了解飞桨的使用方法。\n",
"\n",
"### 1.2 基础环境准备\n",
"\n",
"如果你想在本地环境运行本课程的代码且之前未搭建过Python环境,可以根据[零基础运行环境准备](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/doc/doc_ch/environment.md),根据自己的操作系统安装Anaconda或docker环境。\n",
"\n",
"如果你没有本地资源,可以通过AI Studio实训平台完成代码运行,其中的每个项目都通过Notebook的方式呈现,方便开发者学习。若对Notebook的相关操作不熟悉,可以参考[AI Studio项目说明](https://ai.baidu.com/ai-doc/AISTUDIO/0k3e2tfzm)。\n",
"\n",
"### 1.3 获取和运行代码\n",
"\n",
"本课程依托PaddleOCR的代码库形成,首先,克隆PaddleOCR的完整项目:\n",
"\n",
"```bash\n",
"#【推荐】\n",
"git clone https://github.com/PaddlePaddle/PaddleOCR\n",
"\n",
"# 如果因为网络问题无法pull成功,也可选择使用码云上的托管:\n",
"git clone https://gitee.com/paddlepaddle/PaddleOCR\n",
"```\n",
"\n",
"> 注:码云托管代码可能无法实时同步本github项目更新,存在3~5天延时,请优先使用推荐方式。\n",
">\n",
"> \t\t如果你不熟悉git操作,可以直接在PaddleOCR的首页的 `Code` 中下载压缩包\n",
"\n",
"然后安装第三方库:\n",
"\n",
"```bash\n",
"cd PaddleOCR\n",
"pip3 install -r requirements.txt\n",
"```\n",
"\n",
"\n",
"\n",
"### 1.4 查阅资料\n",
"\n",
"[PaddleOCR使用文档](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/README_ch.md#%E6%96%87%E6%A1%A3%E6%95%99%E7%A8%8B) (中文) 中详细介绍了如何使用PaddleOCR完成模型应用、训练和部署。文档内容丰富,大多数用户的问题都在文档或FAQ中有所描述,尤其在[FAQ(中文)](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/doc/doc_ch/FAQ.md)中,按照深度学习的应用过程沉淀了用户的常见问题,建议大家仔细阅读。\n",
"\n",
"### 1.5 寻求帮助\n",
"\n",
"如果你在使用PaddleOCR的过程中遇到BUG、易用性或者文档相关的问题,可通过[Github issue](https://github.com/PaddlePaddle/PaddleOCR/issues)与官方联系,请按照issue模板尽可能多的提供信息,以便官方人员迅速定位问题。同时,微信群是广大PaddleOCR用户的日常交流阵地,更适合提问一些咨询类问题,除了有PaddleOCR团队成员以外,还会有热心开发者回答大家的问题。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: notebook_ch/1.introduction/.ipynb_checkpoints/OCR技术导论-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n",
"*注:以上图片来自网络*\n",
"\n",
"# 1. OCR技术背景\n",
"## 1.1 OCR技术的应用场景\n",
"\n",
"* **<font color=red>OCR是什么</font>**\n",
"\n",
"OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象,现在我们常说的OCR一般指场景文字识别(Scene Text Recognition,STR),主要面向自然场景,如下图中所示的牌匾等各种自然场景可见的文字。\n",
"\n",
"\n",
"<center>图1 文档场景文字识别 VS. 自然场景文字识别</center>\n",
"\n",
"<br>\n",
"\n",
"* **<font color=red>OCR有哪些应用场景?</font>**\n",
"\n",
"OCR技术有着丰富的应用场景,一类典型的场景是日常生活中广泛应用的面向垂类的结构化文本识别,比如车牌识别、银行卡信息识别、身份证信息识别、火车票信息识别等等。这些小垂类的共同特点是格式固定,因此非常适合使用OCR技术进行自动化,可以极大的减轻人力成本,提升效率。\n",
"\n",
"这种面向垂类的结构化文本识别是目前ocr应用最广泛、并且技术相对较成熟的场景。\n",
"\n",
"\n",
"<center>图2 OCR技术的应用场景</center>\n",
"\n",
"除了面向垂类的结构化文本识别,通用OCR技术也有广泛的应用,并且常常和其他技术结合完成多模态任务,例如在视频场景中,经常使用OCR技术进行字幕自动翻译、内容安全监控等等,或者与视觉特征相结合,完成视频理解、视频搜索等任务。\n",
"\n",
"\n",
"<center>图3 多模态场景中的通用OCR</center>\n",
"\n",
"## 1.2 OCR技术挑战\n",
"OCR的技术难点可以分为算法层和应用层两方面。\n",
"\n",
"* **<font color=red>算法层</font>**\n",
"\n",
"OCR丰富的应用场景,决定了它会存在很多技术难点。这里给出了常见的8种问题:\n",
"\n",
"\n",
"<center>图4 OCR算法层技术难点</center>\n",
"\n",
"这些问题给文本检测和文本识别都带来了巨大的技术挑战,可以看到,这些挑战主要都是面向自然场景,目前学术界的研究也主要聚焦在自然场景,OCR领域在学术上的常用数据集也都是自然场景。针对这些问题的研究很多,相对来说,识别比检测面临更大的挑战。\n",
"\n",
"* **<font color=red>应用层</font>**\n",
"\n",
"在实际应用中,尤其是在广泛的通用场景下,除了上一节总结的仿射变换、尺度问题、光照不足、拍摄模糊等算法层面的技术难点,OCR技术还面临两大落地难点:\n",
"1. **海量数据要求OCR能够实时处理。** OCR应用常对接海量数据,我们要求或希望数据能够得到实时处理,模型的速度做到实时是一个不小的挑战。\n",
"2. **端侧应用要求OCR模型足够轻量,识别速度足够快。** OCR应用常部署在移动端或嵌入式硬件,端侧OCR应用一般有两种模式:上传到服务器 vs. 端侧直接识别,考虑到上传到服务器的方式对网络有要求,实时性较低,并且请求量过大时服务器压力大,以及数据传输的安全性问题,我们希望能够直接在端侧完成OCR识别,而端侧的存储空间和计算能力有限,因此对OCR模型的大小和预测速度有很高的要求。\n",
"\n",
"\n",
"<center>图5 OCR应用层技术难点</center>\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 2. OCR前沿算法\n",
"\n",
"虽然OCR是一个相对具体的任务,但涉及了多方面的技术,包括文本检测、文本识别、端到端文本识别、文档分析等等。学术上关于OCR各项相关技术的研究层出不穷,下文将简要介绍OCR任务中的几种关键技术的相关工作。\n",
"\n",
"## 2.1 文本检测\n",
"\n",
"文本检测的任务是定位出输入图像中的文字区域。近年来学术界关于文本检测的研究非常丰富,一类方法将文本检测视为目标检测中的一个特定场景,基于通用目标检测算法进行改进适配,如TextBoxes[1]基于一阶段目标检测器SSD[2]算法,调整目标框使之适合极端长宽比的文本行,CTPN[3]则是基于Faster RCNN[4]架构改进而来。但是文本检测与目标检测在目标信息以及任务本身上仍存在一些区别,如文本一般长宽比较大,往往呈“条状”,文本行之间可能比较密集,弯曲文本等,因此又衍生了很多专用于文本检测的算法,如EAST[5]、PSENet[6]、DBNet[7]等等。\n",
"\n",
"<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/548b50212935402abb2e671c158c204737c2c64b9464442a8f65192c8a31b44d\" width=\"500\"></center>\n",
"<center>图6 文本检测任务示例</center>\n",
"\n",
"<br>\n",
"\n",
"目前较为流行的文本检测算法可以大致分为**基于回归**和**基于分割**的两大类文本检测算法,也有一些算法将二者相结合。基于回归的算法借鉴通用物体检测算法,通过设定anchor回归检测框,或者直接做像素回归,这类方法对规则形状文本检测效果较好,但是对不规则形状的文本检测效果会相对差一些,比如CTPN[3]对水平文本的检测效果较好,但对倾斜、弯曲文本的检测效果较差,SegLink[8]对长文本比较好,但对分布稀疏的文本效果较差;基于分割的算法引入了Mask-RCNN[9],这类算法在各种场景、对各种形状文本的检测效果都可以达到一个更高的水平,但缺点就是后处理一般会比较复杂,因此常常存在速度问题,并且无法解决重叠文本的检测问题。\n",
"\n",
"<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/4f4ea65578384900909efff93d0b7386e86ece144d8c4677b7bc94b4f0337cfb\" width=\"800\"></center>\n",
"<center>图7 文本检测算法概览</center>\n",
"\n",
"<br>\n",
"\n",
"||\n",
"|---|---|---|\n",
"<center>图8 (左)基于回归的CTPN[3]算法优化anchor (中)基于分割的DB[7]算法优化后处理 (右)回归+分割的SAST[10]算法</center>\n",
"\n",
"<br>\n",
"\n",
"文本检测相关技术将在第二章进行详细解读和实战。\n",
"\n",
"## 2.2 文本识别\n",
"\n",
"文本识别的任务是识别出图像中的文字内容,一般输入来自于文本检测得到的文本框截取出的图像文字区域。文本识别一般可以根据待识别文本形状分为**规则文本识别**和**不规则文本识别**两大类。规则文本主要指印刷字体、扫描文本等,文本大致处在水平线位置;不规则文本往往不在水平位置,存在弯曲、遮挡、模糊等问题。不规则文本场景具有很大的挑战性,也是目前文本识别领域的主要研究方向。\n",
"\n",
"\n",
"<center>图9 (左)规则文本 VS. (右)不规则文本</center>\n",
"\n",
"<br>\n",
"\n",
"规则文本识别的算法根据解码方式的不同可以大致分为基于CTC和Sequence2Sequence两种,将网络学习到的序列特征 转化为 最终的识别结果 的处理方式不同。基于CTC的算法以经典的CRNN[11]为代表。\n",
"\n",
"\n",
"<center>图10 基于CTC的识别算法 VS. 基于Attention的识别算法</center>\n",
"\n",
"不规则文本的识别算法相比更为丰富,如STAR-Net[12]等方法通过加入TPS等矫正模块,将不规则文本矫正为规则的矩形后再进行识别;RARE[13]等基于Attention的方法增强了对序列之间各部分相关性的关注;基于分割的方法将文本行的各字符作为独立个体,相比与对整个文本行做矫正后识别,识别分割出的单个字符更加容易;此外,随着近年来Transfomer[14]的快速发展和在各类任务中的有效性验证,也出现了一批基于Transformer的文本识别算法,这类方法利用transformer结构解决CNN在长依赖建模上的局限性问题,也取得了不错的效果。\n",
"\n",
"\n",
"<center>图11 基于字符分割的识别算法[15]</center>\n",
"\n",
"<br>\n",
"\n",
"文本识别相关技术将在第三章进行详细解读和实战。\n",
"\n",
"## 2.3 文档结构化识别\n",
"\n",
"传统意义上的OCR技术可以解决文字的检测和识别需求,但在实际应用场景中,最终需要获取的往往是结构化的信息,如身份证、发票的信息格式化抽取,表格的结构化识别等等,多在快递单据抽取、合同内容比对、金融保理单信息比对、物流业单据识别等场景下应用。OCR结果+后处理是一种常用的结构化方案,但流程往往比较复杂,并且后处理需要精细设计,泛化性也比较差。在OCR技术逐渐成熟、结构化信息抽取需求日益旺盛的背景下,版面分析、表格识别、关键信息提取等关于智能文档分析的各种技术受到了越来越多的关注和研究。\n",
"\n",
"* **版面分析**\n",
"\n",
"版面分析(Layout Analysis)主要是对文档图像进行内容分类,类别一般可分为纯文本、标题、表格、图片等。现有方法一般将文档中不同的板式当做不同的目标进行检测或分割,如Soto Carlos[16]在目标检测算法Faster R-CNN的基础上,结合上下文信息并利用文档内容的固有位置信息来提高区域检测性能;Sarkar Mausoom[17]等人提出了一种基于先验的分割机制,在非常高的分辨率的图像上训练文档分割模型,解决了过度缩小原始图像导致的密集区域不同结构无法区分进而合并的问题。\n",
"\n",
"\n",
"<center>图12 版面分析任务示意图</center>\n",
"\n",
"<br>\n",
"\n",
"* **表格识别**\n",
"\n",
"表格识别(Table Recognition)的任务就是将文档里的表格信息进行识别和转换到excel文件中。文本图像中表格种类和样式复杂多样,例如不同的行列合并,不同的内容文本类型等,除此之外文档的样式和拍摄时的光照环境等都为表格识别带来了极大的挑战。这些挑战使得表格识别一直是文档理解领域的研究难点。\n",
"\n",
"\n",
"\n",
"<center>图13 表格识别任务示意图</center>\n",
"\n",
"<br>\n",
"\n",
"表格识别的方法种类较为丰富,早期的基于启发式规则的传统算法,如Kieninger[18]等人提出的T-Rect等算法,一般通过人工设计规则,连通域检测分析处理;近年来随着深度学习的发展,开始涌现一些基于CNN的表格结构识别算法,如Siddiqui Shoaib Ahmed[19]等人提出的DeepTabStR,Raja Sachin[20]等人提出的TabStruct-Net等;此外,随着图神经网络(Graph Neural Network)的兴起,也有一些研究者尝试将图神经网络应用到表格结构识别问题上,基于图神经网络,将表格识别看作图重建问题,如Xue Wenyuan[21]等人提出的TGRNet;基于端到端的方法直接使用网络完成表格结构的HTML表示输出,端到端的方法大多采用Seq2Seq方法来完成表格结构的预测,如一些基于Attention或Transformer的方法,如TableMaster[22]。\n",
"\n",
"\n",
"<center>图14 表格识别方法示意图</center>\n",
"\n",
"<br>\n",
"\n",
"* **关键信息提取**\n",
"\n",
"关键信息提取(Key Information Extraction,KIE)是Document VQA中的一个重要任务,主要从图像中提取所需要的关键信息,如从身份证中提取出姓名和公民身份号码信息,这类信息的种类往往在特定任务下是固定的,但是在不同任务间是不同的。\n",
"\n",
"\n",
"<center>图15 DocVQA任务示意图</center>\n",
"\n",
"<br>\n",
"\n",
"KIE通常分为两个子任务进行研究:\n",
"\n",
"- SER: 语义实体识别 (Semantic Entity Recognition),对每一个检测到的文本进行分类,如将其分为姓名,身份证。如下图中的黑色框和红色框。\n",
"- RE: 关系抽取 (Relation Extraction),对每一个检测到的文本进行分类,如将其分为问题和的答案。然后对每一个问题找到对应的答案。如下图中的红色框和黑色框分别代表问题和答案,黄色线代表问题和答案之间的对应关系。\n",
"\n",
"\n",
"<center>图16 ser与re任务</center>\n",
"\n",
"<br>\n",
"\n",
"一般的KIE方法基于命名实体识别(Named Entity Recognition,NER)[4]来研究,但是这类方法只利用了图像中的文本信息,缺少对视觉和结构信息的使用,因此精度不高。在此基础上,近几年的方法都开始将视觉和结构信息与文本信息融合到一起,按照对多模态信息进行融合时所采用的的原理可以将这些方法分为下面四种:\n",
"\n",
"- 基于Grid的方法\n",
"- 基于Token的方法\n",
"- 基于GCN的方法\n",
"- 基于End to End 的方法\n",
"\n",
"<br>\n",
"\n",
"文档分析相关技术将在第六章进行详细解读和实战。\n",
"\n",
"## 2.4 其他相关技术\n",
"\n",
"前面主要介绍了OCR领域的三种关键技术:文本检测、文本识别、文档结构化识别,更多其他OCR相关前沿技术介绍,包括端到端文本识别、OCR中的图像预处理技术、OCR数据合成等,可参考教程第七章和第八章。\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 3. OCR技术的产业实践\n",
"\n",
"\n",
"\n",
"> 你是小王,该怎么办? \n",
"> 1. 我不会,我不行,我不干了😭\n",
"> 2. 建议老板找外包公司或者商业化方案,反正花老板的钱😊\n",
"> 3. 网上找找类似项目,面向Github编程😏\n",
"\n",
"<br>\n",
"\n",
"OCR技术最终还是要落到产业实践当中。虽然学术上关于OCR技术的研究很多,OCR技术的商业化应用相比于其他AI技术也已经相对成熟,但在实际的产业应用中,还是存在一些难点与挑战。下文将从技术和产业实践两个角度进行分析。\n",
"\n",
"\n",
"## 3.1 产业实践难点\n",
"\n",
"在实际的产业实践中,开发者常常需要依托开源社区资源启动或推进项目,而开发者使用开源模型又往往面临三大难题:\n",
"\n",
"<center>图17 OCR技术产业实践三大难题</center>\n",
"\n",
"**1. 找不到、选不出**\n",
"\n",
"开源社区资源丰富,但是信息不对称导致开发者并不能高效地解决痛点问题。一方面,开源社区资源过于丰富,开发者面对一项需求,无法快速从海量的代码仓库中找到匹配业务需求的项目,即存在“找不到”的问题;另一方面,在算法选型时,英文公开数据集上的指标,无法给开发者常常面对的中文场景提供直接的参考,逐个算法验证需要耗费大量时间和人力,且不能保证选出最合适的算法,即“选不出”。\n",
"\n",
"**2. 不适用产业场景**\n",
"\n",
"开源社区中的工作往往更多地偏向效果优化,如学术论文代码开源或复现,一般更侧重算法效果,平衡考虑模型大小和速度的工作相比就少很多,而模型大小和预测耗时在产业实践中是两项不容忽视的指标,其重要程度不亚于模型效果。无论是移动端和服务器端,待识别的图像数目往往非常多,都希望模型更小,精度更高,预测速度更快。GPU太贵,最好使用CPU跑起来更经济。在满足业务需求的前提下,模型越轻量占用的资源越少。\n",
"\n",
"**3. 优化难、训练部署问题多**\n",
"\n",
"直接使用开源算法或模型一般无法直接满足业务需求,实际业务场景中,OCR面临的问题多种多样,业务场景个性化往往需要自定义数据集重新训练,现有的开源项目上,实验各种优化方法的成本较高。此外,OCR应用场景十分丰富,服务端和各种移动端设备上都有着广泛的应用需求,硬件环境多样化就需要支持丰富的部署方式,而开源社区的项目更侧重算法和模型,在预测部署这部分明显支撑不足。要把OCR技术从论文上的算法做到技术落地应用,对开发者的算法和工程能力都有很高的要求。\n",
"\n",
"## 3.2 产业级OCR开发套件PaddleOCR\n",
"\n",
"OCR产业实践需要一套完整全流程的解决方案,来加快研发进度,节约宝贵的研发时间。也就是说,超轻量模型及其全流程解决方案,尤其对于算力、存储空间有限的移动端、嵌入式设备而言,可以说是刚需。\n",
"\n",
"在此背景下,产业级OCR开发套件[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)应运而生。\n",
"\n",
"PaddleOCR的建设思路从用户画像和需求出发,依托飞桨核心框架,精选并复现丰富的前沿算法,基于复现的算法研发更适用于产业落地的PP特色模型,并打通训推一体,提供多种预测部署方式,满足实际应用的不同需求场景。\n",
"\n",
"\n",
"<center>图18 PaddleOCR开发套件全景图</center>\n",
"\n",
"<br>\n",
"\n",
"从全景图可以看出,PaddleOCR依托于飞桨核心框架,在模型算法、预训练模型库、工业级部署等层面均提供了丰富的解决方案,并且提供了数据合成、半自动数据标注工具,满足开发者的数据生产需求。\n",
"\n",
"**在模型算法层面**,PaddleOCR对**文字检测识别**和**文档结构化分析**两类任务分别提供了解决方案。在文字检测识别方面,PaddleOCR复现或开源了4种文本检测算法、8种文本识别算法、1种端到端文本识别算法,并在此基础上研发了PP-OCR系列的通用文本检测识别解决方案;在文档结构化分析方面,PaddleOCR提供了版面分析、表格识别、关键信息抽取、命名实体识别等算法,并在此基础提出了PP-Structure文档分析解决方案。丰富的精选算法可以满足开发者不同业务场景的需求,代码框架的统一也方便开发者进行不同算法的优化和性能对比。\n",
"\n",
"**在预训练模型库层面**,基于PP-OCR和PP-Structure解决方案,PaddleOCR研发并开源了适用于产业实践的PP系列特色模型,包括通用、超轻量和多语言的文本检测识别模型,和复杂文档分析模型。PP系列特色模型均在原始算法上进行了深度优化,使其在效果和性能上均能达到产业实用级别,开发者既可以直接应用于业务场景,也可以用业务数据进行简单的finetune,便可以轻松研发出适用于自己业务需求的“实用模型”。\n",
"\n",
"**在工业级部署层面**,PaddleOCR提供了基于Paddle Inference的服务器端预测方案,基于Paddle Serving的服务化部署方案,以及基于Paddle-Lite的端侧部署方案,满足不同硬件环境下的部署需求,同时提供了基于PaddleSlim的模型压缩方案,可以进一步压缩模型大小。以上部署方式都完成了训推一体全流程打通,以保障开发者可以高效部署,稳定可靠。\n",
"\n",
"**在数据工具层面**,PaddleOCR提供了半自动数据标注工具PPOCRLabel和数据合成工具Style-Text,助力开发者更方便的生产模型训练所需的数据集和标注信息。PPOCRLabel作为业界首个开源的半自动OCR数据标注工具,针对标注过程枯燥繁琐、机械性高,大量训练数据所需人工标记,时间金钱成本昂贵的问题,内置PP-OCR模型实现预标注+人工校验的标注模式,可以极大提升标注效率,节省人力成本。数据合成工具Style-Text主要解决实际场景真实数据严重不足,传统合成算法无法合成文字风格(字体、颜色、间距、背景)的问题,只需要少许目标场景图像,就可以批量合成大量与目标场景风格相近的文本图像。\n",
"\n",
"\n",
"<center>图19 PPOCRLabel使用示意图</center>\n",
"\n",
"<br>\n",
"\n",
"\n",
"<center>图20 Style-Text合成效果示例</center>\n",
"\n",
"<br>\n",
"\n",
"### 3.2.1 PP-OCR与PP-Structrue\n",
"\n",
"PP系列特色模型是飞桨各视觉开发套件针对产业实践需求进行深度优化的模型,力求速度与精度平衡。PaddleOCR中的PP系列特色模型包括针对文字检测识别任务的PP-OCR系列模型和针对文档分析的PP-Structure系列模型。\n",
"\n",
"**(1)PP-OCR中英文模型**\n",
"\n",
"\n",
"\n",
"<center>图21 PP-OCR中英文模型识别结果示例</center>\n",
"\n",
"<br>\n",
"\n",
"PP-OCR中英文模型采用的典型的两阶段OCR算法,即检测模型+识别模型的组成方式,具体的算法框架如下:\n",
"\n",
"<center>图22 PP-OCR系统pipeline示意图</center>\n",
"\n",
"<br>\n",
"\n",
"可以看到,除输入输出外,PP-OCR核心框架包含了3个模块,分别是:文本检测模块、检测框矫正模块、文本识别模块。\n",
"- 文本检测模块:核心是一个基于[DB](https://arxiv.org/abs/1911.08947)检测算法训练的文本检测模型,检测出图像中的文字区域;\n",
"- 检测框矫正模块:将检测到的文本框输入检测框矫正模块,在这一阶段,将四点表示的文本框矫正为矩形框,方便后续进行文本识别,另一方面会进行文本方向判断和校正,例如如果判断文本行是倒立的情况,则会进行转正,该功能通过训练一个文本方向分类器实现;\n",
"- 文本识别模块:最后文本识别模块对矫正后的检测框进行文本识别,得到每个文本框内的文字内容,PP-OCR中使用的经典文本识别算法[CRNN](https://arxiv.org/abs/1507.05717)。\n",
"\n",
"PaddleOCR先后推出了PP-OCR[23]和PP-OCRv2[24]模型。\n",
"\n",
"PP-OCR模型分为mobile版(轻量版)和server版(通用版),其中mobile版模型主要基于轻量级骨干网络MobileNetV3进行优化,优化后模型(检测模型+文本方向分类模型+识别模型)大小仅8.1M,CPU上平均单张图像预测耗时350ms,T4 GPU上约110ms,裁剪量化后,可在精度不变的情况下进一步压缩到3.5M,便于端侧部署,在骁龙855上测试预测耗时仅260ms。更多的PP-OCR评估数据可参考[benchmark](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/benchmark.md)。\n",
"\n",
"PP-OCRv2保持了PP-OCR的整体框架,主要做了效果上的进一步策略优化。提升包括3个方面:\n",
"- 在模型效果上,相对于PP-OCR mobile版本提升超7%;\n",
"- 在速度上,相对于PP-OCR server版本提升超过220%;\n",
"- 在模型大小上,11.6M的总大小,服务器端和移动端都可以轻松部署。\n",
"\n",
"PP-OCR和PP-OCRv2的具体优化策略将在第四章中进行详细解读。\n",
"\n",
"除了中英文模型,PaddleOCR也基于不同的数据集训练并开源了英文数字模型、多语言识别模型,以上均为超轻量模型,适用于不同的语言场景。\n",
"\n",
"\n",
"<center>图23 PP-OCR的英文数字模型和多语言模型识别效果示意图</center>\n",
"\n",
"<br>\n",
"\n",
"**(2)PP-Structure文档分析模型**\n",
"\n",
"PP-Structure支持版面分析(layout analysis)、表格识别(table recognition)、文档视觉问答(DocVQA)三种子任务。\n",
"\n",
"PP-Structure核心功能点如下:\n",
"- 支持对图片形式的文档进行版面分析,可以划分文字、标题、表格、图片以及列表5类区域(与Layout-Parser联合使用)\n",
"- 支持文字、标题、图片以及列表区域提取为文字字段(与PP-OCR联合使用)\n",
"- 支持表格区域进行结构化分析,最终结果输出Excel文件\n",
"- 支持Python whl包和命令行两种方式,简单易用\n",
"- 支持版面分析和表格结构化两类任务自定义训练\n",
"- 支持VQA任务-SER和RE\n",
"\n",
"\n",
"<center>图24 PP-Structure系统示意图(本图仅含版面分析+表格识别)</center>\n",
"\n",
"<br>\n",
"\n",
"PP-Structure的具体方案将在第六章中进行详细解读。\n",
"\n",
"### 3.2.2 工业级部署方案\n",
"\n",
"飞桨支持全流程、全场景推理部署,模型来源主要分为三种,第一种使用PaddlePaddle API构建网络结构进行训练所得,第二种是基于飞桨套件系列,飞桨套件提供了丰富的模型库、简洁易用的API,具备开箱即用,包括视觉模型库PaddleCV、智能语音库PaddleSpeech以及自然语言处理库PaddleNLP等,第三种采用X2Paddle工具从第三方框架(PyTorh、ONNX、TensorFlow等)产出的模型。\n",
"\n",
"飞桨模型可以选用PaddleSlim工具进行压缩、量化以及蒸馏,支持五种部署方案,分别为服务化Paddle Serving、服务端/云端Paddle Inference、移动端/边缘端Paddle Lite、网页前端Paddle.js, 对于Paddle不支持的硬件,比如MCU、地平线、鲲云等国产芯片,可以借助Paddle2ONNX转化为支持ONNX的第三方框架。\n",
"\n",
"\n",
"<center>图25 飞桨支持部署方式</center>\n",
"\n",
"<br>\n",
"\n",
"Paddle Inference支持服务端和云端部署,具备高性能与通用性,针对不同平台和不同应用场景进行了深度的适配和优化,Paddle Inference是飞桨的原生推理库,保证模型在服务器端即训即用,快速部署,适用于高性能硬件上使用多种应用语言环境部署算法复杂的模型,硬件覆盖x86 CPU、Nvidia GPU、以及百度昆仑XPU、华为昇腾等AI加速器。\n",
"\n",
"Paddle Lite 是端侧推理引擎,具有轻量化和高性能特点,针对端侧设备和各应用场景进行了深度的设配和优化。当前支持Android、IOS、嵌入式Linux设备、macOS 等多个平台,硬件覆盖ARM CPU和GPU、X86 CPU和新硬件如百度昆仑、华为昇腾与麒麟、瑞芯微等。\n",
"\n",
"Paddle Serving是一套高性能服务框架,旨在帮助用户几个步骤快速将模型在云端服务化部署。目前Paddle Serving支持自定义前后处理、模型组合、模型热加载更新、多机多卡多模型、分布式推理、K8S部署、安全网关和模型加密部署、支持多语言多客户端访问等功能,Paddle Serving官方还提供了包括PaddleOCR在内的40多种模型的部署示例,以帮助用户更快上手。\n",
"\n",
"\n",
"<center>图26 飞桨支持部署方式</center>\n",
"\n",
"<br>\n",
"\n",
"以上部署方案将在第五章中基于PP-OCRv2模型进行详细解读与实战。"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 4. 总结\n",
"\n",
"本节首先介绍了OCR技术的应用场景和前沿算法,然后分析了OCR技术在产业实践中的难点与三大挑战。\n",
"\n",
"本教程后续章节内容安排如下:\n",
"\n",
"* 第二、三章分别介绍检测、识别技术并实践;\n",
"* 第四章介绍PP-OCR优化策略; \n",
"* 第五章进行预测部署实战; \n",
"* 第六章介绍文档结构化; \n",
"* 第七章介绍端到端、数据预处理、数据合成等其他OCR相关算法; \n",
"* 第八章介绍OCR相关数据集和数据合成工具。\n",
"\n",
"# 参考文献\n",
"\n",
"[1] Liao, Minghui, et al. \"Textboxes: A fast text detector with a single deep neural network.\" Thirty-first AAAI conference on artificial intelligence. 2017.\n",
"\n",
"[2] Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//European conference on computer vision. Springer, Cham, 2016: 21-37.\n",
"\n",
"[3] Tian, Zhi, et al. \"Detecting text in natural image with connectionist text proposal network.\" European conference on computer vision. Springer, Cham, 2016.\n",
"\n",
"[4] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[J]. Advances in neural information processing systems, 2015, 28: 91-99.\n",
"\n",
"[5] Zhou, Xinyu, et al. \"East: an efficient and accurate scene text detector.\" Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2017.\n",
"\n",
"[6] Wang, Wenhai, et al. \"Shape robust text detection with progressive scale expansion network.\" Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019.\n",
"\n",
"[7] Liao, Minghui, et al. \"Real-time scene text detection with differentiable binarization.\" Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 34. No. 07. 2020.\n",
"\n",
"[8] Deng, Dan, et al. \"Pixellink: Detecting scene text via instance segmentation.\" Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 32. No. 1. 2018.\n",
"\n",
"[9] He K, Gkioxari G, Dollár P, et al. Mask r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2961-2969.\n",
"\n",
"[10] Wang P, Zhang C, Qi F, et al. A single-shot arbitrarily-shaped text detector based on context attended multi-task \n",
"learning[C]//Proceedings of the 27th ACM international conference on multimedia. 2019: 1277-1285.\n",
"\n",
"[11] Shi, B., Bai, X., & Yao, C. (2016). An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition. IEEE transactions on pattern analysis and machine intelligence, 39(11), 2298-2304.\n",
"\n",
"[12] Star-Net Max Jaderberg, Karen Simonyan, Andrew Zisserman, et al. Spa- tial transformer networks. In Advances in neural information processing systems, pages 2017–2025, 2015.\n",
"\n",
"[13] Shi, B., Wang, X., Lyu, P., Yao, C., & Bai, X. (2016). Robust scene text recognition with automatic rectification. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4168-4176).\n",
"\n",
"[14] Sheng, F., Chen, Z., & Xu, B. (2019, September). NRTR: A no-recurrence sequence-to-sequence model for scene text recognition. In 2019 International Conference on Document Analysis and Recognition (ICDAR) (pp. 781-786). IEEE.\n",
"\n",
"[15] Lyu P, Liao M, Yao C, et al. Mask textspotter: An end-to-end trainable neural network for spotting text with arbitrary shapes[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 67-83.\n",
"\n",
"[16] Soto C, Yoo S. Visual detection with context for document layout analysis[C]//Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP). 2019: 3464-3470.\n",
"\n",
"[17] Sarkar M, Aggarwal M, Jain A, et al. Document Structure Extraction using Prior based High Resolution Hierarchical Semantic Segmentation[C]//European Conference on Computer Vision. Springer, Cham, 2020: 649-666.\n",
"\n",
"[18] Kieninger T, Dengel A. A paper-to-HTML table converting system[C]//Proceedings of document analysis systems (DAS). 1998, 98: 356-365.\n",
"\n",
"[19] Siddiqui S A, Fateh I A, Rizvi S T R, et al. Deeptabstr: Deep learning based table structure recognition[C]//2019 International Conference on Document Analysis and Recognition (ICDAR). IEEE, 2019: 1403-1409.\n",
"\n",
"[20] Raja S, Mondal A, Jawahar C V. Table structure recognition using top-down and bottom-up cues[C]//European Conference on Computer Vision. Springer, Cham, 2020: 70-86.\n",
"\n",
"[21] Xue W, Yu B, Wang W, et al. TGRNet: A Table Graph Reconstruction Network for Table Structure Recognition[J]. arXiv preprint arXiv:2106.10598, 2021.\n",
"\n",
"[22] Ye J, Qi X, He Y, et al. PingAn-VCGroup's Solution for ICDAR 2021 Competition on Scientific Literature Parsing Task B: Table Recognition to HTML[J]. arXiv preprint arXiv:2105.01848, 2021.\n",
"\n",
"[23] Du Y, Li C, Guo R, et al. PP-OCR: A practical ultra lightweight OCR system[J]. arXiv preprint arXiv:2009.09941, 2020.\n",
"\n",
"[24] Du Y, Li C, Guo R, et al. PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System[J]. arXiv preprint arXiv:2109.03144, 2021.\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: notebook_ch/1.introduction/OCR技术导论.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"\n",
"*注:以上图片来自网络*\n",
"\n",
"# 1. OCR技术背景\n",
"## 1.1 OCR技术的应用场景\n",
"\n",
"* **<font color=red>OCR是什么</font>**\n",
"\n",
"OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一。传统定义的OCR一般面向扫描文档类对象,现在我们常说的OCR一般指场景文字识别(Scene Text Recognition,STR),主要面向自然场景,如下图中所示的牌匾等各种自然场景可见的文字。\n",
"\n",
"\n",
"<center>图1 文档场景文字识别 VS. 自然场景文字识别</center>\n",
"\n",
"<br>\n",
"\n",
"* **<font color=red>OCR有哪些应用场景?</font>**\n",
"\n",
"OCR技术有着丰富的应用场景,一类典型的场景是日常生活中广泛应用的面向垂类的结构化文本识别,比如车牌识别、银行卡信息识别、身份证信息识别、火车票信息识别等等。这些小垂类的共同特点是格式固定,因此非常适合使用OCR技术进行自动化,可以极大的减轻人力成本,提升效率。\n",
"\n",
"这种面向垂类的结构化文本识别是目前ocr应用最广泛、并且技术相对较成熟的场景。\n",
"\n",
"\n",
"<center>图2 OCR技术的应用场景</center>\n",
"\n",
"除了面向垂类的结构化文本识别,通用OCR技术也有广泛的应用,并且常常和其他技术结合完成多模态任务,例如在视频场景中,经常使用OCR技术进行字幕自动翻译、内容安全监控等等,或者与视觉特征相结合,完成视频理解、视频搜索等任务。\n",
"\n",
"\n",
"<center>图3 多模态场景中的通用OCR</center>\n",
"\n",
"## 1.2 OCR技术挑战\n",
"OCR的技术难点可以分为算法层和应用层两方面。\n",
"\n",
"* **<font color=red>算法层</font>**\n",
"\n",
"OCR丰富的应用场景,决定了它会存在很多技术难点。这里给出了常见的8种问题:\n",
"\n",
"\n",
"<center>图4 OCR算法层技术难点</center>\n",
"\n",
"这些问题给文本检测和文本识别都带来了巨大的技术挑战,可以看到,这些挑战主要都是面向自然场景,目前学术界的研究也主要聚焦在自然场景,OCR领域在学术上的常用数据集也都是自然场景。针对这些问题的研究很多,相对来说,识别比检测面临更大的挑战。\n",
"\n",
"* **<font color=red>应用层</font>**\n",
"\n",
"在实际应用中,尤其是在广泛的通用场景下,除了上一节总结的仿射变换、尺度问题、光照不足、拍摄模糊等算法层面的技术难点,OCR技术还面临两大落地难点:\n",
"1. **海量数据要求OCR能够实时处理。** OCR应用常对接海量数据,我们要求或希望数据能够得到实时处理,模型的速度做到实时是一个不小的挑战。\n",
"2. **端侧应用要求OCR模型足够轻量,识别速度足够快。** OCR应用常部署在移动端或嵌入式硬件,端侧OCR应用一般有两种模式:上传到服务器 vs. 端侧直接识别,考虑到上传到服务器的方式对网络有要求,实时性较低,并且请求量过大时服务器压力大,以及数据传输的安全性问题,我们希望能够直接在端侧完成OCR识别,而端侧的存储空间和计算能力有限,因此对OCR模型的大小和预测速度有很高的要求。\n",
"\n",
"\n",
"<center>图5 OCR应用层技术难点</center>\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"# 2. OCR前沿算法\n",
"\n",
"虽然OCR是一个相对具体的任务,但涉及了多方面的技术,包括文本检测、文本识别、端到端文本识别、文档分析等等。学术上关于OCR各项相关技术的研究层出不穷,下文将简要介绍OCR任务中的几种关键技术的相关工作。\n",
"\n",
"## 2.1 文本检测\n",
"\n",
"文本检测的任务是定位出输入图像中的文字区域。近年来学术界关于文本检测的研究非常丰富,一类方法将文本检测视为目标检测中的一个特定场景,基于通用目标检测算法进行改进适配,如TextBoxes[1]基于一阶段目标检测器SSD[2]算法,调整目标框使之适合极端长宽比的文本行,CTPN[3]则是基于Faster RCNN[4]架构改进而来。但是文本检测与目标检测在目标信息以及任务本身上仍存在一些区别,如文本一般长宽比较大,往往呈“条状”,文本行之间可能比较密集,弯曲文本等,因此又衍生了很多专用于文本检测的算法,如EAST[5]、PSENet[6]、DBNet[7]等等。\n",
"\n",
"<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/548b50212935402abb2e671c158c204737c2c64b9464442a8f65192c8a31b44d\" width=\"500\"></center>\n",
"<center>图6 文本检测任务示例</center>\n",
"\n",
"<br>\n",
"\n",
"目前较为流行的文本检测算法可以大致分为**基于回归**和**基于分割**的两大类文本检测算法,也有一些算法将二者相结合。基于回归的算法借鉴通用物体检测算法,通过设定anchor回归检测框,或者直接做像素回归,这类方法对规则形状文本检测效果较好,但是对不规则形状的文本检测效果会相对差一些,比如CTPN[3]对水平文本的检测效果较好,但对倾斜、弯曲文本的检测效果较差,SegLink[8]对长文本比较好,但对分布稀疏的文本效果较差;基于分割的算法引入了Mask-RCNN[9],这类算法在各种场景、对各种形状文本的检测效果都可以达到一个更高的水平,但缺点就是后处理一般会比较复杂,因此常常存在速度问题,并且无法解决重叠文本的检测问题。\n",
"\n",
"<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/4f4ea65578384900909efff93d0b7386e86ece144d8c4677b7bc94b4f0337cfb\" width=\"800\"></center>\n",
"<center>图7 文本检测算法概览</center>\n",
"\n",
"<br>\n",
"\n",
"||\n",
"|---|---|---|\n",
"<center>图8 (左)基于回归的CTPN[3]算法优化anchor (中)基于分割的DB[7]算法优化后处理 (右)回归+分割的SAST[10]算法</center>\n",
"\n",
"<br>\n",
"\n",
"文本检测相关技术将在第二章进行详细解读和实战。\n",
"\n",
"## 2.2 文本识别\n",
"\n",
"文本识别的任务是识别出图像中的文字内容,一般输入来自于文本检测得到的文本框截取出的图像文字区域。文本识别一般可以根据待识别文本形状分为**规则文本识别**和**不规则文本识别**两大类。规则文本主要指印刷字体、扫描文本等,文本大致处在水平线位置;不规则文本往往不在水平位置,存在弯曲、遮挡、模糊等问题。不规则文本场景具有很大的挑战性,也是目前文本识别领域的主要研究方向。\n",
"\n",
"\n",
"<center>图9 (左)规则文本 VS. (右)不规则文本</center>\n",
"\n",
"<br>\n",
"\n",
"规则文本识别的算法根据解码方式的不同可以大致分为基于CTC和Sequence2Sequence两种,将网络学习到的序列特征 转化为 最终的识别结果 的处理方式不同。基于CTC的算法以经典的CRNN[11]为代表。\n",
"\n",
"\n",
"<center>图10 基于CTC的识别算法 VS. 基于Attention的识别算法</center>\n",
"\n",
"不规则文本的识别算法相比更为丰富,如STAR-Net[12]等方法通过加入TPS等矫正模块,将不规则文本矫正为规则的矩形后再进行识别;RARE[13]等基于Attention的方法增强了对序列之间各部分相关性的关注;基于分割的方法将文本行的各字符作为独立个体,相比与对整个文本行做矫正后识别,识别分割出的单个字符更加容易;此外,随着近年来Transfomer[14]的快速发展和在各类任务中的有效性验证,也出现了一批基于Transformer的文本识别算法,这类方法利用transformer结构解决CNN在长依赖建模上的局限性问题,也取得了不错的效果。\n",
"\n",
"\n",
"<center>图11 基于字符分割的识别算法[15]</center>\n",
"\n",
"<br>\n",
"\n",
"文本识别相关技术将在第三章进行详细解读和实战。\n",
"\n",
"## 2.3 文档结构化识别\n",
"\n",
"传统意义上的OCR技术可以解决文字的检测和识别需求,但在实际应用场景中,最终需要获取的往往是结构化的信息,如身份证、发票的信息格式化抽取,表格的结构化识别等等,多在快递单据抽取、合同内容比对、金融保理单信息比对、物流业单据识别等场景下应用。OCR结果+后处理是一种常用的结构化方案,但流程往往比较复杂,并且后处理需要精细设计,泛化性也比较差。在OCR技术逐渐成熟、结构化信息抽取需求日益旺盛的背景下,版面分析、表格识别、关键信息提取等关于智能文档分析的各种技术受到了越来越多的关注和研究。\n",
"\n",
"* **版面分析**\n",
"\n",
"版面分析(Layout Analysis)主要是对文档图像进行内容分类,类别一般可分为纯文本、标题、表格、图片等。现有方法一般将文档中不同的板式当做不同的目标进行检测或分割,如Soto Carlos[16]在目标检测算法Faster R-CNN的基础上,结合上下文信息并利用文档内容的固有位置信息来提高区域检测性能;Sarkar Mausoom[17]等人提出了一种基于先验的分割机制,在非常高的分辨率的图像上训练文档分割模型,解决了过度缩小原始图像导致的密集区域不同结构无法区分进而合并的问题。\n",
"\n",
"\n",
"<center>图12 版面分析任务示意图</center>\n",
"\n",
"<br>\n",
"\n",
"* **表格识别**\n",
"\n",
"表格识别(Table Recognition)的任务就是将文档里的表格信息进行识别和转换到excel文件中。文本图像中表格种类和样式复杂多样,例如不同的行列合并,不同的内容文本类型等,除此之外文档的样式和拍摄时的光照环境等都为表格识别带来了极大的挑战。这些挑战使得表格识别一直是文档理解领域的研究难点。\n",
"\n",
"\n",
"\n",
"<center>图13 表格识别任务示意图</center>\n",
"\n",
"<br>\n",
"\n",
"表格识别的方法种类较为丰富,早期的基于启发式规则的传统算法,如Kieninger[18]等人提出的T-Rect等算法,一般通过人工设计规则,连通域检测分析处理;近年来随着深度学习的发展,开始涌现一些基于CNN的表格结构识别算法,如Siddiqui Shoaib Ahmed[19]等人提出的DeepTabStR,Raja Sachin[20]等人提出的TabStruct-Net等;此外,随着图神经网络(Graph Neural Network)的兴起,也有一些研究者尝试将图神经网络应用到表格结构识别问题上,基于图神经网络,将表格识别看作图重建问题,如Xue Wenyuan[21]等人提出的TGRNet;基于端到端的方法直接使用网络完成表格结构的HTML表示输出,端到端的方法大多采用Seq2Seq方法来完成表格结构的预测,如一些基于Attention或Transformer的方法,如TableMaster[22]。\n",
"\n",
"\n",
"<center>图14 表格识别方法示意图</center>\n",
"\n",
"<br>\n",
"\n",
"* **关键信息提取**\n",
"\n",
"关键信息提取(Key Information Extraction,KIE)是Document VQA中的一个重要任务,主要从图像中提取所需要的关键信息,如从身份证中提取出姓名和公民身份号码信息,这类信息的种类往往在特定任务下是固定的,但是在不同任务间是不同的。\n",
"\n",
"\n",
"<center>图15 DocVQA任务示意图</center>\n",
"\n",
"<br>\n",
"\n",
"KIE通常分为两个子任务进行研究:\n",
"\n",
"- SER: 语义实体识别 (Semantic Entity Recognition),对每一个检测到的文本进行分类,如将其分为姓名,身份证。如下图中的黑色框和红色框。\n",
"- RE: 关系抽取 (Relation Extraction),对每一个检测到的文本进行分类,如将其分为问题和的答案。然后对每一个问题找到对应的答案。如下图中的红色框和黑色框分别代表问题和答案,黄色线代表问题和答案之间的对应关系。\n",
"\n",
"\n",
"<center>图16 ser与re任务</center>\n",
"\n",
"<br>\n",
"\n",
"一般的KIE方法基于命名实体识别(Named Entity Recognition,NER)[4]来研究,但是这类方法只利用了图像中的文本信息,缺少对视觉和结构信息的使用,因此精度不高。在此基础上,近几年的方法都开始将视觉和结构信息与文本信息融合到一起,按照对多模态信息进行融合时所采用的原理可以将这些方法分为下面四种:\n",
"\n",
"- 基于Grid的方法\n",
"- 基于Token的方法\n",
"- 基于GCN的方法\n",
"- 基于End to End 的方法\n",
"\n",
"<br>\n",
"\n",
"文档分析相关技术将在第六章进行详细解读和实战。\n",
"\n",
"## 2.4 其他相关技术\n",
"\n",
"前面主要介绍了OCR领域的三种关键技术:文本检测、文本识别、文档结构化识别,更多其他OCR相关前沿技术介绍,包括端到端文本识别、OCR中的图像预处理技术、OCR数据合成等,可参考教程第七章和第八章。\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"# 3. OCR技术的产业实践\n",
"\n",
"\n",
"\n",
"> 你是小王,该怎么办? \n",
"> 1. 我不会,我不行,我不干了😭\n",
"> 2. 建议老板找外包公司或者商业化方案,反正花老板的钱😊\n",
"> 3. 网上找找类似项目,面向Github编程😏\n",
"\n",
"<br>\n",
"\n",
"OCR技术最终还是要落到产业实践当中。虽然学术上关于OCR技术的研究很多,OCR技术的商业化应用相比于其他AI技术也已经相对成熟,但在实际的产业应用中,还是存在一些难点与挑战。下文将从技术和产业实践两个角度进行分析。\n",
"\n",
"\n",
"## 3.1 产业实践难点\n",
"\n",
"在实际的产业实践中,开发者常常需要依托开源社区资源启动或推进项目,而开发者使用开源模型又往往面临三大难题:\n",
"\n",
"<center>图17 OCR技术产业实践三大难题</center>\n",
"\n",
"**1. 找不到、选不出**\n",
"\n",
"开源社区资源丰富,但是信息不对称导致开发者并不能高效地解决痛点问题。一方面,开源社区资源过于丰富,开发者面对一项需求,无法快速从海量的代码仓库中找到匹配业务需求的项目,即存在“找不到”的问题;另一方面,在算法选型时,英文公开数据集上的指标,无法给开发者常常面对的中文场景提供直接的参考,逐个算法验证需要耗费大量时间和人力,且不能保证选出最合适的算法,即“选不出”。\n",
"\n",
"**2. 不适用产业场景**\n",
"\n",
"开源社区中的工作往往更多地偏向效果优化,如学术论文代码开源或复现,一般更侧重算法效果,平衡考虑模型大小和速度的工作相比就少很多,而模型大小和预测耗时在产业实践中是两项不容忽视的指标,其重要程度不亚于模型效果。无论是移动端和服务器端,待识别的图像数目往往非常多,都希望模型更小,精度更高,预测速度更快。GPU太贵,最好使用CPU跑起来更经济。在满足业务需求的前提下,模型越轻量占用的资源越少。\n",
"\n",
"**3. 优化难、训练部署问题多**\n",
"\n",
"直接使用开源算法或模型一般无法直接满足业务需求,实际业务场景中,OCR面临的问题多种多样,业务场景个性化往往需要自定义数据集重新训练,现有的开源项目上,实验各种优化方法的成本较高。此外,OCR应用场景十分丰富,服务端和各种移动端设备上都有着广泛的应用需求,硬件环境多样化就需要支持丰富的部署方式,而开源社区的项目更侧重算法和模型,在预测部署这部分明显支撑不足。要把OCR技术从论文上的算法做到技术落地应用,对开发者的算法和工程能力都有很高的要求。\n",
"\n",
"## 3.2 产业级OCR开发套件PaddleOCR\n",
"\n",
"OCR产业实践需要一套完整全流程的解决方案,来加快研发进度,节约宝贵的研发时间。也就是说,超轻量模型及其全流程解决方案,尤其对于算力、存储空间有限的移动端、嵌入式设备而言,可以说是刚需。\n",
"\n",
"在此背景下,产业级OCR开发套件[PaddleOCR](https://github.com/PaddlePaddle/PaddleOCR)应运而生。\n",
"\n",
"PaddleOCR的建设思路从用户画像和需求出发,依托飞桨核心框架,精选并复现丰富的前沿算法,基于复现的算法研发更适用于产业落地的PP特色模型,并打通训推一体,提供多种预测部署方式,满足实际应用的不同需求场景。\n",
"\n",
"\n",
"<center>图18 PaddleOCR开发套件全景图</center>\n",
"\n",
"<br>\n",
"\n",
"从全景图可以看出,PaddleOCR依托于飞桨核心框架,在模型算法、预训练模型库、工业级部署等层面均提供了丰富的解决方案,并且提供了数据合成、半自动数据标注工具,满足开发者的数据生产需求。\n",
"\n",
"**在模型算法层面**,PaddleOCR对**文字检测识别**和**文档结构化分析**两类任务分别提供了解决方案。在文字检测识别方面,PaddleOCR复现或开源了4种文本检测算法、8种文本识别算法、1种端到端文本识别算法,并在此基础上研发了PP-OCR系列的通用文本检测识别解决方案;在文档结构化分析方面,PaddleOCR提供了版面分析、表格识别、关键信息抽取、命名实体识别等算法,并在此基础提出了PP-Structure文档分析解决方案。丰富的精选算法可以满足开发者不同业务场景的需求,代码框架的统一也方便开发者进行不同算法的优化和性能对比。\n",
"\n",
"**在预训练模型库层面**,基于PP-OCR和PP-Structure解决方案,PaddleOCR研发并开源了适用于产业实践的PP系列特色模型,包括通用、超轻量和多语言的文本检测识别模型,和复杂文档分析模型。PP系列特色模型均在原始算法上进行了深度优化,使其在效果和性能上均能达到产业实用级别,开发者既可以直接应用于业务场景,也可以用业务数据进行简单的finetune,便可以轻松研发出适用于自己业务需求的“实用模型”。\n",
"\n",
"**在工业级部署层面**,PaddleOCR提供了基于Paddle Inference的服务器端预测方案,基于Paddle Serving的服务化部署方案,以及基于Paddle-Lite的端侧部署方案,满足不同硬件环境下的部署需求,同时提供了基于PaddleSlim的模型压缩方案,可以进一步压缩模型大小。以上部署方式都完成了训推一体全流程打通,以保障开发者可以高效部署,稳定可靠。\n",
"\n",
"**在数据工具层面**,PaddleOCR提供了半自动数据标注工具PPOCRLabel和数据合成工具Style-Text,助力开发者更方便的生产模型训练所需的数据集和标注信息。PPOCRLabel作为业界首个开源的半自动OCR数据标注工具,针对标注过程枯燥繁琐、机械性高,大量训练数据所需人工标记,时间金钱成本昂贵的问题,内置PP-OCR模型实现预标注+人工校验的标注模式,可以极大提升标注效率,节省人力成本。数据合成工具Style-Text主要解决实际场景真实数据严重不足,传统合成算法无法合成文字风格(字体、颜色、间距、背景)的问题,只需要少许目标场景图像,就可以批量合成大量与目标场景风格相近的文本图像。\n",
"\n",
"\n",
"<center>图19 PPOCRLabel使用示意图</center>\n",
"\n",
"<br>\n",
"\n",
"\n",
"<center>图20 Style-Text合成效果示例</center>\n",
"\n",
"<br>\n",
"\n",
"### 3.2.1 PP-OCR与PP-Structrue\n",
"\n",
"PP系列特色模型是飞桨各视觉开发套件针对产业实践需求进行深度优化的模型,力求速度与精度平衡。PaddleOCR中的PP系列特色模型包括针对文字检测识别任务的PP-OCR系列模型和针对文档分析的PP-Structure系列模型。\n",
"\n",
"**(1)PP-OCR中英文模型**\n",
"\n",
"\n",
"\n",
"<center>图21 PP-OCR中英文模型识别结果示例</center>\n",
"\n",
"<br>\n",
"\n",
"PP-OCR中英文模型采用的典型的两阶段OCR算法,即检测模型+识别模型的组成方式,具体的算法框架如下:\n",
"\n",
"<center>图22 PP-OCR系统pipeline示意图</center>\n",
"\n",
"<br>\n",
"\n",
"可以看到,除输入输出外,PP-OCR核心框架包含了3个模块,分别是:文本检测模块、检测框矫正模块、文本识别模块。\n",
"- 文本检测模块:核心是一个基于[DB](https://arxiv.org/abs/1911.08947)检测算法训练的文本检测模型,检测出图像中的文字区域;\n",
"- 检测框矫正模块:将检测到的文本框输入检测框矫正模块,在这一阶段,将四点表示的文本框矫正为矩形框,方便后续进行文本识别,另一方面会进行文本方向判断和校正,例如如果判断文本行是倒立的情况,则会进行转正,该功能通过训练一个文本方向分类器实现;\n",
"- 文本识别模块:最后文本识别模块对矫正后的检测框进行文本识别,得到每个文本框内的文字内容,PP-OCR中使用的经典文本识别算法[CRNN](https://arxiv.org/abs/1507.05717)。\n",
"\n",
"PaddleOCR先后推出了PP-OCR[23]和PP-OCRv2[24]模型。\n",
"\n",
"PP-OCR模型分为mobile版(轻量版)和server版(通用版),其中mobile版模型主要基于轻量级骨干网络MobileNetV3进行优化,优化后模型(检测模型+文本方向分类模型+识别模型)大小仅8.1M,CPU上平均单张图像预测耗时350ms,T4 GPU上约110ms,裁剪量化后,可在精度不变的情况下进一步压缩到3.5M,便于端侧部署,在骁龙855上测试预测耗时仅260ms。更多的PP-OCR评估数据可参考[benchmark](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/benchmark.md)。\n",
"\n",
"PP-OCRv2保持了PP-OCR的整体框架,主要做了效果上的进一步策略优化。提升包括3个方面:\n",
"- 在模型效果上,相对于PP-OCR mobile版本提升超7%;\n",
"- 在速度上,相对于PP-OCR server版本提升超过220%;\n",
"- 在模型大小上,11.6M的总大小,服务器端和移动端都可以轻松部署。\n",
"\n",
"PP-OCR和PP-OCRv2的具体优化策略将在第四章中进行详细解读。\n",
"\n",
"除了中英文模型,PaddleOCR也基于不同的数据集训练并开源了英文数字模型、多语言识别模型,以上均为超轻量模型,适用于不同的语言场景。\n",
"\n",
"\n",
"<center>图23 PP-OCR的英文数字模型和多语言模型识别效果示意图</center>\n",
"\n",
"<br>\n",
"\n",
"**(2)PP-Structure文档分析模型**\n",
"\n",
"PP-Structure支持版面分析(layout analysis)、表格识别(table recognition)、文档视觉问答(DocVQA)三种子任务。\n",
"\n",
"PP-Structure核心功能点如下:\n",
"- 支持对图片形式的文档进行版面分析,可以划分文字、标题、表格、图片以及列表5类区域(与Layout-Parser联合使用)\n",
"- 支持文字、标题、图片以及列表区域提取为文字字段(与PP-OCR联合使用)\n",
"- 支持表格区域进行结构化分析,最终结果输出Excel文件\n",
"- 支持Python whl包和命令行两种方式,简单易用\n",
"- 支持版面分析和表格结构化两类任务自定义训练\n",
"- 支持VQA任务-SER和RE\n",
"\n",
"\n",
"<center>图24 PP-Structure系统示意图(本图仅含版面分析+表格识别)</center>\n",
"\n",
"<br>\n",
"\n",
"PP-Structure的具体方案将在第六章中进行详细解读。\n",
"\n",
"### 3.2.2 工业级部署方案\n",
"\n",
"飞桨支持全流程、全场景推理部署,模型来源主要分为三种,第一种使用PaddlePaddle API构建网络结构进行训练所得,第二种是基于飞桨套件系列,飞桨套件提供了丰富的模型库、简洁易用的API,具备开箱即用,包括视觉模型库PaddleCV、智能语音库PaddleSpeech以及自然语言处理库PaddleNLP等,第三种采用X2Paddle工具从第三方框架(PyTorh、ONNX、TensorFlow等)产出的模型。\n",
"\n",
"飞桨模型可以选用PaddleSlim工具进行压缩、量化以及蒸馏,支持五种部署方案,分别为服务化Paddle Serving、服务端/云端Paddle Inference、移动端/边缘端Paddle Lite、网页前端Paddle.js, 对于Paddle不支持的硬件,比如MCU、地平线、鲲云等国产芯片,可以借助Paddle2ONNX转化为支持ONNX的第三方框架。\n",
"\n",
"\n",
"<center>图25 飞桨支持部署方式</center>\n",
"\n",
"<br>\n",
"\n",
"Paddle Inference支持服务端和云端部署,具备高性能与通用性,针对不同平台和不同应用场景进行了深度的适配和优化,Paddle Inference是飞桨的原生推理库,保证模型在服务器端即训即用,快速部署,适用于高性能硬件上使用多种应用语言环境部署算法复杂的模型,硬件覆盖x86 CPU、Nvidia GPU、以及百度昆仑XPU、华为昇腾等AI加速器。\n",
"\n",
"Paddle Lite 是端侧推理引擎,具有轻量化和高性能特点,针对端侧设备和各应用场景进行了深度的设配和优化。当前支持Android、IOS、嵌入式Linux设备、macOS 等多个平台,硬件覆盖ARM CPU和GPU、X86 CPU和新硬件如百度昆仑、华为昇腾与麒麟、瑞芯微等。\n",
"\n",
"Paddle Serving是一套高性能服务框架,旨在帮助用户几个步骤快速将模型在云端服务化部署。目前Paddle Serving支持自定义前后处理、模型组合、模型热加载更新、多机多卡多模型、分布式推理、K8S部署、安全网关和模型加密部署、支持多语言多客户端访问等功能,Paddle Serving官方还提供了包括PaddleOCR在内的40多种模型的部署示例,以帮助用户更快上手。\n",
"\n",
"\n",
"<center>图26 飞桨支持部署方式</center>\n",
"\n",
"<br>\n",
"\n",
"以上部署方案将在第五章中基于PP-OCRv2模型进行详细解读与实战。"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": false
},
"source": [
"# 4. 总结\n",
"\n",
"本节首先介绍了OCR技术的应用场景和前沿算法,然后分析了OCR技术在产业实践中的难点与三大挑战。\n",
"\n",
"本教程后续章节内容安排如下:\n",
"\n",
"* 第二、三章分别介绍检测、识别技术并实践;\n",
"* 第四章介绍PP-OCR优化策略; \n",
"* 第五章进行预测部署实战; \n",
"* 第六章介绍文档结构化; \n",
"* 第七章介绍端到端、数据预处理、数据合成等其他OCR相关算法; \n",
"* 第八章介绍OCR相关数据集和数据合成工具。\n",
"\n",
"# 参考文献\n",
"\n",
"[1] Liao, Minghui, et al. \"Textboxes: A fast text detector with a single deep neural network.\" Thirty-first AAAI conference on artificial intelligence. 2017.\n",
"\n",
"[2] Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//European conference on computer vision. Springer, Cham, 2016: 21-37.\n",
"\n",
"[3] Tian, Zhi, et al. \"Detecting text in natural image with connectionist text proposal network.\" European conference on computer vision. Springer, Cham, 2016.\n",
"\n",
"[4] Ren S, He K, Girshick R, et al. Faster r-cnn: Towards real-time object detection with region proposal networks[J]. Advances in neural information processing systems, 2015, 28: 91-99.\n",
"\n",
"[5] Zhou, Xinyu, et al. \"East: an efficient and accurate scene text detector.\" Proceedings of the IEEE conference on Computer Vision and Pattern Recognition. 2017.\n",
"\n",
"[6] Wang, Wenhai, et al. \"Shape robust text detection with progressive scale expansion network.\" Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2019.\n",
"\n",
"[7] Liao, Minghui, et al. \"Real-time scene text detection with differentiable binarization.\" Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 34. No. 07. 2020.\n",
"\n",
"[8] Deng, Dan, et al. \"Pixellink: Detecting scene text via instance segmentation.\" Proceedings of the AAAI Conference on Artificial Intelligence. Vol. 32. No. 1. 2018.\n",
"\n",
"[9] He K, Gkioxari G, Dollár P, et al. Mask r-cnn[C]//Proceedings of the IEEE international conference on computer vision. 2017: 2961-2969.\n",
"\n",
"[10] Wang P, Zhang C, Qi F, et al. A single-shot arbitrarily-shaped text detector based on context attended multi-task \n",
"learning[C]//Proceedings of the 27th ACM international conference on multimedia. 2019: 1277-1285.\n",
"\n",
"[11] Shi, B., Bai, X., & Yao, C. (2016). An end-to-end trainable neural network for image-based sequence recognition and its application to scene text recognition. IEEE transactions on pattern analysis and machine intelligence, 39(11), 2298-2304.\n",
"\n",
"[12] Star-Net Max Jaderberg, Karen Simonyan, Andrew Zisserman, et al. Spa- tial transformer networks. In Advances in neural information processing systems, pages 2017–2025, 2015.\n",
"\n",
"[13] Shi, B., Wang, X., Lyu, P., Yao, C., & Bai, X. (2016). Robust scene text recognition with automatic rectification. In Proceedings of the IEEE conference on computer vision and pattern recognition (pp. 4168-4176).\n",
"\n",
"[14] Sheng, F., Chen, Z., & Xu, B. (2019, September). NRTR: A no-recurrence sequence-to-sequence model for scene text recognition. In 2019 International Conference on Document Analysis and Recognition (ICDAR) (pp. 781-786). IEEE.\n",
"\n",
"[15] Lyu P, Liao M, Yao C, et al. Mask textspotter: An end-to-end trainable neural network for spotting text with arbitrary shapes[C]//Proceedings of the European Conference on Computer Vision (ECCV). 2018: 67-83.\n",
"\n",
"[16] Soto C, Yoo S. Visual detection with context for document layout analysis[C]//Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP). 2019: 3464-3470.\n",
"\n",
"[17] Sarkar M, Aggarwal M, Jain A, et al. Document Structure Extraction using Prior based High Resolution Hierarchical Semantic Segmentation[C]//European Conference on Computer Vision. Springer, Cham, 2020: 649-666.\n",
"\n",
"[18] Kieninger T, Dengel A. A paper-to-HTML table converting system[C]//Proceedings of document analysis systems (DAS). 1998, 98: 356-365.\n",
"\n",
"[19] Siddiqui S A, Fateh I A, Rizvi S T R, et al. Deeptabstr: Deep learning based table structure recognition[C]//2019 International Conference on Document Analysis and Recognition (ICDAR). IEEE, 2019: 1403-1409.\n",
"\n",
"[20] Raja S, Mondal A, Jawahar C V. Table structure recognition using top-down and bottom-up cues[C]//European Conference on Computer Vision. Springer, Cham, 2020: 70-86.\n",
"\n",
"[21] Xue W, Yu B, Wang W, et al. TGRNet: A Table Graph Reconstruction Network for Table Structure Recognition[J]. arXiv preprint arXiv:2106.10598, 2021.\n",
"\n",
"[22] Ye J, Qi X, He Y, et al. PingAn-VCGroup's Solution for ICDAR 2021 Competition on Scientific Literature Parsing Task B: Table Recognition to HTML[J]. arXiv preprint arXiv:2105.01848, 2021.\n",
"\n",
"[23] Du Y, Li C, Guo R, et al. PP-OCR: A practical ultra lightweight OCR system[J]. arXiv preprint arXiv:2009.09941, 2020.\n",
"\n",
"[24] Du Y, Li C, Guo R, et al. PP-OCRv2: Bag of Tricks for Ultra Lightweight OCR System[J]. arXiv preprint arXiv:2109.03144, 2021.\n",
"\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "py35-paddle1.2.0"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.4"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: notebook_ch/2.text_detection/.ipynb_checkpoints/文本检测FAQ-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 文本检测FAQ\n",
"\n",
"本节罗列一些开发者们使用PaddleOCR的文本检测模型常遇到的一些问题,并给出相应的问题解决方法或建议。\n",
"\n",
"FAQ分两个部分来介绍,分别是:\n",
" - 文本检测训练相关\n",
" - 文本检测预测相关"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 1. 文本检测训练相关FAQ\n",
"\n",
"**1.1 PaddleOCR提供的文本检测算法包括哪些?**\n",
"\n",
"**A**:PaddleOCR中包含多种文本检测模型,包括基于回归的文本检测方法EAST、SAST,和基于分割的文本检测方法DB,PSENet。\n",
"\n",
"\n",
"**1.2:请问PaddleOCR项目中的中文超轻量和通用模型用了哪些数据集?训练多少样本,gpu什么配置,跑了多少个epoch,大概跑了多久?**\n",
"\n",
"**A**:对于超轻量DB检测模型,训练数据包括开源数据集lsvt,rctw,CASIA,CCPD,MSRA,MLT,BornDigit,iflytek,SROIE和合成的数据集等,总数据量越10W,数据集分为5个部分,训练时采用随机采样策略,在4卡V100GPU上约训练500epoch,耗时3天。\n",
"\n",
"\n",
"**1.3 文本检测训练标签是否需要具体文本标注,标签中的”###”是什么意思?**\n",
"\n",
"**A**:文本检测训练只需要文本区域的坐标即可,标注可以是四点或者十四点,按照左上,右上,右下,左下的顺序排列。PaddleOCR提供的标签文件中包含文本字段,对于文本区域文字不清晰会使用###代替。训练检测模型时,不会用到标签中的文本字段。\n",
" \n",
"**1.4 对于文本行较紧密的情况下训练的文本检测模型效果较差?**\n",
"\n",
"**A**:使用基于分割的方法,如DB,检测密集文本行时,最好收集一批数据进行训练,并且在训练时,并将生成二值图像的[shrink_ratio](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/ppocr/data/imaug/make_shrink_map.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L37)参数调小一些。另外,在预测的时候,可以适当减小[unclip_ratio](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0.yml?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L59)参数,unclip_ratio参数值越大检测框就越大。\n",
"\n",
"\n",
"**1.5 对于一些尺寸较大的文档类图片, DB在检测时会有较多的漏检,怎么避免这种漏检的问题呢?**\n",
"\n",
"**A**:首先,需要确定是模型没有训练好的问题还是预测时处理的问题。如果是模型没有训练好,建议多加一些数据进行训练,或者在训练的时候多加一些数据增强。\n",
"如果是预测图像过大的问题,可以增大预测时输入的最长边设置参数[det_limit_side_len](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L47),默认为960。\n",
"其次,可以通过可视化后处理的分割图观察漏检的文字是否有分割结果,如果没有分割结果,说明是模型没有训练好。如果有完整的分割区域,说明是预测后处理的问题,建议调整[DB后处理参数](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L51-L53)。\n",
"\n",
"\n",
"**1.6 DB模型弯曲文本(如略微形变的文档图像)漏检问题?**\n",
"\n",
"**A**: DB后处理中计算文本框平均得分时,是求rectangle区域的平均分数,容易造成弯曲文本漏检,已新增求polygon区域的平均分数,会更准确,但速度有所降低,可按需选择,在相关pr中可查看[可视化对比效果](https://github.com/PaddlePaddle/PaddleOCR/pull/2604)。该功能通过参数 [det_db_score_mode](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.1/tools/infer/utility.py#L51)进行选择,参数值可选[`fast`(默认)、`slow`],`fast`对应原始的rectangle方式,`slow`对应polygon方式。感谢用户[buptlihang](https://github.com/buptlihang)提[pr](https://github.com/PaddlePaddle/PaddleOCR/pull/2574)帮助解决该问题。\n",
"\n",
"\n",
"**1.7 简单的对于精度要求不高的OCR任务,数据集需要准备多少张呢?**\n",
"\n",
"**A**:(1)训练数据的数量和需要解决问题的复杂度有关系。难度越大,精度要求越高,则数据集需求越大,而且一般情况实际中的训练数据越多效果越好。\n",
"\n",
"(2)对于精度要求不高的场景,检测任务和识别任务需要的数据量是不一样的。对于检测任务,500张图像可以保证基本的检测效果。对于识别任务,需要保证识别字典中每个字符出现在不同场景的行文本图像数目需要大于200张(举例,如果有字典中有5个字,每个字都需要出现在200张图片以上,那么最少要求的图像数量应该在200-1000张之间),这样可以保证基本的识别效果。\n",
"\n",
"\n",
"**1.8 当训练数据量少时,如何获取更多的数据?**\n",
"\n",
"**A**:当训练数据量少时,可以尝试以下三种方式获取更多的数据:(1)人工采集更多的训练数据,最直接也是最有效的方式。(2)基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。(3)利用数据生成算法合成数据,例如pix2pix等算法。\n",
"\n",
"\n",
"**1.9 如何更换文本检测/识别的backbone?**\n",
"\n",
"A:无论是文字检测,还是文字识别,骨干网络的选择是预测效果和预测效率的权衡。一般,选择更大规模的骨干网络,例如ResNet101_vd,则检测或识别更准确,但预测耗时相应也会增加。而选择更小规模的骨干网络,例如MobileNetV3_small_x0_35,则预测更快,但检测或识别的准确率会大打折扣。幸运的是不同骨干网络的检测或识别效果与在ImageNet数据集图像1000分类任务效果正相关。飞桨图像分类套件PaddleClas汇总了ResNet_vd、Res2Net、HRNet、MobileNetV3、GhostNet等23种系列的分类网络结构,在上述图像分类任务的top1识别准确率,GPU(V100和T4)和CPU(骁龙855)的预测耗时以及相应的117个预训练模型下载地址。\n",
"\n",
"(1)文字检测骨干网络的替换,主要是确定类似与ResNet的4个stages,以方便集成后续的类似FPN的检测头。此外,对于文字检测问题,使用ImageNet训练的分类预训练模型,可以加速收敛和效果提升。\n",
"\n",
"(2)文字识别的骨干网络的替换,需要注意网络宽高stride的下降位置。由于文本识别一般宽高比例很大,因此高度下降频率少一些,宽度下降频率多一些。可以参考[PaddleOCR中MobileNetV3骨干网络的改动](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.3/ppocr/modeling/backbones/rec_mobilenet_v3.py)。\n",
"\n",
"\n",
"**1.10 如何对检测模型finetune,比如冻结前面的层或某些层使用小的学习率学习?**\n",
"\n",
"**A**:如果是冻结某些层,可以将变量的stop_gradient属性设置为True,这样计算这个变量之前的所有参数都不会更新了,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/faq/train_cn.html#id4\n",
"\n",
"如果对某些层使用更小的学习率学习,静态图里还不是很方便,一个方法是在参数初始化的时候,给权重的属性设置固定的学习率,参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/fluid/param_attr/ParamAttr_cn.html#paramattr\n",
"\n",
"实际上我们实验发现,直接加载模型去fine-tune,不设置某些层不同学习率,效果也都不错。\n",
"\n",
"**1.11 DB的预处理部分,图片的长和宽为什么要处理成32的倍数?**\n",
"\n",
"**A**:和网络下采样的倍数(stride)有关。以检测中的resnet骨干网络为例,图像输入网络之后,需要经过5次2倍降采样,共32倍,因此建议输入的图像尺寸为32的倍数。\n",
"\n",
"\n",
"**1.12 在PP-OCR系列的模型中,文本检测的骨干网络为什么没有使用SEBlock?**\n",
"\n",
"**A**:SE模块是MobileNetV3网络一个重要模块,目的是估计特征图每个特征通道重要性,给特征图每个特征分配权重,提高网络的表达能力。但是,对于文本检测,输入网络的分辨率比较大,一般是640\\*640,利用SE模块估计特征图每个特征通道重要性比较困难,网络提升能力有限,但是该模块又比较耗时,因此在PP-OCR系统中,文本检测的骨干网络没有使用SE模块。实验也表明,当去掉SE模块,超轻量模型大小可以减小40%,文本检测效果基本不受影响。详细可以参考PP-OCR技术文章,https://arxiv.org/abs/2009.09941.\n",
"\n",
"\n",
"**1.13 PP-OCR检测效果不好,该如何优化?**\n",
"\n",
"**A**: 具体问题具体分析:\n",
"- 如果在你的场景上检测效果不可用,首选是在你的数据上做finetune训练;\n",
"- 如果图像过大,文字过于密集,建议不要过度压缩图像,可以尝试修改检测预处理的resize逻辑,防止图像被过度压缩;\n",
"- 检测框大小过于紧贴文字或检测框过大,可以调整db_unclip_ratio这个参数,加大参数可以扩大检测框,减小参数可以减小检测框大小;\n",
"- 检测框存在很多漏检问题,可以减小DB检测后处理的阈值参数det_db_box_thresh,防止一些检测框被过滤掉,也可以尝试设置det_db_score_mode为'slow';\n",
"- 其他方法可以选择use_dilation为True,对检测输出的feature map做膨胀处理,一般情况下,会有效果改善;\n",
"\n",
"\n",
"## 2. 文本检测预测相关FAQ\n",
"\n",
"**2.1 DB有些框太贴文本了反而去掉了一些文本的边角影响识别,这个问题有什么办法可以缓解吗?**\n",
"\n",
"**A**:可以把后处理的参数[unclip_ratio](https://github.com/PaddlePaddle/PaddleOCR/blob/d80afce9b51f09fd3d90e539c40eba8eb5e50dd6/tools/infer/utility.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L52)适当调大一点,该参数越大文本框越大。\n",
"\n",
"\n",
"**2.2 为什么PaddleOCR检测预测是只支持一张图片测试?即test_batch_size_per_card=1**\n",
"\n",
"**A**:预测的时候,对图像等比例缩放,最长边960,不同图像等比例缩放后长宽不一致,无法组成batch,所以设置为test_batch_size为1。\n",
"\n",
"\n",
"**2.3 在CPU上加速PaddleOCR的文本检测模型预测?**\n",
"\n",
"**A**:x86 CPU可以使用mkldnn(OneDNN)进行加速;在支持mkldnn加速的CPU上开启[enable_mkldnn](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py#L105)参数。另外,配合增加CPU上预测使用的[线程数num_threads](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py#L106),可以有效加快CPU上的预测速度。\n",
"\n",
"**2.4 在GPU上加速PaddleOCR的文本检测模型预测?**\n",
"\n",
"**A**:GPU加速预测推荐使用TensorRT。\n",
"- 1. 从[链接](https://paddleinference.paddlepaddle.org.cn/master/user_guides/download_lib.html)下载带TensorRT的Paddle安装包或者预测库。\n",
"- 2. 从Nvidia官网下载[TensorRT](https://developer.nvidia.com/tensorrt),注意下载的TensorRT版本与paddle安装包中编译的TensorRT版本一致。\n",
"- 3. 设置环境变量`LD_LIBRARY_PATH`,指向TensorRT的lib文件夹\n",
"```\n",
"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:<TensorRT-${version}/lib>\n",
"```\n",
"- 4. 开启PaddleOCR预测的[tensorrt选项](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L38)。\n",
"\n",
"**2.5 如何在移动端部署PaddleOCR模型?**\n",
"\n",
"**A**: 飞桨Paddle有专门针对移动端部署的工具[PaddleLite](https://github.com/PaddlePaddle/Paddle-Lite),并且PaddleOCR提供了DB+CRNN为demo的android arm部署代码,参考[链接](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.3/deploy/lite/readme.md)。\n",
"\n",
"\n",
"**2.6 如何使用PaddleOCR多进程预测?**\n",
"\n",
"**A**: 近期PaddleOCR新增了[多进程预测控制参数](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L111),`use_mp`表示是否使用多进程,`total_process_num`表示在使用多进程时的进程数。具体使用方式请参考[文档](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.3/doc/doc_ch/inference.md#1-%E8%B6%85%E8%BD%BB%E9%87%8F%E4%B8%AD%E6%96%87ocr%E6%A8%A1%E5%9E%8B%E6%8E%A8%E7%90%86)。\n",
"\n",
"**2.7 预测时显存爆炸、内存泄漏问题?**\n",
"\n",
"**A**: 如果是训练模型的预测,由于模型太大或者输入图像太大导致显存不够用,可以参考代码在主函数运行前加上paddle.no_grad(),即可减小显存占用。如果是inference模型预测时显存占用过高,可以配置Config时,加入[config.enable_memory_optim()](https://github.com/PaddlePaddle/PaddleOCR/blob/8b656a3e13631dfb1ac21d2095d4d4a4993ef710/tools/infer/utility.py?_pjax=%23js-repo-pjax-container%2C%20div%5Bitemtype%3D%22http%3A%2F%2Fschema.org%2FSoftwareSourceCode%22%5D%20main%2C%20%5Bdata-pjax-container%5D#L267)用于减小内存占用。\n",
"\n",
"另外关于使用Paddle预测时出现内存泄漏的问题,建议安装paddle最新版本,内存泄漏已修复。"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.8"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
================================================
FILE: notebook_ch/2.text_detection/.ipynb_checkpoints/文本检测实践篇-checkpoint.ipynb
================================================
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# OCR 文本检测实战\n",
"\n",
"本节将介绍如何使用PaddleOCR完成文本检测DB算法的训练与运行,包括:\n",
"1. 快速调用paddleocr包体验文本检测\n",
"1. 理解文本检测DB算法原理\n",
"2. 掌握文本检测模型构建流程\n",
"3. 掌握文本检测模型训练流程\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 1. 快速开始\n",
"\n",
"本节以[paddleocr](https://pypi.org/project/paddleocr/)为例,介绍如何三个步骤快速实现文本检测。\n",
"1. 安装[paddleocr](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.4/doc/doc_ch/whl.md)\n",
"2. 一行命令运行DB算法得到检测结果\n",
"3. 可视化文本检测结果\n",
"\n",
"\n",
"\n",
"\n",
"**安装paddleocr whl包**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"!pip install --upgrade pip\n",
"!pip install paddleocr"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**一行命令实现文本检测**\n",
"\n",
"初次运行时,paddleocr会自动下载并使用PaddleOCR的[PP-OCRv2轻量级模型](https://github.com/PaddlePaddle/PaddleOCR/blob/release%2F2.4/README.md#pp-ocr-series-model-listupdate-on-september-8th)。\n",
"\n",
"使用安装好的paddleocr 以./12.jpg为输入图像,将得到以下预测结果:\n",
"\n",
"<center><img src=\"https://ai-studio-static-online.cdn.bcebos.com/4e31d512f7e147d4847cb1a0ee27a8260ef05506c9254fc1b19137bab1831ac8\"\n",
"width=\"200\", height=\"400\" ></center>\n",
"\n",
"<br><center>图1 ./12.jpg </center>\n",
"\n",
"```\n",
"[[79.0, 555.0], [398.0, 542.0], [399.0, 571.0], [80.0, 584.0]]\n",
"[[21.0, 507.0], [512.0, 491.0], [513.0, 532.0], [22.0, 548.0]]\n",
"[[174.0, 458.0], [397.0, 449.0], [398.0, 480.0], [175.0, 489.0]]\n",
"[[42.0, 414.0], [482.0, 392.0], [484.0, 428.0], [44.0, 450.0]]\n",
"```\n",
"预测结果一共包含四个文本框,每一行包含四个坐标点,代表一个文本框的坐标集合,从左上角起以顺时针顺序排列。\n",
"\n",
"\n",
"paddleocr命令行调用文本检测模型预测图像./12.jpg的方式如下:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"import os\n",
"# 修改Aistudio代码运行的默认目录为 /home/aistudio/\n",
"os.chdir(\"/home/aistudio/\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/skimage/morphology/_skeletonize.py:241: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\n",
"Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
" 0, 1, 1, 0, 0, 1, 0, 0, 0], dtype=np.bool)\n",
"/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/skimage/morphology/_skeletonize.py:256: DeprecationWarning: `np.bool` is a deprecated alias for the builtin `bool`. To silence this warning, use `bool` by itself. Doing this will not modify any behavior and is safe. If you specifically wanted the numpy scalar type, use `np.bool_` here.\n",
"Deprecated in NumPy 1.20; for more details and guidance: https://numpy.org/devdocs/release/1.20.0-notes.html#deprecations\n",
" 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=np.bool)\n",
"[2021/12/22 21:07:19] root WARNING: version PP-OCRv2 not support cls models, auto switch to version PP-OCR\n",
"Namespace(benchmark=False, cls_batch_num=6, cls_image_shape='3, 48, 192', cls_model_dir='/home/aistudio/.paddleocr/2.3.0.2/ocr/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_thresh=0.9, cpu_threads=10, det=True, det_algorithm='DB', det_db_box_thresh=0.6, det_db_score_mode='fast', det_db_thresh=0.3, det_db_unclip_ratio=1.5, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_east_score_thresh=0.8, det_limit_side_len=960, det_limit_type='max', det_model_dir='/home/aistudio/.paddleocr/2.3.0.2/ocr/det/ch/ch_PP-OCRv2_det_infer', det_pse_box_thresh=0.85, det_pse_box_type='box', det_pse_min_area=16, det_pse_scale=1, det_pse_thresh=0, det_sast_nms_thresh=0.2, det_sast_polygon=False, det_sast_score_thresh=0.5, drop_score=0.5, e2e_algorithm='PGNet', e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_limit_side_len=768, e2e_limit_type='max', e2e_model_dir=None, e2e_pgnet_mode='fast', e2e_pgnet_polygon=True, e2e_pgnet_score_thresh=0.5, e2e_pgnet_valid_set='totaltext', enable_mkldnn=False, gpu_mem=500, help='==SUPPRESS==', image_dir='./12.jpg', ir_optim=True, label_list=['0', '180'], lang='ch', layout_path_model='lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config', max_batch_size=10, max_text_length=25, min_subgraph_size=15, ocr_version='PP-OCRv2', output='./output/table', precision='fp32', process_id=0, rec=False, rec_algorithm='CRNN', rec_batch_num=6, rec_char_dict_path='/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/paddleocr/ppocr/utils/ppocr_keys_v1.txt', rec_image_shape='3, 32, 320', rec_model_dir='/home/aistudio/.paddleocr/2.3.0.2/ocr/rec/ch/ch_PP-OCRv2_rec_infer', save_log_path='./log_output/', show_log=True, structure_version='STRUCTURE', table_char_dict_path=None, table_char_type='en', table_max_len=488, table_model_dir=None, total_process_num=1, type='ocr', use_angle_cls=False, use_dilation=False, use_gpu=True, use_mp=False, use_onnx=False, use_pdserving=False, use_space_char=True, use_tensorrt=False, vis_font_path='./doc/fonts/simfang.ttf', warmup=True)\n",
"[2021/12/22 21:07:21] root INFO: **********./12.jpg**********\n",
"[2021/12/22 21:07:23] root INFO: [[79.0, 555.0], [398.0, 542.0], [399.0, 571.0], [80.0, 584.0]]\n",
"[2021/12/22 21:07:23] root INFO: [[21.0, 507.0], [512.0, 491.0], [513.0, 532.0], [22.0, 548.0]]\n",
"[2021/12/22 21:07:23] root INFO: [[174.0, 458.0], [397.0, 449.0], [398.0, 480.0], [175.0, 489.0]]\n",
"[2021/12/22 21:07:23] root INFO: [[42.0, 414.0], [482.0, 392.0], [484.0, 428.0], [44.0, 450.0]]\n"
]
}
],
"source": [
"# --image_dir 指向要预测的图像路径 --rec false表示不使用识别识别,只执行文本检测\n",
"! paddleocr --image_dir ./12.jpg --rec false"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"另外,除了命令行使用方式,paddleocr也提供了代码调用方式,如下:"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[2021/12/22 21:07:58] root WARNING: version 2.1 not support cls models, use version 2.0 instead\n",
"Namespace(benchmark=False, cls_batch_num=6, cls_image_shape='3, 48, 192', cls_model_dir='/home/aistudio/.paddleocr/2.2.1/ocr/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_thresh=0.9, cpu_threads=10, det=True, det_algorithm='DB', det_db_box_thresh=0.6, det_db_score_mode='fast', det_db_thresh=0.3, det_db_unclip_ratio=1.5, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_east_score_thresh=0.8, det_limit_side_len=960, det_limit_type='max', det_model_dir='/home/aistudio/.paddleocr/2.2.1/ocr/det/ch/ch_PP-OCRv2_det_infer', det_sast_nms_thresh=0.2, det_sast_polygon=False, det_sast_score_thresh=0.5, drop_score=0.5, e2e_algorithm='PGNet', e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_limit_side_len=768, e2e_limit_type='max', e2e_model_dir=None, e2e_pgnet_mode='fast', e2e_pgnet_polygon=True, e2e_pgnet_score_thresh=0.5, e2e_pgnet_valid_set='totaltext', enable_mkldnn=False, gpu_mem=500, help='==SUPPRESS==', image_dir=None, ir_optim=True, label_list=['0', '180'], lang='ch', layout_path_model='lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config', max_batch_size=10, max_text_length=25, min_subgraph_size=15, output='./output/table', precision='fp32', process_id=0, rec=True, rec_algorithm='CRNN', rec_batch_num=6, rec_char_dict_path='/home/aistudio/PaddleOCR/ppocr/utils/ppocr_keys_v1.txt', rec_char_type='ch', rec_image_shape='3, 32, 320', rec_model_dir='/home/aistudio/.paddleocr/2.2.1/ocr/rec/ch/ch_PP-OCRv2_rec_infer', save_log_path='./log_output/', show_log=True, table_char_dict_path=None, table_char_type='en', table_max_len=488, table_model_dir=None, total_process_num=1, type='ocr', use_angle_cls=False, use_dilation=False, use_gpu=True, use_mp=False, use_pdserving=False, use_space_char=True, use_tensorrt=False, version='2.1', vis_font_path='./doc/fonts/simfang.ttf', warmup=True)\n",
"[2021/12/22 21:07:59] root WARNING: Since the angle classifier is not initialized, the angle classifier will not be uesd during the forward process\n",
"The predicted text box of ./12.jpg are follows.\n",
"[[[79.0, 555.0], [398.0, 542.0], [399.0, 571.0], [80.0, 584.0]], [[21.0, 507.0], [512.0, 491.0], [513.0, 532.0], [22.0, 548.0]], [[174.0, 458.0], [397.0, 449.0], [398.0, 480.0], [175.0, 489.0]], [[42.0, 414.0], [482.0, 392.0], [484.0, 428.0], [44.0, 450.0]]]\n"
]
}
],
"source": [
"# 1. 从paddleocr中import PaddleOCR类\n",
"from paddleocr import PaddleOCR\n",
"\n",
"# 2. 声明PaddleOCR类\n",
"ocr = PaddleOCR() \n",
"img_path = './12.jpg'\n",
"# 3. 执行预测\n",
"result = ocr.ocr(img_path, rec=False)\n",
"print(f\"The predicted text box of {img_path} are follows.\")\n",
"print(result)\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**可视化文本检测预测结果**"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.image.AxesImage at 0x7ff48841bcd0>"
]
},
"execution_count": null,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
gitextract_wepobalr/
├── LICENSE
├── README.md
├── README_ch.md
├── notebook_ch/
│ ├── .ipynb_checkpoints/
│ │ └── 如何使用本书-checkpoint.ipynb
│ ├── 1.introduction/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── OCR技术导论-checkpoint.ipynb
│ │ └── OCR技术导论.ipynb
│ ├── 2.text_detection/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 文本检测FAQ-checkpoint.ipynb
│ │ │ ├── 文本检测实践篇-checkpoint.ipynb
│ │ │ └── 文本检测理论篇-checkpoint.ipynb
│ │ ├── 文本检测FAQ.ipynb
│ │ ├── 文本检测实践篇.ipynb
│ │ └── 文本检测理论篇.ipynb
│ ├── 3.text_recognition/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 文本识别实践部分-checkpoint.ipynb
│ │ │ └── 文本识别理论部分-checkpoint.ipynb
│ │ ├── 文本识别实践部分.ipynb
│ │ └── 文本识别理论部分.ipynb
│ ├── 4.ppcor_system_strategy/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── PP-OCR系统及优化策略-checkpoint.ipynb
│ │ └── PP-OCR系统及优化策略.ipynb
│ ├── 4.ppocr_system_strategy/
│ │ └── PP-OCR系统及优化策略.ipynb
│ ├── 5.ppocrv2_inference_deployment/
│ │ ├── .ipynb_checkpoints/
│ │ │ └── PP-OCRv2预测部署实战-checkpoint.ipynb
│ │ └── PP-OCRv2预测部署实战.ipynb
│ ├── 6.document_analysis/
│ │ ├── .ipynb_checkpoints/
│ │ │ ├── 文档分析实战-VQA-checkpoint.ipynb
│ │ │ ├── 文档分析实战-表格识别-checkpoint.ipynb
│ │ │ └── 文档分析理论-checkpoint.ipynb
│ │ ├── 文档分析实战-VQA.ipynb
│ │ ├── 文档分析实战-表格识别.ipynb
│ │ └── 文档分析理论.ipynb
│ └── 如何使用本书.ipynb
└── notebook_en/
├── 1.introduction/
│ └── introduction_to_OCR_technology.ipynb
├── 2.text_detection/
│ ├── text_detection_FAQ.ipynb
│ ├── text_detection_practice.ipynb
│ └── text_detection_theory.ipynb
├── 3.text_recognition/
│ ├── text_recognition_practice.ipynb
│ └── text_recognition_theory.ipynb
├── 4.ppocr_system_strategy/
│ └── ppocr_system_strategy.ipynb
├── 5.ppocrv2_inference_deployment/
│ └── ppocrv2_inference_deployment_practice.ipynb
├── 6.document_analysis/
│ ├── document_analysis_practice-VQA.ipynb
│ ├── document_analysis_practice-form_recognition.ipynb
│ └── document_analysis_theory.ipynb
└── how_to_use_these_notebooks.ipynb
Copy disabled (too large)
Download .json
Condensed preview — 40 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (39,899K chars).
[
{
"path": "LICENSE",
"chars": 11357,
"preview": " Apache License\n Version 2.0, January 2004\n "
},
{
"path": "README.md",
"chars": 2323,
"preview": "English | [简体中文](README_ch.md)\n\n# E-book: *Dive Into OCR*\n\n\"Dive Into OCR\" is a textbook that combines OCR theory and pr"
},
{
"path": "README_ch.md",
"chars": 1120,
"preview": "[English](README.md) | 简体中文\n\n# 《动手学OCR》电子书\n\n《动手学OCR》是PaddleOCR团队**携手华中科技大学博导/教授,IAPR Fellow 白翔、复旦大学青年研究员陈智能、中国移动研究院视觉领域资"
},
{
"path": "notebook_ch/.ipynb_checkpoints/如何使用本书-checkpoint.ipynb",
"chars": 3083,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \"# 1. 课程预备知识\\n\",\n \"\\n\",\n \"本课所涉"
},
{
"path": "notebook_ch/1.introduction/.ipynb_checkpoints/OCR技术导论-checkpoint.ipynb",
"chars": 23146,
"preview": "{\n \"cells\": [\n {\n \"cell_type\": \"markdown\",\n \"metadata\": {},\n \"source\": [\n \". The extraction includes 40 files (37.6 MB), approximately 9.9M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.