update doc for case

pull/6612/head
andyjpaddle 2022-06-28 12:31:14 +00:00
parent 038a933034
commit bcd56d0054
4 changed files with 49 additions and 37 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 285 KiB

View File

@ -23,15 +23,15 @@
- [7. PaddleServing部署](#7-PaddleServing部署)
# 1. 项目背景及意义
## 1. 项目背景及意义
目前光学字符识别(OCR)技术在我们的生活当中被广泛使用但是大多数模型在通用场景下的准确性还有待提高针对于此我们借助飞桨提供的PaddleOCR套件较容易的实现了在垂类场景下的应用。
该项目以国家质量基础NQI为准绳充分利用大数据、云计算、物联网等高新技术构建覆盖计量端、实验室端、数据端和硬件端的完整计量解决方案解决传统计量校准中存在的难题拓宽计量检测服务体系和服务领域解决无数传接口或数传接口不统一、不公开的计量设备以及计量设备所处的环境比较恶劣不适合人工读取数据。通过OCR技术实现远程计量引领计量行业向智慧计量转型和发展。
# 2. 项目内容
## 2. 项目内容
本项目基于PaddleOCR开源套件以PP-OCRv3检测和识别模型为基础针对液晶屏读数识别场景进行优化。
# 3. 安装环境
## 3. 安装环境
```python
# 首先git官方的PaddleOCR项目安装需要的依赖
@ -41,16 +41,16 @@ cd PaddleOCR
pip install -r requirements.txt
```
# 4. 文字检测
## 4. 文字检测
文本检测的任务是定位出输入图像中的文字区域。近年来学术界关于文本检测的研究非常丰富一类方法将文本检测视为目标检测中的一个特定场景基于通用目标检测算法进行改进适配如TextBoxes[1]基于一阶段目标检测器SSD[2]算法调整目标框使之适合极端长宽比的文本行CTPN[3]则是基于Faster RCNN[4]架构改进而来。但是文本检测与目标检测在目标信息以及任务本身上仍存在一些区别如文本一般长宽比较大往往呈“条状”文本行之间可能比较密集弯曲文本等因此又衍生了很多专用于文本检测的算法。本项目基于PP-OCRv3算法进行优化。
## 4.1 PP-OCRv3检测算法介绍
### 4.1 PP-OCRv3检测算法介绍
PP-OCRv3检测模型是对PP-OCRv2中的CMLCollaborative Mutual Learning) 协同互学习文本检测蒸馏策略进行了升级。如下图所示CML的核心思想结合了①传统的Teacher指导Student的标准蒸馏与 ②Students网络之间的DML互学习可以让Students网络互学习的同时Teacher网络予以指导。PP-OCRv3分别针对教师模型和学生模型进行进一步效果优化。其中在对教师模型优化时提出了大感受野的PAN结构LK-PAN和引入了DMLDeep Mutual Learning蒸馏策略在对学生模型优化时提出了残差注意力机制的FPN结构RSE-FPN。
![](https://ai-studio-static-online.cdn.bcebos.com/c306b2f028364805a55494d435ab553a76cf5ae5dd3f4649a948ea9aeaeb28b8)
详细优化策略描述请参考[PP-OCRv3优化策略](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/PP-OCRv3_introduction.md#2)
## 4.2 数据准备
### 4.2 数据准备
[计量设备屏幕字符检测数据集](https://aistudio.baidu.com/aistudio/datasetdetail/127845)数据来源于实际项目中各种计量设备的数显屏以及在网上搜集的一些其他数显屏包含训练集755张测试集355张。
```python
@ -83,11 +83,11 @@ def get_one_image(train):
get_one_image(train)
```
![det_png](imgs/det.png)
![det_png](https://ai-studio-static-online.cdn.bcebos.com/0639da09b774458096ae577e82b2c59e89ced6a00f55458f946997ab7472a4f8)
## 4.3 模型训练
### 4.3 模型训练
### 4.3.1 预训练模型直接评估
#### 4.3.1 预训练模型直接评估
下载我们需要的PP-OCRv3检测预训练模型更多选择请自行选择其他的[文字检测模型](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/models_list.md#1-%E6%96%87%E6%9C%AC%E6%A3%80%E6%B5%8B%E6%A8%A1%E5%9E%8B)
```python
@ -110,8 +110,8 @@ python tools/eval.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml -o Globa
|---|---------------------------|---|
| 0 | PP-OCRv3中英文超轻量检测预训练模型直接预测 |47.5%|
### 4.3.2 预训练模型直接finetune
#### 修改配置文件
#### 4.3.2 预训练模型直接finetune
##### 修改配置文件
我们使用configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml主要修改训练轮数和学习率参相关参数设置预训练模型路径设置数据集路径。 另外batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
```
epoch:100
@ -123,7 +123,7 @@ learning_rate: 0.00025
num_workers: 0 # 如果单卡训练建议将Train和Eval的loader部分的num_workers设置为0否则会出现`/dev/shm insufficient`的报错
```
#### 开始训练
##### 开始训练
使用我们上面修改的配置文件configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml训练命令如下
```python
@ -144,7 +144,7 @@ python tools/eval.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml -o Globa
| 0 | PP-OCRv3中英文超轻量检测预训练模型直接预测 |47.5%|
| 1 | PP-OCRv3中英文超轻量检测预训练模型fintune |65.2%|
### 4.3.3 基于预训练模型Finetune_student模型
#### 4.3.3 基于预训练模型Finetune_student模型
我们使用configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml主要修改训练轮数和学习率参相关参数设置预训练模型路径设置数据集路径。 另外batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
```
@ -177,7 +177,7 @@ python tools/eval.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o G
| 1 | PP-OCRv3中英文超轻量检测预训练模型fintune |65.2%|
| 2 | PP-OCRv3中英文超轻量检测预训练模型fintune学生模型 |80.0%|
### 4.3.4 基于预训练模型Finetune_teacher模型
#### 4.3.4 基于预训练模型Finetune_teacher模型
首先需要从提供的预训练模型best_accuracy.pdparams中提取teacher参数组合成适合dml训练的初始化模型提取代码如下
@ -236,7 +236,7 @@ python tools/eval.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_dml.yml -o Globa
| 2 | PP-OCRv3中英文超轻量检测预训练模型fintune学生模型 |80.0%|
| 3 | PP-OCRv3中英文超轻量检测预训练模型fintune教师模型 |84.8%|
### 4.3.5 采用CML蒸馏进一步提升student模型精度
#### 4.3.5 采用CML蒸馏进一步提升student模型精度
需要从4.3.3和4.3.4训练得到的best_accuracy.pdparams中提取各自代表student和teacher的参数组合成适合cml训练的初始化模型提取代码如下
@ -298,9 +298,15 @@ python tools/eval.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_cml.yml -o Globa
| 3 | PP-OCRv3中英文超轻量检测预训练模型fintune教师模型 |84.8%|
| 4 | 基于2和3训练好的模型fintune |82.7%|
### 4.3.6 模型导出推理
如需获取已训练模型请扫码填写问卷加入PaddleOCR官方交流群获取全部OCR垂类模型下载链接、《动手学OCR》电子书等全套OCR学习资料🎁
<div align="left">
<img src="https://ai-studio-static-online.cdn.bcebos.com/dd721099bd50478f9d5fb13d8dd00fad69c22d6848244fd3a1d3980d7fefc63e" width = "150" height = "150" />
</div>
将下载或训练完成的模型放置在对应目录下即可完成模型推理。
#### 4.3.6 模型导出推理
训练完成后可以将训练模型转换成inference模型。inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
#### 4.3.6.1 模型导出
##### 4.3.6.1 模型导出
导出命令如下:
```python
@ -312,7 +318,7 @@ python tools/export_model.py \
```
#### 4.3.6.2 模型推理
##### 4.3.6.2 模型推理
导出模型后,可以使用如下命令进行推理预测:
```python
@ -320,10 +326,10 @@ python tools/export_model.py \
python tools/infer/predict_det.py --image_dir="train_data/icdar2015/text_localization/test/1.jpg" --det_model_dir="./inference/det_ppocrv3/Student"
```
# 5. 文字识别
## 5. 文字识别
文本识别的任务是识别出图像中的文字内容一般输入来自于文本检测得到的文本框截取出的图像文字区域。文本识别一般可以根据待识别文本形状分为规则文本识别和不规则文本识别两大类。规则文本主要指印刷字体、扫描文本等文本大致处在水平线位置不规则文本往往不在水平位置存在弯曲、遮挡、模糊等问题。不规则文本场景具有很大的挑战性也是目前文本识别领域的主要研究方向。本项目基于PP-OCRv3算法进行优化。
## 5.1 PP-OCRv3识别算法介绍
### 5.1 PP-OCRv3识别算法介绍
PP-OCRv3的识别模块是基于文本识别算法[SVTR](https://arxiv.org/abs/2205.00159)优化。SVTR不再采用RNN结构通过引入Transformers结构更加有效地挖掘文本行图像的上下文信息从而提升文本识别能力。如下图所示PP-OCRv3采用了6个优化策略。
![](https://ai-studio-static-online.cdn.bcebos.com/d4f5344b5b854d50be738671598a89a45689c6704c4d481fb904dd7cf72f2a1a)
@ -337,7 +343,7 @@ PP-OCRv3的识别模块是基于文本识别算法[SVTR](https://arxiv.org/abs/2
详细优化策略描述请参考[PP-OCRv3优化策略](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/PP-OCRv3_introduction.md#3-%E8%AF%86%E5%88%AB%E4%BC%98%E5%8C%96)
## 5.2 数据准备
### 5.2 数据准备
[计量设备屏幕字符识别数据集](https://aistudio.baidu.com/aistudio/datasetdetail/128714)数据来源于实际项目中各种计量设备的数显屏以及在网上搜集的一些其他数显屏包含训练集19912张测试集4099张。
```python
@ -368,10 +374,10 @@ def get_one_image(train):
get_one_image(train)
```
![rec_png](imgs/rec.png)
![rec_png](https://ai-studio-static-online.cdn.bcebos.com/3de0d475c69746d0a184029001ef07c85fd68816d66d4beaa10e6ef60030f9b4)
## 5.3 模型训练
### 下载预训练模型
### 5.3 模型训练
#### 下载预训练模型
下载我们需要的PP-OCRv3识别预训练模型更多选择请自行选择其他的[文字识别模型](https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.5/doc/doc_ch/models_list.md#2-%E6%96%87%E6%9C%AC%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9E%8B)
```python
@ -381,7 +387,7 @@ wget -P ./pretrained_models/ https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch
tar -xf ./pretrained_models/ch_PP-OCRv3_rec_train.tar -C pretrained_models
```
### 修改配置文件
#### 修改配置文件
我们使用configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml主要修改训练轮数和学习率参相关参数设置预训练模型路径设置数据集路径。 另外batch_size可根据自己机器显存大小进行调整。 具体修改如下几个地方:
```
epoch_num: 100 # 训练epoch数
@ -439,7 +445,7 @@ python tools/eval.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml -o
|---|---------------------------|---|
| 0 | PP-OCRv3中英文超轻量识别预训练模型直接预测 |70.4%|
### 开始训练
#### 开始训练
我们使用上面修改好的配置文件configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml预训练模型数据集路径学习率训练轮数等都已经设置完毕后可以使用下面命令开始训练。
```python
@ -460,9 +466,15 @@ python tools/eval.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml -o
| 0 | PP-OCRv3中英文超轻量识别预训练模型直接预测 |70.4%|
| 1 | PP-OCRv3中英文超轻量识别预训练模型finetune |82.2%|
## 5.4 模型导出推理
如需获取已训练模型请扫码填写问卷加入PaddleOCR官方交流群获取全部OCR垂类模型下载链接、《动手学OCR》电子书等全套OCR学习资料🎁
<div align="left">
<img src="https://ai-studio-static-online.cdn.bcebos.com/dd721099bd50478f9d5fb13d8dd00fad69c22d6848244fd3a1d3980d7fefc63e" width = "150" height = "150" />
</div>
将下载或训练完成的模型放置在对应目录下即可完成模型推理。
### 5.4 模型导出推理
训练完成后可以将训练模型转换成inference模型。inference 模型会额外保存模型的结构信息,在预测部署、加速推理上性能优越,灵活方便,适合于实际系统集成。
### 模型导出
#### 模型导出
导出命令如下:
```python
@ -470,7 +482,7 @@ python tools/eval.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml -o
python tools/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillation.yml -o Global.pretrained_model="./output/ch_PP-OCR_v3_rec/best_accuracy" Global.save_inference_dir="./inference/rec_ppocrv3/"
```
### 模型推理
#### 模型推理
导出模型后,可以使用如下命令进行推理预测
```python
@ -478,7 +490,7 @@ python tools/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec_distillatio
python tools/infer/predict_rec.py --image_dir="train_data/ic15_data/test/1_crop_0.jpg" --rec_model_dir="./inference/rec_ppocrv3/Student"
```
# 6. 系统串联
## 6. 系统串联
我们将上面训练好的检测和识别模型进行系统串联测试,命令如下:
```python
@ -500,9 +512,9 @@ plt.imshow(img)
plt.show()
```
![sys_res_png](imgs/sys_res.png)
![sys_res_png](https://ai-studio-static-online.cdn.bcebos.com/901ab741cb46441ebec510b37e63b9d8d1b7c95f63cc4e5e8757f35179ae6373)
## 6.1 后处理
### 6.1 后处理
如果需要获取key-value信息可以基于启发式的规则将识别结果与关键字库进行匹配如果匹配上了则取该字段为key, 后面一个字段为value。
```python
@ -523,7 +535,7 @@ def postprocess(rec_res):
key_value = postprocess(filter_rec_res)
```
# 7. PaddleServing部署
## 7. PaddleServing部署
首先需要安装PaddleServing部署相关的环境
```python
@ -532,7 +544,7 @@ python -m pip install paddle_serving_client
python -m pip install paddle-serving-app
```
## 7.1 转化检测模型
### 7.1 转化检测模型
```python
cd deploy/pdserving/
@ -543,7 +555,7 @@ python -m paddle_serving_client.convert --dirname ../../inference/det_ppocrv3/St
--serving_client ./ppocr_det_v3_client/
```
## 7.2 转化识别模型
### 7.2 转化识别模型
```python
python -m paddle_serving_client.convert --dirname ../../inference/rec_ppocrv3/Student \
@ -554,7 +566,7 @@ python -m paddle_serving_client.convert --dirname ../../inference/rec_ppocrv3/St
```
## 7.3 启动服务
### 7.3 启动服务
首先可以将后处理代码加入到web_service.py中具体修改如下
```
# 代码153行后面增加下面代码
@ -582,7 +594,7 @@ res = {"result": str(key_value)}
python web_service.py 2>&1 >log.txt
```
## 7.4 发送请求
### 7.4 发送请求
然后再开启一个新的终端,运行下面的客户端代码
```python