PaddleOCR/doc/doc_ch/finetune.md

168 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 模型微调
## 1. 模型微调背景与意义
PaddleOCR提供的PP-OCR系列模型在通用场景中性能优异能够解决绝大多数情况下的检测与识别问题。在垂类场景中如果希望获取更优的模型效果可以通过模型微调的方法进一步提升PP-OCR系列检测与识别模型的精度。
本文主要介绍文本检测与识别模型在模型微调时的一些注意事项,最终希望您在自己的场景中,通过模型微调,可以获取精度更高的文本检测与识别模型。
本文核心要点如下所示。
1. PP-OCR提供的预训练模型有较好的泛化能力
2. 加入少量真实数据(检测任务>=500张, 识别任务>=5000张会大幅提升垂类场景的检测与识别效果
3. 在模型微调时,加入真实通用场景数据,可以进一步提升模型精度与泛化性能
4. 在图像检测任务中,增大图像的预测尺度,能够进一步提升较小文字区域的检测效果
5. 在模型微调时需要适当调整超参数学习率batch size最为重要以获得更优的微调效果。
更多详细内容请参考第2章与第3章。
## 2. 文本检测模型微调
### 2.1 数据选择
* 数据量建议至少准备500张的文本检测数据集用于模型微调。
* 数据标注单行文本标注格式建议标注的检测框与实际语义内容一致。如在火车票场景中姓氏与名字可能离得较远但是它们在语义上属于同一个检测字段这里也需要将整个姓名标注为1个检测框。
### 2.2 模型选择
建议选择PP-OCRv3模型配置文件[ch_PP-OCRv3_det_student.yml](../../configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml),预训练模型:[ch_PP-OCRv3_det_distill_train.tar](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar))进行微调,其精度与泛化性能是目前提供的最优预训练模型。
更多PP-OCR系列模型请参考[PP-OCR 系列模型库](./models_list.md)。
注意:在使用上述预训练模型的时候,需要使用文件夹中的`student.pdparams`文件作为预训练模型,即,仅使用学生模型。
### 2.3 训练超参选择
在模型微调的时候,最重要的超参就是预训练模型路径`pretrained_model`, 学习率`learning_rate`与`batch_size`,部分配置文件如下所示。
```yaml
Global:
pretrained_model: ./ch_PP-OCRv3_det_distill_train/student.pdparams # 预训练模型路径
Optimizer:
lr:
name: Cosine
learning_rate: 0.001 # 学习率
warmup_epoch: 2
regularizer:
name: 'L2'
factor: 0
Train:
loader:
shuffle: True
drop_last: False
batch_size_per_card: 8 # 单卡batch size
num_workers: 4
```
上述配置文件中,首先需要将`pretrained_model`字段指定为`student.pdparams`文件路径。
PaddleOCR提供的配置文件是在8卡训练相当于总的batch size是`8*8=64`、且没有加载预训练模型情况下的配置文件因此您的场景中学习率与总的batch size需要对应线性调整例如
* 如果您的场景中是单卡训练单卡batch_size=8则总的batch_size=8建议将学习率调整为`1e-4`左右。
* 如果您的场景中是单卡训练由于显存限制只能设置单卡batch_size=4则总的batch_size=4建议将学习率调整为`5e-5`左右。
### 2.4 预测超参选择
对训练好的模型导出并进行推理时可以通过进一步调整预测的图像尺度来提升小面积文本的检测效果下面是DBNet推理时的一些超参数可以通过适当调整提升效果。
| 参数名称 | 类型 | 默认值 | 含义 |
| :--: | :--: | :--: | :--: |
| det_db_thresh | float | 0.3 | DB输出的概率图中得分大于该阈值的像素点才会被认为是文字像素点 |
| det_db_box_thresh | float | 0.6 | 检测结果边框内,所有像素点的平均得分大于该阈值时,该结果会被认为是文字区域 |
| det_db_unclip_ratio | float | 1.5 | `Vatti clipping`算法的扩张系数,使用该方法对文字区域进行扩张 |
| max_batch_size | int | 10 | 预测的batch size |
| use_dilation | bool | False | 是否对分割结果进行膨胀以获取更优检测效果 |
| det_db_score_mode | str | "fast" | DB的检测结果得分计算方法支持`fast`和`slow``fast`是根据polygon的外接矩形边框内的所有像素计算平均得分`slow`是根据原始polygon内的所有像素计算平均得分计算速度相对较慢一些但是更加准确一些。 |
更多关于推理方法的介绍可以参考[Paddle Inference推理教程](././inference_ppocr.md)。
## 3. 文本识别模型微调
### 3.1 数据选择
* 数据量不更换字典的情况下建议至少准备5000张的文本识别数据集用于模型微调如果更换了字典不建议需要的数量更多。
* 数据分布:建议分布与实测场景尽量一致。如果实测场景包含大量短文本,则训练数据中建议也包含较多短文本,如果实测场景对于空格识别效果要求较高,则训练数据中建议也包含较多带空格的文本内容。
* 数据合成:针对部分字符识别有误的情况,建议获取一批特定字符数据,加入到原数据中使用小学习率微调。其中原始数据与新增数据比例可尝试 10:1 51 避免单一场景数据过多导致模型过拟合,同时尽量平衡语料词频,确保常用字的出现频率不会过低。
特定字符生成可以使用 TextRenderer 工具,合成例子可参考 [数码管数据合成](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/applications/%E5%85%89%E5%8A%9F%E7%8E%87%E8%AE%A1%E6%95%B0%E7%A0%81%E7%AE%A1%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB/%E5%85%89%E5%8A%9F%E7%8E%87%E8%AE%A1%E6%95%B0%E7%A0%81%E7%AE%A1%E5%AD%97%E7%AC%A6%E8%AF%86%E5%88%AB.md#31-%E6%95%B0%E6%8D%AE%E5%87%86%E5%A4%87)
,合成数据语料尽量来自真实使用场景,在贴近真实场景的基础上保持字体、背景的丰富性,有助于提升模型效果。
* 通用中英文数据在训练的时候可以在训练集中添加通用真实数据如在不更换字典的微调场景中建议添加LSVT、RCTW、MTWI等真实数据进一步提升模型的泛化性能。
### 3.2 模型选择
建议选择PP-OCRv3模型配置文件[ch_PP-OCRv3_rec_distillation.yml](../../configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml),预训练模型:[ch_PP-OCRv3_rec_train.tar](https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_train.tar))进行微调,其精度与泛化性能是目前提供的最优预训练模型。
更多PP-OCR系列模型请参考[PP-OCR 系列模型库](./models_list.md)。
### 3.3 训练超参选择
与文本检测任务微调相同,在识别模型微调的时候,最重要的超参就是预训练模型路径`pretrained_model`, 学习率`learning_rate`与`batch_size`,部分默认配置文件如下所示。
```yaml
Global:
pretrained_model: # 预训练模型路径
Optimizer:
lr:
name: Piecewise
decay_epochs : [700, 800]
values : [0.001, 0.0001] # 学习率
warmup_epoch: 5
regularizer:
name: 'L2'
factor: 0
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list:
- ./train_data/train_list.txt
ratio_list: [1.0] # 采样比例,默认值是[1.0]
loader:
shuffle: True
drop_last: False
batch_size_per_card: 128 # 单卡batch size
num_workers: 8
```
上述配置文件中,首先需要将`pretrained_model`字段指定为3.2章节中解压得到的`ch_PP-OCRv3_rec_train/best_accuracy.pdparams`文件路径。
PaddleOCR提供的配置文件是在8卡训练相当于总的batch size是`8*128=1024`、且没有加载预训练模型情况下的配置文件因此您的场景中学习率与总的batch size需要对应线性调整例如
* 如果您的场景中是单卡训练单卡batch_size=128则总的batch_size=128在加载预训练模型的情况下建议将学习率调整为`[1e-4, 2e-5]`左右piecewise学习率策略需设置2个值下同
* 如果您的场景中是单卡训练因为显存限制只能设置单卡batch_size=64则总的batch_size=64在加载预训练模型的情况下建议将学习率调整为`[5e-5, 1e-5]`左右。
如果有通用真实场景数据加进来建议每个epoch中垂类场景数据与真实场景的数据量保持在1:1左右。
比如您自己的垂类场景识别数据量为1W数据标签文件为`vertical.txt`收集到的通用场景识别数据量为10W数据标签文件为`general.txt`
那么,可以设置`label_file_list`和`ratio_list`参数如下所示。每个epoch中`vertical.txt`中会进行全采样采样比例为1.0包含1W条数据`general.txt`中会按照0.1的采样比例进行采样,包含`10W*0.1=1W`条数据,最终二者的比例为`1:1`。
```yaml
Train:
dataset:
name: SimpleDataSet
data_dir: ./train_data/
label_file_list:
- vertical.txt
- general.txt
ratio_list: [1.0, 0.1]
```
### 3.4 训练调优
训练过程并非一蹴而就的,完成一个阶段的训练评估后,建议收集分析当前模型在真实场景中的 badcase有针对性的调整训练数据比例或者进一步新增合成数据。通过多次迭代训练不断优化模型效果。