From e3bb1e23c8cd835a260fe95ac4b6d5efee9a6fad Mon Sep 17 00:00:00 2001 From: MRXLT Date: Tue, 10 Mar 2020 16:08:35 +0800 Subject: [PATCH] add rpc service --- python/examples/imagenet/READEMR.md | 31 +++++++++++++++ python/examples/imagenet/get_model.sh | 2 + .../imagenet/image_classification_service.py | 39 +++++++++++++++++++ python/examples/imagenet/image_http_client.py | 27 +++---------- ...assifcation_service.py => image_reader.py} | 23 +---------- python/examples/imagenet/image_rpc_client.py | 29 ++++++++++++++ 6 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 python/examples/imagenet/READEMR.md create mode 100644 python/examples/imagenet/get_model.sh create mode 100644 python/examples/imagenet/image_classification_service.py rename python/examples/imagenet/{image_classifcation_service.py => image_reader.py} (82%) create mode 100644 python/examples/imagenet/image_rpc_client.py diff --git a/python/examples/imagenet/READEMR.md b/python/examples/imagenet/READEMR.md new file mode 100644 index 00000000..4dde20b1 --- /dev/null +++ b/python/examples/imagenet/READEMR.md @@ -0,0 +1,31 @@ +# Image Classification Service + +model : ResNet50_vd + + +## Prepare model + +``` +sh get_model.sh +``` + +## Start web service +``` +python image_classification_service.py serving_server_model/ workdir/ 9393 +``` + +## Prediction +``` +python image_http_client.py +``` + +## Start rpc service + +``` +python image_server.py serving_server_model/ 9393 +``` + +## Prediction +``` +python image_rpc_client.py serving_client_conf/serving_client_conf.prototxt +``` diff --git a/python/examples/imagenet/get_model.sh b/python/examples/imagenet/get_model.sh new file mode 100644 index 00000000..72fa0c26 --- /dev/null +++ b/python/examples/imagenet/get_model.sh @@ -0,0 +1,2 @@ +wget https://paddle-serving.bj.bcebos.com/imagenet-example/conf_and_model.tar.gz +tar -xzvf conf_and_model.tar.gz diff --git a/python/examples/imagenet/image_classification_service.py b/python/examples/imagenet/image_classification_service.py new file mode 100644 index 00000000..c78ae1d2 --- /dev/null +++ b/python/examples/imagenet/image_classification_service.py @@ -0,0 +1,39 @@ +# 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_server.web_service import WebService +import sys +import cv2 +import base64 +import numpy as np +from image_reader import ImageReader + + +class ImageService(WebService): + def preprocess(self, feed={}, fetch=[]): + reader = ImageReader() + if "image" not in feed: + raise ("feed data error!") + sample = base64.b64decode(feed["image"]) + img = reader.process_image(sample) + res_feed = {} + res_feed["image"] = img.reshape(-1) + return res_feed, fetch + + +image_service = ImageService(name="image") +image_service.load_model_config(sys.argv[1]) +image_service.prepare_server( + workdir=sys.argv[2], port=int(sys.argv[3]), device="cpu") +image_service.run_server() diff --git a/python/examples/imagenet/image_http_client.py b/python/examples/imagenet/image_http_client.py index d86b4314..51072332 100644 --- a/python/examples/imagenet/image_http_client.py +++ b/python/examples/imagenet/image_http_client.py @@ -14,32 +14,15 @@ import requests import base64 -import sys -import cv2 import json -import os -import numpy as np def predict(image_path, server): - image = open(image_path).read() - image = base64.b64encode(image) - - req = {} - req["image"] = image - req["fetch"] = ["score"] - - req = json.dumps(req) - url = server - headers = {"Content-Type": "application/json"} - r = requests.post(url, data=req, headers=headers) - if r.status_code == requests.codes.ok: - score = r.json()["score"] - score = np.array(score) - print("picture {} max score : {} class {}".format( - image_path, np.max(score), np.argmax(score))) - else: - print("predict {} error".format(image_path)) + image = base64.b64encode(open(image_path).read()) + req = json.dumps({"image": image, "fetch": ["score"]}) + r = requests.post( + server, data=req, headers={"Content-Type": "application/json"}) + print(r.json()["score"]) if __name__ == "__main__": diff --git a/python/examples/imagenet/image_classifcation_service.py b/python/examples/imagenet/image_reader.py similarity index 82% rename from python/examples/imagenet/image_classifcation_service.py rename to python/examples/imagenet/image_reader.py index a7747f57..843d9417 100644 --- a/python/examples/imagenet/image_classifcation_service.py +++ b/python/examples/imagenet/image_reader.py @@ -12,15 +12,12 @@ # See the License for the specific language governing permissions and # limitations under the License. -from paddle_serving_server.web_service import WebService -import sys import cv2 -import base64 import numpy as np -class ImageService(WebService): - def set_param(self): +class ImageReader(): + def __init__(self): self.image_mean = [0.485, 0.456, 0.406] self.image_std = [0.229, 0.224, 0.225] self.image_shape = [3, 224, 224] @@ -100,19 +97,3 @@ class ImageService(WebService): img -= img_mean img /= img_std return img - - def preprocess(self, feed={}, fetch=[]): - self.set_param() - if "image" not in feed: - raise ("feed data error!") - sample = base64.b64decode(feed["image"]) - img = self.process_image(sample) - res_feed = {} - res_feed["image"] = img.reshape(-1) - return res_feed, fetch - - -image_service = ImageService(name="image") -image_service.load_model_config(sys.argv[1]) -image_service.prepare_server(workdir=sys.argv[2], port=9393, device="cpu") -image_service.run_server() diff --git a/python/examples/imagenet/image_rpc_client.py b/python/examples/imagenet/image_rpc_client.py new file mode 100644 index 00000000..385d4fe8 --- /dev/null +++ b/python/examples/imagenet/image_rpc_client.py @@ -0,0 +1,29 @@ +# 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. + +import sys +from image_reader import ImageReader +from paddle_serving_client import Client + +client = Client() +client.load_client_config(sys.argv[1]) +client.connect(["127.0.0.1:9393"]) +reader = ImageReader() +with open("./data/n01440764_10026.JPEG") as f: + img = f.read() + +img = reader.process_image(img).reshape(-1) +fetch_map = client.predict(feed={"image": img}, fetch=["score"]) + +print(fetch_map["score"]) -- GitLab