From 7e1420f243492c1f9f415e57f2d4896fc5bddd6a Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Mon, 20 Jul 2020 15:42:51 +0800 Subject: [PATCH 001/101] Update readme.md --- deploy/pdserving/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index eb1b89b6..27542774 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -1,6 +1,6 @@ # Paddle Serving 服务部署 -本教程将介绍基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)部署在线预测服务的详细步骤。 +本教程将介绍基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)部署PaddleOCR在线预测服务的详细步骤。 ## 快速启动服务 @@ -25,4 +25,4 @@ ## 返回结果格式说明 -## 自定义修改服务逻辑 \ No newline at end of file +## 自定义修改服务逻辑 From 481240549a13fad5755a9ba2846d9333c2a19640 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Mon, 20 Jul 2020 17:24:07 +0800 Subject: [PATCH 002/101] add common code to reduce code duplication this funtion is mainly for the train ,evel,export_model --- tools/program.py | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/tools/program.py b/tools/program.py index ff8743f1..6197b91b 100755 --- a/tools/program.py +++ b/tools/program.py @@ -22,6 +22,7 @@ import yaml import os from ppocr.utils.utility import create_module from ppocr.utils.utility import initial_logger + logger = initial_logger() import paddle.fluid as fluid @@ -31,8 +32,7 @@ from eval_utils.eval_det_utils import eval_det_run from eval_utils.eval_rec_utils import eval_rec_run from ppocr.utils.save_load import save_model import numpy as np -from ppocr.utils.character import cal_predicts_accuracy - +from ppocr.utils.character import cal_predicts_accuracy, CharacterOps class ArgsParser(ArgumentParser): def __init__(self): @@ -374,3 +374,28 @@ def train_eval_rec_run(config, exe, train_info_dict, eval_info_dict): save_path = save_model_dir + "/iter_epoch_%d" % (epoch) save_model(train_info_dict['train_program'], save_path) return + +def preProcess(): + FLAGS = ArgsParser().parse_args() + config = load_config(FLAGS.config) + merge_config(FLAGS.opt) + logger.info(config) + + # check if set use_gpu=True in paddlepaddle cpu version + use_gpu = config['Global']['use_gpu'] + check_gpu(use_gpu) + + alg = config['Global']['algorithm'] + assert alg in ['EAST', 'DB', 'Rosetta', 'CRNN', 'STARNet', 'RARE'] + if alg in ['Rosetta', 'CRNN', 'STARNet', 'RARE']: + config['Global']['char_ops'] = CharacterOps(config['Global']) + + place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() + startup_program = fluid.Program() + train_program = fluid.Program() + + isContain_det = False + if alg in ['EAST', 'DB']: + isContain_det = True + + return startup_program, train_program, place, config, isContain_det From 5be223ba5265cda8615a9598df5f77a96eacb665 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Mon, 20 Jul 2020 17:32:25 +0800 Subject: [PATCH 003/101] remove the duplication code remove the duplication code --- tools/export_model.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/tools/export_model.py b/tools/export_model.py index 4415eda8..720599c9 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -41,27 +41,11 @@ from paddle import fluid from ppocr.utils.utility import initial_logger logger = initial_logger() from ppocr.utils.save_load import init_model -from ppocr.utils.character import CharacterOps -from ppocr.utils.utility import create_module + def main(): - config = program.load_config(FLAGS.config) - program.merge_config(FLAGS.opt) - logger.info(config) - - # check if set use_gpu=True in paddlepaddle cpu version - use_gpu = config['Global']['use_gpu'] - program.check_gpu(use_gpu) - - alg = config['Global']['algorithm'] - assert alg in ['EAST', 'DB', 'Rosetta', 'CRNN', 'STARNet', 'RARE'] - if alg in ['Rosetta', 'CRNN', 'STARNet', 'RARE']: - config['Global']['char_ops'] = CharacterOps(config['Global']) - - place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() - startup_prog = fluid.Program() - eval_program = fluid.Program() + startup_prog, eval_program, place, config = program.preProcess() feeded_var_names, target_vars, fetches_var_name = program.build_export( config, eval_program, startup_prog) @@ -88,6 +72,4 @@ def main(): if __name__ == '__main__': - parser = program.ArgsParser() - FLAGS = parser.parse_args() main() From 4ce2826c71e912096eff631c42ed51eadcdd59c5 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Mon, 20 Jul 2020 17:33:21 +0800 Subject: [PATCH 004/101] Update export_model.py --- tools/export_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/export_model.py b/tools/export_model.py index 720599c9..414b5794 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -45,7 +45,7 @@ from ppocr.utils.save_load import init_model def main(): - startup_prog, eval_program, place, config = program.preProcess() + startup_prog, eval_program, place, config = program.preProcess() feeded_var_names, target_vars, fetches_var_name = program.build_export( config, eval_program, startup_prog) From 49668934fddae404aafac5aba557864dddb77285 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Mon, 20 Jul 2020 17:35:48 +0800 Subject: [PATCH 005/101] remove the duplication codes remove the duplication codes --- tools/eval.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/tools/eval.py b/tools/eval.py index a5b8e26a..13083acf 100755 --- a/tools/eval.py +++ b/tools/eval.py @@ -45,26 +45,10 @@ from ppocr.utils.save_load import init_model from eval_utils.eval_det_utils import eval_det_run from eval_utils.eval_rec_utils import test_rec_benchmark from eval_utils.eval_rec_utils import eval_rec_run -from ppocr.utils.character import CharacterOps def main(): - config = program.load_config(FLAGS.config) - program.merge_config(FLAGS.opt) - logger.info(config) - - # check if set use_gpu=True in paddlepaddle cpu version - use_gpu = config['Global']['use_gpu'] - program.check_gpu(use_gpu) - - alg = config['Global']['algorithm'] - assert alg in ['EAST', 'DB', 'Rosetta', 'CRNN', 'STARNet', 'RARE'] - if alg in ['Rosetta', 'CRNN', 'STARNet', 'RARE']: - config['Global']['char_ops'] = CharacterOps(config['Global']) - - place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() - startup_prog = fluid.Program() - eval_program = fluid.Program() + startup_prog, eval_program, place, config,isContain_det = program.preProcess() eval_build_outputs = program.build( config, eval_program, startup_prog, mode='test') eval_fetch_name_list = eval_build_outputs[1] @@ -75,7 +59,7 @@ def main(): init_model(config, eval_program, exe) - if alg in ['EAST', 'DB']: + if isContain_det: eval_reader = reader_main(config=config, mode="eval") eval_info_dict = {'program':eval_program,\ 'reader':eval_reader,\ @@ -101,6 +85,4 @@ def main(): if __name__ == '__main__': - parser = program.ArgsParser() - FLAGS = parser.parse_args() main() From 0add8bdec6688f86dccebe5455b1b41985143cf5 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Mon, 20 Jul 2020 17:37:55 +0800 Subject: [PATCH 006/101] remove the duplication codes --- tools/train.py | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/tools/train.py b/tools/train.py index 29205483..c9d6e221 100755 --- a/tools/train.py +++ b/tools/train.py @@ -42,27 +42,10 @@ from ppocr.utils.utility import initial_logger logger = initial_logger() from ppocr.data.reader_main import reader_main from ppocr.utils.save_load import init_model -from ppocr.utils.character import CharacterOps from paddle.fluid.contrib.model_stat import summary def main(): - config = program.load_config(FLAGS.config) - program.merge_config(FLAGS.opt) - logger.info(config) - - # check if set use_gpu=True in paddlepaddle cpu version - use_gpu = config['Global']['use_gpu'] - program.check_gpu(use_gpu) - - alg = config['Global']['algorithm'] - assert alg in ['EAST', 'DB', 'Rosetta', 'CRNN', 'STARNet', 'RARE'] - if alg in ['Rosetta', 'CRNN', 'STARNet', 'RARE']: - config['Global']['char_ops'] = CharacterOps(config['Global']) - - place = fluid.CUDAPlace(0) if use_gpu else fluid.CPUPlace() - startup_program = fluid.Program() - train_program = fluid.Program() train_build_outputs = program.build( config, train_program, startup_program, mode='train') train_loader = train_build_outputs[0] @@ -109,7 +92,7 @@ def main(): 'fetch_name_list':eval_fetch_name_list,\ 'fetch_varname_list':eval_fetch_varname_list} - if alg in ['EAST', 'DB']: + if isContain_det: program.train_eval_det_run(config, exe, train_info_dict, eval_info_dict) else: program.train_eval_rec_run(config, exe, train_info_dict, eval_info_dict) @@ -136,7 +119,6 @@ def test_reader(): if __name__ == '__main__': - parser = program.ArgsParser() - FLAGS = parser.parse_args() + startup_program, train_program, place, config, isContain_det = program.preProcess() main() # test_reader() From d59077f4dbee8b64073108b91f005ad2f83a93df Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Mon, 20 Jul 2020 17:38:44 +0800 Subject: [PATCH 007/101] Update train.py --- tools/train.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tools/train.py b/tools/train.py index c9d6e221..f0791eb1 100755 --- a/tools/train.py +++ b/tools/train.py @@ -99,8 +99,6 @@ def main(): def test_reader(): - config = program.load_config(FLAGS.config) - program.merge_config(FLAGS.opt) logger.info(config) train_reader = reader_main(config=config, mode="train") import time From 0975906eeca00f0e95274c34741c3ca12f8f2a9c Mon Sep 17 00:00:00 2001 From: dyning Date: Mon, 20 Jul 2020 20:24:51 +0800 Subject: [PATCH 008/101] Update README_cn.md --- README_cn.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README_cn.md b/README_cn.md index 1594b6b2..f5914f2b 100644 --- a/README_cn.md +++ b/README_cn.md @@ -3,7 +3,8 @@ ## 简介 PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 -**直播预告:2020年7月21日晚8点B站直播,PaddleOCR开源大礼包全面解读,直播地址当天更新** +**直播预告:2020年7月21日晚8点B站直播,PaddleOCR开源大礼包全面解读** +直播地址:https://live.bilibili.com/21689802 **近期更新** - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 From 034f76709a25f003e0767b8a7458dbad400cda48 Mon Sep 17 00:00:00 2001 From: dyning Date: Mon, 20 Jul 2020 20:25:06 +0800 Subject: [PATCH 009/101] Update README_cn.md --- README_cn.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README_cn.md b/README_cn.md index f5914f2b..7b3c3fec 100644 --- a/README_cn.md +++ b/README_cn.md @@ -4,6 +4,7 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 **直播预告:2020年7月21日晚8点B站直播,PaddleOCR开源大礼包全面解读** + 直播地址:https://live.bilibili.com/21689802 **近期更新** From a3494c66e95f0505c86d0b1a3f1b70056a4dca36 Mon Sep 17 00:00:00 2001 From: dyning Date: Mon, 20 Jul 2020 20:26:02 +0800 Subject: [PATCH 010/101] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 26ecef77..60ea75b7 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,8 @@ PaddleOCR aims to create rich, leading, and practical OCR tools that help users **Live stream on coming day**: July 21, 2020 at 8 pm BiliBili station live stream +Live address:https://live.bilibili.com/h5/21689802 + **Recent updates** - 2020.7.15, Add mobile App demo , support both iOS and Android ( based on easyedge and Paddle Lite) From d07a223df83267d59ae6f3a97671656b8e44ca72 Mon Sep 17 00:00:00 2001 From: wangjiawei04 Date: Mon, 20 Jul 2020 21:15:45 +0800 Subject: [PATCH 011/101] add pdserving ocr --- deploy/pdserving/det_local_server.py | 71 ++++++++++++++++++ deploy/pdserving/det_web_server.py | 72 +++++++++++++++++++ deploy/pdserving/ocr_local_server.py | 103 +++++++++++++++++++++++++++ deploy/pdserving/ocr_web_client.py | 37 ++++++++++ deploy/pdserving/ocr_web_server.py | 99 +++++++++++++++++++++++++ deploy/pdserving/readme.md | 55 +++++++++++++- deploy/pdserving/rec_local_server.py | 72 +++++++++++++++++++ deploy/pdserving/rec_web_server.py | 71 ++++++++++++++++++ 8 files changed, 578 insertions(+), 2 deletions(-) create mode 100644 deploy/pdserving/det_local_server.py create mode 100644 deploy/pdserving/det_web_server.py create mode 100644 deploy/pdserving/ocr_local_server.py create mode 100644 deploy/pdserving/ocr_web_client.py create mode 100644 deploy/pdserving/ocr_web_server.py create mode 100644 deploy/pdserving/rec_local_server.py create mode 100644 deploy/pdserving/rec_web_server.py diff --git a/deploy/pdserving/det_local_server.py b/deploy/pdserving/det_local_server.py new file mode 100644 index 00000000..acfccdb6 --- /dev/null +++ b/deploy/pdserving/det_local_server.py @@ -0,0 +1,71 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +from paddle_serving_client import Client +from paddle_serving_app.reader import Sequential, ResizeByFactor +from paddle_serving_app.reader import Div, Normalize, Transpose +from paddle_serving_app.reader import DBPostProcess, FilterBoxes +from paddle_serving_server_gpu.web_service import WebService +import time +import re +import base64 + + +class OCRService(WebService): + def init_det(self): + self.det_preprocess = Sequential([ + ResizeByFactor(32, 960), Div(255), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( + (2, 0, 1)) + ]) + self.filter_func = FilterBoxes(10, 10) + self.post_func = DBPostProcess({ + "thresh": 0.3, + "box_thresh": 0.5, + "max_candidates": 1000, + "unclip_ratio": 1.5, + "min_size": 3 + }) + + def preprocess(self, feed=[], fetch=[]): + data = base64.b64decode(feed[0]["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + self.ori_h, self.ori_w, _ = im.shape + det_img = self.det_preprocess(im) + _, self.new_h, self.new_w = det_img.shape + return {"image": det_img[np.newaxis, :].copy()}, ["concat_1.tmp_0"] + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + det_out = fetch_map["concat_1.tmp_0"] + ratio_list = [ + float(self.new_h) / self.ori_h, float(self.new_w) / self.ori_w + ] + dt_boxes_list = self.post_func(det_out, [ratio_list]) + dt_boxes = self.filter_func(dt_boxes_list[0], [self.ori_h, self.ori_w]) + return {"dt_boxes": dt_boxes.tolist()} + + +ocr_service = OCRService(name="ocr") +ocr_service.load_model_config("ocr_det_model") +ocr_service.set_gpus("0") +ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) +ocr_service.init_det() +ocr_service.run_debugger_service() +ocr_service.run_web_service() diff --git a/deploy/pdserving/det_web_server.py b/deploy/pdserving/det_web_server.py new file mode 100644 index 00000000..dd69be0c --- /dev/null +++ b/deploy/pdserving/det_web_server.py @@ -0,0 +1,72 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +import cv2 +import sys +import numpy as np +import os +from paddle_serving_client import Client +from paddle_serving_app.reader import Sequential, ResizeByFactor +from paddle_serving_app.reader import Div, Normalize, Transpose +from paddle_serving_app.reader import DBPostProcess, FilterBoxes +from paddle_serving_server_gpu.web_service import WebService +import time +import re +import base64 + + +class OCRService(WebService): + def init_det(self): + self.det_preprocess = Sequential([ + ResizeByFactor(32, 960), Div(255), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( + (2, 0, 1)) + ]) + self.filter_func = FilterBoxes(10, 10) + self.post_func = DBPostProcess({ + "thresh": 0.3, + "box_thresh": 0.5, + "max_candidates": 1000, + "unclip_ratio": 1.5, + "min_size": 3 + }) + + def preprocess(self, feed=[], fetch=[]): + data = base64.b64decode(feed[0]["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + self.ori_h, self.ori_w, _ = im.shape + det_img = self.det_preprocess(im) + _, self.new_h, self.new_w = det_img.shape + print(det_img) + return {"image": det_img}, ["concat_1.tmp_0"] + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + det_out = fetch_map["concat_1.tmp_0"] + ratio_list = [ + float(self.new_h) / self.ori_h, float(self.new_w) / self.ori_w + ] + dt_boxes_list = self.post_func(det_out, [ratio_list]) + dt_boxes = self.filter_func(dt_boxes_list[0], [self.ori_h, self.ori_w]) + return {"dt_boxes": dt_boxes.tolist()} + + +ocr_service = OCRService(name="ocr") +ocr_service.load_model_config("ocr_det_model") +ocr_service.set_gpus("0") +ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) +ocr_service.init_det() +ocr_service.run_rpc_service() +ocr_service.run_web_service() diff --git a/deploy/pdserving/ocr_local_server.py b/deploy/pdserving/ocr_local_server.py new file mode 100644 index 00000000..93e2d7a3 --- /dev/null +++ b/deploy/pdserving/ocr_local_server.py @@ -0,0 +1,103 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +from paddle_serving_app.reader import OCRReader +import cv2 +import sys +import numpy as np +import os +from paddle_serving_client import Client +from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor +from paddle_serving_app.reader import Div, Normalize, Transpose +from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes +from paddle_serving_server_gpu.web_service import WebService +from paddle_serving_app.local_predict import Debugger +import time +import re +import base64 + + +class OCRService(WebService): + def init_det_debugger(self, det_model_config): + self.det_preprocess = Sequential([ + ResizeByFactor(32, 960), Div(255), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( + (2, 0, 1)) + ]) + self.det_client = Debugger() + self.det_client.load_model_config( + det_model_config, gpu=True, profile=False) + self.ocr_reader = OCRReader() + + def preprocess(self, feed=[], fetch=[]): + data = base64.b64decode(feed[0]["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + ori_h, ori_w, _ = im.shape + det_img = self.det_preprocess(im) + _, new_h, new_w = det_img.shape + det_img = det_img[np.newaxis, :] + det_img = det_img.copy() + det_out = self.det_client.predict( + feed={"image": det_img}, fetch=["concat_1.tmp_0"]) + filter_func = FilterBoxes(10, 10) + post_func = DBPostProcess({ + "thresh": 0.3, + "box_thresh": 0.5, + "max_candidates": 1000, + "unclip_ratio": 1.5, + "min_size": 3 + }) + sorted_boxes = SortedBoxes() + ratio_list = [float(new_h) / ori_h, float(new_w) / ori_w] + dt_boxes_list = post_func(det_out["concat_1.tmp_0"], [ratio_list]) + dt_boxes = filter_func(dt_boxes_list[0], [ori_h, ori_w]) + dt_boxes = sorted_boxes(dt_boxes) + get_rotate_crop_image = GetRotateCropImage() + img_list = [] + max_wh_ratio = 0 + for i, dtbox in enumerate(dt_boxes): + boximg = get_rotate_crop_image(im, dt_boxes[i]) + img_list.append(boximg) + h, w = boximg.shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + if len(img_list) == 0: + return [], [] + _, w, h = self.ocr_reader.resize_norm_img(img_list[0], + max_wh_ratio).shape + imgs = np.zeros((len(img_list), 3, w, h)).astype('float32') + for id, img in enumerate(img_list): + norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) + imgs[id] = norm_img + feed = {"image": imgs.copy()} + fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) + res_lst = [] + for res in rec_res: + res_lst.append(res[0]) + res = {"res": res_lst} + return res + + +ocr_service = OCRService(name="ocr") +ocr_service.load_model_config("ocr_rec_model") +ocr_service.prepare_server(workdir="workdir", port=9292) +ocr_service.init_det_debugger(det_model_config="ocr_det_model") +ocr_service.run_debugger_service(gpu=True) +ocr_service.run_web_service() diff --git a/deploy/pdserving/ocr_web_client.py b/deploy/pdserving/ocr_web_client.py new file mode 100644 index 00000000..e2a92eb8 --- /dev/null +++ b/deploy/pdserving/ocr_web_client.py @@ -0,0 +1,37 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# -*- coding: utf-8 -*- + +import requests +import json +import cv2 +import base64 +import os, sys +import time + +def cv2_to_base64(image): + #data = cv2.imencode('.jpg', image)[1] + return base64.b64encode(image).decode( + 'utf8') #data.tostring()).decode('utf8') + +headers = {"Content-type": "application/json"} +url = "http://127.0.0.1:9292/ocr/prediction" +test_img_dir = "../../doc/imgs/" +for img_file in os.listdir(test_img_dir): + with open(os.path.join(test_img_dir, img_file), 'rb') as file: + image_data1 = file.read() + image = cv2_to_base64(image_data1) + data = {"feed": [{"image": image}], "fetch": ["res"]} + r = requests.post(url=url, headers=headers, data=json.dumps(data)) + print(r.json()) diff --git a/deploy/pdserving/ocr_web_server.py b/deploy/pdserving/ocr_web_server.py new file mode 100644 index 00000000..d017f6b9 --- /dev/null +++ b/deploy/pdserving/ocr_web_server.py @@ -0,0 +1,99 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +from paddle_serving_app.reader import OCRReader +import cv2 +import sys +import numpy as np +import os +from paddle_serving_client import Client +from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor +from paddle_serving_app.reader import Div, Normalize, Transpose +from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes +from paddle_serving_server_gpu.web_service import WebService +import time +import re +import base64 + + +class OCRService(WebService): + def init_det_client(self, det_port, det_client_config): + self.det_preprocess = Sequential([ + ResizeByFactor(32, 960), Div(255), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), Transpose( + (2, 0, 1)) + ]) + self.det_client = Client() + self.det_client.load_client_config(det_client_config) + self.det_client.connect(["127.0.0.1:{}".format(det_port)]) + self.ocr_reader = OCRReader() + + def preprocess(self, feed=[], fetch=[]): + data = base64.b64decode(feed[0]["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + ori_h, ori_w, _ = im.shape + det_img = self.det_preprocess(im) + det_out = self.det_client.predict( + feed={"image": det_img}, fetch=["concat_1.tmp_0"]) + _, new_h, new_w = det_img.shape + filter_func = FilterBoxes(10, 10) + post_func = DBPostProcess({ + "thresh": 0.3, + "box_thresh": 0.5, + "max_candidates": 1000, + "unclip_ratio": 1.5, + "min_size": 3 + }) + sorted_boxes = SortedBoxes() + ratio_list = [float(new_h) / ori_h, float(new_w) / ori_w] + dt_boxes_list = post_func(det_out["concat_1.tmp_0"], [ratio_list]) + dt_boxes = filter_func(dt_boxes_list[0], [ori_h, ori_w]) + dt_boxes = sorted_boxes(dt_boxes) + get_rotate_crop_image = GetRotateCropImage() + feed_list = [] + img_list = [] + max_wh_ratio = 0 + for i, dtbox in enumerate(dt_boxes): + boximg = get_rotate_crop_image(im, dt_boxes[i]) + img_list.append(boximg) + h, w = boximg.shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + for img in img_list: + norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) + feed = {"image": norm_img} + feed_list.append(feed) + fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] + return feed_list, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) + res_lst = [] + for res in rec_res: + res_lst.append(res[0]) + res = {"res": res_lst} + return res + + +ocr_service = OCRService(name="ocr") +ocr_service.load_model_config("ocr_rec_model") +ocr_service.set_gpus("0") +ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) +ocr_service.init_det_client( + det_port=9293, + det_client_config="ocr_det_client/serving_client_conf.prototxt") +ocr_service.run_rpc_service() +ocr_service.run_web_service() diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index 27542774..bab44249 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -5,24 +5,75 @@ ## 快速启动服务 ### 1. 准备环境 +我们先安装Paddle Serving相关组件 +我们推荐用户使用GPU来做Paddle Serving的OCR服务部署 + +**CUDA版本:9.0以上** +**CUDNN版本:7.0以上** +**操作系统版本:CentOS 6以上** + +``` +python -m pip install paddle_serving_server_gpu paddle_serving_client paddle_serving_app +``` ### 2. 模型转换 +可以使用`paddle_serving_app`提供的模型,执行下列命令 +``` +python -m paddle_serving_app.package --get_model ocr_rec +tar -xzvf ocr_rec.tar.gz +python -m paddle_serving_app.package --get_model ocr_det +tar -xzvf ocr_det.tar.gz +``` +执行上述命令会下载`db_crnn_mobile`的模型,如果想要下载规模更大的`db_crnn_server`模型,可以在下载预测模型并解压之后。参考[如何从Paddle保存的预测模型转为Paddle Serving格式可部署的模型](https://github.com/PaddlePaddle/Serving/blob/develop/doc/INFERENCE_TO_SERVING_CN.md)。 ### 3. 启动服务 启动服务可以根据实际需求选择启动`标准版`或者`快速版`,两种方式的对比如下表: |版本|特点|适用场景| |-|-|-| -|标准版||| -|快速版||| +|标准版|稳定性高,分布式部署|适用于吞吐量大,需要跨机房部署的情况| +|快速版|部署方便,预测速度快|适用于对预测速度要求高,迭代速度快的场景| #### 方式1. 启动标准版服务 +``` +python -m paddle_serving_server_gpu.serve --model ocr_det_model --port 9293 --gpu_id 0 +python ocr_web_server.py +``` + #### 方式2. 启动快速版服务 +``` +python ocr_local_server.py +``` ## 发送预测请求 +``` +python ocr_web_client.py +``` + ## 返回结果格式说明 +返回结果是json格式 +``` +{u'result': {u'res': [u'\u571f\u5730\u6574\u6cbb\u4e0e\u571f\u58e4\u4fee\u590d\u7814\u7a76\u4e2d\u5fc3', u'\u534e\u5357\u519c\u4e1a\u5927\u5b661\u7d20\u56fe']}} +``` +我们也可以打印结果json串中`res`字段的每一句话 +``` +土地整治与土壤修复研究中心 +华南农业大学1素图 +``` + ## 自定义修改服务逻辑 + +在`ocr_web_server.py`或是`ocr_debugger_server.py`当中的`preprocess`函数里面做了检测服务和识别服务的前处理,·`postprocess`函数里面做了识别的后处理服务,可以在相应的函数中做修改。调用了`paddle_serving_app`库提供的常见CV模型的前处理/后处理库。 + +如果想要单独启动Paddle Serving的检测服务和识别服务,参见下列表格, 执行对应的脚本即可。 + +| 模型 | 标准版 | 快速版 | +| ---- | ----------------- | ------------------- | +| 检测 | det_web_server.py | det_local_server.py | +| 识别 | rec_web_server.py | rec_local_server.py | + +更多信息参见[Paddle Serving](https://github.com/PaddlePaddle/Serving) diff --git a/deploy/pdserving/rec_local_server.py b/deploy/pdserving/rec_local_server.py new file mode 100644 index 00000000..fbe67aaf --- /dev/null +++ b/deploy/pdserving/rec_local_server.py @@ -0,0 +1,72 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +from paddle_serving_app.reader import OCRReader +import cv2 +import sys +import numpy as np +import os +from paddle_serving_client import Client +from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor +from paddle_serving_app.reader import Div, Normalize, Transpose +from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes +from paddle_serving_server_gpu.web_service import WebService +import time +import re +import base64 + + +class OCRService(WebService): + def init_rec(self): + self.ocr_reader = OCRReader() + + def preprocess(self, feed=[], fetch=[]): + img_list = [] + for feed_data in feed: + data = base64.b64decode(feed_data["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img_list.append(im) + max_wh_ratio = 0 + for i, boximg in enumerate(img_list): + h, w = boximg.shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + _, w, h = self.ocr_reader.resize_norm_img(img_list[0], + max_wh_ratio).shape + imgs = np.zeros((len(img_list), 3, w, h)).astype('float32') + for i, img in enumerate(img_list): + norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) + imgs[i] = norm_img + feed = {"image": imgs.copy()} + fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] + return feed, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) + res_lst = [] + for res in rec_res: + res_lst.append(res[0]) + res = {"res": res_lst} + return res + + +ocr_service = OCRService(name="ocr") +ocr_service.load_model_config("ocr_rec_model") +ocr_service.set_gpus("0") +ocr_service.init_rec() +ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) +ocr_service.run_debugger_service() +ocr_service.run_web_service() diff --git a/deploy/pdserving/rec_web_server.py b/deploy/pdserving/rec_web_server.py new file mode 100644 index 00000000..684c313d --- /dev/null +++ b/deploy/pdserving/rec_web_server.py @@ -0,0 +1,71 @@ +# Copyright (c) 2020 PaddlePaddle Authors. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from paddle_serving_client import Client +from paddle_serving_app.reader import OCRReader +import cv2 +import sys +import numpy as np +import os +from paddle_serving_client import Client +from paddle_serving_app.reader import Sequential, URL2Image, ResizeByFactor +from paddle_serving_app.reader import Div, Normalize, Transpose +from paddle_serving_app.reader import DBPostProcess, FilterBoxes, GetRotateCropImage, SortedBoxes +from paddle_serving_server_gpu.web_service import WebService +import time +import re +import base64 + + +class OCRService(WebService): + def init_rec(self): + self.ocr_reader = OCRReader() + + def preprocess(self, feed=[], fetch=[]): + # TODO: to handle batch rec images + img_list = [] + for feed_data in feed: + data = base64.b64decode(feed_data["image"].encode('utf8')) + data = np.fromstring(data, np.uint8) + im = cv2.imdecode(data, cv2.IMREAD_COLOR) + img_list.append(im) + feed_list = [] + max_wh_ratio = 0 + for i, boximg in enumerate(img_list): + h, w = boximg.shape[0:2] + wh_ratio = w * 1.0 / h + max_wh_ratio = max(max_wh_ratio, wh_ratio) + for img in img_list: + norm_img = self.ocr_reader.resize_norm_img(img, max_wh_ratio) + feed = {"image": norm_img} + feed_list.append(feed) + fetch = ["ctc_greedy_decoder_0.tmp_0", "softmax_0.tmp_0"] + return feed_list, fetch + + def postprocess(self, feed={}, fetch=[], fetch_map=None): + rec_res = self.ocr_reader.postprocess(fetch_map, with_score=True) + res_lst = [] + for res in rec_res: + res_lst.append(res[0]) + res = {"res": res_lst} + return res + + +ocr_service = OCRService(name="ocr") +ocr_service.load_model_config("ocr_rec_model") +ocr_service.set_gpus("0") +ocr_service.init_rec() +ocr_service.prepare_server(workdir="workdir", port=9292, device="gpu", gpuid=0) +ocr_service.run_rpc_service() +ocr_service.run_web_service() From d9905dd19dfc84adbacaf995c9d791de0225c9b7 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Mon, 20 Jul 2020 17:23:49 +0000 Subject: [PATCH 012/101] add cpp inference for windows --- deploy/cpp_infer/CMakeLists.txt | 165 ++++++++++++++---- deploy/cpp_infer/docs/windows_vs2019_build.md | 95 ++++++++++ deploy/cpp_infer/readme.md | 3 + deploy/cpp_infer/src/config.cpp | 2 +- deploy/cpp_infer/src/utility.cpp | 22 ++- deploy/cpp_infer/tools/build.sh | 4 +- deploy/cpp_infer/tools/config.txt | 3 +- 7 files changed, 245 insertions(+), 49 deletions(-) create mode 100644 deploy/cpp_infer/docs/windows_vs2019_build.md diff --git a/deploy/cpp_infer/CMakeLists.txt b/deploy/cpp_infer/CMakeLists.txt index 1415e2cb..b8ded08a 100644 --- a/deploy/cpp_infer/CMakeLists.txt +++ b/deploy/cpp_infer/CMakeLists.txt @@ -1,8 +1,16 @@ project(ocr_system CXX C) -option(WITH_MKL "Compile demo with MKL/OpenBlas support, default use MKL." ON) + +option(WITH_MKL "Compile demo with MKL/OpenBlas support, default use MKL." OFF) option(WITH_GPU "Compile demo with GPU/CPU, default use CPU." OFF) option(WITH_STATIC_LIB "Compile demo with static/shared library, default use static." ON) -option(USE_TENSORRT "Compile demo with TensorRT." OFF) + +SET(PADDLE_LIB "" CACHE PATH "Location of libraries") +SET(OPENCV_DIR "" CACHE PATH "Location of libraries") +SET(CUDA_LIB "" CACHE PATH "Location of libraries") +SET(CUDNN_LIB "" CACHE PATH "Location of libraries") +SET(TENSORRT_DIR "" CACHE PATH "Compile demo with TensorRT") + +set(DEMO_NAME "ocr_system") macro(safe_set_static_flag) @@ -15,24 +23,60 @@ macro(safe_set_static_flag) endforeach(flag_var) endmacro() -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -fpermissive") -set(CMAKE_STATIC_LIBRARY_PREFIX "") -message("flags" ${CMAKE_CXX_FLAGS}) -set(CMAKE_CXX_FLAGS_RELEASE "-O3") +if (WITH_MKL) + ADD_DEFINITIONS(-DUSE_MKL) +endif() if(NOT DEFINED PADDLE_LIB) message(FATAL_ERROR "please set PADDLE_LIB with -DPADDLE_LIB=/path/paddle/lib") endif() -if(NOT DEFINED DEMO_NAME) - message(FATAL_ERROR "please set DEMO_NAME with -DDEMO_NAME=demo_name") + +if(NOT DEFINED OPENCV_DIR) + message(FATAL_ERROR "please set OPENCV_DIR with -DOPENCV_DIR=/path/opencv") endif() -set(OPENCV_DIR ${OPENCV_DIR}) -find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH) +if (WIN32) + include_directories("${PADDLE_LIB}/paddle/fluid/inference") + include_directories("${PADDLE_LIB}/paddle/include") + link_directories("${PADDLE_LIB}/paddle/fluid/inference") + find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/build/ NO_DEFAULT_PATH) + +else () + find_package(OpenCV REQUIRED PATHS ${OPENCV_DIR}/share/OpenCV NO_DEFAULT_PATH) + include_directories("${PADDLE_LIB}/paddle/include") + link_directories("${PADDLE_LIB}/paddle/lib") +endif () include_directories(${OpenCV_INCLUDE_DIRS}) -include_directories("${PADDLE_LIB}/paddle/include") +if (WIN32) + add_definitions("/DGOOGLE_GLOG_DLL_DECL=") + set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} /bigobj /MTd") + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /bigobj /MT") + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /bigobj /MTd") + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /bigobj /MT") + if (WITH_STATIC_LIB) + safe_set_static_flag() + add_definitions(-DSTATIC_LIB) + endif() +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -o3 -std=c++11") + set(CMAKE_STATIC_LIBRARY_PREFIX "") +endif() +message("flags" ${CMAKE_CXX_FLAGS}) + + +if (WITH_GPU) + if (NOT DEFINED CUDA_LIB OR ${CUDA_LIB} STREQUAL "") + message(FATAL_ERROR "please set CUDA_LIB with -DCUDA_LIB=/path/cuda-8.0/lib64") + endif() + if (NOT WIN32) + if (NOT DEFINED CUDNN_LIB) + message(FATAL_ERROR "please set CUDNN_LIB with -DCUDNN_LIB=/path/cudnn_v7.4/cuda/lib64") + endif() + endif(NOT WIN32) +endif() + include_directories("${PADDLE_LIB}/third_party/install/protobuf/include") include_directories("${PADDLE_LIB}/third_party/install/glog/include") include_directories("${PADDLE_LIB}/third_party/install/gflags/include") @@ -43,10 +87,12 @@ include_directories("${PADDLE_LIB}/third_party/eigen3") include_directories("${CMAKE_SOURCE_DIR}/") -if (USE_TENSORRT AND WITH_GPU) - include_directories("${TENSORRT_ROOT}/include") - link_directories("${TENSORRT_ROOT}/lib") -endif() +if (NOT WIN32) + if (WITH_TENSORRT AND WITH_GPU) + include_directories("${TENSORRT_DIR}/include") + link_directories("${TENSORRT_DIR}/lib") + endif() +endif(NOT WIN32) link_directories("${PADDLE_LIB}/third_party/install/zlib/lib") @@ -57,17 +103,24 @@ link_directories("${PADDLE_LIB}/third_party/install/xxhash/lib") link_directories("${PADDLE_LIB}/paddle/lib") -AUX_SOURCE_DIRECTORY(./src SRCS) -add_executable(${DEMO_NAME} ${SRCS}) - if(WITH_MKL) include_directories("${PADDLE_LIB}/third_party/install/mklml/include") - set(MATH_LIB ${PADDLE_LIB}/third_party/install/mklml/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} - ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5${CMAKE_SHARED_LIBRARY_SUFFIX}) + if (WIN32) + set(MATH_LIB ${PADDLE_LIB}/third_party/install/mklml/lib/mklml.lib + ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5md.lib) + else () + set(MATH_LIB ${PADDLE_LIB}/third_party/install/mklml/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} + ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5${CMAKE_SHARED_LIBRARY_SUFFIX}) + execute_process(COMMAND cp -r ${PADDLE_LIB}/third_party/install/mklml/lib/libmklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX} /usr/lib) + endif () set(MKLDNN_PATH "${PADDLE_LIB}/third_party/install/mkldnn") if(EXISTS ${MKLDNN_PATH}) include_directories("${MKLDNN_PATH}/include") - set(MKLDNN_LIB ${MKLDNN_PATH}/lib/libmkldnn.so.0) + if (WIN32) + set(MKLDNN_LIB ${MKLDNN_PATH}/lib/mkldnn.lib) + else () + set(MKLDNN_LIB ${MKLDNN_PATH}/lib/libmkldnn.so.0) + endif () endif() else() set(MATH_LIB ${PADDLE_LIB}/third_party/install/openblas/lib/libopenblas${CMAKE_STATIC_LIBRARY_SUFFIX}) @@ -82,24 +135,66 @@ else() ${PADDLE_LIB}/paddle/lib/libpaddle_fluid${CMAKE_SHARED_LIBRARY_SUFFIX}) endif() -set(EXTERNAL_LIB "-lrt -ldl -lpthread -lm") +if (NOT WIN32) + set(DEPS ${DEPS} + ${MATH_LIB} ${MKLDNN_LIB} + glog gflags protobuf z xxhash + ) + if(EXISTS "${PADDLE_LIB}/third_party/install/snappystream/lib") + set(DEPS ${DEPS} snappystream) + endif() + if (EXISTS "${PADDLE_LIB}/third_party/install/snappy/lib") + set(DEPS ${DEPS} snappy) + endif() +else() + set(DEPS ${DEPS} + ${MATH_LIB} ${MKLDNN_LIB} + glog gflags_static libprotobuf xxhash) + set(DEPS ${DEPS} libcmt shlwapi) + if (EXISTS "${PADDLE_LIB}/third_party/install/snappy/lib") + set(DEPS ${DEPS} snappy) + endif() + if(EXISTS "${PADDLE_LIB}/third_party/install/snappystream/lib") + set(DEPS ${DEPS} snappystream) + endif() +endif(NOT WIN32) -set(DEPS ${DEPS} - ${MATH_LIB} ${MKLDNN_LIB} - glog gflags protobuf z xxhash - ${EXTERNAL_LIB} ${OpenCV_LIBS}) if(WITH_GPU) - if (USE_TENSORRT) - set(DEPS ${DEPS} - ${TENSORRT_ROOT}/lib/libnvinfer${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(DEPS ${DEPS} - ${TENSORRT_ROOT}/lib/libnvinfer_plugin${CMAKE_SHARED_LIBRARY_SUFFIX}) + if(NOT WIN32) + if (WITH_TENSORRT) + set(DEPS ${DEPS} ${TENSORRT_DIR}/lib/libnvinfer${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(DEPS ${DEPS} ${TENSORRT_DIR}/lib/libnvinfer_plugin${CMAKE_SHARED_LIBRARY_SUFFIX}) + endif() + set(DEPS ${DEPS} ${CUDA_LIB}/libcudart${CMAKE_SHARED_LIBRARY_SUFFIX}) + set(DEPS ${DEPS} ${CUDNN_LIB}/libcudnn${CMAKE_SHARED_LIBRARY_SUFFIX}) + else() + set(DEPS ${DEPS} ${CUDA_LIB}/cudart${CMAKE_STATIC_LIBRARY_SUFFIX} ) + set(DEPS ${DEPS} ${CUDA_LIB}/cublas${CMAKE_STATIC_LIBRARY_SUFFIX} ) + set(DEPS ${DEPS} ${CUDNN_LIB}/cudnn${CMAKE_STATIC_LIBRARY_SUFFIX}) endif() - set(DEPS ${DEPS} ${CUDA_LIB}/libcudart${CMAKE_SHARED_LIBRARY_SUFFIX}) - set(DEPS ${DEPS} ${CUDA_LIB}/libcudart${CMAKE_SHARED_LIBRARY_SUFFIX} ) - set(DEPS ${DEPS} ${CUDA_LIB}/libcublas${CMAKE_SHARED_LIBRARY_SUFFIX} ) - set(DEPS ${DEPS} ${CUDNN_LIB}/libcudnn${CMAKE_SHARED_LIBRARY_SUFFIX} ) endif() + +if (NOT WIN32) + set(EXTERNAL_LIB "-ldl -lrt -lgomp -lz -lm -lpthread") + set(DEPS ${DEPS} ${EXTERNAL_LIB}) +endif() + +set(DEPS ${DEPS} ${OpenCV_LIBS}) + +AUX_SOURCE_DIRECTORY(./src SRCS) +add_executable(${DEMO_NAME} ${SRCS}) + target_link_libraries(${DEMO_NAME} ${DEPS}) + +if (WIN32 AND WITH_MKL) + add_custom_command(TARGET ${DEMO_NAME} POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mklml/lib/mklml.dll ./mklml.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5md.dll ./libiomp5md.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mkldnn/lib/mkldnn.dll ./mkldnn.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mklml/lib/mklml.dll ./release/mklml.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mklml/lib/libiomp5md.dll ./release/libiomp5md.dll + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PADDLE_LIB}/third_party/install/mkldnn/lib/mkldnn.dll ./release/mkldnn.dll + ) +endif() \ No newline at end of file diff --git a/deploy/cpp_infer/docs/windows_vs2019_build.md b/deploy/cpp_infer/docs/windows_vs2019_build.md new file mode 100644 index 00000000..21fbf4e0 --- /dev/null +++ b/deploy/cpp_infer/docs/windows_vs2019_build.md @@ -0,0 +1,95 @@ +# Visual Studio 2019 Community CMake 编译指南 + +PaddleOCR在Windows 平台下基于`Visual Studio 2019 Community` 进行了测试。微软从`Visual Studio 2017`开始即支持直接管理`CMake`跨平台编译项目,但是直到`2019`才提供了稳定和完全的支持,所以如果你想使用CMake管理项目编译构建,我们推荐你使用`Visual Studio 2019`环境下构建。 + + +## 前置条件 +* Visual Studio 2019 +* CUDA 9.0 / CUDA 10.0,cudnn 7+ (仅在使用GPU版本的预测库时需要) +* CMake 3.0+ + +请确保系统已经安装好上述基本软件,我们使用的是`VS2019`的社区版。 + +**下面所有示例以工作目录为 `D:\projects`演示**。 + +### Step1: 下载PaddlePaddle C++ 预测库 fluid_inference + +PaddlePaddle C++ 预测库针对不同的`CPU`和`CUDA`版本提供了不同的预编译版本,请根据实际情况下载: [C++预测库下载列表](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/advanced_guide/inference_deployment/inference/windows_cpp_inference.html) + +解压后`D:\projects\fluid_inference`目录包含内容为: +``` +fluid_inference +├── paddle # paddle核心库和头文件 +| +├── third_party # 第三方依赖库和头文件 +| +└── version.txt # 版本和编译信息 +``` + +### Step2: 安装配置OpenCV + +1. 在OpenCV官网下载适用于Windows平台的3.4.6版本, [下载地址](https://sourceforge.net/projects/opencvlibrary/files/3.4.6/opencv-3.4.6-vc14_vc15.exe/download) +2. 运行下载的可执行文件,将OpenCV解压至指定目录,如`D:\projects\opencv` +3. 配置环境变量,如下流程所示 + - 我的电脑->属性->高级系统设置->环境变量 + - 在系统变量中找到Path(如没有,自行创建),并双击编辑 + - 新建,将opencv路径填入并保存,如`D:\projects\opencv\build\x64\vc14\bin` + +### Step3: 使用Visual Studio 2019直接编译CMake + +1. 打开Visual Studio 2019 Community,点击`继续但无需代码` +![step2](https://paddleseg.bj.bcebos.com/inference/vs2019_step1.png) +2. 点击: `文件`->`打开`->`CMake` +![step2.1](https://paddleseg.bj.bcebos.com/inference/vs2019_step2.png) + +选择项目代码所在路径,并打开`CMakeList.txt`: + +![step2.2](https://paddleseg.bj.bcebos.com/inference/vs2019_step3.png) + +3. 点击:`项目`->`cpp_inference_demo的CMake设置` + +![step3](https://paddleseg.bj.bcebos.com/inference/vs2019_step4.png) + +4. 点击`浏览`,分别设置编译选项指定`CUDA`、`CUDNN_LIB`、`OpenCV`、`Paddle预测库`的路径 + +三个编译参数的含义说明如下(带`*`表示仅在使用**GPU版本**预测库时指定, 其中CUDA库版本尽量对齐,**使用9.0、10.0版本,不使用9.2、10.1等版本CUDA库**): + +| 参数名 | 含义 | +| ---- | ---- | +| *CUDA_LIB | CUDA的库路径 | +| *CUDNN_LIB | CUDNN的库路径 | +| OPENCV_DIR | OpenCV的安装路径 | +| PADDLE_LIB | Paddle预测库的路径 | + +**注意:** + 1. 使用`CPU`版预测库,请把`WITH_GPU`的勾去掉 + 2. 如果使用的是`openblas`版本,请把`WITH_MKL`勾去掉 + +![step4](https://paddleseg.bj.bcebos.com/inference/vs2019_step5.png) + +**设置完成后**, 点击上图中`保存并生成CMake缓存以加载变量`。 + +5. 点击`生成`->`全部生成` + +![step6](https://paddleseg.bj.bcebos.com/inference/vs2019_step6.png) + + +### Step4: 预测及可视化 + +上述`Visual Studio 2019`编译产出的可执行文件在`out\build\x64-Release`目录下,打开`cmd`,并切换到该目录: + +``` +cd D:\projects\PaddleOCR\deploy\cpp_infer\out\build\x64-Release +``` +可执行文件`ocr_system.exe`即为样例的预测程序,其主要使用方法如下 + +```shell +#预测图片 `D:\projects\PaddleOCR\doc\imgs\10.jpg` +.\ocr_system.exe D:\projects\PaddleOCR\deploy\cpp_infer\tools\config.txt D:\projects\PaddleOCR\doc\imgs\10.jpg +``` + +第一个参数为配置文件路径,第二个参数为需要预测的图片路径。 + + +### 注意 +* 在Windows下的终端中执行文件exe时,可能会发生乱码的现象,此时需要在终端中输入`CHCP 65001`,将终端的编码方式由GBK编码(默认)改为UTF-8编码,更加具体的解释可以参考这篇博客:[https://blog.csdn.net/qq_35038153/article/details/78430359](https://blog.csdn.net/qq_35038153/article/details/78430359)。 diff --git a/deploy/cpp_infer/readme.md b/deploy/cpp_infer/readme.md index 03db8c50..0b244109 100644 --- a/deploy/cpp_infer/readme.md +++ b/deploy/cpp_infer/readme.md @@ -7,6 +7,9 @@ ### 运行准备 - Linux环境,推荐使用docker。 +- Windows环境,目前支持基于`Visual Studio 2019 Community`进行编译。 + +* 该文档主要介绍基于Linux环境的PaddleOCR C++预测流程,如果需要在Windows下基于预测库进行C++预测,具体编译方法请参考[Windows下编译教程](./docs/windows_vs2019_build.md) ### 1.1 编译opencv库 diff --git a/deploy/cpp_infer/src/config.cpp b/deploy/cpp_infer/src/config.cpp index 228c874d..52dfa209 100644 --- a/deploy/cpp_infer/src/config.cpp +++ b/deploy/cpp_infer/src/config.cpp @@ -44,7 +44,7 @@ Config::LoadConfig(const std::string &config_path) { std::map dict; for (int i = 0; i < config.size(); i++) { // pass for empty line or comment - if (config[i].size() <= 1 or config[i][0] == '#') { + if (config[i].size() <= 1 || config[i][0] == '#') { continue; } std::vector res = split(config[i], " "); diff --git a/deploy/cpp_infer/src/utility.cpp b/deploy/cpp_infer/src/utility.cpp index ffb74c2e..cbff2a71 100644 --- a/deploy/cpp_infer/src/utility.cpp +++ b/deploy/cpp_infer/src/utility.cpp @@ -39,22 +39,28 @@ std::vector Utility::ReadDict(const std::string &path) { void Utility::VisualizeBboxes( const cv::Mat &srcimg, const std::vector>> &boxes) { - cv::Point rook_points[boxes.size()][4]; - for (int n = 0; n < boxes.size(); n++) { - for (int m = 0; m < boxes[0].size(); m++) { - rook_points[n][m] = cv::Point(int(boxes[n][m][0]), int(boxes[n][m][1])); - } - } + // cv::Point rook_points[boxes.size()][4]; + // for (int n = 0; n < boxes.size(); n++) { + // for (int m = 0; m < boxes[0].size(); m++) { + // rook_points[n][m] = cv::Point(int(boxes[n][m][0]), + // int(boxes[n][m][1])); + // } + // } cv::Mat img_vis; srcimg.copyTo(img_vis); for (int n = 0; n < boxes.size(); n++) { - const cv::Point *ppt[1] = {rook_points[n]}; + cv::Point rook_points[4]; + for (int m = 0; m < boxes[n].size(); m++) { + rook_points[m] = cv::Point(int(boxes[n][m][0]), int(boxes[n][m][1])); + } + + const cv::Point *ppt[1] = {rook_points}; int npt[] = {4}; cv::polylines(img_vis, ppt, npt, 1, 1, CV_RGB(0, 255, 0), 2, 8, 0); } cv::imwrite("./ocr_vis.png", img_vis); - std::cout << "The detection visualized image saved in ./ocr_vis.png.pn" + std::cout << "The detection visualized image saved in ./ocr_vis.png" << std::endl; } diff --git a/deploy/cpp_infer/tools/build.sh b/deploy/cpp_infer/tools/build.sh index d8344a23..60653948 100755 --- a/deploy/cpp_infer/tools/build.sh +++ b/deploy/cpp_infer/tools/build.sh @@ -1,8 +1,7 @@ - OPENCV_DIR=your_opencv_dir LIB_DIR=your_paddle_inference_dir CUDA_LIB_DIR=your_cuda_lib_dir -CUDNN_LIB_DIR=/your_cudnn_lib_dir +CUDNN_LIB_DIR=your_cudnn_lib_dir BUILD_DIR=build rm -rf ${BUILD_DIR} @@ -11,7 +10,6 @@ cd ${BUILD_DIR} cmake .. \ -DPADDLE_LIB=${LIB_DIR} \ -DWITH_MKL=ON \ - -DDEMO_NAME=ocr_system \ -DWITH_GPU=OFF \ -DWITH_STATIC_LIB=OFF \ -DUSE_TENSORRT=OFF \ diff --git a/deploy/cpp_infer/tools/config.txt b/deploy/cpp_infer/tools/config.txt index fe7f27a0..a049fc7d 100644 --- a/deploy/cpp_infer/tools/config.txt +++ b/deploy/cpp_infer/tools/config.txt @@ -15,8 +15,7 @@ det_model_dir ./inference/det_db # rec config rec_model_dir ./inference/rec_crnn char_list_file ../../ppocr/utils/ppocr_keys_v1.txt -img_path ../../doc/imgs/11.jpg # show the detection results -visualize 0 +visualize 1 From 59ca349fe458f84be4d1ef73fd7ea92ee9b5943e Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Mon, 20 Jul 2020 17:29:40 +0000 Subject: [PATCH 013/101] fix format --- deploy/cpp_infer/CMakeLists.txt | 3 ++- deploy/cpp_infer/src/utility.cpp | 7 ------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/deploy/cpp_infer/CMakeLists.txt b/deploy/cpp_infer/CMakeLists.txt index b8ded08a..466c2be8 100644 --- a/deploy/cpp_infer/CMakeLists.txt +++ b/deploy/cpp_infer/CMakeLists.txt @@ -1,8 +1,9 @@ project(ocr_system CXX C) -option(WITH_MKL "Compile demo with MKL/OpenBlas support, default use MKL." OFF) +option(WITH_MKL "Compile demo with MKL/OpenBlas support, default use MKL." ON) option(WITH_GPU "Compile demo with GPU/CPU, default use CPU." OFF) option(WITH_STATIC_LIB "Compile demo with static/shared library, default use static." ON) +option(WITH_TENSORRT "Compile demo with TensorRT." OFF) SET(PADDLE_LIB "" CACHE PATH "Location of libraries") SET(OPENCV_DIR "" CACHE PATH "Location of libraries") diff --git a/deploy/cpp_infer/src/utility.cpp b/deploy/cpp_infer/src/utility.cpp index cbff2a71..c1c9d938 100644 --- a/deploy/cpp_infer/src/utility.cpp +++ b/deploy/cpp_infer/src/utility.cpp @@ -39,13 +39,6 @@ std::vector Utility::ReadDict(const std::string &path) { void Utility::VisualizeBboxes( const cv::Mat &srcimg, const std::vector>> &boxes) { - // cv::Point rook_points[boxes.size()][4]; - // for (int n = 0; n < boxes.size(); n++) { - // for (int m = 0; m < boxes[0].size(); m++) { - // rook_points[n][m] = cv::Point(int(boxes[n][m][0]), - // int(boxes[n][m][1])); - // } - // } cv::Mat img_vis; srcimg.copyTo(img_vis); for (int n = 0; n < boxes.size(); n++) { From ea542b51b41f04f5de710b799f0fadc0b315c8c7 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 08:53:28 +0800 Subject: [PATCH 014/101] resolve the ValueError: too many values to unpack resolve the ValueError: too many values to unpack (expected 4) --- tools/export_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/export_model.py b/tools/export_model.py index 414b5794..44de4580 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -45,7 +45,7 @@ from ppocr.utils.save_load import init_model def main(): - startup_prog, eval_program, place, config = program.preProcess() + startup_prog, eval_program, place, config,_ = program.preProcess() feeded_var_names, target_vars, fetches_var_name = program.build_export( config, eval_program, startup_prog) From 19da8ba8438d2e47528b888ca0ae1dcb60d247c7 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 09:03:21 +0800 Subject: [PATCH 015/101] update the export_model.py --- tools/export_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/export_model.py b/tools/export_model.py index 44de4580..d422b6e8 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -45,7 +45,7 @@ from ppocr.utils.save_load import init_model def main(): - startup_prog, eval_program, place, config,_ = program.preProcess() + startup_prog, eval_program, place, config, _ = program.preProcess() feeded_var_names, target_vars, fetches_var_name = program.build_export( config, eval_program, startup_prog) From 941a629dbefcb69ee64cb6cef88f97ae2d232458 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 13:55:28 +0800 Subject: [PATCH 016/101] remame a var --- tools/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/train.py b/tools/train.py index f0791eb1..7e13ccc4 100755 --- a/tools/train.py +++ b/tools/train.py @@ -92,7 +92,7 @@ def main(): 'fetch_name_list':eval_fetch_name_list,\ 'fetch_varname_list':eval_fetch_varname_list} - if isContain_det: + if contain_det: program.train_eval_det_run(config, exe, train_info_dict, eval_info_dict) else: program.train_eval_rec_run(config, exe, train_info_dict, eval_info_dict) From 7c0042edf31f7196f96d34232ddfb46eb1283a3b Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 13:56:52 +0800 Subject: [PATCH 017/101] rename a function --- tools/export_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/export_model.py b/tools/export_model.py index d422b6e8..a9543b54 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -45,7 +45,7 @@ from ppocr.utils.save_load import init_model def main(): - startup_prog, eval_program, place, config, _ = program.preProcess() + startup_prog, eval_program, place, config, _ = program. preprocess() feeded_var_names, target_vars, fetches_var_name = program.build_export( config, eval_program, startup_prog) From 91df2b64483afae1060294fc694791b33de38121 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 13:57:42 +0800 Subject: [PATCH 018/101] rename a function --- tools/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/train.py b/tools/train.py index 7e13ccc4..bee9214d 100755 --- a/tools/train.py +++ b/tools/train.py @@ -117,6 +117,6 @@ def test_reader(): if __name__ == '__main__': - startup_program, train_program, place, config, isContain_det = program.preProcess() + startup_program, train_program, place, config, isContain_det = program.preprocess() main() # test_reader() From 5f13f6e08a788b815f3dc5b78e7a0ebc1596235c Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 13:59:02 +0800 Subject: [PATCH 019/101] rename a var --- tools/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/train.py b/tools/train.py index bee9214d..14949012 100755 --- a/tools/train.py +++ b/tools/train.py @@ -117,6 +117,6 @@ def test_reader(): if __name__ == '__main__': - startup_program, train_program, place, config, isContain_det = program.preprocess() + startup_program, train_program, place, config, contain_det = program.preprocess() main() # test_reader() From eb208af1467dcd8329d3099e6c1ad13ada1032ad Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 14:00:20 +0800 Subject: [PATCH 020/101] rename a var and a function --- tools/program.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/program.py b/tools/program.py index 6197b91b..65d29460 100755 --- a/tools/program.py +++ b/tools/program.py @@ -375,7 +375,7 @@ def train_eval_rec_run(config, exe, train_info_dict, eval_info_dict): save_model(train_info_dict['train_program'], save_path) return -def preProcess(): +def preprocess(): FLAGS = ArgsParser().parse_args() config = load_config(FLAGS.config) merge_config(FLAGS.opt) @@ -398,4 +398,4 @@ def preProcess(): if alg in ['EAST', 'DB']: isContain_det = True - return startup_program, train_program, place, config, isContain_det + return startup_program, train_program, place, config, contain_det From 20d26b767c933858d045bf7ab2390411052207a3 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 14:02:01 +0800 Subject: [PATCH 021/101] rename a var and a function --- tools/eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/eval.py b/tools/eval.py index 13083acf..8f7521d7 100755 --- a/tools/eval.py +++ b/tools/eval.py @@ -48,7 +48,7 @@ from eval_utils.eval_rec_utils import eval_rec_run def main(): - startup_prog, eval_program, place, config,isContain_det = program.preProcess() + startup_prog, eval_program, place, config,contain_det = program.preprocess() eval_build_outputs = program.build( config, eval_program, startup_prog, mode='test') eval_fetch_name_list = eval_build_outputs[1] @@ -59,7 +59,7 @@ def main(): init_model(config, eval_program, exe) - if isContain_det: + if contain_det: eval_reader = reader_main(config=config, mode="eval") eval_info_dict = {'program':eval_program,\ 'reader':eval_reader,\ From 13bc04eb8f1f32e16db8068ad8b163e8dd48fcb2 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 14:02:59 +0800 Subject: [PATCH 022/101] Update export_model.py --- tools/export_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/export_model.py b/tools/export_model.py index a9543b54..de4ba0e4 100644 --- a/tools/export_model.py +++ b/tools/export_model.py @@ -45,7 +45,7 @@ from ppocr.utils.save_load import init_model def main(): - startup_prog, eval_program, place, config, _ = program. preprocess() + startup_prog, eval_program, place, config, _ = program.preprocess() feeded_var_names, target_vars, fetches_var_name = program.build_export( config, eval_program, startup_prog) From cd560324790c255c82a008e00ed381611196719a Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Tue, 21 Jul 2020 14:41:49 +0800 Subject: [PATCH 023/101] Update program.py --- tools/program.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/program.py b/tools/program.py index 65d29460..c39e0878 100755 --- a/tools/program.py +++ b/tools/program.py @@ -394,8 +394,8 @@ def preprocess(): startup_program = fluid.Program() train_program = fluid.Program() - isContain_det = False + contain_det = False if alg in ['EAST', 'DB']: - isContain_det = True + contain_det = True return startup_program, train_program, place, config, contain_det From 7576c8a66f5dab737dcbc7234acabb45a109978e Mon Sep 17 00:00:00 2001 From: dyning Date: Tue, 21 Jul 2020 15:47:14 +0800 Subject: [PATCH 024/101] Update README.md --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 60ea75b7..3d665771 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ English | [简体中文](README_cn.md) +## **Live stream**: July 21, 2020 at 8 pm BiliBili station + +**Live address:https://live.bilibili.com/h5/21689802** + ## Introduction PaddleOCR aims to create rich, leading, and practical OCR tools that help users train better models and apply them into practice. -**Live stream on coming day**: July 21, 2020 at 8 pm BiliBili station live stream - -Live address:https://live.bilibili.com/h5/21689802 - **Recent updates** - 2020.7.15, Add mobile App demo , support both iOS and Android ( based on easyedge and Paddle Lite) From 54829530724151894d4d08ae29c0051214b539c4 Mon Sep 17 00:00:00 2001 From: dyning Date: Tue, 21 Jul 2020 15:48:49 +0800 Subject: [PATCH 025/101] Update README_cn.md --- README_cn.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README_cn.md b/README_cn.md index 7b3c3fec..a3ffa13d 100644 --- a/README_cn.md +++ b/README_cn.md @@ -1,12 +1,12 @@ [English](README.md) | 简体中文 +## **直播:2020年7月21日晚8点B站直播,PaddleOCR开源大礼包全面解读** + +**直播地址:https://live.bilibili.com/21689802** + ## 简介 PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 -**直播预告:2020年7月21日晚8点B站直播,PaddleOCR开源大礼包全面解读** - -直播地址:https://live.bilibili.com/21689802 - **近期更新** - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark From 395d83d36c9c7251fc53f3bb65f4ce2ce7148296 Mon Sep 17 00:00:00 2001 From: dyning Date: Tue, 21 Jul 2020 15:54:30 +0800 Subject: [PATCH 026/101] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d665771..ed98d688 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ English | [简体中文](README_cn.md) -## **Live stream**: July 21, 2020 at 8 pm BiliBili station +## **Live stream**: July 21, 2020 at 8 pm BiliBili station,PaddleOCR Introduction **Live address:https://live.bilibili.com/h5/21689802** From 422130966895d31ba7dd7afd45c3d7a982b31794 Mon Sep 17 00:00:00 2001 From: wangjiawei04 Date: Tue, 21 Jul 2020 19:19:36 +0800 Subject: [PATCH 027/101] fix readme --- deploy/pdserving/readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index bab44249..17378b10 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -67,7 +67,7 @@ python ocr_web_client.py ## 自定义修改服务逻辑 -在`ocr_web_server.py`或是`ocr_debugger_server.py`当中的`preprocess`函数里面做了检测服务和识别服务的前处理,·`postprocess`函数里面做了识别的后处理服务,可以在相应的函数中做修改。调用了`paddle_serving_app`库提供的常见CV模型的前处理/后处理库。 +在`ocr_web_server.py`或是`ocr_local_server.py`当中的`preprocess`函数里面做了检测服务和识别服务的前处理,`postprocess`函数里面做了识别的后处理服务,可以在相应的函数中做修改。调用了`paddle_serving_app`库提供的常见CV模型的前处理/后处理库。 如果想要单独启动Paddle Serving的检测服务和识别服务,参见下列表格, 执行对应的脚本即可。 From ba69b2d480ff4a5ce16b34630f4c33fda6f9c773 Mon Sep 17 00:00:00 2001 From: wangjiawei04 Date: Tue, 21 Jul 2020 19:22:25 +0800 Subject: [PATCH 028/101] fix readme --- deploy/pdserving/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index 17378b10..b77ffea9 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -8,8 +8,8 @@ 我们先安装Paddle Serving相关组件 我们推荐用户使用GPU来做Paddle Serving的OCR服务部署 -**CUDA版本:9.0以上** -**CUDNN版本:7.0以上** +**CUDA版本:9.0** +**CUDNN版本:7.0** **操作系统版本:CentOS 6以上** ``` From 205dea7ecf5d2b85e6df4f3690520889e24fc04d Mon Sep 17 00:00:00 2001 From: wangjiawei04 Date: Tue, 21 Jul 2020 20:00:36 +0800 Subject: [PATCH 029/101] fix readme(mark beta) --- deploy/pdserving/readme.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index b77ffea9..e711369f 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -1,4 +1,4 @@ -# Paddle Serving 服务部署 +# Paddle Serving 服务部署(Beta) 本教程将介绍基于[Paddle Serving](https://github.com/PaddlePaddle/Serving)部署PaddleOCR在线预测服务的详细步骤。 @@ -13,7 +13,11 @@ **操作系统版本:CentOS 6以上** ``` -python -m pip install paddle_serving_server_gpu paddle_serving_client paddle_serving_app +#以下提供beta版本的paddle serving whl包,欢迎试用,正式版会在7月底正式上线 +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_server_gpu-0.3.2-py2-none-any.whl +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_app-0.1.2-py2-none-any.whl +python -m pip install paddle_serving_app-0.1.2-py2-none-any.whl paddle_serving_server_gpu-0.3.2-py2-none-any.whl +python -m pip install paddle_serving_client ``` ### 2. 模型转换 From 64512c7c57795690a1c6ec5d11608697243bfc77 Mon Sep 17 00:00:00 2001 From: wangjiawei04 Date: Tue, 21 Jul 2020 20:24:26 +0800 Subject: [PATCH 030/101] fix readme(mark beta) --- deploy/pdserving/readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index e711369f..4ec42d79 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -16,8 +16,8 @@ #以下提供beta版本的paddle serving whl包,欢迎试用,正式版会在7月底正式上线 wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_server_gpu-0.3.2-py2-none-any.whl wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_app-0.1.2-py2-none-any.whl -python -m pip install paddle_serving_app-0.1.2-py2-none-any.whl paddle_serving_server_gpu-0.3.2-py2-none-any.whl -python -m pip install paddle_serving_client +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_client-0.3.2-cp27-none-any.whl +python -m pip install paddle_serving_app-0.1.2-py2-none-any.whl paddle_serving_server_gpu-0.3.2-py2-none-any.whl paddle_serving_client-0.3.2-cp27-none-any.whl ``` ### 2. 模型转换 From 9d33e36df550762b204d5fbfd7977a25e31b2c44 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Wed, 22 Jul 2020 10:37:21 +0800 Subject: [PATCH 031/101] Update serving.md --- doc/doc_ch/serving.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_ch/serving.md b/doc/doc_ch/serving.md index 0b5eff3f..1cc57d53 100644 --- a/doc/doc_ch/serving.md +++ b/doc/doc_ch/serving.md @@ -69,7 +69,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ #### 方式2. 配置文件启动(支持CPU、GPU) **启动命令:** -```hub serving start --config/-c config.json``` +```hub serving start -c config.json``` 其中,`config.json`格式如下: ```python From 4cbcee2ddba757be83df3fa3e63609f628e616ff Mon Sep 17 00:00:00 2001 From: authorfu Date: Wed, 22 Jul 2020 16:08:18 +0800 Subject: [PATCH 032/101] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E6=8B=8D=E7=85=A7?= =?UTF-8?q?=E4=B8=8D=E6=B8=85=E6=99=B0=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/src/main/AndroidManifest.xml | 9 +++ .../paddle/lite/demo/ocr/MainActivity.java | 72 +++++++++++++++++-- .../lite/demo/ocr/OCRPredictorNative.java | 4 +- .../baidu/paddle/lite/demo/ocr/Predictor.java | 12 ++-- .../com/baidu/paddle/lite/demo/ocr/Utils.java | 46 ++++++++++++ .../app/src/main/res/xml/file_paths.xml | 4 ++ 6 files changed, 131 insertions(+), 16 deletions(-) create mode 100644 deploy/android_demo/app/src/main/res/xml/file_paths.xml diff --git a/deploy/android_demo/app/src/main/AndroidManifest.xml b/deploy/android_demo/app/src/main/AndroidManifest.xml index ff1900d6..b7c1d8b5 100644 --- a/deploy/android_demo/app/src/main/AndroidManifest.xml +++ b/deploy/android_demo/app/src/main/AndroidManifest.xml @@ -25,6 +25,15 @@ android:name="com.baidu.paddle.lite.demo.ocr.SettingsActivity" android:label="Settings"> + + + \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java index b72d72df..716e7bdd 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java @@ -3,14 +3,17 @@ package com.baidu.paddle.lite.demo.ocr; import android.Manifest; import android.app.ProgressDialog; import android.content.ContentResolver; +import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; +import android.media.ExifInterface; import android.net.Uri; import android.os.Bundle; +import android.os.Environment; import android.os.Handler; import android.os.HandlerThread; import android.os.Message; @@ -19,6 +22,7 @@ import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; +import android.support.v4.content.FileProvider; import android.support.v7.app.AppCompatActivity; import android.text.method.ScrollingMovementMethod; import android.util.Log; @@ -32,6 +36,8 @@ import android.widget.Toast; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.Date; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); @@ -69,6 +75,7 @@ public class MainActivity extends AppCompatActivity { protected float[] inputMean = new float[]{}; protected float[] inputStd = new float[]{}; protected float scoreThreshold = 0.1f; + private String currentPhotoPath; protected Predictor predictor = new Predictor(); @@ -368,18 +375,56 @@ public class MainActivity extends AppCompatActivity { } private void takePhoto() { - Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); - if (takePhotoIntent.resolveActivity(getPackageManager()) != null) { - startActivityForResult(takePhotoIntent, TAKE_PHOTO_REQUEST_CODE); + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + // Ensure that there's a camera activity to handle the intent + if (takePictureIntent.resolveActivity(getPackageManager()) != null) { + // Create the File where the photo should go + File photoFile = null; + try { + photoFile = createImageFile(); + } catch (IOException ex) { + Log.e("MainActitity", ex.getMessage(), ex); + Toast.makeText(MainActivity.this, + "Create Camera temp file failed: " + ex.getMessage(), Toast.LENGTH_SHORT).show(); + } + // Continue only if the File was successfully created + if (photoFile != null) { + Log.i(TAG, "FILEPATH " + getExternalFilesDir("Pictures").getAbsolutePath()); + Uri photoURI = FileProvider.getUriForFile(this, + "com.baidu.paddle.lite.demo.ocr.fileprovider", + photoFile); + currentPhotoPath = photoFile.getAbsolutePath(); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + startActivityForResult(takePictureIntent, TAKE_PHOTO_REQUEST_CODE); + Log.i(TAG, "startActivityForResult finished"); + } } + + } + + private File createImageFile() throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File image = File.createTempFile( + imageFileName, /* prefix */ + ".bmp", /* suffix */ + storageDir /* directory */ + ); + + return image; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); - if (resultCode == RESULT_OK && data != null) { + if (resultCode == RESULT_OK) { switch (requestCode) { case OPEN_GALLERY_REQUEST_CODE: + if (data == null) { + break; + } try { ContentResolver resolver = getContentResolver(); Uri uri = data.getData(); @@ -393,9 +438,22 @@ public class MainActivity extends AppCompatActivity { } break; case TAKE_PHOTO_REQUEST_CODE: - Bundle extras = data.getExtras(); - Bitmap image = (Bitmap) extras.get("data"); - onImageChanged(image); + if (currentPhotoPath != null) { + ExifInterface exif = null; + try { + exif = new ExifInterface(currentPhotoPath); + } catch (IOException e) { + e.printStackTrace(); + } + int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, + ExifInterface.ORIENTATION_UNDEFINED); + Log.i(TAG, "rotation " + orientation); + Bitmap image = BitmapFactory.decodeFile(currentPhotoPath); + image = Utils.rotateBitmap(image, orientation); + onImageChanged(image); + } else { + Log.e(TAG, "currentPhotoPath is null"); + } break; default: break; diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java index 103d5d37..2e78a3ec 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/OCRPredictorNative.java @@ -35,8 +35,8 @@ public class OCRPredictorNative { } - public void release(){ - if (nativePointer != 0){ + public void release() { + if (nativePointer != 0) { nativePointer = 0; destory(nativePointer); } diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java index d491481e..7543acee 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java @@ -127,12 +127,12 @@ public class Predictor { } public void releaseModel() { - if (paddlePredictor != null){ + if (paddlePredictor != null) { paddlePredictor.release(); paddlePredictor = null; } isLoaded = false; - cpuThreadNum = 4; + cpuThreadNum = 1; cpuPowerMode = "LITE_POWER_HIGH"; modelPath = ""; modelName = ""; @@ -287,9 +287,7 @@ public class Predictor { if (image == null) { return; } - // Scale image to the size of input tensor - Bitmap rgbaImage = image.copy(Bitmap.Config.ARGB_8888, true); - this.inputImage = rgbaImage; + this.inputImage = image.copy(Bitmap.Config.ARGB_8888, true); } private ArrayList postprocess(ArrayList results) { @@ -310,7 +308,7 @@ public class Predictor { private void drawResults(ArrayList results) { StringBuffer outputResultSb = new StringBuffer(""); - for (int i=0;i + + + \ No newline at end of file From a4dc67f2f59c0c4f150f621d268f7e96cf9a3049 Mon Sep 17 00:00:00 2001 From: tink2123 Date: Wed, 22 Jul 2020 20:52:57 +0800 Subject: [PATCH 033/101] polish android readme --- doc/demo/build.png | Bin 0 -> 13398 bytes doc/demo/error.png | Bin 0 -> 107835 bytes doc/demo/proxy.png | Bin 0 -> 189161 bytes doc/doc_ch/android_demo.md | 57 +++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 doc/demo/build.png create mode 100644 doc/demo/error.png create mode 100644 doc/demo/proxy.png create mode 100644 doc/doc_ch/android_demo.md diff --git a/doc/demo/build.png b/doc/demo/build.png new file mode 100644 index 0000000000000000000000000000000000000000..73fb58e24b497bf57881745774838adb90d07ffa GIT binary patch literal 13398 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 Pdl`tf9tMVeS3gK{C5JzkT@9@yDTFapPVE7$ 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 X<(qQ~4^{pm{m9FxJT81>67>H8p7yjQ literal 0 HcmV?d00001 diff --git a/doc/doc_ch/android_demo.md b/doc/doc_ch/android_demo.md new file mode 100644 index 00000000..41765a04 --- /dev/null +++ b/doc/doc_ch/android_demo.md @@ -0,0 +1,57 @@ +# Android Demo 快速测试 + + +### 1. 安装最新版本的Android Studio + +可以从https://developer.android.com/studio下载。本Demo使用是4.0版本Android Studio编写。 + +### 2. 创建新项目 + +Demo测试的时候使用的是NDK 20b版本,20版本以上均可以支持编译成功。 + +如果您是初学者,可以用以下方式安装和测试NDK编译环境。 +点击 File -> New ->New Project, 新建 "Native C++" project + + +1. Start a new Android Studio project + 在项目模版中选择 Native C++ 选择PaddleOCR/depoly/android_demo 路径 + 进入项目后会自动编译,第一次编译会花费较长的时间,建议添加代理加速下载。 + +**代理添加:** + +选择 Android Studio -> Perferences -> Appearance & Behavior -> System Settings -> HTTP Proxy -> Manual proxy configuration + +![](../demo/proxy.png) + +2. 开始编译 + +点击编译按钮,连接手机,跟着Android Studio的引导完成操作。 + +在 Android Studio 里看到下图,表示编译完成: + +![](../demo/build.png) + +**提示:** 此时如果出现下列找不到OpenCV的报错信息,请重新点击编译,编译完成后退出项目,再次进入。 + +![](../demo/error.png) + +### 3. 发送到手机端 + +完成编译,点击运行,在手机端查看效果。 + +### 4. 如何自定义demo图片 + +1. 图片存放路径:android_demo/app/src/main/assets/images + + 将自定义图片放置在该路径下 + +2. 配置文件: android_demo/app/src/main/res/values/strings.xml + + 修改 IMAGE_PATH_DEFAULT 为自定义图片名即可 + + +# 获得更多支持 +前往[端计算模型生成平台EasyEdge](https://ai.baidu.com/easyedge/app/open_source_demo?referrerUrl=paddlelite),获得更多开发支持: + +- Demo APP:可使用手机扫码安装,方便手机端快速体验文字识别 +- SDK:模型被封装为适配不同芯片硬件和操作系统SDK,包括完善的接口,方便进行二次开发 From 070abbc37142242c20a961f7f5a151e8fc26895c Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:03:44 +0800 Subject: [PATCH 034/101] Update README_cn.md --- README_cn.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README_cn.md b/README_cn.md index a3ffa13d..290622fe 100644 --- a/README_cn.md +++ b/README_cn.md @@ -1,13 +1,10 @@ [English](README.md) | 简体中文 -## **直播:2020年7月21日晚8点B站直播,PaddleOCR开源大礼包全面解读** - -**直播地址:https://live.bilibili.com/21689802** - ## 简介 PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 **近期更新** +- 2020.7.23 2020年7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark - 2020.7.15 整理OCR相关数据集、常用数据标注以及合成工具 From bb8194f9e621808941172e79862be7b82abc61a5 Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:04:10 +0800 Subject: [PATCH 035/101] Update README_cn.md --- README_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_cn.md b/README_cn.md index 290622fe..08cb0cc4 100644 --- a/README_cn.md +++ b/README_cn.md @@ -4,7 +4,7 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 **近期更新** -- 2020.7.23 2020年7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) +- 2020.7.23 7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark - 2020.7.15 整理OCR相关数据集、常用数据标注以及合成工具 From ebf4d25650790fa1eead8e4010a1b214db3d7c96 Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:04:42 +0800 Subject: [PATCH 036/101] Update update.md --- doc/doc_ch/update.md | 1 + 1 file changed, 1 insertion(+) diff --git a/doc/doc_ch/update.md b/doc/doc_ch/update.md index 59514aad..b00dbebd 100644 --- a/doc/doc_ch/update.md +++ b/doc/doc_ch/update.md @@ -1,4 +1,5 @@ # 更新 +- 2020.7.23 7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark - 2020.7.15 整理OCR相关数据集、常用数据标注以及合成工具 From 391b3ae539d3b4eadf530054229869e3e2f11f5c Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:05:16 +0800 Subject: [PATCH 037/101] Update update.md --- doc/doc_ch/update.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_ch/update.md b/doc/doc_ch/update.md index b00dbebd..e22d05b4 100644 --- a/doc/doc_ch/update.md +++ b/doc/doc_ch/update.md @@ -1,5 +1,5 @@ # 更新 -- 2020.7.23 7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) +- 2020.7.23 发布7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark - 2020.7.15 整理OCR相关数据集、常用数据标注以及合成工具 From 0f47c5ce369fc061967f9673854cb41dfe22810e Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:05:36 +0800 Subject: [PATCH 038/101] Update README_cn.md --- README_cn.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README_cn.md b/README_cn.md index 08cb0cc4..47bddd5d 100644 --- a/README_cn.md +++ b/README_cn.md @@ -4,7 +4,7 @@ PaddleOCR旨在打造一套丰富、领先、且实用的OCR工具库,助力使用者训练出更好的模型,并应用落地。 **近期更新** -- 2020.7.23 7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) +- 2020.7.23 发布7月21日B站直播课回放和PPT,PaddleOCR开源大礼包全面解读,[获取地址](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15 添加基于EasyEdge和Paddle-Lite的移动端DEMO,支持iOS和Android系统 - 2020.7.15 完善预测部署,添加基于C++预测引擎推理、服务化部署和端侧部署方案,以及超轻量级中文OCR模型预测耗时Benchmark - 2020.7.15 整理OCR相关数据集、常用数据标注以及合成工具 From 3ace934646d67c32b21d70a2204b2d2d537271b8 Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:10:38 +0800 Subject: [PATCH 039/101] Update README.md --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index ed98d688..3e8bae3f 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,10 @@ English | [简体中文](README_cn.md) -## **Live stream**: July 21, 2020 at 8 pm BiliBili station,PaddleOCR Introduction - -**Live address:https://live.bilibili.com/h5/21689802** - ## Introduction PaddleOCR aims to create rich, leading, and practical OCR tools that help users train better models and apply them into practice. **Recent updates** - +- 2020.7.21, Release the playback and PPT of live class on BiliBili station, PaddleOCR Introduction, [address](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15, Add mobile App demo , support both iOS and Android ( based on easyedge and Paddle Lite) - 2020.7.15, Improve the deployment ability, add the C + + inference , serving deployment. In addtion, the benchmarks of the ultra-lightweight OCR model are provided. - 2020.7.15, Add several related datasets, data annotation and synthesis tools. From 279a7845e0c705905eea6a50130132bc124db6a5 Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:11:45 +0800 Subject: [PATCH 040/101] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3e8bae3f..95326fa0 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ English | [简体中文](README_cn.md) PaddleOCR aims to create rich, leading, and practical OCR tools that help users train better models and apply them into practice. **Recent updates** -- 2020.7.21, Release the playback and PPT of live class on BiliBili station, PaddleOCR Introduction, [address](https://aistudio.baidu.com/aistudio/course/introduce/1519) +- 2020.7.23, Release the playback and PPT of live class on BiliBili station, PaddleOCR Introduction, [address](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15, Add mobile App demo , support both iOS and Android ( based on easyedge and Paddle Lite) - 2020.7.15, Improve the deployment ability, add the C + + inference , serving deployment. In addtion, the benchmarks of the ultra-lightweight OCR model are provided. - 2020.7.15, Add several related datasets, data annotation and synthesis tools. From 25ba6785b3665be1ce2476b899ec1633b8efeab3 Mon Sep 17 00:00:00 2001 From: dyning Date: Thu, 23 Jul 2020 10:11:56 +0800 Subject: [PATCH 041/101] Update update_en.md --- doc/doc_en/update_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_en/update_en.md b/doc/doc_en/update_en.md index 6cd347a8..ef02d9db 100644 --- a/doc/doc_en/update_en.md +++ b/doc/doc_en/update_en.md @@ -1,5 +1,5 @@ # RECENT UPDATES - +- 2020.7.23, Release the playback and PPT of live class on BiliBili station, PaddleOCR Introduction, [address](https://aistudio.baidu.com/aistudio/course/introduce/1519) - 2020.7.15, Add mobile App demo , support both iOS and Android ( based on easyedge and Paddle Lite) - 2020.7.15, Improve the deployment ability, add the C + + inference , serving deployment. In addtion, the benchmarks of the ultra-lightweight Chinese OCR model are provided. - 2020.7.15, Add several related datasets, data annotation and synthesis tools. From a52ee64d459f90d1f578defbb7579f10cfe145fe Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Thu, 23 Jul 2020 10:37:39 +0800 Subject: [PATCH 042/101] fix lite readme --- deploy/lite/readme.md | 4 ++-- deploy/lite/readme_en.md | 2 +- ppocr/modeling/backbones/rec_mobilenet_v3.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deploy/lite/readme.md b/deploy/lite/readme.md index 378a3eec..219cc83f 100644 --- a/deploy/lite/readme.md +++ b/deploy/lite/readme.md @@ -18,7 +18,7 @@ Paddle Lite是飞桨轻量化推理引擎,为手机、IOT端提供高效推理 1. [Docker](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#docker) 2. [Linux](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#android) 3. [MAC OS](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id13) -4. [Windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#windows) +4. [Windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#id4) ### 1.2 准备预测库 @@ -84,7 +84,7 @@ Paddle-Lite 提供了多种策略来自动优化原始的模型,其中包括 |模型简介|检测模型|识别模型|Paddle-Lite版本| |-|-|-|-| -|超轻量级中文OCR opt优化模型|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_det_mv3_db_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_rec_mv3_crnn_opt.nb)|2.6.1| +|超轻量级中文OCR opt优化模型|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_det_mv3_db_opt.nb)|[下载地址](https://paddleocr.bj.bcebos.com/deploy/lite/ch_rec_mv3_crnn_opt.nb)|develop| 如果直接使用上述表格中的模型进行部署,可略过下述步骤,直接阅读 [2.2节](#2.2与手机联调)。 diff --git a/deploy/lite/readme_en.md b/deploy/lite/readme_en.md index a8c9f604..6110e646 100644 --- a/deploy/lite/readme_en.md +++ b/deploy/lite/readme_en.md @@ -17,7 +17,7 @@ deployment solutions for end-side deployment issues. [build for Docker](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#docker) [build for Linux](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#android) [build for MAC OS](https://paddle-lite.readthedocs.io/zh/latest/user_guides/source_compile.html#id13) -[build for windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#windows) +[build for windows](https://paddle-lite.readthedocs.io/zh/latest/demo_guides/x86.html#id4) ## 3. Download prebuild library for android and ios diff --git a/ppocr/modeling/backbones/rec_mobilenet_v3.py b/ppocr/modeling/backbones/rec_mobilenet_v3.py index 506209cc..650b2d59 100755 --- a/ppocr/modeling/backbones/rec_mobilenet_v3.py +++ b/ppocr/modeling/backbones/rec_mobilenet_v3.py @@ -78,7 +78,7 @@ class MobileNetV3(): supported_scale = [0.35, 0.5, 0.75, 1.0, 1.25] assert self.scale in supported_scale, \ - "supported scale are {} but input scale is {}".format(supported_scale, scale) + "supported scale are {} but input scale is {}".format(supported_scale, self.scale) def __call__(self, input): scale = self.scale From 8a11d97da8dbb28792e649b4f6302fe9e4bb3649 Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Thu, 23 Jul 2020 11:12:35 +0800 Subject: [PATCH 043/101] typo --- deploy/lite/readme_en.md | 2 +- ppocr/modeling/backbones/rec_mobilenet_v3.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deploy/lite/readme_en.md b/deploy/lite/readme_en.md index 6110e646..1efbba36 100644 --- a/deploy/lite/readme_en.md +++ b/deploy/lite/readme_en.md @@ -155,7 +155,7 @@ demo/cxx/ocr/ |-- debug/ | |--ch_det_mv3_db_opt.nb Detection model | |--ch_rec_mv3_crnn_opt.nb Recognition model -| |--11.jpg image for OCR +| |--11.jpg Image for OCR | |--ppocr_keys_v1.txt Dictionary file | |--libpaddle_light_api_shared.so C++ .so file | |--config.txt Config file diff --git a/ppocr/modeling/backbones/rec_mobilenet_v3.py b/ppocr/modeling/backbones/rec_mobilenet_v3.py index 650b2d59..e5040642 100755 --- a/ppocr/modeling/backbones/rec_mobilenet_v3.py +++ b/ppocr/modeling/backbones/rec_mobilenet_v3.py @@ -78,7 +78,7 @@ class MobileNetV3(): supported_scale = [0.35, 0.5, 0.75, 1.0, 1.25] assert self.scale in supported_scale, \ - "supported scale are {} but input scale is {}".format(supported_scale, self.scale) + "supported scales are {} but input scale is {}".format(supported_scale, self.scale) def __call__(self, input): scale = self.scale From af8740330b746e6225b8ef7f18f79d0aeb5bd2fc Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Thu, 23 Jul 2020 13:59:58 +0800 Subject: [PATCH 044/101] fix the assignment of a var --- tools/program.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tools/program.py b/tools/program.py index c39e0878..4ebc1167 100755 --- a/tools/program.py +++ b/tools/program.py @@ -394,8 +394,9 @@ def preprocess(): startup_program = fluid.Program() train_program = fluid.Program() - contain_det = False if alg in ['EAST', 'DB']: - contain_det = True + train_alg_type = 'det' + else: + train_alg_type = 'rec' - return startup_program, train_program, place, config, contain_det + return startup_program, train_program, place, config, train_alg_type From 94e8c3b66d61dd957d43edacf24377aa20acf718 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Thu, 23 Jul 2020 14:04:24 +0800 Subject: [PATCH 045/101] repair a var --- tools/train.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/train.py b/tools/train.py index 14949012..0f5e9039 100755 --- a/tools/train.py +++ b/tools/train.py @@ -92,7 +92,7 @@ def main(): 'fetch_name_list':eval_fetch_name_list,\ 'fetch_varname_list':eval_fetch_varname_list} - if contain_det: + if train_alg_type == 'det': program.train_eval_det_run(config, exe, train_info_dict, eval_info_dict) else: program.train_eval_rec_run(config, exe, train_info_dict, eval_info_dict) @@ -117,6 +117,6 @@ def test_reader(): if __name__ == '__main__': - startup_program, train_program, place, config, contain_det = program.preprocess() + startup_program, train_program, place, config, train_alg_type = program.preprocess() main() # test_reader() From 4d541eb364fc63888122e5b10b27b441c7be50b3 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Thu, 23 Jul 2020 14:07:21 +0800 Subject: [PATCH 046/101] repair a var --- tools/eval.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/eval.py b/tools/eval.py index 8f7521d7..edd84a9d 100755 --- a/tools/eval.py +++ b/tools/eval.py @@ -48,7 +48,7 @@ from eval_utils.eval_rec_utils import eval_rec_run def main(): - startup_prog, eval_program, place, config,contain_det = program.preprocess() + startup_prog, eval_program, place, config, train_alg_type = program.preprocess() eval_build_outputs = program.build( config, eval_program, startup_prog, mode='test') eval_fetch_name_list = eval_build_outputs[1] @@ -59,7 +59,7 @@ def main(): init_model(config, eval_program, exe) - if contain_det: + if train_alg_type == 'det': eval_reader = reader_main(config=config, mode="eval") eval_info_dict = {'program':eval_program,\ 'reader':eval_reader,\ From f45946dc83b7d54b1061d456d950983928583d94 Mon Sep 17 00:00:00 2001 From: LDOUBLEV Date: Thu, 23 Jul 2020 15:35:23 +0800 Subject: [PATCH 047/101] add hint when install shapely on win --- doc/doc_ch/installation.md | 3 +++ doc/doc_en/installation_en.md | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/doc/doc_ch/installation.md b/doc/doc_ch/installation.md index 4b75e21b..7a51c561 100644 --- a/doc/doc_ch/installation.md +++ b/doc/doc_ch/installation.md @@ -80,3 +80,6 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR cd PaddleOCR pip3 install -r requirments.txt ``` + +注意,windows环境下,建议从[这里](https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely)下载shapely安装包完成安装, +直接通过pip安装的shapely库可能出现`[winRrror 126] 找不到指定模块的问题`。 diff --git a/doc/doc_en/installation_en.md b/doc/doc_en/installation_en.md index 585f9d43..9e4df74f 100644 --- a/doc/doc_en/installation_en.md +++ b/doc/doc_en/installation_en.md @@ -82,3 +82,9 @@ git clone https://gitee.com/paddlepaddle/PaddleOCR cd PaddleOCR pip3 install -r requirments.txt ``` + +If you getting this error `OSError: [WinError 126] The specified module could not be found` when you install shapely on windows. + +Please try to download Shapely whl file using [http://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely](http://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely). + +Reference: [Solve shapely installation on windows](https://stackoverflow.com/questions/44398265/install-shapely-oserror-winerror-126-the-specified-module-could-not-be-found) From 3c2187e973b50f10c371134eb86d53e2aec2a535 Mon Sep 17 00:00:00 2001 From: Jiawei Wang Date: Fri, 24 Jul 2020 16:32:53 +0800 Subject: [PATCH 048/101] Update readme.md --- deploy/pdserving/readme.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/deploy/pdserving/readme.md b/deploy/pdserving/readme.md index 4ec42d79..d6069cd3 100644 --- a/deploy/pdserving/readme.md +++ b/deploy/pdserving/readme.md @@ -9,9 +9,21 @@ 我们推荐用户使用GPU来做Paddle Serving的OCR服务部署 **CUDA版本:9.0** + **CUDNN版本:7.0** + **操作系统版本:CentOS 6以上** +**Python3操作指南:** +``` +#以下提供beta版本的paddle serving whl包,欢迎试用,正式版会在7月底正式上线 +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_server_gpu-0.3.2-py3-none-any.whl +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_client-0.3.2-cp36-none-any.whl +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_app-0.1.2-py3-none-any.whl +python -m pip install paddle_serving_app-0.1.2-py3-none-any.whl paddle_serving_server_gpu-0.3.2-py3-none-any.whl paddle_serving_client-0.3.2-cp36-none-any.whl +``` + +**Python2操作指南:** ``` #以下提供beta版本的paddle serving whl包,欢迎试用,正式版会在7月底正式上线 wget --no-check-certificate https://paddle-serving.bj.bcebos.com/others/paddle_serving_server_gpu-0.3.2-py2-none-any.whl From dcd2626e11f3975e47bc97a4a9156662903873c7 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Fri, 24 Jul 2020 17:26:37 +0800 Subject: [PATCH 049/101] The if condition is not sufficient when you trian the det model , there is not the var: loss_type in the Global, so train_alg_type == 'rec' is necessary --- tools/train.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/train.py b/tools/train.py index 0f5e9039..68e792b7 100755 --- a/tools/train.py +++ b/tools/train.py @@ -74,7 +74,7 @@ def main(): # dump mode structure if config['Global']['debug']: - if 'attention' in config['Global']['loss_type']: + if train_alg_type == 'rec' and 'attention' in config['Global']['loss_type']: logger.warning('Does not suport dump attention...') else: summary(train_program) From 65042ff602eb8d191419ea7ec6b6bc5befc4ae06 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Sat, 25 Jul 2020 11:49:52 +0800 Subject: [PATCH 050/101] Common modules are executed repeatedly the function sample_iter_reader is executed repatedly,so the common modules do not need to be executed repeatedly --- ppocr/data/det/dataset_traversal.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ppocr/data/det/dataset_traversal.py b/ppocr/data/det/dataset_traversal.py index 737cbe2e..fc2241cf 100644 --- a/ppocr/data/det/dataset_traversal.py +++ b/ppocr/data/det/dataset_traversal.py @@ -37,8 +37,7 @@ class TrainReader(object): self.process = create_module(params['process_function'])(params) def __call__(self, process_id): - def sample_iter_reader(): - with open(self.label_file_path, "rb") as fin: + with open(self.label_file_path, "rb") as fin: label_infor_list = fin.readlines() img_num = len(label_infor_list) img_id_list = list(range(img_num)) @@ -47,6 +46,8 @@ class TrainReader(object): print("multiprocess is not fully compatible with Windows." "num_workers will be 1.") self.num_workers = 1 + + def sample_iter_reader(): for img_id in range(process_id, img_num, self.num_workers): label_infor = label_infor_list[img_id_list[img_id]] outs = self.process(label_infor) From dd32d0f636b686e6b685d01255971e37fc40efbc Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Sat, 25 Jul 2020 11:54:03 +0800 Subject: [PATCH 051/101] Update dataset_traversal.py --- ppocr/data/det/dataset_traversal.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ppocr/data/det/dataset_traversal.py b/ppocr/data/det/dataset_traversal.py index fc2241cf..89c776d5 100644 --- a/ppocr/data/det/dataset_traversal.py +++ b/ppocr/data/det/dataset_traversal.py @@ -38,14 +38,14 @@ class TrainReader(object): def __call__(self, process_id): with open(self.label_file_path, "rb") as fin: - label_infor_list = fin.readlines() - img_num = len(label_infor_list) - img_id_list = list(range(img_num)) - random.shuffle(img_id_list) - if sys.platform == "win32": - print("multiprocess is not fully compatible with Windows." - "num_workers will be 1.") - self.num_workers = 1 + label_infor_list = fin.readlines() + img_num = len(label_infor_list) + img_id_list = list(range(img_num)) + random.shuffle(img_id_list) + if sys.platform == "win32": + print("multiprocess is not fully compatible with Windows." + "num_workers will be 1.") + self.num_workers = 1 def sample_iter_reader(): for img_id in range(process_id, img_num, self.num_workers): From 791f6239474fe2109b60e109c7a1a5be0a3e0608 Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Sat, 25 Jul 2020 07:38:50 +0000 Subject: [PATCH 052/101] fix hub serving doc --- doc/doc_ch/serving.md | 37 ++++++++++++++++++++++++++----------- doc/doc_en/serving_en.md | 35 +++++++++++++++++++++++++++-------- 2 files changed, 53 insertions(+), 19 deletions(-) diff --git a/doc/doc_ch/serving.md b/doc/doc_ch/serving.md index 1cc57d53..d4c5d8c1 100644 --- a/doc/doc_ch/serving.md +++ b/doc/doc_ch/serving.md @@ -28,21 +28,37 @@ deploy/hubserving/ocr_system/ # 安装paddlehub pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -# 设置环境变量 +# 在Linux下设置环境变量 export PYTHONPATH=. -``` +# 在Windows下设置环境变量 +SET PYTHONPATH=. +``` ### 2. 安装服务模块 -PaddleOCR提供3种服务模块,根据需要安装所需模块。如: +PaddleOCR提供3种服务模块,根据需要安装所需模块。 + +* 在Linux环境下,安装示例如下: 安装检测服务模块: ```hub install deploy/hubserving/ocr_det/``` -或,安装识别服务模块: +或,安装识别服务模块: ```hub install deploy/hubserving/ocr_rec/``` 或,安装检测+识别串联服务模块: -```hub install deploy/hubserving/ocr_system/``` +```hub install deploy/hubserving/ocr_system/``` + +* 在Windows环境下(文件夹的分隔符为`\`),安装示例如下: + +安装检测服务模块: +```hub install deploy\hubserving\ocr_det\``` + +或,安装识别服务模块: +```hub install deploy\hubserving\ocr_rec\``` + +或,安装检测+识别串联服务模块: +```hub install deploy\hubserving\ocr_system\``` + ### 3. 启动服务 #### 方式1. 命令行命令启动(仅支持CPU) @@ -71,7 +87,7 @@ $ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ **启动命令:** ```hub serving start -c config.json``` -其中,`config.json`格式如下: +其中,`config.json`格式如下: ```python { "modules_info": { @@ -124,7 +140,7 @@ hub serving start -c deploy/hubserving/ocr_system/config.json ## 返回结果格式说明 返回结果为列表(list),列表中的每一项为词典(dict),词典一共可能包含3种字段,信息如下: -|字段名称|数据类型|意义| +|字段名称|数据类型|意义| |-|-|-| |text|str|文本内容| |confidence|float| 文本识别置信度| @@ -134,9 +150,9 @@ hub serving start -c deploy/hubserving/ocr_system/config.json |字段名/模块名|ocr_det|ocr_rec|ocr_system| |-|-|-|-| -|text||✔|✔| -|confidence||✔|✔| -|text_region|✔||✔| +|text||✔|✔| +|confidence||✔|✔| +|text_region|✔||✔| **说明:** 如果需要增加、删除、修改返回字段,可在相应模块的`module.py`文件中进行修改,完整流程参考下一节自定义修改服务模块。 @@ -157,4 +173,3 @@ hub serving start -c deploy/hubserving/ocr_system/config.json - 5、重新启动服务 ```hub serving start -m ocr_system``` - diff --git a/doc/doc_en/serving_en.md b/doc/doc_en/serving_en.md index 84b57ecd..d4c235d2 100644 --- a/doc/doc_en/serving_en.md +++ b/doc/doc_en/serving_en.md @@ -29,12 +29,16 @@ The following steps take the 2-stage series service as an example. If only the d # Install paddlehub pip3 install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple -# Set environment variables +# Set environment variables on Linux export PYTHONPATH=. -``` +# Set environment variables on Windows +SET PYTHONPATH=. +``` ### 2. Install Service Module -PaddleOCR provides 3 kinds of service modules, install the required modules according to your needs. Such as: +PaddleOCR provides 3 kinds of service modules, install the required modules according to your needs. + +* On Linux platform, the examples are as follows. Install the detection service module: ```shell @@ -47,7 +51,22 @@ hub install deploy/hubserving/ocr_rec/ Or, install the 2-stage series service module: ```shell hub install deploy/hubserving/ocr_system/ +``` + +* On Windows platform, the examples are as follows. + +Install the detection service module: +```shell +hub install deploy\hubserving\ocr_det\ ``` +Or, install the recognition service module: +```shell +hub install deploy\hubserving\ocr_rec\ +``` +Or, install the 2-stage series service module: +```shell +hub install deploy\hubserving\ocr_system\ + ### 3. Start service #### Way 1. Start with command line parameters (CPU only) @@ -119,7 +138,7 @@ python tools/test_hubserving.py server_url image_path ``` Two parameters need to be passed to the script: -- **server_url**:service address,format of which is +- **server_url**:service address,format of which is `http://[ip_address]:[port]/predict/[module_name]` For example, if the detection, recognition and 2-stage serial services are started with provided configuration files, the respective `server_url` would be: `http://127.0.0.1:8866/predict/ocr_det` @@ -135,7 +154,7 @@ python tools/test_hubserving.py http://127.0.0.1:8868/predict/ocr_system ./doc/i ## Returned result format The returned result is a list. Each item in the list is a dict. The dict may contain three fields. The information is as follows: -|field name|data type|description| +|field name|data type|description| |-|-|-| |text|str|text content| |confidence|float|text recognition confidence| @@ -145,9 +164,9 @@ The fields returned by different modules are different. For example, the results |field name/module name|ocr_det|ocr_rec|ocr_system| |-|-|-|-| -|text||✔|✔| -|confidence||✔|✔| -|text_region|✔||✔| +|text||✔|✔| +|confidence||✔|✔| +|text_region|✔||✔| **Note:** If you need to add, delete or modify the returned fields, you can modify the file `module.py` of the corresponding module. For the complete process, refer to the user-defined modification service module in the next section. From f7224e46ac8c329a684120da0ad8f89866e8134a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=94=A1=E8=88=92=E8=B5=B7?= <867907127@qq.com> Date: Sat, 25 Jul 2020 20:31:50 +0800 Subject: [PATCH 053/101] fix a typo --- deploy/lite/readme_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/lite/readme_en.md b/deploy/lite/readme_en.md index 1efbba36..00bb5e58 100644 --- a/deploy/lite/readme_en.md +++ b/deploy/lite/readme_en.md @@ -3,7 +3,7 @@ This tutorial will introduce how to use paddle-lite to deploy paddleOCR ultra-lightweight Chinese and English detection models on mobile phones. -addle Lite is a lightweight inference engine for PaddlePaddle. +paddle-lite is a lightweight inference engine for PaddlePaddle. It provides efficient inference capabilities for mobile phones and IOTs, and extensively integrates cross-platform hardware to provide lightweight deployment solutions for end-side deployment issues. From b5f1f89abfb7a44ead75865fef5e41d2dc19a606 Mon Sep 17 00:00:00 2001 From: "shaohua.zhang" Date: Sun, 26 Jul 2020 10:24:57 +0800 Subject: [PATCH 054/101] put the shuffer into iter --- ppocr/data/det/dataset_traversal.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ppocr/data/det/dataset_traversal.py b/ppocr/data/det/dataset_traversal.py index 89c776d5..76e298c2 100644 --- a/ppocr/data/det/dataset_traversal.py +++ b/ppocr/data/det/dataset_traversal.py @@ -40,9 +40,9 @@ class TrainReader(object): with open(self.label_file_path, "rb") as fin: label_infor_list = fin.readlines() img_num = len(label_infor_list) - img_id_list = list(range(img_num)) - random.shuffle(img_id_list) + img_id_list = list(range(img_num)) if sys.platform == "win32": + random.shuffle(img_id_list) print("multiprocess is not fully compatible with Windows." "num_workers will be 1.") self.num_workers = 1 From 0aebfbc26f933643c9140e5b357998fe4f62b68b Mon Sep 17 00:00:00 2001 From: littletomatodonkey Date: Sun, 26 Jul 2020 11:23:47 +0000 Subject: [PATCH 055/101] fix save img for pred_det --- tools/infer/predict_det.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/infer/predict_det.py b/tools/infer/predict_det.py index 93a21c51..28515b78 100755 --- a/tools/infer/predict_det.py +++ b/tools/infer/predict_det.py @@ -135,6 +135,9 @@ if __name__ == "__main__": text_detector = TextDetector(args) count = 0 total_time = 0 + draw_img_save = "./inference_results" + if not os.path.exists(draw_img_save): + os.makedirs(draw_img_save) for image_file in image_file_list: img = cv2.imread(image_file) if img is None: @@ -147,6 +150,7 @@ if __name__ == "__main__": print("Predict time of %s:" % image_file, elapse) src_im = utility.draw_text_det_res(dt_boxes, image_file) img_name_pure = image_file.split("/")[-1] - cv2.imwrite("./inference_results/det_res_%s" % img_name_pure, src_im) + cv2.imwrite( + os.path.join(draw_img_save, "det_res_%s" % img_name_pure), src_im) if count > 1: print("Avg Time:", total_time / (count - 1)) From b736ab897c2b6d11ccceb6e6b9d170ea0dcb18b3 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Mon, 27 Jul 2020 10:56:56 +0800 Subject: [PATCH 056/101] Update serving_en.md --- doc/doc_en/serving_en.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/doc/doc_en/serving_en.md b/doc/doc_en/serving_en.md index d4c235d2..ce863f5b 100644 --- a/doc/doc_en/serving_en.md +++ b/doc/doc_en/serving_en.md @@ -40,33 +40,32 @@ PaddleOCR provides 3 kinds of service modules, install the required modules acco * On Linux platform, the examples are as follows. -Install the detection service module: +Install the detection service module: ```shell hub install deploy/hubserving/ocr_det/ -``` -Or, install the recognition service module: +``` +Or, install the recognition service module: ```shell hub install deploy/hubserving/ocr_rec/ -``` -Or, install the 2-stage series service module: +``` +Or, install the 2-stage series service module: ```shell hub install deploy/hubserving/ocr_system/ ``` - * On Windows platform, the examples are as follows. -Install the detection service module: +Install the detection service module: ```shell hub install deploy\hubserving\ocr_det\ ``` -Or, install the recognition service module: +Or, install the recognition service module: ```shell hub install deploy\hubserving\ocr_rec\ ``` -Or, install the 2-stage series service module: +Or, install the 2-stage series service module: ```shell hub install deploy\hubserving\ocr_system\ - +``` ### 3. Start service #### Way 1. Start with command line parameters (CPU only) From ab662a16d96995221dc628c08ddc956f44e6aad5 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Mon, 27 Jul 2020 10:59:18 +0800 Subject: [PATCH 057/101] Update serving_en.md --- doc/doc_en/serving_en.md | 27 +++++++++++---------------- 1 file changed, 11 insertions(+), 16 deletions(-) diff --git a/doc/doc_en/serving_en.md b/doc/doc_en/serving_en.md index ce863f5b..471269a2 100644 --- a/doc/doc_en/serving_en.md +++ b/doc/doc_en/serving_en.md @@ -39,31 +39,26 @@ SET PYTHONPATH=. PaddleOCR provides 3 kinds of service modules, install the required modules according to your needs. * On Linux platform, the examples are as follows. - -Install the detection service module: ```shell +# Install the detection service module: hub install deploy/hubserving/ocr_det/ -``` -Or, install the recognition service module: -```shell + +# Or, install the recognition service module: hub install deploy/hubserving/ocr_rec/ -``` -Or, install the 2-stage series service module: -```shell + +#Or, install the 2-stage series service module: hub install deploy/hubserving/ocr_system/ ``` -* On Windows platform, the examples are as follows. -Install the detection service module: +* On Windows platform, the examples are as follows. ```shell +# Install the detection service module: hub install deploy\hubserving\ocr_det\ -``` -Or, install the recognition service module: -```shell + +# Or, install the recognition service module: hub install deploy\hubserving\ocr_rec\ -``` -Or, install the 2-stage series service module: -```shell + +# Or, install the 2-stage series service module: hub install deploy\hubserving\ocr_system\ ``` From cdeef19e765062b78251c52cb26c887940021c96 Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Mon, 27 Jul 2020 10:59:57 +0800 Subject: [PATCH 058/101] Update serving_en.md --- doc/doc_en/serving_en.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/doc_en/serving_en.md b/doc/doc_en/serving_en.md index 471269a2..7439cc84 100644 --- a/doc/doc_en/serving_en.md +++ b/doc/doc_en/serving_en.md @@ -46,7 +46,7 @@ hub install deploy/hubserving/ocr_det/ # Or, install the recognition service module: hub install deploy/hubserving/ocr_rec/ -#Or, install the 2-stage series service module: +# Or, install the 2-stage series service module: hub install deploy/hubserving/ocr_system/ ``` From c1ba964326cfbc6404d43b8d43fed61ca5f00c1e Mon Sep 17 00:00:00 2001 From: MissPenguin Date: Mon, 27 Jul 2020 11:03:08 +0800 Subject: [PATCH 059/101] Update serving.md --- doc/doc_ch/serving.md | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/doc/doc_ch/serving.md b/doc/doc_ch/serving.md index d4c5d8c1..89274567 100644 --- a/doc/doc_ch/serving.md +++ b/doc/doc_ch/serving.md @@ -38,27 +38,28 @@ SET PYTHONPATH=. PaddleOCR提供3种服务模块,根据需要安装所需模块。 * 在Linux环境下,安装示例如下: +```shell +# 安装检测服务模块: +hub install deploy/hubserving/ocr_det/ -安装检测服务模块: -```hub install deploy/hubserving/ocr_det/``` +# 或,安装识别服务模块: +hub install deploy/hubserving/ocr_rec/ -或,安装识别服务模块: -```hub install deploy/hubserving/ocr_rec/``` - -或,安装检测+识别串联服务模块: -```hub install deploy/hubserving/ocr_system/``` +# 或,安装检测+识别串联服务模块: +hub install deploy/hubserving/ocr_system/ +``` * 在Windows环境下(文件夹的分隔符为`\`),安装示例如下: +```shell +# 安装检测服务模块: +hub install deploy\hubserving\ocr_det\ -安装检测服务模块: -```hub install deploy\hubserving\ocr_det\``` - -或,安装识别服务模块: -```hub install deploy\hubserving\ocr_rec\``` - -或,安装检测+识别串联服务模块: -```hub install deploy\hubserving\ocr_system\``` +# 或,安装识别服务模块: +hub install deploy\hubserving\ocr_rec\ +# 或,安装检测+识别串联服务模块: +hub install deploy\hubserving\ocr_system\ +``` ### 3. 启动服务 #### 方式1. 命令行命令启动(仅支持CPU) From c3c417f579d417b8fd68f6364d41383c506d543f Mon Sep 17 00:00:00 2001 From: authorfu Date: Mon, 27 Jul 2020 11:11:50 +0800 Subject: [PATCH 060/101] =?UTF-8?q?1.=20=E6=B7=BB=E5=8A=A0mini=20demo=202.?= =?UTF-8?q?=20ui=E5=8D=87=E7=BA=A7=E5=88=B0androidx?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/android_demo/app/build.gradle | 11 +- .../app/src/main/AndroidManifest.xml | 4 +- .../demo/ocr/AppCompatPreferenceActivity.java | 11 +- .../paddle/lite/demo/ocr/MainActivity.java | 11 +- .../paddle/lite/demo/ocr/MiniActivity.java | 156 ++++++++++++++++++ .../baidu/paddle/lite/demo/ocr/Predictor.java | 20 ++- .../lite/demo/ocr/SettingsActivity.java | 3 +- .../app/src/main/res/layout/activity_main.xml | 4 +- .../app/src/main/res/layout/activity_mini.xml | 46 ++++++ 9 files changed, 238 insertions(+), 28 deletions(-) create mode 100644 deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java create mode 100644 deploy/android_demo/app/src/main/res/layout/activity_mini.xml diff --git a/deploy/android_demo/app/build.gradle b/deploy/android_demo/app/build.gradle index adf3968b..5ecb1169 100644 --- a/deploy/android_demo/app/build.gradle +++ b/deploy/android_demo/app/build.gradle @@ -3,11 +3,11 @@ import java.security.MessageDigest apply plugin: 'com.android.application' android { - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { applicationId "com.baidu.paddle.lite.demo.ocr" - minSdkVersion 15 - targetSdkVersion 28 + minSdkVersion 23 + targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" @@ -39,9 +39,8 @@ android { dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation 'com.android.support:appcompat-v7:28.0.0' - implementation 'com.android.support.constraint:constraint-layout:1.1.3' - implementation 'com.android.support:design:28.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' diff --git a/deploy/android_demo/app/src/main/AndroidManifest.xml b/deploy/android_demo/app/src/main/AndroidManifest.xml index b7c1d8b5..54482b1d 100644 --- a/deploy/android_demo/app/src/main/AndroidManifest.xml +++ b/deploy/android_demo/app/src/main/AndroidManifest.xml @@ -14,10 +14,10 @@ android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> + - @@ -26,7 +26,7 @@ android:label="Settings"> diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java index 397e4e39..49af0afe 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/AppCompatPreferenceActivity.java @@ -19,15 +19,16 @@ package com.baidu.paddle.lite.demo.ocr; import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceActivity; -import android.support.annotation.LayoutRes; -import android.support.annotation.Nullable; -import android.support.v7.app.ActionBar; -import android.support.v7.app.AppCompatDelegate; -import android.support.v7.widget.Toolbar; import android.view.MenuInflater; import android.view.View; import android.view.ViewGroup; +import androidx.annotation.LayoutRes; +import androidx.annotation.Nullable; +import androidx.appcompat.app.ActionBar; +import androidx.appcompat.app.AppCompatDelegate; +import androidx.appcompat.widget.Toolbar; + /** * A {@link PreferenceActivity} which implements and proxies the necessary calls * to be used with AppCompat. diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java index 716e7bdd..afb261dc 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MainActivity.java @@ -19,11 +19,6 @@ import android.os.HandlerThread; import android.os.Message; import android.preference.PreferenceManager; import android.provider.MediaStore; -import android.support.annotation.NonNull; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; -import android.support.v4.content.FileProvider; -import android.support.v7.app.AppCompatActivity; import android.text.method.ScrollingMovementMethod; import android.util.Log; import android.view.Menu; @@ -33,6 +28,12 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.app.ActivityCompat; +import androidx.core.content.ContextCompat; +import androidx.core.content.FileProvider; + import java.io.File; import java.io.IOException; import java.io.InputStream; diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java new file mode 100644 index 00000000..b40cd5f0 --- /dev/null +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/MiniActivity.java @@ -0,0 +1,156 @@ +package com.baidu.paddle.lite.demo.ocr; + +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.os.Bundle; +import android.os.Handler; +import android.os.HandlerThread; +import android.os.Message; +import android.util.Log; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.appcompat.app.AppCompatActivity; + +import java.io.IOException; +import java.io.InputStream; + +public class MiniActivity extends AppCompatActivity { + + + public static final int REQUEST_LOAD_MODEL = 0; + public static final int REQUEST_RUN_MODEL = 1; + public static final int REQUEST_UNLOAD_MODEL = 2; + public static final int RESPONSE_LOAD_MODEL_SUCCESSED = 0; + public static final int RESPONSE_LOAD_MODEL_FAILED = 1; + public static final int RESPONSE_RUN_MODEL_SUCCESSED = 2; + public static final int RESPONSE_RUN_MODEL_FAILED = 3; + + private static final String TAG = "MiniActivity"; + + protected Handler receiver = null; // Receive messages from worker thread + protected Handler sender = null; // Send command to worker thread + protected HandlerThread worker = null; // Worker thread to load&run model + protected volatile Predictor predictor = null; + + private String assetModelDirPath = "models/ocr_v1_for_cpu"; + private String assetlabelFilePath = "labels/ppocr_keys_v1.txt"; + + private Button button; + private ImageView imageView; // 显示图像 + private TextView textView; // 显示结果 + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_mini); + + Log.i(TAG, "SHOW in Logcat"); + + // Prepare the worker thread for mode loading and inference + worker = new HandlerThread("Predictor Worker"); + worker.start(); + sender = new Handler(worker.getLooper()) { + public void handleMessage(Message msg) { + switch (msg.what) { + case REQUEST_LOAD_MODEL: + // Load model and reload test image + if (!onLoadModel()) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(MiniActivity.this, "Load model failed!", Toast.LENGTH_SHORT).show(); + } + }); + } + break; + case REQUEST_RUN_MODEL: + // Run model if model is loaded + final boolean isSuccessed = onRunModel(); + runOnUiThread(new Runnable() { + @Override + public void run() { + if (isSuccessed){ + onRunModelSuccessed(); + }else{ + Toast.makeText(MiniActivity.this, "Run model failed!", Toast.LENGTH_SHORT).show(); + } + } + }); + break; + } + } + }; + sender.sendEmptyMessage(REQUEST_LOAD_MODEL); // 对应上面的REQUEST_LOAD_MODEL, 调用onLoadModel() + + imageView = findViewById(R.id.imageView); + textView = findViewById(R.id.sample_text); + button = findViewById(R.id.button); + button.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + sender.sendEmptyMessage(REQUEST_RUN_MODEL); + } + }); + + + } + + @Override + protected void onDestroy() { + onUnloadModel(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + worker.quitSafely(); + } else { + worker.quit(); + } + super.onDestroy(); + } + + /** + * onCreate的时候调用, 模型初始化 + * + * @return + */ + private boolean onLoadModel() { + if (predictor == null) { + predictor = new Predictor(); + } + return predictor.init(this, assetModelDirPath, assetlabelFilePath); + } + + /** + * on + * + * @return + */ + private boolean onRunModel() { + try { + String assetImagePath = "images/5.jpg"; + InputStream imageStream = getAssets().open(assetImagePath); + Bitmap image = BitmapFactory.decodeStream(imageStream); + // 这里输入是Bitmap + predictor.setInputImage(image); + return predictor.isLoaded() && predictor.runModel(); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + private void onRunModelSuccessed() { + Log.i(TAG, "onRunModelSuccessed"); + textView.setText(predictor.outputResult); + imageView.setImageBitmap(predictor.outputImage); + } + + private void onUnloadModel() { + if (predictor != null) { + predictor.releaseModel(); + } + } +} diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java index 7543acee..0eedf3dc 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/Predictor.java @@ -38,7 +38,7 @@ public class Predictor { protected float scoreThreshold = 0.1f; protected Bitmap inputImage = null; protected Bitmap outputImage = null; - protected String outputResult = ""; + protected volatile String outputResult = ""; protected float preprocessTime = 0; protected float postprocessTime = 0; @@ -46,6 +46,16 @@ public class Predictor { public Predictor() { } + public boolean init(Context appCtx, String modelPath, String labelPath) { + isLoaded = loadModel(appCtx, modelPath, cpuThreadNum, cpuPowerMode); + if (!isLoaded) { + return false; + } + isLoaded = loadLabel(appCtx, labelPath); + return isLoaded; + } + + public boolean init(Context appCtx, String modelPath, String labelPath, int cpuThreadNum, String cpuPowerMode, String inputColorFormat, long[] inputShape, float[] inputMean, @@ -76,11 +86,7 @@ public class Predictor { Log.e(TAG, "Only BGR color format is supported."); return false; } - isLoaded = loadModel(appCtx, modelPath, cpuThreadNum, cpuPowerMode); - if (!isLoaded) { - return false; - } - isLoaded = loadLabel(appCtx, labelPath); + boolean isLoaded = init(appCtx, modelPath, labelPath); if (!isLoaded) { return false; } @@ -317,7 +323,7 @@ public class Predictor { for (Point p : result.getPoints()) { sb.append("(").append(p.x).append(",").append(p.y).append(") "); } - Log.i(TAG, sb.toString()); + Log.i(TAG, sb.toString()); // 这里在logcat里打印结果 outputResultSb.append(i + 1).append(": ").append(result.getLabel()).append("\n"); } outputResult = outputResultSb.toString(); diff --git a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java index 28727e60..b3653ccc 100644 --- a/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java +++ b/deploy/android_demo/app/src/main/java/com/baidu/paddle/lite/demo/ocr/SettingsActivity.java @@ -5,7 +5,8 @@ import android.os.Bundle; import android.preference.CheckBoxPreference; import android.preference.EditTextPreference; import android.preference.ListPreference; -import android.support.v7.app.ActionBar; + +import androidx.appcompat.app.ActionBar; import java.util.ArrayList; import java.util.List; diff --git a/deploy/android_demo/app/src/main/res/layout/activity_main.xml b/deploy/android_demo/app/src/main/res/layout/activity_main.xml index 98b9bc1a..adc70e20 100644 --- a/deploy/android_demo/app/src/main/res/layout/activity_main.xml +++ b/deploy/android_demo/app/src/main/res/layout/activity_main.xml @@ -1,5 +1,5 @@ - - \ No newline at end of file + \ No newline at end of file diff --git a/deploy/android_demo/app/src/main/res/layout/activity_mini.xml b/deploy/android_demo/app/src/main/res/layout/activity_mini.xml new file mode 100644 index 00000000..ec4622ae --- /dev/null +++ b/deploy/android_demo/app/src/main/res/layout/activity_mini.xml @@ -0,0 +1,46 @@ + + + + + + + + +