diff --git a/applications/imgs/det.png b/applications/imgs/det.png deleted file mode 100644 index 6f21ee170ed272e6ae9c3ef475f60855a064cbbc..0000000000000000000000000000000000000000 Binary files a/applications/imgs/det.png and /dev/null differ diff --git a/applications/imgs/rec.png b/applications/imgs/rec.png deleted file mode 100644 index c9cd069e42198947cf65aeb14923765be296ab5e..0000000000000000000000000000000000000000 Binary files a/applications/imgs/rec.png and /dev/null differ diff --git a/applications/imgs/sys_res.png b/applications/imgs/sys_res.png deleted file mode 100644 index 6a9305c62d529f87a9ab063f9933b686c8c63228..0000000000000000000000000000000000000000 Binary files a/applications/imgs/sys_res.png and /dev/null differ diff --git "a/applications/\346\266\262\346\231\266\345\261\217\350\257\273\346\225\260\350\257\206\345\210\253.md" "b/applications/\346\266\262\346\231\266\345\261\217\350\257\273\346\225\260\350\257\206\345\210\253.md" index 6b1ea243067b1897ff7a7d0590ae7a5a31d50246..b85bf56daf8fb217edc6d42276d395192790c32f 100644 --- "a/applications/\346\266\262\346\231\266\345\261\217\350\257\273\346\225\260\350\257\206\345\210\253.md" +++ "b/applications/\346\266\262\346\231\266\345\261\217\350\257\273\346\225\260\350\257\206\345\210\253.md" @@ -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中的CML(Collaborative Mutual Learning) 协同互学习文本检测蒸馏策略进行了升级。如下图所示,CML的核心思想结合了①传统的Teacher指导Student的标准蒸馏与 ②Students网络之间的DML互学习,可以让Students网络互学习的同时,Teacher网络予以指导。PP-OCRv3分别针对教师模型和学生模型进行进一步效果优化。其中,在对教师模型优化时,提出了大感受野的PAN结构LK-PAN和引入了DML(Deep 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学习资料🎁 +
+ +
+将下载或训练完成的模型放置在对应目录下即可完成模型推理。 + +#### 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学习资料🎁 +
+ +
+将下载或训练完成的模型放置在对应目录下即可完成模型推理。 + +### 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