diff --git a/core/general-client/CMakeLists.txt b/core/general-client/CMakeLists.txt index d6079317a75d3f45b61920836e6695bd6b31d951..ddacb8d53d141e242fe6222a837ec8997608382b 100644 --- a/core/general-client/CMakeLists.txt +++ b/core/general-client/CMakeLists.txt @@ -1,5 +1,6 @@ if(CLIENT) add_subdirectory(pybind11) pybind11_add_module(serving_client src/general_model.cpp src/pybind_general_model.cpp) +add_dependencies(serving_client sdk_cpp) target_link_libraries(serving_client PRIVATE -Wl,--whole-archive utils sdk-cpp pybind python -Wl,--no-whole-archive -lpthread -lcrypto -lm -lrt -lssl -ldl -lz -Wl,-rpath,'$ORIGIN'/lib) endif() diff --git a/core/pdcodegen/CMakeLists.txt b/core/pdcodegen/CMakeLists.txt index c47e668f595fbfe26b08c163bb7f78dacebbbf4e..c74273f024359ec50854cddf32ce6d8b7922437b 100644 --- a/core/pdcodegen/CMakeLists.txt +++ b/core/pdcodegen/CMakeLists.txt @@ -7,7 +7,7 @@ PROTOBUF_GENERATE_CPP(pdcodegen_proto_srcs pdcodegen_proto_hdrs LIST(APPEND pdcodegen_srcs ${pdcodegen_proto_srcs}) add_executable(pdcodegen ${pdcodegen_srcs}) -add_dependencies(pdcodegen boost) +add_dependencies(pdcodegen boost protobuf) target_link_libraries(pdcodegen protobuf ${PROTOBUF_PROTOC_LIBRARY}) # install diff --git a/core/sdk-cpp/CMakeLists.txt b/core/sdk-cpp/CMakeLists.txt index 35312b572bace8138b50b4f7349e20cb141980d0..f2e44ec3e3aed32f5d4fb52cb44511f6343968c4 100644 --- a/core/sdk-cpp/CMakeLists.txt +++ b/core/sdk-cpp/CMakeLists.txt @@ -2,7 +2,7 @@ include(src/CMakeLists.txt) include(proto/CMakeLists.txt) add_library(sdk-cpp ${sdk_cpp_srcs}) -add_dependencies(sdk-cpp pdcodegen configure) +add_dependencies(sdk-cpp pdcodegen configure protobuf brpc leveldb) target_link_libraries(sdk-cpp brpc configure protobuf leveldb) # install diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt index d17844991ea342e142476acececb14ac2e6ae106..a44027d90228f69b6d3f2f80995bd4609b8b64b8 100644 --- a/python/CMakeLists.txt +++ b/python/CMakeLists.txt @@ -86,7 +86,7 @@ if (SERVER) elseif(CUDA_VERSION EQUAL 10.2) set(SUFFIX 102) elseif(CUDA_VERSION EQUAL 11.0) - set(SUFFIX 110) + set(SUFFIX 11) endif() add_custom_command( diff --git a/python/examples/detection/README.md b/python/examples/detection/README.md new file mode 100644 index 0000000000000000000000000000000000000000..6d136e0bf02140b5642faac97a8cd9db96598445 --- /dev/null +++ b/python/examples/detection/README.md @@ -0,0 +1,19 @@ +# Serve models from Paddle Detection + +(English|[简体中文](./README_CN.md)) + +### Introduction + +PaddleDetection flying paddle target detection development kit is designed to help developers complete the whole development process of detection model formation, training, optimization and deployment faster and better. For details, see [Github](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph) + +This article mainly introduces the deployment of Paddle Detection's dynamic graph model on Serving. + +Paddle Detection provides a large number of [Model Zoo](https://github.com/PaddlePaddle/PaddleDetection/blob/master/dygraph/docs/MODEL_ZOO_cn.md), these model libraries can be used in Paddle Serving with export tools Model. For the export tutorial, please refer to [Paddle Detection Export Model Tutorial (Simplified Chinese)](https://github.com/PaddlePaddle/PaddleDetection/blob/master/dygraph/deploy/EXPORT_MODEL.md). + +### Serving example +Several examples of PaddleDetection models used in Serving are given in this folder + +-[Faster RCNN](./faster_rcnn_r50_fpn_1x_coco) +-[PPYOLO](./ppyolo_r50vd_dcn_1x_coco) +-[TTFNet](./ttfnet_darknet53_1x_coco) +-[YOLOv3](./yolov3_darknet53_270e_coco) diff --git a/python/examples/detection/README_CN.md b/python/examples/detection/README_CN.md new file mode 100644 index 0000000000000000000000000000000000000000..a04fe40ab3e116375a04f84132dd0a0a35eb2ef7 --- /dev/null +++ b/python/examples/detection/README_CN.md @@ -0,0 +1,22 @@ +## 使用Paddle Detection模型 + +([English](./README.md)|简体中文) + +### 简介 + +PaddleDetection飞桨目标检测开发套件,旨在帮助开发者更快更好地完成检测模型的组建、训练、优化及部署等全开发流程。详情参见[Github](https://github.com/PaddlePaddle/PaddleDetection/tree/master/dygraph) + +本文主要是介绍Paddle Detection的动态图模型在Serving上的部署。 + +### 导出模型 + +Paddle Detection提供了大量的[模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/master/dygraph/docs/MODEL_ZOO_cn.md), 这些模型库配合导出工具都可以得到可以用于Paddle Serving的模型。导出教程参见[Paddle Detection模型导出教程](https://github.com/PaddlePaddle/PaddleDetection/blob/master/dygraph/deploy/EXPORT_MODEL.md)。 + +### Serving示例 +本文件夹下给出了多个PaddleDetection模型用于Serving的范例 + +- [Faster RCNN](./faster_rcnn_r50_fpn_1x_coco) +- [PPYOLO](./ppyolo_r50vd_dcn_1x_coco) +- [TTFNet](./ttfnet_darknet53_1x_coco) +- [YOLOv3](./yolov3_darknet53_270e_coco) + diff --git a/python/examples/faster_rcnn/000000570688.jpg b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/000000570688.jpg similarity index 100% rename from python/examples/faster_rcnn/000000570688.jpg rename to python/examples/detection/faster_rcnn_r50_fpn_1x_coco/000000570688.jpg diff --git a/python/examples/faster_rcnn/README.md b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/README.md similarity index 54% rename from python/examples/faster_rcnn/README.md rename to python/examples/detection/faster_rcnn_r50_fpn_1x_coco/README.md index e31f734e2b8f04ee4cd35258f9da81672b2caf88..7dd05f2ed6cf7e222a44dada8f1c9fc6b769198d 100644 --- a/python/examples/faster_rcnn/README.md +++ b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/README.md @@ -4,21 +4,18 @@ ### Get The Faster RCNN Model ``` -wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/faster_rcnn_model.tar.gz -wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/infer_cfg.yml +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/faster_rcnn_r50_fpn_1x_coco.tar ``` -If you want to have more detection models, please refer to [Paddle Detection Model Zoo](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/MODEL_ZOO_cn.md) ### Start the service ``` -tar xf faster_rcnn_model.tar.gz -mv faster_rcnn_model/pddet* . -GLOG_v=2 python -m paddle_serving_server_gpu.serve --model pddet_serving_model --port 9494 --gpu_ids 0 +tar xf faster_rcnn_r50_fpn_1x_coco.tar +python -m paddle_serving_server_gpu.serve --model serving_server --port 9494 --gpu_ids 0 ``` ### Perform prediction ``` -python test_client.py pddet_client_conf/serving_client_conf.prototxt infer_cfg.yml 000000570688.jpg +python test_client.py 000000570688.jpg ``` ## 3. Result analysis diff --git a/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/README_CN.md b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/README_CN.md new file mode 100644 index 0000000000000000000000000000000000000000..8e3d387d4a2918104c24f8e71048e59d1b51e6c2 --- /dev/null +++ b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/README_CN.md @@ -0,0 +1,35 @@ +# 使用Paddle Serving部署Faster RCNN模型 + +(简体中文|[English](./README.md)) + +## 获得Faster RCNN模型 +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/faster_rcnn_r50_fpn_1x_coco.tar +``` + + +### 启动服务 +``` +tar xf faster_rcnn_r50_fpn_1x_coco.tar +python -m paddle_serving_server_gpu.serve --model pddet_serving_model --port 9494 --gpu_ids 0 +``` + +### 执行预测 +``` +python test_client.py 000000570688.jpg +``` + +## 3. 结果分析 +
+
+
+
+
+这是输入图片 + +
+
+
+
+
+这是实现添加了bbox之后的图片,可以看到客户端已经为图片做好了后处理,此外在output/bbox.json也有各个框的编号和坐标信息。 diff --git a/python/examples/faster_rcnn/label_list.txt b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/label_list.txt similarity index 98% rename from python/examples/faster_rcnn/label_list.txt rename to python/examples/detection/faster_rcnn_r50_fpn_1x_coco/label_list.txt index d7d43a94adf73208f997f0efd6581bef11ca734e..941cb4e1392266f6a6c09b1fdc5f79503b2e5df6 100644 --- a/python/examples/faster_rcnn/label_list.txt +++ b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/label_list.txt @@ -1,4 +1,3 @@ -background person bicycle car diff --git a/python/examples/faster_rcnn/test_client.py b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/test_client.py similarity index 77% rename from python/examples/faster_rcnn/test_client.py rename to python/examples/detection/faster_rcnn_r50_fpn_1x_coco/test_client.py index 98a1c8f4df087a71891d2a3c89e8fca64f701854..a81f53dced2076615e14d05c844a91e40da19321 100755 --- a/python/examples/faster_rcnn/test_client.py +++ b/python/examples/detection/faster_rcnn_r50_fpn_1x_coco/test_client.py @@ -26,17 +26,18 @@ preprocess = Sequential([ postprocess = RCNNPostprocess("label_list.txt", "output") client = Client() -client.load_client_config(sys.argv[1]) +client.load_client_config("serving_client/serving_client_conf.prototxt") client.connect(['127.0.0.1:9494']) -im = preprocess(sys.argv[3]) +im = preprocess(sys.argv[1]) fetch_map = client.predict( feed={ "image": im, - "im_info": np.array(list(im.shape[1:]) + [1.0]), - "im_shape": np.array(list(im.shape[1:]) + [1.0]) + "im_shape": np.array(list(im.shape[1:])).reshape(-1), + "scale_factor": np.array([1.0, 1.0]).reshape(-1), }, - fetch=["multiclass_nms"], + fetch=["save_infer_model/scale_0.tmp_1"], batch=False) -fetch_map["image"] = sys.argv[3] +print(fetch_map) +fetch_map["image"] = sys.argv[1] postprocess(fetch_map) diff --git a/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/000000570688.jpg b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/000000570688.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb304bd56c4010c08611a30dcca58ea9140cea54 Binary files /dev/null and b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/000000570688.jpg differ diff --git a/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/README.md b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/README.md new file mode 100644 index 0000000000000000000000000000000000000000..7bad9c1e7a2decedcf736f73e5692ade7c1ae7d6 --- /dev/null +++ b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/README.md @@ -0,0 +1,20 @@ +# PP-YOLO model on Paddle Serving + +([简体中文](./README_CN.md)|English) + +### Get The Model +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/ppyolo_r50vd_dcn_1x_coco.tar +``` + +### Start the service +``` +tar xf ppyolo_r50vd_dcn_1x_coco.tar +python -m paddle_serving_server_gpu.serve --model serving_server --port 9494 --gpu_ids 0 +``` + +### Perform prediction +``` +python test_client.py 000000570688.jpg +``` + diff --git a/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/README_CN.md b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/README_CN.md new file mode 100644 index 0000000000000000000000000000000000000000..2b8c1c63844c703679c480953494c917a78b829c --- /dev/null +++ b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/README_CN.md @@ -0,0 +1,21 @@ +# 使用Paddle Serving部署PP-YOLO模型 + +(简体中文|[English](./README.md)) + +## 获得模型 +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/ppyolo_r50vd_dcn_1x_coco.tar +``` + + +### 启动服务 +``` +tar xf ppyolo_r50vd_dcn_1x_coco.tar +python -m paddle_serving_server_gpu.serve --model pddet_serving_model --port 9494 --gpu_ids 0 +``` + +### 执行预测 +``` +python test_client.py 000000570688.jpg +``` + diff --git a/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/label_list.txt b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/label_list.txt new file mode 100644 index 0000000000000000000000000000000000000000..941cb4e1392266f6a6c09b1fdc5f79503b2e5df6 --- /dev/null +++ b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/label_list.txt @@ -0,0 +1,80 @@ +person +bicycle +car +motorcycle +airplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +couch +potted plant +bed +dining table +toilet +tv +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/test_client.py b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/test_client.py new file mode 100755 index 0000000000000000000000000000000000000000..dc3b2b77dc07822a3d69a85a7c38690c58a442c2 --- /dev/null +++ b/python/examples/detection/ppyolo_r50vd_dcn_1x_coco/test_client.py @@ -0,0 +1,43 @@ +# 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 * +import sys +import numpy as np + +preprocess = Sequential([ + File2Image(), BGR2RGB(), Div(255.0), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], False), + Resize((608, 608)), Transpose((2, 0, 1)) +]) + +postprocess = RCNNPostprocess("label_list.txt", "output") +client = Client() + +client.load_client_config("serving_client/serving_client_conf.prototxt") +client.connect(['127.0.0.1:9494']) + +im = preprocess(sys.argv[1]) +fetch_map = client.predict( + feed={ + "image": im, + "im_shape": np.array(list(im.shape[1:])).reshape(-1), + "scale_factor": np.array([1.0, 1.0]).reshape(-1), + }, + fetch=["save_infer_model/scale_0.tmp_1"], + batch=False) +print(fetch_map) +fetch_map["image"] = sys.argv[1] +postprocess(fetch_map) diff --git a/python/examples/detection/ttfnet_darknet53_1x_coco/000000570688.jpg b/python/examples/detection/ttfnet_darknet53_1x_coco/000000570688.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb304bd56c4010c08611a30dcca58ea9140cea54 Binary files /dev/null and b/python/examples/detection/ttfnet_darknet53_1x_coco/000000570688.jpg differ diff --git a/python/examples/detection/ttfnet_darknet53_1x_coco/README.md b/python/examples/detection/ttfnet_darknet53_1x_coco/README.md new file mode 100644 index 0000000000000000000000000000000000000000..530c6e445b4deffdd28c791c4f0bac6f3479a9ef --- /dev/null +++ b/python/examples/detection/ttfnet_darknet53_1x_coco/README.md @@ -0,0 +1,20 @@ +# TTF-Net model on Paddle Serving + +([简体中文](./README_CN.md)|English) + +### Get Model +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/ttfnet_darknet53_1x_coco.tar +``` + +### Start the service +``` +tar xf ttfnet_darknet53_1x_coco.tar +python -m paddle_serving_server_gpu.serve --model serving_server --port 9494 --gpu_ids 0 +``` + +### Perform prediction +``` +python test_client.py 000000570688.jpg +``` + diff --git a/python/examples/detection/ttfnet_darknet53_1x_coco/README_CN.md b/python/examples/detection/ttfnet_darknet53_1x_coco/README_CN.md new file mode 100644 index 0000000000000000000000000000000000000000..28cf7cf6ab04882a67480404216ce29e3983a185 --- /dev/null +++ b/python/examples/detection/ttfnet_darknet53_1x_coco/README_CN.md @@ -0,0 +1,21 @@ +# 使用Paddle Serving部署TTF-Net模型 + +(简体中文|[English](./README.md)) + +## 获得模型 +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/ttfnet_darknet53_1x_coco.tar +``` + + +### 启动服务 +``` +tar xf ttfnet_darknet53_1x_coco.tar +python -m paddle_serving_server_gpu.serve --model pddet_serving_model --port 9494 --gpu_ids 0 +``` + +### 执行预测 +``` +python test_client.py 000000570688.jpg +``` + diff --git a/python/examples/detection/ttfnet_darknet53_1x_coco/label_list.txt b/python/examples/detection/ttfnet_darknet53_1x_coco/label_list.txt new file mode 100644 index 0000000000000000000000000000000000000000..941cb4e1392266f6a6c09b1fdc5f79503b2e5df6 --- /dev/null +++ b/python/examples/detection/ttfnet_darknet53_1x_coco/label_list.txt @@ -0,0 +1,80 @@ +person +bicycle +car +motorcycle +airplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +couch +potted plant +bed +dining table +toilet +tv +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/python/examples/detection/ttfnet_darknet53_1x_coco/test_client.py b/python/examples/detection/ttfnet_darknet53_1x_coco/test_client.py new file mode 100755 index 0000000000000000000000000000000000000000..59024d010a27c1569b5a07afd4508ad19894d89e --- /dev/null +++ b/python/examples/detection/ttfnet_darknet53_1x_coco/test_client.py @@ -0,0 +1,40 @@ +# 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 * +import sys +import numpy as np + +preprocess = Sequential([ + File2Image(), BGR2RGB(), + Normalize([123.675, 116.28, 103.53], [58.395, 57.12, 57.375], False), + Resize((512, 512)), Transpose((2, 0, 1)) +]) + +postprocess = RCNNPostprocess("label_list.txt", "output") +client = Client() + +client.load_client_config("serving_client/serving_client_conf.prototxt") +client.connect(['127.0.0.1:9494']) + +im = preprocess(sys.argv[1]) +fetch_map = client.predict( + feed={ + "image": im, + "scale_factor": np.array([1.0, 1.0]).reshape(-1), + }, + fetch=["save_infer_model/scale_0.tmp_1"], + batch=False) +print(fetch_map) diff --git a/python/examples/detection/yolov3_darknet53_270e_coco/000000570688.jpg b/python/examples/detection/yolov3_darknet53_270e_coco/000000570688.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cb304bd56c4010c08611a30dcca58ea9140cea54 Binary files /dev/null and b/python/examples/detection/yolov3_darknet53_270e_coco/000000570688.jpg differ diff --git a/python/examples/detection/yolov3_darknet53_270e_coco/README.md b/python/examples/detection/yolov3_darknet53_270e_coco/README.md new file mode 100644 index 0000000000000000000000000000000000000000..c3d7638d12b7c1fd4c0da246acea70b4a816e366 --- /dev/null +++ b/python/examples/detection/yolov3_darknet53_270e_coco/README.md @@ -0,0 +1,20 @@ +# YOLOv3 model on Paddle Serving + +([简体中文](./README_CN.md)|English) + +### Get Model +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/yolov3_darknet53_270e_coco.tar +``` + +### Start the service +``` +tar xf yolov3_darknet53_270e_coco.tar +python -m paddle_serving_server_gpu.serve --model serving_server --port 9494 --gpu_ids 0 +``` + +### Perform prediction +``` +python test_client.py 000000570688.jpg +``` + diff --git a/python/examples/detection/yolov3_darknet53_270e_coco/README_CN.md b/python/examples/detection/yolov3_darknet53_270e_coco/README_CN.md new file mode 100644 index 0000000000000000000000000000000000000000..1f80df8f77f301c74e08088be3bdaa5fd8c4c75a --- /dev/null +++ b/python/examples/detection/yolov3_darknet53_270e_coco/README_CN.md @@ -0,0 +1,21 @@ +# 使用Paddle Serving部署YOLOv3模型 + +(简体中文|[English](./README.md)) + +## 获得模型 +``` +wget --no-check-certificate https://paddle-serving.bj.bcebos.com/pddet_demo/2.0/yolov3_darknet53_270e_coco.tar +``` + + +### 启动服务 +``` +tar xf yolov3_darknet53_270e_coco.tar +python -m paddle_serving_server_gpu.serve --model pddet_serving_model --port 9494 --gpu_ids 0 +``` + +### 执行预测 +``` +python test_client.py 000000570688.jpg +``` + diff --git a/python/examples/detection/yolov3_darknet53_270e_coco/label_list.txt b/python/examples/detection/yolov3_darknet53_270e_coco/label_list.txt new file mode 100644 index 0000000000000000000000000000000000000000..941cb4e1392266f6a6c09b1fdc5f79503b2e5df6 --- /dev/null +++ b/python/examples/detection/yolov3_darknet53_270e_coco/label_list.txt @@ -0,0 +1,80 @@ +person +bicycle +car +motorcycle +airplane +bus +train +truck +boat +traffic light +fire hydrant +stop sign +parking meter +bench +bird +cat +dog +horse +sheep +cow +elephant +bear +zebra +giraffe +backpack +umbrella +handbag +tie +suitcase +frisbee +skis +snowboard +sports ball +kite +baseball bat +baseball glove +skateboard +surfboard +tennis racket +bottle +wine glass +cup +fork +knife +spoon +bowl +banana +apple +sandwich +orange +broccoli +carrot +hot dog +pizza +donut +cake +chair +couch +potted plant +bed +dining table +toilet +tv +laptop +mouse +remote +keyboard +cell phone +microwave +oven +toaster +sink +refrigerator +book +clock +vase +scissors +teddy bear +hair drier +toothbrush diff --git a/python/examples/detection/yolov3_darknet53_270e_coco/test_client.py b/python/examples/detection/yolov3_darknet53_270e_coco/test_client.py new file mode 100644 index 0000000000000000000000000000000000000000..dc3b2b77dc07822a3d69a85a7c38690c58a442c2 --- /dev/null +++ b/python/examples/detection/yolov3_darknet53_270e_coco/test_client.py @@ -0,0 +1,43 @@ +# 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 * +import sys +import numpy as np + +preprocess = Sequential([ + File2Image(), BGR2RGB(), Div(255.0), + Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], False), + Resize((608, 608)), Transpose((2, 0, 1)) +]) + +postprocess = RCNNPostprocess("label_list.txt", "output") +client = Client() + +client.load_client_config("serving_client/serving_client_conf.prototxt") +client.connect(['127.0.0.1:9494']) + +im = preprocess(sys.argv[1]) +fetch_map = client.predict( + feed={ + "image": im, + "im_shape": np.array(list(im.shape[1:])).reshape(-1), + "scale_factor": np.array([1.0, 1.0]).reshape(-1), + }, + fetch=["save_infer_model/scale_0.tmp_1"], + batch=False) +print(fetch_map) +fetch_map["image"] = sys.argv[1] +postprocess(fetch_map) diff --git a/python/examples/faster_rcnn/000000570688_bbox.jpg b/python/examples/faster_rcnn/000000570688_bbox.jpg deleted file mode 100644 index 39d0230108e238b0dd9624a838c01bf9e6abcd7d..0000000000000000000000000000000000000000 Binary files a/python/examples/faster_rcnn/000000570688_bbox.jpg and /dev/null differ diff --git a/python/examples/faster_rcnn/README_CN.md b/python/examples/faster_rcnn/README_CN.md deleted file mode 100644 index 3ddccf9e63043e797c9e261c1f26ebe774adb81c..0000000000000000000000000000000000000000 --- a/python/examples/faster_rcnn/README_CN.md +++ /dev/null @@ -1,37 +0,0 @@ -# 使用Paddle Serving部署Faster RCNN模型 - -(简体中文|[English](./README.md)) - -## 获得Faster RCNN模型 -``` -wget https://paddle-serving.bj.bcebos.com/pddet_demo/faster_rcnn_model.tar.gz -wget https://paddle-serving.bj.bcebos.com/pddet_demo/infer_cfg.yml -``` -如果你想要更多的检测模型,请参考[Paddle检测模型库](https://github.com/PaddlePaddle/PaddleDetection/blob/release/0.2/docs/MODEL_ZOO_cn.md) - -### 启动服务 -``` -tar xf faster_rcnn_model.tar.gz -mv faster_rcnn_model/pddet* ./ -GLOG_v=2 python -m paddle_serving_server_gpu.serve --model pddet_serving_model --port 9494 --gpu_ids 0 -``` - -### 执行预测 -``` -python test_client.py pddet_client_conf/serving_client_conf.prototxt infer_cfg.yml 000000570688.jpg -``` - -## 3. 结果分析 -
-
-
-
-
-这是输入图片 - -
-
-
-
-
-这是实现添加了bbox之后的图片,可以看到客户端已经为图片做好了后处理,此外在output/bbox.json也有各个框的编号和坐标信息。 diff --git a/python/examples/faster_rcnn/benchmark.py b/python/examples/faster_rcnn/benchmark.py deleted file mode 100755 index 543ef3352ea629f5209b7e5252276bda46a4b2ae..0000000000000000000000000000000000000000 --- a/python/examples/faster_rcnn/benchmark.py +++ /dev/null @@ -1,123 +0,0 @@ -# -*- coding: utf-8 -*- -# -# 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. -# pylint: disable=doc-string-missing - -from __future__ import unicode_literals, absolute_import -import os -import sys -import time -import json -import requests -from paddle_serving_client import Client -from paddle_serving_client.utils import MultiThreadRunner -from paddle_serving_client.utils import benchmark_args, show_latency -from paddle_serving_app.reader import ChineseBertReader - -from paddle_serving_app.reader import * -import numpy as np - -args = benchmark_args() - - -def single_func(idx, resource): - img = "./000000570688.jpg" - profile_flags = False - latency_flags = False - if os.getenv("FLAGS_profile_client"): - profile_flags = True - if os.getenv("FLAGS_serving_latency"): - latency_flags = True - latency_list = [] - - if args.request == "rpc": - preprocess = Sequential([ - File2Image(), BGR2RGB(), Div(255.0), - Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225], False), - Resize(640, 640), Transpose((2, 0, 1)) - ]) - - postprocess = RCNNPostprocess("label_list.txt", "output") - client = Client() - - client.load_client_config(args.model) - client.connect([resource["endpoint"][idx % len(resource["endpoint"])]]) - - start = time.time() - for i in range(turns): - if args.batch_size >= 1: - l_start = time.time() - feed_batch = [] - b_start = time.time() - im = preprocess(img) - for bi in range(args.batch_size): - print("1111batch") - print(bi) - feed_batch.append({ - "image": im, - "im_info": np.array(list(im.shape[1:]) + [1.0]), - "im_shape": np.array(list(im.shape[1:]) + [1.0]) - }) - # im = preprocess(img) - b_end = time.time() - - if profile_flags: - sys.stderr.write( - "PROFILE\tpid:{}\tbert_pre_0:{} bert_pre_1:{}\n".format( - os.getpid(), - int(round(b_start * 1000000)), - int(round(b_end * 1000000)))) - #result = client.predict(feed=feed_batch, fetch=fetch) - fetch_map = client.predict( - feed=feed_batch, fetch=["multiclass_nms"]) - fetch_map["image"] = img - postprocess(fetch_map) - - l_end = time.time() - if latency_flags: - latency_list.append(l_end * 1000 - l_start * 1000) - else: - print("unsupport batch size {}".format(args.batch_size)) - else: - raise ValueError("not implemented {} request".format(args.request)) - end = time.time() - if latency_flags: - return [[end - start], latency_list] - else: - return [[end - start]] - - -if __name__ == '__main__': - multi_thread_runner = MultiThreadRunner() - endpoint_list = ["127.0.0.1:7777"] - turns = 10 - start = time.time() - result = multi_thread_runner.run( - single_func, args.thread, {"endpoint": endpoint_list, - "turns": turns}) - end = time.time() - total_cost = end - start - - avg_cost = 0 - for i in range(args.thread): - avg_cost += result[0][i] - avg_cost = avg_cost / args.thread - - print("total cost: {}s".format(total_cost)) - print("each thread cost: {}s. ".format(avg_cost)) - print("qps: {}samples/s".format(args.batch_size * args.thread * turns / - total_cost)) - if os.getenv("FLAGS_serving_latency"): - show_latency(result[1]) diff --git a/python/examples/faster_rcnn/benchmark.sh b/python/examples/faster_rcnn/benchmark.sh deleted file mode 100755 index 5706fd03c7a0e266bcac18b0544c64f327cbbe9b..0000000000000000000000000000000000000000 --- a/python/examples/faster_rcnn/benchmark.sh +++ /dev/null @@ -1,52 +0,0 @@ -rm profile_log* -export CUDA_VISIBLE_DEVICES=0 -export FLAGS_profile_server=1 -export FLAGS_profile_client=1 -export FLAGS_serving_latency=1 - -gpu_id=0 -#save cpu and gpu utilization log -if [ -d utilization ];then - rm -rf utilization -else - mkdir utilization -fi -#start server -$PYTHONROOT/bin/python3 -m paddle_serving_server_gpu.serve --model $1 --port 7777 --thread 4 --gpu_ids 0 --ir_optim > elog 2>&1 & -sleep 5 - -#warm up -$PYTHONROOT/bin/python3 benchmark.py --thread 4 --batch_size 1 --model $2/serving_client_conf.prototxt --request rpc > profile 2>&1 -echo -e "import psutil\ncpu_utilization=psutil.cpu_percent(1,False)\nprint('CPU_UTILIZATION:', cpu_utilization)\n" > cpu_utilization.py -for thread_num in 1 4 8 16 -do -for batch_size in 1 -do - job_bt=`date '+%Y%m%d%H%M%S'` - nvidia-smi --id=0 --query-compute-apps=used_memory --format=csv -lms 100 > gpu_use.log 2>&1 & - nvidia-smi --id=0 --query-gpu=utilization.gpu --format=csv -lms 100 > gpu_utilization.log 2>&1 & - gpu_memory_pid=$! - $PYTHONROOT/bin/python3 benchmark.py --thread $thread_num --batch_size $batch_size --model $2/serving_client_conf.prototxt --request rpc > profile 2>&1 - kill ${gpu_memory_pid} - kill `ps -ef|grep used_memory|awk '{print $2}'` - echo "model_name:" $1 - echo "thread_num:" $thread_num - echo "batch_size:" $batch_size - echo "=================Done====================" - echo "model_name:$1" >> profile_log_$1 - echo "batch_size:$batch_size" >> profile_log_$1 - $PYTHONROOT/bin/python3 cpu_utilization.py >> profile_log_$1 - job_et=`date '+%Y%m%d%H%M%S'` - awk 'BEGIN {max = 0} {if(NR>1){if ($1 > max) max=$1}} END {print "MAX_GPU_MEMORY:", max}' gpu_use.log >> profile_log_$1 - awk 'BEGIN {max = 0} {if(NR>1){if ($1 > max) max=$1}} END {print "GPU_UTILIZATION:", max}' gpu_utilization.log >> profile_log_$1 - rm -rf gpu_use.log gpu_utilization.log - $PYTHONROOT/bin/python3 ../util/show_profile.py profile $thread_num >> profile_log_$1 - tail -n 8 profile >> profile_log_$1 - echo "" >> profile_log_$1 -done -done - -#Divided log -awk 'BEGIN{RS="\n\n"}{i++}{print > "bert_log_"i}' profile_log_$1 -mkdir bert_log && mv bert_log_* bert_log -ps -ef|grep 'serving'|grep -v grep|cut -c 9-15 | xargs kill -9 diff --git a/python/paddle_serving_server_gpu/__init__.py b/python/paddle_serving_server_gpu/__init__.py index d53c67797f66e89e1f6c78d3aeef79d9d8603fc7..69dcf96de2d5b71537c4c7072fb53f9d8d8c3aa5 100644 --- a/python/paddle_serving_server_gpu/__init__.py +++ b/python/paddle_serving_server_gpu/__init__.py @@ -442,7 +442,7 @@ class Server(object): for line in version_file.readlines(): if re.match("cuda_version", line): cuda_version = line.split("\"")[1] - if cuda_version == "101" or cuda_version == "102" or cuda_version == "110": + if cuda_version == "101" or cuda_version == "102": device_version = "serving-gpu-" + cuda_version + "-" elif cuda_version == "arm" or cuda_version == "arm-xpu": device_version = "serving-" + cuda_version + "-" diff --git a/python/setup.py.app.in b/python/setup.py.app.in index 5cb2d137c8491e461e8b3149e8faf7c82512020a..14dcb7b5449dd5aa0967bb845c0ec0df20b01d8f 100644 --- a/python/setup.py.app.in +++ b/python/setup.py.app.in @@ -32,7 +32,7 @@ if '${PACK}' == 'ON': REQUIRED_PACKAGES = [ - 'six >= 1.10.0', 'sentencepiece', 'opencv-python', 'pillow', + 'six >= 1.10.0', 'sentencepiece<=0.1.83', 'opencv-python<=4.2.0.32', 'pillow', 'pyclipper' ] diff --git a/python/setup.py.client.in b/python/setup.py.client.in index 319ae9b24899e99e72f3de8612c44b1ae0d269f2..7b4ef6310240c0fc9f245d60d61ece6f7845fc9a 100644 --- a/python/setup.py.client.in +++ b/python/setup.py.client.in @@ -44,7 +44,7 @@ if '${PACK}' == 'ON': REQUIRED_PACKAGES = [ 'six >= 1.10.0', 'protobuf >= 3.11.0', 'numpy >= 1.12', 'grpcio <= 1.33.2', - 'grpcio-tools <= 1.33.2' + 'grpcio-tools <= 1.33.2', 'requests' ]