Merge branch 'dygraph' of https://github.com/PaddlePaddle/PaddleOCR into test_v10
commit
c1b0684cf5
|
@ -1,9 +1,9 @@
|
||||||
===========================train_params===========================
|
===========================train_params===========================
|
||||||
model_name:ocr_det
|
model_name:ocr_det
|
||||||
python:python3.7
|
python:python3.7
|
||||||
gpu_list:0|0,1
|
gpu_list:0|0,1|10.21.226.181,10.21.226.133;0,1
|
||||||
Global.use_gpu:True|True
|
Global.use_gpu:True|True|True
|
||||||
Global.auto_cast:null
|
Global.auto_cast:fp32|amp
|
||||||
Global.epoch_num:lite_train_infer=1|whole_train_infer=300
|
Global.epoch_num:lite_train_infer=1|whole_train_infer=300
|
||||||
Global.save_model_dir:./output/
|
Global.save_model_dir:./output/
|
||||||
Train.loader.batch_size_per_card:lite_train_infer=2|whole_train_infer=4
|
Train.loader.batch_size_per_card:lite_train_infer=2|whole_train_infer=4
|
||||||
|
|
|
@ -6,7 +6,7 @@ C++预测功能测试的主程序为`test_inference_cpp.sh`,可以测试基于
|
||||||
|
|
||||||
基于训练是否使用量化,进行本测试的模型可以分为`正常模型`和`量化模型`,这两类模型对应的C++预测功能汇总如下:
|
基于训练是否使用量化,进行本测试的模型可以分为`正常模型`和`量化模型`,这两类模型对应的C++预测功能汇总如下:
|
||||||
|
|
||||||
| 模型类型 |device | batchsize | tensorrt | mkldnn | cpu多线程 |
|
| 模型类型 |device | batchsize | tensorrt | mkldnn | cpu多线程 |
|
||||||
| ---- | ---- | ---- | :----: | :----: | :----: |
|
| ---- | ---- | ---- | :----: | :----: | :----: |
|
||||||
| 正常模型 | GPU | 1/6 | fp32/fp16 | - | - |
|
| 正常模型 | GPU | 1/6 | fp32/fp16 | - | - |
|
||||||
| 正常模型 | CPU | 1/6 | - | fp32 | 支持 |
|
| 正常模型 | CPU | 1/6 | - | fp32 | 支持 |
|
||||||
|
@ -15,17 +15,17 @@ C++预测功能测试的主程序为`test_inference_cpp.sh`,可以测试基于
|
||||||
|
|
||||||
## 2. 测试流程
|
## 2. 测试流程
|
||||||
### 2.1 功能测试
|
### 2.1 功能测试
|
||||||
先运行`prepare.sh`准备数据和模型,然后运行`test_inference_cpp.sh`进行测试,最终在```tests/output```目录下生成`cpp_infer_*.log`后缀的日志文件。
|
先运行`prepare.sh`准备数据和模型,然后运行`test_inference_cpp.sh`进行测试,最终在```PTDN/output```目录下生成`cpp_infer_*.log`后缀的日志文件。
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
bash tests/prepare.sh ./tests/configs/ppocr_det_mobile_params.txt "cpp_infer"
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt "cpp_infer"
|
||||||
|
|
||||||
# 用法1:
|
# 用法1:
|
||||||
bash tests/test_inference_cpp.sh ./tests/configs/ppocr_det_mobile_params.txt
|
bash PTDN/test_inference_cpp.sh ./PTDN/configs/ppocr_det_mobile_params.txt
|
||||||
# 用法2: 指定GPU卡预测,第三个传入参数为GPU卡号
|
# 用法2: 指定GPU卡预测,第三个传入参数为GPU卡号
|
||||||
bash tests/test_inference_cpp.sh ./tests/configs/ppocr_det_mobile_params.txt '1'
|
bash PTDN/test_inference_cpp.sh ./PTDN/configs/ppocr_det_mobile_params.txt '1'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
### 2.2 精度测试
|
### 2.2 精度测试
|
||||||
|
|
||||||
|
@ -37,12 +37,12 @@ bash tests/test_inference_cpp.sh ./tests/configs/ppocr_det_mobile_params.txt '1'
|
||||||
#### 使用方式
|
#### 使用方式
|
||||||
运行命令:
|
运行命令:
|
||||||
```shell
|
```shell
|
||||||
python3.7 tests/compare_results.py --gt_file=./tests/results/cpp_*.txt --log_file=./tests/output/cpp_*.log --atol=1e-3 --rtol=1e-3
|
python3.7 PTDN/compare_results.py --gt_file=./PTDN/results/cpp_*.txt --log_file=./PTDN/output/cpp_*.log --atol=1e-3 --rtol=1e-3
|
||||||
```
|
```
|
||||||
|
|
||||||
参数介绍:
|
参数介绍:
|
||||||
- gt_file: 指向事先保存好的预测结果路径,支持*.txt 结尾,会自动索引*.txt格式的文件,文件默认保存在tests/result/ 文件夹下
|
- gt_file: 指向事先保存好的预测结果路径,支持*.txt 结尾,会自动索引*.txt格式的文件,文件默认保存在PTDN/result/ 文件夹下
|
||||||
- log_file: 指向运行tests/test.sh 脚本的infer模式保存的预测日志,预测日志中打印的有预测结果,比如:文本框,预测文本,类别等等,同样支持infer_*.log格式传入
|
- log_file: 指向运行PTDN/test_inference_cpp.sh 脚本的infer模式保存的预测日志,预测日志中打印的有预测结果,比如:文本框,预测文本,类别等等,同样支持cpp_infer_*.log格式传入
|
||||||
- atol: 设置的绝对误差
|
- atol: 设置的绝对误差
|
||||||
- rtol: 设置的相对误差
|
- rtol: 设置的相对误差
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
# PaddleServing预测功能测试
|
||||||
|
|
||||||
|
PaddleServing预测功能测试的主程序为`test_serving.sh`,可以测试基于PaddleServing的部署功能。
|
||||||
|
|
||||||
|
## 1. 测试结论汇总
|
||||||
|
|
||||||
|
基于训练是否使用量化,进行本测试的模型可以分为`正常模型`和`量化模型`,这两类模型对应的C++预测功能汇总如下:
|
||||||
|
|
||||||
|
| 模型类型 |device | batchsize | tensorrt | mkldnn | cpu多线程 |
|
||||||
|
| ---- | ---- | ---- | :----: | :----: | :----: |
|
||||||
|
| 正常模型 | GPU | 1/6 | fp32/fp16 | - | - |
|
||||||
|
| 正常模型 | CPU | 1/6 | - | fp32 | 支持 |
|
||||||
|
| 量化模型 | GPU | 1/6 | int8 | - | - |
|
||||||
|
| 量化模型 | CPU | 1/6 | - | int8 | 支持 |
|
||||||
|
|
||||||
|
## 2. 测试流程
|
||||||
|
### 2.1 功能测试
|
||||||
|
先运行`prepare.sh`准备数据和模型,然后运行`test_serving.sh`进行测试,最终在```PTDN/output```目录下生成`serving_infer_*.log`后缀的日志文件。
|
||||||
|
|
||||||
|
```shell
|
||||||
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt "serving_infer"
|
||||||
|
|
||||||
|
# 用法:
|
||||||
|
bash PTND/test_serving.sh ./PTDN/configs/ppocr_det_mobile_params.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 运行结果
|
||||||
|
|
||||||
|
各测试的运行情况会打印在 `PTDN/output/results_serving.log` 中:
|
||||||
|
运行成功时会输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Run successfully with command - python3.7 pipeline_http_client.py --image_dir=../../doc/imgs > ../../tests/output/server_infer_cpu_usemkldnn_True_threads_1_batchsize_1.log 2>&1 !
|
||||||
|
Run successfully with command - xxxxx
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
运行失败时会输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
Run failed with command - python3.7 pipeline_http_client.py --image_dir=../../doc/imgs > ../../tests/output/server_infer_cpu_usemkldnn_True_threads_1_batchsize_1.log 2>&1 !
|
||||||
|
Run failed with command - python3.7 pipeline_http_client.py --image_dir=../../doc/imgs > ../../tests/output/server_infer_cpu_usemkldnn_True_threads_6_batchsize_1.log 2>&1 !
|
||||||
|
Run failed with command - xxxxx
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
详细的预测结果会存在 PTDN/output/ 文件夹下,例如`server_infer_gpu_usetrt_True_precision_fp16_batchsize_1.log`中会返回检测框的坐标:
|
||||||
|
|
||||||
|
```
|
||||||
|
{'err_no': 0, 'err_msg': '', 'key': ['dt_boxes'], 'value': ['[[[ 78. 642.]\n [409. 640.]\n [409. 657.]\n
|
||||||
|
[ 78. 659.]]\n\n [[ 75. 614.]\n [211. 614.]\n [211. 635.]\n [ 75. 635.]]\n\n
|
||||||
|
[[103. 554.]\n [135. 554.]\n [135. 575.]\n [103. 575.]]\n\n [[ 75. 531.]\n
|
||||||
|
[347. 531.]\n [347. 549.]\n [ 75. 549.] ]\n\n [[ 76. 503.]\n [309. 498.]\n
|
||||||
|
[309. 521.]\n [ 76. 526.]]\n\n [[163. 462.]\n [317. 462.]\n [317. 493.]\n
|
||||||
|
[163. 493.]]\n\n [[324. 431.]\n [414. 431.]\n [414. 452.]\n [324. 452.]]\n\n
|
||||||
|
[[ 76. 412.]\n [208. 408.]\n [209. 424.]\n [ 76. 428.]]\n\n [[307. 409.]\n
|
||||||
|
[428. 409.]\n [428. 426.]\n [307 . 426.]]\n\n [[ 74. 385.]\n [217. 382.]\n
|
||||||
|
[217. 400.]\n [ 74. 403.]]\n\n [[308. 381.]\n [427. 380.]\n [427. 400.]\n
|
||||||
|
[308. 401.]]\n\n [[ 74. 363.]\n [195. 362.]\n [195. 378.]\n [ 74. 379.]]\n\n
|
||||||
|
[[303. 359.]\n [423. 357.]\n [423. 375.]\n [303. 377.]]\n\n [[ 70. 336.]\n
|
||||||
|
[239. 334.]\n [239. 354.]\ n [ 70. 356.]]\n\n [[ 70. 312.]\n [204. 310.]\n
|
||||||
|
[204. 327.]\n [ 70. 330.]]\n\n [[303. 308.]\n [419. 306.]\n [419. 326.]\n
|
||||||
|
[303. 328.]]\n\n [[113. 2 72.]\n [246. 270.]\n [247. 299.]\n [113. 301.]]\n\n
|
||||||
|
[[361. 269.]\n [384. 269.]\n [384. 296.]\n [361. 296.]]\n\n [[ 70. 250.]\n
|
||||||
|
[243. 246.]\n [243. 265.]\n [ 70. 269.]]\n\n [[ 65. 221.]\n [187. 220.]\n
|
||||||
|
[187. 240.]\n [ 65. 241.]]\n\n [[337. 216.]\n [382. 216.]\n [382. 240.]\n
|
||||||
|
[337. 240.]]\n\n [ [ 65. 196.]\n [247. 193.]\n [247. 213.]\n [ 65. 216.]]\n\n
|
||||||
|
[[296. 197.]\n [423. 191.]\n [424. 209.]\n [296. 215.]]\n\n [[ 65. 167.]\n [244. 167.]\n
|
||||||
|
[244. 186.]\n [ 65. 186.]]\n\n [[ 67. 139.]\n [290. 139.]\n [290. 159.]\n [ 67. 159.]]\n\n
|
||||||
|
[[ 68. 113.]\n [410. 113.]\n [410. 128.]\n [ 68. 129.] ]\n\n [[277. 87.]\n [416. 87.]\n
|
||||||
|
[416. 108.]\n [277. 108.]]\n\n [[ 79. 28.]\n [132. 28.]\n [132. 62.]\n [ 79. 62.]]\n\n
|
||||||
|
[[163. 17.]\n [410. 14.]\n [410. 50.]\n [163. 53.]]]']}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 3. 更多教程
|
||||||
|
|
||||||
|
本文档为功能测试用,更详细的Serving预测使用教程请参考:[PPOCR 服务化部署](https://github.com/PaddlePaddle/PaddleOCR/blob/dygraph/deploy/pdserving/README_CN.md)
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
- 预测相关:基于训练是否使用量化,可以将训练产出的模型可以分为`正常模型`和`量化模型`,这两类模型对应的预测功能汇总如下,
|
- 预测相关:基于训练是否使用量化,可以将训练产出的模型可以分为`正常模型`和`量化模型`,这两类模型对应的预测功能汇总如下,
|
||||||
|
|
||||||
| 模型类型 |device | batchsize | tensorrt | mkldnn | cpu多线程 |
|
| 模型类型 |device | batchsize | tensorrt | mkldnn | cpu多线程 |
|
||||||
| ---- | ---- | ---- | :----: | :----: | :----: |
|
| ---- | ---- | ---- | :----: | :----: | :----: |
|
||||||
| 正常模型 | GPU | 1/6 | fp32/fp16 | - | - |
|
| 正常模型 | GPU | 1/6 | fp32/fp16 | - | - |
|
||||||
| 正常模型 | CPU | 1/6 | - | fp32 | 支持 |
|
| 正常模型 | CPU | 1/6 | - | fp32 | 支持 |
|
||||||
|
@ -46,42 +46,42 @@
|
||||||
|
|
||||||
|
|
||||||
### 2.2 功能测试
|
### 2.2 功能测试
|
||||||
先运行`prepare.sh`准备数据和模型,然后运行`test_train_inference_python.sh`进行测试,最终在```tests/output```目录下生成`python_infer_*.log`格式的日志文件。
|
先运行`prepare.sh`准备数据和模型,然后运行`test_train_inference_python.sh`进行测试,最终在```PTDN/output```目录下生成`python_infer_*.log`格式的日志文件。
|
||||||
|
|
||||||
|
|
||||||
`test_train_inference_python.sh`包含5种运行模式,每种模式的运行数据不同,分别用于测试速度和精度,分别是:
|
`test_train_inference_python.sh`包含5种运行模式,每种模式的运行数据不同,分别用于测试速度和精度,分别是:
|
||||||
|
|
||||||
- 模式1:lite_train_infer,使用少量数据训练,用于快速验证训练到预测的走通流程,不验证精度和速度;
|
- 模式1:lite_train_infer,使用少量数据训练,用于快速验证训练到预测的走通流程,不验证精度和速度;
|
||||||
```shell
|
```shell
|
||||||
bash tests/prepare.sh ./tests/configs/ppocr_det_mobile_params.txt 'lite_train_infer'
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'lite_train_infer'
|
||||||
bash tests/test_train_inference_python.sh ./tests/configs/ppocr_det_mobile_params.txt 'lite_train_infer'
|
bash PTDN/test_train_inference_python.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'lite_train_infer'
|
||||||
```
|
```
|
||||||
|
|
||||||
- 模式2:whole_infer,使用少量数据训练,一定量数据预测,用于验证训练后的模型执行预测,预测速度是否合理;
|
- 模式2:whole_infer,使用少量数据训练,一定量数据预测,用于验证训练后的模型执行预测,预测速度是否合理;
|
||||||
```shell
|
```shell
|
||||||
bash tests/prepare.sh ./tests/configs/ppocr_det_mobile_params.txt 'whole_infer'
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'whole_infer'
|
||||||
bash tests/test_train_inference_python.sh ./tests/configs/ppocr_det_mobile_params.txt 'whole_infer'
|
bash PTDN/test_train_inference_python.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'whole_infer'
|
||||||
```
|
```
|
||||||
|
|
||||||
- 模式3:infer,不训练,全量数据预测,走通开源模型评估、动转静,检查inference model预测时间和精度;
|
- 模式3:infer,不训练,全量数据预测,走通开源模型评估、动转静,检查inference model预测时间和精度;
|
||||||
```shell
|
```shell
|
||||||
bash tests/prepare.sh ./tests/configs/ppocr_det_mobile_params.txt 'infer'
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'infer'
|
||||||
# 用法1:
|
# 用法1:
|
||||||
bash tests/test_train_inference_python.sh ./tests/configs/ppocr_det_mobile_params.txt 'infer'
|
bash PTDN/test_train_inference_python.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'infer'
|
||||||
# 用法2: 指定GPU卡预测,第三个传入参数为GPU卡号
|
# 用法2: 指定GPU卡预测,第三个传入参数为GPU卡号
|
||||||
bash tests/test_train_inference_python.sh ./tests/configs/ppocr_det_mobile_params.txt 'infer' '1'
|
bash PTDN/test_train_inference_python.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'infer' '1'
|
||||||
```
|
```
|
||||||
|
|
||||||
- 模式4:whole_train_infer,CE: 全量数据训练,全量数据预测,验证模型训练精度,预测精度,预测速度;
|
- 模式4:whole_train_infer,CE: 全量数据训练,全量数据预测,验证模型训练精度,预测精度,预测速度;
|
||||||
```shell
|
```shell
|
||||||
bash tests/prepare.sh ./tests/configs/ppocr_det_mobile_params.txt 'whole_train_infer'
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'whole_train_infer'
|
||||||
bash tests/test_train_inference_python.sh ./tests/configs/ppocr_det_mobile_params.txt 'whole_train_infer'
|
bash PTDN/test_train_inference_python.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'whole_train_infer'
|
||||||
```
|
```
|
||||||
|
|
||||||
- 模式5:klquant_infer,测试离线量化;
|
- 模式5:klquant_infer,测试离线量化;
|
||||||
```shell
|
```shell
|
||||||
bash tests/prepare.sh ./tests/configs/ppocr_det_mobile_params.txt 'klquant_infer'
|
bash PTDN/prepare.sh ./PTDN/configs/ppocr_det_mobile_params.txt 'klquant_infer'
|
||||||
bash tests/test_train_inference_python.sh tests/configs/ppocr_det_mobile_params.txt 'klquant_infer'
|
bash PTDN/test_train_inference_python.sh PTDN/configs/ppocr_det_mobile_params.txt 'klquant_infer'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -95,12 +95,12 @@ bash tests/test_train_inference_python.sh tests/configs/ppocr_det_mobile_params.
|
||||||
#### 使用方式
|
#### 使用方式
|
||||||
运行命令:
|
运行命令:
|
||||||
```shell
|
```shell
|
||||||
python3.7 tests/compare_results.py --gt_file=./tests/results/python_*.txt --log_file=./tests/output/python_*.log --atol=1e-3 --rtol=1e-3
|
python3.7 PTDN/compare_results.py --gt_file=./PTDN/results/python_*.txt --log_file=./PTDN/output/python_*.log --atol=1e-3 --rtol=1e-3
|
||||||
```
|
```
|
||||||
|
|
||||||
参数介绍:
|
参数介绍:
|
||||||
- gt_file: 指向事先保存好的预测结果路径,支持*.txt 结尾,会自动索引*.txt格式的文件,文件默认保存在tests/result/ 文件夹下
|
- gt_file: 指向事先保存好的预测结果路径,支持*.txt 结尾,会自动索引*.txt格式的文件,文件默认保存在PTDN/result/ 文件夹下
|
||||||
- log_file: 指向运行tests/test.sh 脚本的infer模式保存的预测日志,预测日志中打印的有预测结果,比如:文本框,预测文本,类别等等,同样支持infer_*.log格式传入
|
- log_file: 指向运行PTDN/test_train_inference_python.sh 脚本的infer模式保存的预测日志,预测日志中打印的有预测结果,比如:文本框,预测文本,类别等等,同样支持python_infer_*.log格式传入
|
||||||
- atol: 设置的绝对误差
|
- atol: 设置的绝对误差
|
||||||
- rtol: 设置的相对误差
|
- rtol: 设置的相对误差
|
||||||
|
|
||||||
|
|
|
@ -15,20 +15,23 @@
|
||||||
|
|
||||||
**字段说明:**
|
**字段说明:**
|
||||||
- 基础训练预测:包括模型训练、Paddle Inference Python预测。
|
- 基础训练预测:包括模型训练、Paddle Inference Python预测。
|
||||||
- 其他:包括Paddle Inference C++预测、Paddle Serving部署、Paddle-Lite部署等。
|
- 更多训练方式:包括多机多卡、混合精度。
|
||||||
|
- 模型压缩:包括裁剪、离线/在线量化、蒸馏。
|
||||||
|
- 其他预测部署:包括Paddle Inference C++预测、Paddle Serving部署、Paddle-Lite部署等。
|
||||||
|
|
||||||
|
更详细的mkldnn、Tensorrt等预测加速相关功能的支持情况可以查看各测试工具的[更多教程](#more)。
|
||||||
|
|
||||||
| 算法论文 | 模型名称 | 模型类型 | 基础训练预测 | 其他 |
|
| 算法论文 | 模型名称 | 模型类型 | 基础<br>训练预测 | 更多<br>训练方式 | 模型压缩 | 其他预测部署 |
|
||||||
| :--- | :--- | :----: | :--------: | :---- |
|
| :--- | :--- | :----: | :--------: | :---- | :---- | :---- |
|
||||||
| DB |ch_ppocr_mobile_v2.0_det | 检测 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
| DB |ch_ppocr_mobile_v2.0_det | 检测 | 支持 | 多机多卡 <br> 混合精度 | FPGM裁剪 <br> 离线量化| Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
||||||
| DB |ch_ppocr_server_v2.0_det | 检测 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
| DB |ch_ppocr_server_v2.0_det | 检测 | 支持 | 多机多卡 <br> 混合精度 | FPGM裁剪 <br> 离线量化| Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
||||||
| DB |ch_PP-OCRv2_det | 检测 |
|
| DB |ch_PP-OCRv2_det | 检测 |
|
||||||
| CRNN |ch_ppocr_mobile_v2.0_rec | 识别 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
| CRNN |ch_ppocr_mobile_v2.0_rec | 识别 | 支持 | 多机多卡 <br> 混合精度 | PACT量化 <br> 离线量化| Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
||||||
| CRNN |ch_ppocr_server_v2.0_rec | 识别 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
| CRNN |ch_ppocr_server_v2.0_rec | 识别 | 支持 | 多机多卡 <br> 混合精度 | PACT量化 <br> 离线量化| Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
||||||
| CRNN |ch_PP-OCRv2_rec | 识别 |
|
| CRNN |ch_PP-OCRv2_rec | 识别 |
|
||||||
| PP-OCR |ch_ppocr_mobile_v2.0 | 检测+识别 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
| PP-OCR |ch_ppocr_mobile_v2.0 | 检测+识别 | 支持 | 多机多卡 <br> 混合精度 | - | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
||||||
| PP-OCR |ch_ppocr_server_v2.0 | 检测+识别 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
| PP-OCR |ch_ppocr_server_v2.0 | 检测+识别 | 支持 | 多机多卡 <br> 混合精度 | - | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
||||||
|PP-OCRv2|ch_PP-OCRv2 | 检测+识别 | 支持 | Paddle Inference: C++ <br> Paddle Serving: Python, C++ <br> Paddle-Lite: <br> (1) ARM CPU(C++) |
|
|PP-OCRv2|ch_PP-OCRv2 | 检测+识别 |
|
||||||
| DB |det_mv3_db_v2.0 | 检测 |
|
| DB |det_mv3_db_v2.0 | 检测 |
|
||||||
| DB |det_r50_vd_db_v2.0 | 检测 |
|
| DB |det_r50_vd_db_v2.0 | 检测 |
|
||||||
| EAST |det_mv3_east_v2.0 | 检测 |
|
| EAST |det_mv3_east_v2.0 | 检测 |
|
||||||
|
@ -98,6 +101,8 @@ PTDN/
|
||||||
- `test_serving.sh`:测试基于Paddle Serving的服务化部署功能。
|
- `test_serving.sh`:测试基于Paddle Serving的服务化部署功能。
|
||||||
- `test_lite.sh`:测试基于Paddle-Lite的端侧预测部署功能。
|
- `test_lite.sh`:测试基于Paddle-Lite的端侧预测部署功能。
|
||||||
|
|
||||||
|
<a name="more"></a>
|
||||||
|
#### 更多教程
|
||||||
各功能测试中涉及混合精度、裁剪、量化等训练相关,及mkldnn、Tensorrt等多种预测相关参数配置,请点击下方相应链接了解更多细节和使用教程:
|
各功能测试中涉及混合精度、裁剪、量化等训练相关,及mkldnn、Tensorrt等多种预测相关参数配置,请点击下方相应链接了解更多细节和使用教程:
|
||||||
[test_train_inference_python 使用](docs/test_train_inference_python.md)
|
[test_train_inference_python 使用](docs/test_train_inference_python.md)
|
||||||
[test_inference_cpp 使用](docs/test_inference_cpp.md)
|
[test_inference_cpp 使用](docs/test_inference_cpp.md)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
source tests/common_func.sh
|
source PTDN/common_func.sh
|
||||||
|
|
||||||
FILENAME=$1
|
FILENAME=$1
|
||||||
dataline=$(awk 'NR==67, NR==83{print}' $FILENAME)
|
dataline=$(awk 'NR==67, NR==83{print}' $FILENAME)
|
||||||
|
@ -36,8 +36,8 @@ web_precision_key=$(func_parser_key "${lines[15]}")
|
||||||
web_precision_list=$(func_parser_value "${lines[15]}")
|
web_precision_list=$(func_parser_value "${lines[15]}")
|
||||||
pipeline_py=$(func_parser_value "${lines[16]}")
|
pipeline_py=$(func_parser_value "${lines[16]}")
|
||||||
|
|
||||||
LOG_PATH="../../tests/output"
|
LOG_PATH="../../PTDN/output"
|
||||||
mkdir -p ./tests/output
|
mkdir -p ./PTDN/output
|
||||||
status_log="${LOG_PATH}/results_serving.log"
|
status_log="${LOG_PATH}/results_serving.log"
|
||||||
|
|
||||||
function func_serving(){
|
function func_serving(){
|
||||||
|
|
|
@ -245,6 +245,7 @@ else
|
||||||
for gpu in ${gpu_list[*]}; do
|
for gpu in ${gpu_list[*]}; do
|
||||||
use_gpu=${USE_GPU_KEY[Count]}
|
use_gpu=${USE_GPU_KEY[Count]}
|
||||||
Count=$(($Count + 1))
|
Count=$(($Count + 1))
|
||||||
|
ips=""
|
||||||
if [ ${gpu} = "-1" ];then
|
if [ ${gpu} = "-1" ];then
|
||||||
env=""
|
env=""
|
||||||
elif [ ${#gpu} -le 1 ];then
|
elif [ ${#gpu} -le 1 ];then
|
||||||
|
@ -264,6 +265,11 @@ else
|
||||||
env=" "
|
env=" "
|
||||||
fi
|
fi
|
||||||
for autocast in ${autocast_list[*]}; do
|
for autocast in ${autocast_list[*]}; do
|
||||||
|
if [ ${autocast} = "amp" ]; then
|
||||||
|
set_amp_config="Global.use_amp=True Global.scale_loss=1024.0 Global.use_dynamic_loss_scaling=True"
|
||||||
|
else
|
||||||
|
set_amp_config=" "
|
||||||
|
fi
|
||||||
for trainer in ${trainer_list[*]}; do
|
for trainer in ${trainer_list[*]}; do
|
||||||
flag_quant=False
|
flag_quant=False
|
||||||
if [ ${trainer} = ${pact_key} ]; then
|
if [ ${trainer} = ${pact_key} ]; then
|
||||||
|
@ -290,7 +296,6 @@ else
|
||||||
if [ ${run_train} = "null" ]; then
|
if [ ${run_train} = "null" ]; then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
set_autocast=$(func_set_params "${autocast_key}" "${autocast}")
|
set_autocast=$(func_set_params "${autocast_key}" "${autocast}")
|
||||||
set_epoch=$(func_set_params "${epoch_key}" "${epoch_num}")
|
set_epoch=$(func_set_params "${epoch_key}" "${epoch_num}")
|
||||||
set_pretrain=$(func_set_params "${pretrain_model_key}" "${pretrain_model_value}")
|
set_pretrain=$(func_set_params "${pretrain_model_key}" "${pretrain_model_value}")
|
||||||
|
@ -306,11 +311,11 @@ else
|
||||||
|
|
||||||
set_save_model=$(func_set_params "${save_model_key}" "${save_log}")
|
set_save_model=$(func_set_params "${save_model_key}" "${save_log}")
|
||||||
if [ ${#gpu} -le 2 ];then # train with cpu or single gpu
|
if [ ${#gpu} -le 2 ];then # train with cpu or single gpu
|
||||||
cmd="${python} ${run_train} ${set_use_gpu} ${set_save_model} ${set_epoch} ${set_pretrain} ${set_autocast} ${set_batchsize} ${set_train_params1} "
|
cmd="${python} ${run_train} ${set_use_gpu} ${set_save_model} ${set_epoch} ${set_pretrain} ${set_autocast} ${set_batchsize} ${set_train_params1} ${set_amp_config} "
|
||||||
elif [ ${#gpu} -le 15 ];then # train with multi-gpu
|
elif [ ${#ips} -le 26 ];then # train with multi-gpu
|
||||||
cmd="${python} -m paddle.distributed.launch --gpus=${gpu} ${run_train} ${set_save_model} ${set_epoch} ${set_pretrain} ${set_autocast} ${set_batchsize} ${set_train_params1}"
|
cmd="${python} -m paddle.distributed.launch --gpus=${gpu} ${run_train} ${set_use_gpu} ${set_save_model} ${set_epoch} ${set_pretrain} ${set_autocast} ${set_batchsize} ${set_train_params1} ${set_amp_config}"
|
||||||
else # train with multi-machine
|
else # train with multi-machine
|
||||||
cmd="${python} -m paddle.distributed.launch --ips=${ips} --gpus=${gpu} ${run_train} ${set_save_model} ${set_pretrain} ${set_epoch} ${set_autocast} ${set_batchsize} ${set_train_params1}"
|
cmd="${python} -m paddle.distributed.launch --ips=${ips} --gpus=${gpu} ${set_use_gpu} ${run_train} ${set_save_model} ${set_pretrain} ${set_epoch} ${set_autocast} ${set_batchsize} ${set_train_params1} ${set_amp_config}"
|
||||||
fi
|
fi
|
||||||
# run train
|
# run train
|
||||||
eval "unset CUDA_VISIBLE_DEVICES"
|
eval "unset CUDA_VISIBLE_DEVICES"
|
||||||
|
|
|
@ -17,7 +17,7 @@ Global:
|
||||||
character_dict_path: ppocr/utils/EN_symbol_dict.txt
|
character_dict_path: ppocr/utils/EN_symbol_dict.txt
|
||||||
max_text_length: 25
|
max_text_length: 25
|
||||||
infer_mode: False
|
infer_mode: False
|
||||||
use_space_char: True
|
use_space_char: False
|
||||||
save_res_path: ./output/rec/predicts_nrtr.txt
|
save_res_path: ./output/rec/predicts_nrtr.txt
|
||||||
|
|
||||||
Optimizer:
|
Optimizer:
|
||||||
|
|
|
@ -64,7 +64,7 @@ C-CTC Loss是CTC Loss + Center Loss的简称。 其中Center Loss出自论文 <
|
||||||
|
|
||||||
以配置文件`configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml`为例, center提取命令如下所示:
|
以配置文件`configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml`为例, center提取命令如下所示:
|
||||||
```
|
```
|
||||||
python tools/export_center.py -c configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml -o Global.pretrained_model: "./output/rec_mobile_pp-OCRv2/best_accuracy"
|
python tools/export_center.py -c configs/rec/ch_PP-OCRv2/ch_PP-OCRv2_rec.yml -o Global.pretrained_model="./output/rec_mobile_pp-OCRv2/best_accuracy"
|
||||||
```
|
```
|
||||||
运行完后,会在PaddleOCR主目录下生成`train_center.pkl`.
|
运行完后,会在PaddleOCR主目录下生成`train_center.pkl`.
|
||||||
|
|
||||||
|
|
BIN
doc/joinus.PNG
BIN
doc/joinus.PNG
Binary file not shown.
Before Width: | Height: | Size: 188 KiB After Width: | Height: | Size: 210 KiB |
|
@ -29,10 +29,7 @@ from .rec_postprocess import CTCLabelDecode, AttnLabelDecode, SRNLabelDecode, Di
|
||||||
TableLabelDecode, NRTRLabelDecode, SARLabelDecode , SEEDLabelDecode
|
TableLabelDecode, NRTRLabelDecode, SARLabelDecode , SEEDLabelDecode
|
||||||
from .cls_postprocess import ClsPostProcess
|
from .cls_postprocess import ClsPostProcess
|
||||||
from .pg_postprocess import PGPostProcess
|
from .pg_postprocess import PGPostProcess
|
||||||
|
from .pse_postprocess import PSEPostProcess
|
||||||
if platform.system() != "Windows":
|
|
||||||
# pse is not support in Windows
|
|
||||||
from .pse_postprocess import PSEPostProcess
|
|
||||||
|
|
||||||
|
|
||||||
def build_post_process(config, global_config=None):
|
def build_post_process(config, global_config=None):
|
||||||
|
|
|
@ -17,7 +17,12 @@ import subprocess
|
||||||
|
|
||||||
python_path = sys.executable
|
python_path = sys.executable
|
||||||
|
|
||||||
if subprocess.call('cd ppocr/postprocess/pse_postprocess/pse;{} setup.py build_ext --inplace;cd -'.format(python_path), shell=True) != 0:
|
ori_path = os.getcwd()
|
||||||
raise RuntimeError('Cannot compile pse: {}'.format(os.path.dirname(os.path.realpath(__file__))))
|
os.chdir('ppocr/postprocess/pse_postprocess/pse')
|
||||||
|
if subprocess.call(
|
||||||
|
'{} setup.py build_ext --inplace'.format(python_path), shell=True) != 0:
|
||||||
|
raise RuntimeError('Cannot compile pse: {}'.format(
|
||||||
|
os.path.dirname(os.path.realpath(__file__))))
|
||||||
|
os.chdir(ori_path)
|
||||||
|
|
||||||
from .pse import pse
|
from .pse import pse
|
||||||
|
|
|
@ -159,7 +159,8 @@ def train(config,
|
||||||
eval_class,
|
eval_class,
|
||||||
pre_best_model_dict,
|
pre_best_model_dict,
|
||||||
logger,
|
logger,
|
||||||
vdl_writer=None):
|
vdl_writer=None,
|
||||||
|
scaler=None):
|
||||||
cal_metric_during_train = config['Global'].get('cal_metric_during_train',
|
cal_metric_during_train = config['Global'].get('cal_metric_during_train',
|
||||||
False)
|
False)
|
||||||
log_smooth_window = config['Global']['log_smooth_window']
|
log_smooth_window = config['Global']['log_smooth_window']
|
||||||
|
@ -226,14 +227,29 @@ def train(config,
|
||||||
images = batch[0]
|
images = batch[0]
|
||||||
if use_srn:
|
if use_srn:
|
||||||
model_average = True
|
model_average = True
|
||||||
if model_type == 'table' or extra_input:
|
|
||||||
preds = model(images, data=batch[1:])
|
# use amp
|
||||||
|
if scaler:
|
||||||
|
with paddle.amp.auto_cast():
|
||||||
|
if model_type == 'table' or extra_input:
|
||||||
|
preds = model(images, data=batch[1:])
|
||||||
|
else:
|
||||||
|
preds = model(images)
|
||||||
else:
|
else:
|
||||||
preds = model(images)
|
if model_type == 'table' or extra_input:
|
||||||
|
preds = model(images, data=batch[1:])
|
||||||
|
else:
|
||||||
|
preds = model(images)
|
||||||
loss = loss_class(preds, batch)
|
loss = loss_class(preds, batch)
|
||||||
avg_loss = loss['loss']
|
avg_loss = loss['loss']
|
||||||
avg_loss.backward()
|
|
||||||
optimizer.step()
|
if scaler:
|
||||||
|
scaled_avg_loss = scaler.scale(avg_loss)
|
||||||
|
scaled_avg_loss.backward()
|
||||||
|
scaler.minimize(optimizer, scaled_avg_loss)
|
||||||
|
else:
|
||||||
|
avg_loss.backward()
|
||||||
|
optimizer.step()
|
||||||
optimizer.clear_grad()
|
optimizer.clear_grad()
|
||||||
|
|
||||||
train_batch_cost += time.time() - batch_start
|
train_batch_cost += time.time() - batch_start
|
||||||
|
@ -480,11 +496,6 @@ def preprocess(is_train=False):
|
||||||
'CLS', 'PGNet', 'Distillation', 'NRTR', 'TableAttn', 'SAR', 'PSE',
|
'CLS', 'PGNet', 'Distillation', 'NRTR', 'TableAttn', 'SAR', 'PSE',
|
||||||
'SEED'
|
'SEED'
|
||||||
]
|
]
|
||||||
windows_not_support_list = ['PSE']
|
|
||||||
if platform.system() == "Windows" and alg in windows_not_support_list:
|
|
||||||
logger.warning('{} is not support in Windows now'.format(
|
|
||||||
windows_not_support_list))
|
|
||||||
sys.exit()
|
|
||||||
|
|
||||||
device = 'gpu:{}'.format(dist.ParallelEnv().dev_id) if use_gpu else 'cpu'
|
device = 'gpu:{}'.format(dist.ParallelEnv().dev_id) if use_gpu else 'cpu'
|
||||||
device = paddle.set_device(device)
|
device = paddle.set_device(device)
|
||||||
|
|
|
@ -102,10 +102,27 @@ def main(config, device, logger, vdl_writer):
|
||||||
if valid_dataloader is not None:
|
if valid_dataloader is not None:
|
||||||
logger.info('valid dataloader has {} iters'.format(
|
logger.info('valid dataloader has {} iters'.format(
|
||||||
len(valid_dataloader)))
|
len(valid_dataloader)))
|
||||||
|
|
||||||
|
use_amp = config["Global"].get("use_amp", False)
|
||||||
|
if use_amp:
|
||||||
|
AMP_RELATED_FLAGS_SETTING = {
|
||||||
|
'FLAGS_cudnn_batchnorm_spatial_persistent': 1,
|
||||||
|
'FLAGS_max_inplace_grad_add': 8,
|
||||||
|
}
|
||||||
|
paddle.fluid.set_flags(AMP_RELATED_FLAGS_SETTING)
|
||||||
|
scale_loss = config["Global"].get("scale_loss", 1.0)
|
||||||
|
use_dynamic_loss_scaling = config["Global"].get(
|
||||||
|
"use_dynamic_loss_scaling", False)
|
||||||
|
scaler = paddle.amp.GradScaler(
|
||||||
|
init_loss_scaling=scale_loss,
|
||||||
|
use_dynamic_loss_scaling=use_dynamic_loss_scaling)
|
||||||
|
else:
|
||||||
|
scaler = None
|
||||||
|
|
||||||
# start train
|
# start train
|
||||||
program.train(config, train_dataloader, valid_dataloader, device, model,
|
program.train(config, train_dataloader, valid_dataloader, device, model,
|
||||||
loss_class, optimizer, lr_scheduler, post_process_class,
|
loss_class, optimizer, lr_scheduler, post_process_class,
|
||||||
eval_class, pre_best_model_dict, logger, vdl_writer)
|
eval_class, pre_best_model_dict, logger, vdl_writer, scaler)
|
||||||
|
|
||||||
|
|
||||||
def test_reader(config, device, logger):
|
def test_reader(config, device, logger):
|
||||||
|
|
Loading…
Reference in New Issue