Skip to content

Commit

Permalink
update doc for rec and training
Browse files Browse the repository at this point in the history
  • Loading branch information
tink2123 committed Sep 6, 2021
1 parent ef9101b commit 1d7a0f9
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 83 deletions.
24 changes: 12 additions & 12 deletions doc/doc_ch/recognition.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## 文字识别
# 文字识别

本文提供了PaddleOCR文本识别任务的全流程指南,包括数据准备、模型训练、调优、评估、预测,各个阶段的详细说明:

Expand All @@ -19,7 +19,7 @@


<a name="数据准备"></a>
### 1. 数据准备
## 1. 数据准备


PaddleOCR 支持两种数据格式:
Expand All @@ -36,7 +36,7 @@ mklink /d <path/to/paddle_ocr>/train_data/dataset <path/to/dataset>
```

<a name="准备数据集"></a>
#### 1.1 自定义数据集
### 1.1 自定义数据集
下面以通用数据集为例, 介绍如何准备数据集:

* 训练集
Expand Down Expand Up @@ -82,7 +82,7 @@ train_data/rec/train/word_002.jpg 用科技让复杂的世界更简单

<a name="数据下载"></a>

#### 1.2 数据下载
### 1.2 数据下载

- ICDAR2015

Expand Down Expand Up @@ -114,7 +114,7 @@ python gen_label.py --mode="rec" --input_path="{path/of/origin/label}" --output_


<a name="字典"></a>
#### 1.3 字典
### 1.3 字典

最后需要提供一个字典({word_dict_name}.txt),使模型在训练时,可以将所有出现的字符映射为字典的索引。

Expand Down Expand Up @@ -161,16 +161,16 @@ PaddleOCR内置了一部分字典,可以按需使用。
并将 `character_type` 设置为 `ch`

<a name="支持空格"></a>
#### 1.4 添加空格类别
### 1.4 添加空格类别

如果希望支持识别"空格"类别, 请将yml文件中的 `use_space_char` 字段设置为 `True`


<a name="启动训练"></a>
### 2. 启动训练
## 2. 启动训练

<a name="数据增强"></a>
#### 2.1 数据增强
### 2.1 数据增强

PaddleOCR提供了多种数据增强方式,默认配置文件中已经添加了数据增广。

Expand All @@ -181,7 +181,7 @@ PaddleOCR提供了多种数据增强方式,默认配置文件中已经添加
*由于OpenCV的兼容性问题,扰动操作暂时只支持Linux*

<a name="通用模型训练"></a>
#### 2.2 通用模型训练
### 2.2 通用模型训练

PaddleOCR提供了训练脚本、评估脚本和预测脚本,本节将以 CRNN 识别模型为例:

Expand Down Expand Up @@ -300,7 +300,7 @@ Eval:
**注意,预测/评估时的配置文件请务必与训练一致。**

<a name="多语言模型训练"></a>
#### 2.3 多语言模型训练
### 2.3 多语言模型训练

PaddleOCR目前已支持80种(除中文外)语种识别,`configs/rec/multi_languages` 路径下提供了一个多语言的配置文件模版: [rec_multi_language_lite_train.yml](../../configs/rec/multi_language/rec_multi_language_lite_train.yml)

Expand Down Expand Up @@ -356,7 +356,7 @@ Eval:
...
```
<a name="评估"></a>
### 3 评估
## 3 评估

评估数据集可以通过 `configs/rec/rec_icdar15_train.yml` 修改Eval中的 `label_file_path` 设置。

Expand All @@ -366,7 +366,7 @@ python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec
```

<a name="预测"></a>
### 4 预测
## 4 预测

使用 PaddleOCR 训练好的模型,可以通过以下脚本进行快速预测。

Expand Down
68 changes: 40 additions & 28 deletions doc/doc_ch/training.md
Original file line number Diff line number Diff line change
@@ -1,17 +1,29 @@
## 模型训练
# 模型训练

本文将介绍模型训练时需掌握的基本概念,和训练时的调优方法。

同时会简单介绍PaddleOCR模型训练数据的组成部分,以及如何在垂类场景中准备数据finetune模型。

### 1. 基本概念
- [1. 基本概念](#基本概念)
* [1.1 学习率](#学习率)
* [1.2 正则化](#正则化)
* [1.3 评估指标](#评估指标)
- [2. 常见问题](#常见问题)
- [3. 数据与垂类场景](#数据与垂类场景)
* [3.1 训练数据](#训练数据)
* [3.2 垂类场景](#垂类场景)
* [3.3 自己构建数据集](#自己构建数据集)

<a name="基本概念"></a>
## 1. 基本概念

OCR(Optical Character Recognition,光学字符识别)是指对图像进行分析识别处理,获取文字和版面信息的过程,是典型的计算机视觉任务,
通常由文本检测和文本识别两个子任务构成。

模型调优时需要关注以下参数:

#### 1.1 学习率
<a name="学习率"></a>
### 1.1 学习率

学习率是训练神经网络的重要超参数之一,它代表在每一次迭代中梯度向损失函数最优解移动的步长。
在PaddleOCR中提供了多种学习率更新策略,可以通过配置文件修改,例如:
Expand All @@ -29,8 +41,8 @@ Optimizer:
Piecewise 代表分段常数衰减,在不同的学习阶段指定不同的学习率,在每段内学习率相同。
warmup_epoch 代表在前5个epoch中,学习率将逐渐从0增加到base_lr。全部策略可以参考代码[learning_rate.py](../../ppocr/optimizer/learning_rate.py)


#### 1.2 正则化
<a name="正则化"></a>
### 1.2 正则化

正则化可以有效的避免算法过拟合,PaddleOCR中提供了L1、L2正则方法,L1 和 L2 正则化是最常用的正则化方法。L1 正则化向目标函数添加正则化项,以减少参数的绝对值总和;而 L2 正则化中,添加正则化项的目的在于减少参数平方的总和。配置方法如下:

Expand All @@ -42,44 +54,43 @@ Optimizer:
factor: 2.0e-05
```


#### 1.3 评估指标
<a name="评估指标"></a>
### 1.3 评估指标

(1)检测阶段:先按照检测框和标注框的IOU评估,IOU大于某个阈值判断为检测准确。这里检测框和标注框不同于一般的通用目标检测框,是采用多边形进行表示。检测准确率:正确的检测框个数在全部检测框的占比,主要是判断检测指标。检测召回率:正确的检测框个数在全部标注框的占比,主要是判断漏检的指标。

(2)识别阶段: 字符识别准确率,即正确识别的文本行占标注的文本行数量的比例,只有整行文本识别对才算正确识别。

(3)端到端统计: 端对端召回率:准确检测并正确识别文本行在全部标注文本行的占比; 端到端准确率:准确检测并正确识别文本行在 检测到的文本行数量 的占比; 准确检测的标准是检测框与标注框的IOU大于某个阈值,正确识别的的检测框中的文本与标注的文本相同。

### 2. 常见问题

**Q**: 基于深度学习的文字检测方法有哪几种?各有什么优缺点?
<a name="常见问题"></a>
## 2. 常见问题

A: 常用的基于深度学习的文字检测方法一般可以分为基于回归的、基于分割的两大类,当然还有一些将两者进行结合的方法。

(1)基于回归的方法分为box回归和像素值回归。a. 采用box回归的方法主要有CTPN、Textbox系列和EAST,这类算法对规则形状文本检测效果较好,但无法准确检测不规则形状文本。 b. 像素值回归的方法主要有CRAFT和SA-Text,这类算法能够检测弯曲文本且对小文本效果优秀但是实时性能不够。
**Q**:训练CRNN识别时,如何选择合适的网络输入shape?

(2)基于分割的算法,如PSENet,这类算法不受文本形状的限制,对各种形状的文本都能取得较好的效果,但是往往后处理比较复杂,导致耗时严重。目前也有一些算法专门针对这个问题进行改进,如DB,将二值化进行近似,使其可导,融入训练,从而获取更准确的边界,大大降低了后处理的耗时。
A:一般高度采用32,最长宽度的选择,有两种方法:

**Q**:对于中文行文本识别,CTC和Attention哪种更优?
(1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。

A:
(1)从效果上来看,通用OCR场景CTC的识别效果优于Attention,因为带识别的字典中的字符比较多,常用中文汉字三千字以上,如果训练样本不足的情况下,对于这些字符的序列关系挖掘比较困难。中文场景下Attention模型的优势无法体现。而且Attention适合短语句识别,对长句子识别比较差。
(2)统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1,英文认为3:1,预估一个最长宽度。

(2)从训练和预测速度上,Attention的串行解码结构限制了预测速度,而CTC网络结构更高效,预测速度上更有优势。
**Q**:识别训练时,训练集精度已经到达90了,但验证集精度一直在70,涨不上去怎么办?

**Q**:训练CRNN识别时,如何选择合适的网络输入shape?
A:训练集精度90,测试集70多的话,应该是过拟合了,有两个可尝试的方法:

A:一般高度采用32,最长宽度的选择,有两种方法:
(1)加入更多的增广方式或者调大增广prob的[概率](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/ppocr/data/imaug/rec_img_aug.py#L341),默认为0.4。

1)统计训练样本图像的宽高比分布。最大宽高比的选取考虑满足80%的训练样本。
2)调大系统的[l2 dcay值](https://github.com/PaddlePaddle/PaddleOCR/blob/a501603d54ff5513fc4fc760319472e59da25424/configs/rec/ch_ppocr_v1.1/rec_chinese_lite_train_v1.1.yml#L47)

(2)统计训练样本文字数目。最长字符数目的选取考虑满足80%的训练样本。然后中文字符长宽比近似认为是1,英文认为3:1,预估一个最长宽度。
**Q**: 识别模型训练时,loss能正常下降,但acc一直为0

A:识别模型训练初期acc为0是正常的,多训一段时间指标就上来了。

### 3. 数据与垂类场景
<a name="数据与垂类场景"></a>
## 3. 数据与垂类场景

#### 3.1 训练数据:
<a name="训练数据"></a>
### 3.1 训练数据
目前开源的模型,数据集和量级如下:

- 检测:
Expand All @@ -93,13 +104,14 @@ Optimizer:

其中,公开数据集都是开源的,用户可自行搜索下载,也可参考[中文数据集](./datasets.md),合成数据暂不开源,用户可使用开源合成工具自行合成,可参考的合成工具包括[text_renderer](https://github.com/Sanster/text_renderer)[SynthText](https://github.com/ankush-me/SynthText)[TextRecognitionDataGenerator](https://github.com/Belval/TextRecognitionDataGenerator) 等。


#### 3.2 垂类场景
<a name="垂类场景"></a>
### 3.2 垂类场景

PaddleOCR主要聚焦通用OCR,如果有垂类需求,您可以用PaddleOCR+垂类数据自己训练;
如果缺少带标注的数据,或者不想投入研发成本,建议直接调用开放的API,开放的API覆盖了目前比较常见的一些垂类。

#### 3.3 自己构建数据集
<a name="自己构建数据集"></a>
### 3.3 自己构建数据集

在构建数据集时有几个经验可供参考:

Expand All @@ -113,4 +125,4 @@ PaddleOCR主要聚焦通用OCR,如果有垂类需求,您可以用PaddleOCR+

a. 人工采集更多的训练数据,最直接也是最有效的方式。
b. 基于PIL和opencv基本图像处理或者变换。例如PIL中ImageFont, Image, ImageDraw三个模块将文字写到背景中,opencv的旋转仿射变换,高斯滤波等。
c. 利用数据生成算法合成数据,例如pix2pix等算法
c. 利用数据生成算法合成数据,例如pix2pix或StyleText等算法
24 changes: 12 additions & 12 deletions doc/doc_en/recognition_en.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
## TEXT RECOGNITION
# TEXT RECOGNITION

- [1 DATA PREPARATION](#DATA_PREPARATION)
- [1.1 Costom Dataset](#Costom_Dataset)
Expand All @@ -17,7 +17,7 @@
- [4.1 Training engine prediction](#Training_engine_prediction)

<a name="DATA_PREPARATION"></a>
### DATA PREPARATION
## 1 DATA PREPARATION


PaddleOCR supports two data formats:
Expand All @@ -36,7 +36,7 @@ mklink /d <path/to/paddle_ocr>/train_data/dataset <path/to/dataset>
```

<a name="Costom_Dataset"></a>
#### 1.1 Costom dataset
### 1.1 Costom dataset

If you want to use your own data for training, please refer to the following to organize your data.

Expand Down Expand Up @@ -84,7 +84,7 @@ Similar to the training set, the test set also needs to be provided a folder con
```

<a name="Dataset_download"></a>
#### 1.2 Dataset download
### 1.2 Dataset download

- ICDAR2015

Expand Down Expand Up @@ -121,7 +121,7 @@ The multi-language model training method is the same as the Chinese model. The t


<a name="Dictionary"></a>
#### 1.3 Dictionary
### 1.3 Dictionary

Finally, a dictionary ({word_dict_name}.txt) needs to be provided so that when the model is trained, all the characters that appear can be mapped to the dictionary index.

Expand Down Expand Up @@ -166,17 +166,17 @@ To customize the dict file, please modify the `character_dict_path` field in `co
If you need to customize dic file, please add character_dict_path field in configs/rec/rec_icdar15_train.yml to point to your dictionary path. And set character_type to ch.

<a name="Add_space_category"></a>
#### 1.4 Add space category
### 1.4 Add space category

If you want to support the recognition of the `space` category, please set the `use_space_char` field in the yml file to `True`.

**Note: use_space_char only takes effect when character_type=ch**

<a name="TRAINING"></a>
### 2 TRAINING
## 2 TRAINING

<a name="Data_Augmentation"></a>
#### 2.1 Data Augmentation
### 2.1 Data Augmentation

PaddleOCR provides a variety of data augmentation methods. All the augmentation methods are enabled by default.

Expand All @@ -185,7 +185,7 @@ The default perturbation methods are: cvtColor, blur, jitter, Gasuss noise, rand
Each disturbance method is selected with a 40% probability during the training process. For specific code implementation, please refer to: [rec_img_aug.py](../../ppocr/data/imaug/rec_img_aug.py)

<a name="Training"></a>
#### 2.2 General Training
### 2.2 General Training

PaddleOCR provides training scripts, evaluation scripts, and prediction scripts. In this section, the CRNN recognition model will be used as an example:

Expand Down Expand Up @@ -304,7 +304,7 @@ Eval:
**Note that the configuration file for prediction/evaluation must be consistent with the training.**

<a name="Multi_language"></a>
#### 2.3 Multi-language Training
### 2.3 Multi-language Training

Currently, the multi-language algorithms supported by PaddleOCR are:

Expand Down Expand Up @@ -361,7 +361,7 @@ Eval:
```

<a name="EVALUATION"></a>
### 3 EVALUATION
## 3 EVALUATION

The evaluation dataset can be set by modifying the `Eval.dataset.label_file_list` field in the `configs/rec/rec_icdar15_train.yml` file.

Expand All @@ -371,7 +371,7 @@ python3 -m paddle.distributed.launch --gpus '0' tools/eval.py -c configs/rec/rec
```

<a name="PREDICTION"></a>
### 4 PREDICTION
## 4 PREDICTION


Using the model trained by paddleocr, you can quickly get prediction through the following script.
Expand Down
Loading

0 comments on commit 1d7a0f9

Please sign in to comment.