From b9c73d9a72b05ab7afd1fab0f3f46c7f8eed61ce Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Tue, 7 Sep 2021 13:16:35 +0000 Subject: [PATCH 1/4] support rec for cpp cice --- deploy/cpp_infer/src/main.cpp | 63 +++++++++++++++++++++++++++-------- tests/ocr_rec_params.txt | 15 +++++++++ tests/prepare.sh | 17 +++++++++- 3 files changed, 80 insertions(+), 15 deletions(-) diff --git a/deploy/cpp_infer/src/main.cpp b/deploy/cpp_infer/src/main.cpp index 6e8ded7f8d..3165b72ddc 100644 --- a/deploy/cpp_infer/src/main.cpp +++ b/deploy/cpp_infer/src/main.cpp @@ -148,12 +148,28 @@ int main_rec(std::vector cv_all_img_names) { time_info[1] += rec_times[1]; time_info[2] += rec_times[2]; } - + + if (FLAGS_benchmark) { + AutoLogger autolog("ocr_rec", + FLAGS_use_gpu, + FLAGS_use_tensorrt, + FLAGS_enable_mkldnn, + FLAGS_cpu_threads, + 1, + "dynamic", + FLAGS_precision, + time_info, + cv_all_img_names.size()); + autolog.report(); + } return 0; } int main_system(std::vector cv_all_img_names) { + std::vector time_info_det = {0, 0, 0}; + std::vector time_info_rec = {0, 0, 0}; + DBDetector det(FLAGS_det_model_dir, FLAGS_use_gpu, FLAGS_gpu_id, FLAGS_gpu_mem, FLAGS_cpu_threads, FLAGS_enable_mkldnn, FLAGS_max_side_len, FLAGS_det_db_thresh, @@ -174,8 +190,6 @@ int main_system(std::vector cv_all_img_names) { FLAGS_enable_mkldnn, FLAGS_char_list_file, FLAGS_use_tensorrt, FLAGS_precision); - auto start = std::chrono::system_clock::now(); - for (int i = 0; i < cv_all_img_names.size(); ++i) { LOG(INFO) << "The predict img: " << cv_all_img_names[i]; @@ -189,7 +203,10 @@ int main_system(std::vector cv_all_img_names) { std::vector rec_times; det.Run(srcimg, boxes, &det_times); - + time_info_det[0] += det_times[0]; + time_info_det[1] += det_times[1]; + time_info_det[2] += det_times[2]; + cv::Mat crop_img; for (int j = 0; j < boxes.size(); j++) { crop_img = Utility::GetRotateCropImage(srcimg, boxes[j]); @@ -198,18 +215,36 @@ int main_system(std::vector cv_all_img_names) { crop_img = cls->Run(crop_img); } rec.Run(crop_img, &rec_times); + time_info_rec[0] += rec_times[0]; + time_info_rec[1] += rec_times[1]; + time_info_rec[2] += rec_times[2]; } - - auto end = std::chrono::system_clock::now(); - auto duration = - std::chrono::duration_cast(end - start); - std::cout << "Cost " - << double(duration.count()) * - std::chrono::microseconds::period::num / - std::chrono::microseconds::period::den - << "s" << std::endl; } - + if (FLAGS_benchmark) { + AutoLogger autolog_det("ocr_det", + FLAGS_use_gpu, + FLAGS_use_tensorrt, + FLAGS_enable_mkldnn, + FLAGS_cpu_threads, + 1, + "dynamic", + FLAGS_precision, + time_info_det, + cv_all_img_names.size()); + AutoLogger autolog_rec("ocr_rec", + FLAGS_use_gpu, + FLAGS_use_tensorrt, + FLAGS_enable_mkldnn, + FLAGS_cpu_threads, + 1, + "dynamic", + FLAGS_precision, + time_info_rec, + cv_all_img_names.size()); + autolog_det.report(); + std::cout << endl; + autolog_rec.report(); + } return 0; } diff --git a/tests/ocr_rec_params.txt b/tests/ocr_rec_params.txt index 2d27a9ee3b..a801c0afc7 100644 --- a/tests/ocr_rec_params.txt +++ b/tests/ocr_rec_params.txt @@ -49,3 +49,18 @@ inference:tools/infer/predict_rec.py --save_log_path:./test/output/ --benchmark:True null:null +===========================cpp_infer_params=========================== +use_opencv:True +infer_model:./inference/ch_ppocr_mobile_v2.0_rec_infer/ +infer_quant:False +inference:./deploy/cpp_infer/build/ppocr rec +--use_gpu:True|False +--enable_mkldnn:True|False +--cpu_threads:1|6 +--rec_batch_num:1 +--use_tensorrt:False|True +--precision:fp32|fp16 +--rec_model_dir: +--image_dir:./inference/rec_inference/ +--save_log_path:null +--benchmark:True \ No newline at end of file diff --git a/tests/prepare.sh b/tests/prepare.sh index aa6420054a..77fc46e05c 100644 --- a/tests/prepare.sh +++ b/tests/prepare.sh @@ -64,7 +64,7 @@ elif [ ${MODE} = "whole_infer" ];then cd ./train_data/ && tar xf icdar2015_infer.tar && tar xf ic15_data.tar ln -s ./icdar2015_infer ./icdar2015 cd ../ -elif [ ${MODE} = "infer" ] || [ ${MODE} = "cpp_infer" ];then +elif [ ${MODE} = "infer" ];then if [ ${model_name} = "ocr_det" ]; then eval_model_name="ch_ppocr_mobile_v2.0_det_train" rm -rf ./train_data/icdar2015 @@ -87,6 +87,21 @@ elif [ ${MODE} = "infer" ] || [ ${MODE} = "cpp_infer" ];then wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar cd ./inference && tar xf ${eval_model_name}.tar && tar xf rec_inference.tar && cd ../ fi +elif [ ${MODE} = "cpp_infer" ];then + if [ ${model_name} = "ocr_det" ]; then + wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/test/ch_det_data_50.tar + wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar + cd ./inference && tar xf ch_ppocr_mobile_v2.0_det_infer.tar && tar xf ch_det_data_50.tar && cd ../ + elif [ ${model_name} = "ocr_rec" ]; then + wget -nc -P ./inference/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/test/rec_inference.tar + wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar + cd ./inference && tar xf ch_ppocr_mobile_v2.0_rec_infer.tar && tar xf rec_inference.tar && cd ../ + elif [ ${model_name} = "ocr_system" ]; then + wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar + wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/test/ch_det_data_50.tar + wget -nc -P ./inference https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar + cd ./inference && tar xf ch_ppocr_mobile_v2.0_det_infer.tar && tar xf ch_ppocr_mobile_v2.0_rec_infer.tar && tar xf ch_det_data_50.tar && cd ../ + fi fi if [ ${MODE} = "serving_infer" ];then From 611df3b613b7369ce31459ab712359b13c1089d5 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Wed, 8 Sep 2021 02:43:27 +0000 Subject: [PATCH 2/4] surpport ocr_system for cpp cice --- deploy/cpp_infer/src/main.cpp | 3 ++- tests/ocr_det_params.txt | 2 +- tests/ocr_ppocr_mobile_params.txt | 4 ++-- tests/test.sh | 9 ++++++--- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/deploy/cpp_infer/src/main.cpp b/deploy/cpp_infer/src/main.cpp index 3165b72ddc..5a40cbdde7 100644 --- a/deploy/cpp_infer/src/main.cpp +++ b/deploy/cpp_infer/src/main.cpp @@ -63,6 +63,7 @@ DEFINE_double(cls_thresh, 0.9, "Threshold of cls_thresh."); DEFINE_string(rec_model_dir, "", "Path of rec inference model."); DEFINE_int32(rec_batch_num, 1, "rec_batch_num."); DEFINE_string(char_list_file, "../../ppocr/utils/ppocr_keys_v1.txt", "Path of dictionary."); +// DEFINE_string(char_list_file, "./ppocr/utils/ppocr_keys_v1.txt", "Path of dictionary."); using namespace std; @@ -193,7 +194,7 @@ int main_system(std::vector cv_all_img_names) { for (int i = 0; i < cv_all_img_names.size(); ++i) { LOG(INFO) << "The predict img: " << cv_all_img_names[i]; - cv::Mat srcimg = cv::imread(FLAGS_image_dir, cv::IMREAD_COLOR); + cv::Mat srcimg = cv::imread(cv_all_img_names[i], cv::IMREAD_COLOR); if (!srcimg.data) { std::cerr << "[ERROR] image read failed! image path: " << cv_all_img_names[i] << endl; exit(1); diff --git a/tests/ocr_det_params.txt b/tests/ocr_det_params.txt index 7be1430a1a..4ea7474662 100644 --- a/tests/ocr_det_params.txt +++ b/tests/ocr_det_params.txt @@ -62,7 +62,7 @@ inference:./deploy/cpp_infer/build/ppocr det --precision:fp32|fp16 --det_model_dir: --image_dir:./inference/ch_det_data_50/all-sum-510/ ---save_log_path:null +null:null --benchmark:True ===========================serving_params=========================== trans_model:-m paddle_serving_client.convert diff --git a/tests/ocr_ppocr_mobile_params.txt b/tests/ocr_ppocr_mobile_params.txt index 7f0e65596d..30b9a03807 100644 --- a/tests/ocr_ppocr_mobile_params.txt +++ b/tests/ocr_ppocr_mobile_params.txt @@ -53,7 +53,7 @@ inference:tools/infer/predict_system.py use_opencv:True infer_model:./inference/ch_ppocr_mobile_v2.0_det_infer/ infer_quant:False -inference:./deploy/cpp_infer/build/ppocr det +inference:./deploy/cpp_infer/build/ppocr system --use_gpu:True|False --enable_mkldnn:True|False --cpu_threads:1|6 @@ -62,6 +62,6 @@ inference:./deploy/cpp_infer/build/ppocr det --precision:fp32|fp16 --det_model_dir: --image_dir:./inference/ch_det_data_50/all-sum-510/ ---save_log_path:null +--rec_model_dir:./inference/ch_ppocr_mobile_v2.0_rec_infer/ --benchmark:True diff --git a/tests/test.sh b/tests/test.sh index 4a67366748..3444f96f8f 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -192,7 +192,8 @@ if [ ${MODE} = "cpp_infer" ]; then cpp_infer_model_key=$(func_parser_key "${lines[62]}") cpp_image_dir_key=$(func_parser_key "${lines[63]}") cpp_infer_img_dir=$(func_parser_value "${lines[63]}") - cpp_save_log_key=$(func_parser_key "${lines[64]}") + cpp_rec_model_key=$(func_parser_key "${lines[64]}") + cpp_rec_model_value=$(func_parser_value "${lines[64]}") cpp_benchmark_key=$(func_parser_key "${lines[65]}") cpp_benchmark_value=$(func_parser_value "${lines[65]}") fi @@ -368,7 +369,8 @@ function func_cpp_inference(){ set_batchsize=$(func_set_params "${cpp_batch_size_key}" "${batch_size}") set_cpu_threads=$(func_set_params "${cpp_cpu_threads_key}" "${threads}") set_model_dir=$(func_set_params "${cpp_infer_model_key}" "${_model_dir}") - command="${_script} ${cpp_use_gpu_key}=${use_gpu} ${cpp_use_mkldnn_key}=${use_mkldnn} ${set_cpu_threads} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} > ${_save_log_path} 2>&1 " + set_infer_params1=$(func_set_params "${cpp_rec_model_key}" "${cpp_rec_model_value}") + command="${_script} ${cpp_use_gpu_key}=${use_gpu} ${cpp_use_mkldnn_key}=${use_mkldnn} ${set_cpu_threads} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} ${set_infer_params1} > ${_save_log_path} 2>&1 " eval $command last_status=${PIPESTATUS[0]} eval "cat ${_save_log_path}" @@ -396,7 +398,8 @@ function func_cpp_inference(){ set_tensorrt=$(func_set_params "${cpp_use_trt_key}" "${use_trt}") set_precision=$(func_set_params "${cpp_precision_key}" "${precision}") set_model_dir=$(func_set_params "${cpp_infer_model_key}" "${_model_dir}") - command="${_script} ${cpp_use_gpu_key}=${use_gpu} ${set_tensorrt} ${set_precision} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} > ${_save_log_path} 2>&1 " + set_infer_params1=$(func_set_params "${cpp_rec_model_key}" "${cpp_rec_model_value}") + command="${_script} ${cpp_use_gpu_key}=${use_gpu} ${set_tensorrt} ${set_precision} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} ${set_infer_params1} > ${_save_log_path} 2>&1 " eval $command last_status=${PIPESTATUS[0]} eval "cat ${_save_log_path}" From 96e1ce3d9f5f630b351dcc52f8ee488ce7268362 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Wed, 8 Sep 2021 02:45:20 +0000 Subject: [PATCH 3/4] fix --- tests/ocr_rec_params.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/ocr_rec_params.txt b/tests/ocr_rec_params.txt index a801c0afc7..d1dc3c311e 100644 --- a/tests/ocr_rec_params.txt +++ b/tests/ocr_rec_params.txt @@ -62,5 +62,5 @@ inference:./deploy/cpp_infer/build/ppocr rec --precision:fp32|fp16 --rec_model_dir: --image_dir:./inference/rec_inference/ ---save_log_path:null +null:null --benchmark:True \ No newline at end of file From 7be68dbd9d96f2d093443bf1c92c14f038f821f0 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Wed, 8 Sep 2021 03:13:42 +0000 Subject: [PATCH 4/4] fix readme --- tests/readme.md | 46 ++++++++++++++++++++++++++++------------------ tests/test.sh | 8 ++++---- 2 files changed, 32 insertions(+), 22 deletions(-) diff --git a/tests/readme.md b/tests/readme.md index 1c5e0faee9..592f621424 100644 --- a/tests/readme.md +++ b/tests/readme.md @@ -23,36 +23,46 @@ test.sh和params.txt文件配合使用,完成OCR轻量检测和识别模型从 ```bash tests/ -├── ocr_det_params.txt # 测试OCR检测模型的参数配置文件 -├── ocr_rec_params.txt # 测试OCR识别模型的参数配置文件 -└── prepare.sh # 完成test.sh运行所需要的数据和模型下载 -└── test.sh # 根据 +├── ocr_det_params.txt # 测试OCR检测模型的参数配置文件 +├── ocr_rec_params.txt # 测试OCR识别模型的参数配置文件 +├── ocr_ppocr_mobile_params.txt # 测试OCR检测+识别模型串联的参数配置文件 +└── prepare.sh # 完成test.sh运行所需要的数据和模型下载 +└── test.sh # 测试主程序 ``` # 使用方法 + test.sh包含四种运行模式,每种模式的运行数据不同,分别用于测试速度和精度,分别是: -- 模式1 lite_train_infer,使用少量数据训练,用于快速验证训练到预测的走通流程,不验证精度和速度; -``` + +- 模式1:lite_train_infer,使用少量数据训练,用于快速验证训练到预测的走通流程,不验证精度和速度; +```shell bash test/prepare.sh ./tests/ocr_det_params.txt 'lite_train_infer' bash tests/test.sh ./tests/ocr_det_params.txt 'lite_train_infer' -``` -- 模式2 whole_infer,使用少量数据训练,一定量数据预测,用于验证训练后的模型执行预测,预测速度是否合理; -``` +``` + +- 模式2:whole_infer,使用少量数据训练,一定量数据预测,用于验证训练后的模型执行预测,预测速度是否合理; +```shell bash tests/prepare.sh ./tests/ocr_det_params.txt 'whole_infer' bash tests/test.sh ./tests/ocr_det_params.txt 'whole_infer' -``` +``` -- 模式3 infer 不训练,全量数据预测,走通开源模型评估、动转静,检查inference model预测时间和精度; -``` +- 模式3:infer 不训练,全量数据预测,走通开源模型评估、动转静,检查inference model预测时间和精度; +```shell bash tests/prepare.sh ./tests/ocr_det_params.txt 'infer' -用法1: +# 用法1: bash tests/test.sh ./tests/ocr_det_params.txt 'infer' -用法2: 指定GPU卡预测,第三个传入参数为GPU卡号 +# 用法2: 指定GPU卡预测,第三个传入参数为GPU卡号 bash tests/test.sh ./tests/ocr_det_params.txt 'infer' '1' -``` +``` -模式4: whole_train_infer , CE: 全量数据训练,全量数据预测,验证模型训练精度,预测精度,预测速度 -``` +- 模式4:whole_train_infer , CE: 全量数据训练,全量数据预测,验证模型训练精度,预测精度,预测速度; +```shell bash tests/prepare.sh ./tests/ocr_det_params.txt 'whole_train_infer' bash tests/test.sh ./tests/ocr_det_params.txt 'whole_train_infer' -``` +``` + +- 模式5:cpp_infer , CE: 验证inference model的c++预测是否走通; +```shell +bash tests/prepare.sh ./tests/ocr_det_params.txt 'cpp_infer' +bash tests/test.sh ./tests/ocr_det_params.txt 'cpp_infer' +``` diff --git a/tests/test.sh b/tests/test.sh index 3444f96f8f..8040793f1d 100644 --- a/tests/test.sh +++ b/tests/test.sh @@ -192,8 +192,8 @@ if [ ${MODE} = "cpp_infer" ]; then cpp_infer_model_key=$(func_parser_key "${lines[62]}") cpp_image_dir_key=$(func_parser_key "${lines[63]}") cpp_infer_img_dir=$(func_parser_value "${lines[63]}") - cpp_rec_model_key=$(func_parser_key "${lines[64]}") - cpp_rec_model_value=$(func_parser_value "${lines[64]}") + cpp_infer_key1=$(func_parser_key "${lines[64]}") + cpp_infer_value1=$(func_parser_value "${lines[64]}") cpp_benchmark_key=$(func_parser_key "${lines[65]}") cpp_benchmark_value=$(func_parser_value "${lines[65]}") fi @@ -369,7 +369,7 @@ function func_cpp_inference(){ set_batchsize=$(func_set_params "${cpp_batch_size_key}" "${batch_size}") set_cpu_threads=$(func_set_params "${cpp_cpu_threads_key}" "${threads}") set_model_dir=$(func_set_params "${cpp_infer_model_key}" "${_model_dir}") - set_infer_params1=$(func_set_params "${cpp_rec_model_key}" "${cpp_rec_model_value}") + set_infer_params1=$(func_set_params "${cpp_infer_key1}" "${cpp_infer_value1}") command="${_script} ${cpp_use_gpu_key}=${use_gpu} ${cpp_use_mkldnn_key}=${use_mkldnn} ${set_cpu_threads} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} ${set_infer_params1} > ${_save_log_path} 2>&1 " eval $command last_status=${PIPESTATUS[0]} @@ -398,7 +398,7 @@ function func_cpp_inference(){ set_tensorrt=$(func_set_params "${cpp_use_trt_key}" "${use_trt}") set_precision=$(func_set_params "${cpp_precision_key}" "${precision}") set_model_dir=$(func_set_params "${cpp_infer_model_key}" "${_model_dir}") - set_infer_params1=$(func_set_params "${cpp_rec_model_key}" "${cpp_rec_model_value}") + set_infer_params1=$(func_set_params "${cpp_infer_key1}" "${cpp_infer_value1}") command="${_script} ${cpp_use_gpu_key}=${use_gpu} ${set_tensorrt} ${set_precision} ${set_model_dir} ${set_batchsize} ${set_infer_data} ${set_benchmark} ${set_infer_params1} > ${_save_log_path} 2>&1 " eval $command last_status=${PIPESTATUS[0]}