diff --git a/demo/serving/Classification_vgg11_imagenet/README.md b/demo/serving/Classification_vgg11_imagenet/README.md deleted file mode 100644 index ace0b1a0e58ebe4147f45a04b39606a83e0bb301..0000000000000000000000000000000000000000 --- a/demo/serving/Classification_vgg11_imagenet/README.md +++ /dev/null @@ -1,21 +0,0 @@ -## 数据格式 -input: {files: {"image": [file_1, file_2, ...]}} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m vgg11_imagenet -``` - -## python脚本 -```shell -$ python vgg11_imagenet_serving_demo.py -``` - -## 结果示例 -```python -{ - "results": "[[{'Egyptian cat': 0.540287435054779}], [{'daisy': 0.9976677298545837}]]" -} -``` -结果含有生成图片的base64编码,可提取生成图片,示例python脚本生成图片位置为当前目录下的output文件夹下。 diff --git a/demo/serving/GAN_stgan_celeba/README.md b/demo/serving/GAN_stgan_celeba/README.md deleted file mode 100644 index 411e86ad47202cc36644d6f4e8a5a1b80e2405e6..0000000000000000000000000000000000000000 --- a/demo/serving/GAN_stgan_celeba/README.md +++ /dev/null @@ -1,47 +0,0 @@ -## 数据格式 -#### 模型所需参数可通过嵌套字典形式传递 -input: {files: {"image": [file_1, file_2, ...]}, data: {...}} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m stgan_celeba -``` - -## python脚本 -```shell -$ python yolov3_coco2017_serving_demo.py -``` - -## 结果示例 -```python -[ - { - "path": "cat.jpg", - "data": [ - { - "left": 322.2323, - "right": 1420.4119, - "top": 208.81363, - "bottom": 996.04395, - "label": "cat", - "confidence": 0.9289875 - } - ] - }, - { - "path": "dog.jpg", - "data": [ - { - "left": 204.74722, - "right": 746.02637, - "top": 122.793274, - "bottom": 566.6292, - "label": "dog", - "confidence": 0.86698055 - } - ] - } -] -``` -结果含有生成图片的base64编码,可提取生成图片,示例python脚本生成图片位置为当前目录下的output文件夹下。 diff --git a/demo/serving/Language_Model_lm_lstm/README.md b/demo/serving/Language_Model_lm_lstm/README.md deleted file mode 100644 index c8a4fc1acada6bfeead62211c7dafb085e7284b3..0000000000000000000000000000000000000000 --- a/demo/serving/Language_Model_lm_lstm/README.md +++ /dev/null @@ -1,29 +0,0 @@ -## 数据格式 -input: {"text": [text_1, text_2, ...]} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m lm_lstm -``` - -## python脚本 -```shell -$ python lm_lstm_serving_demo.py -``` - -## 结果示例 -```python -{ - "results": [ - { - "perplexity": 4.584166451916099, - "text": "the plant which is owned by & co. was under contract with to make the cigarette filter" - }, - { - "perplexity": 6.038358983397484, - "text": "more common fibers are and are more easily rejected by the body dr. explained" - } - ] -} -``` diff --git a/demo/serving/Language_Model_lm_lstm/lm_lstm_serving_demo.py b/demo/serving/Language_Model_lm_lstm/lm_lstm_serving_demo.py deleted file mode 100644 index 9142b826e36ce5d8364e82c315a15f446bc2623f..0000000000000000000000000000000000000000 --- a/demo/serving/Language_Model_lm_lstm/lm_lstm_serving_demo.py +++ /dev/null @@ -1,17 +0,0 @@ -# coding: utf8 -import requests -import json - -if __name__ == "__main__": - # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} - text_list = [ - "the plant which is owned by & co. was under contract with to make the cigarette filter", - "more common fibers are and are more easily rejected by the body dr. explained" - ] - text = {"text": text_list} - # 指定预测方法为lm_lstm并发送post请求 - url = "http://127.0.0.1:8866/predict/text/lm_lstm" - r = requests.post(url=url, data=text) - - # 打印预测结果 - print(json.dumps(r.json(), indent=4, ensure_ascii=False)) diff --git a/demo/serving/Lexical_Analysis_lac/README.md b/demo/serving/Lexical_Analysis_lac/README.md deleted file mode 100644 index e1eaf4553ece353c9ffebd952c6ed47f4864c5f9..0000000000000000000000000000000000000000 --- a/demo/serving/Lexical_Analysis_lac/README.md +++ /dev/null @@ -1,57 +0,0 @@ -## 数据格式 -input: {"text": [text_1, text_2, ...]} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m lac -``` - -## python脚本 -#### 不携带用户自定义词典 -```shell -$ python lac_no_dict_serving_demo.py -``` - -#### 携带用户自定义词典 -```shell -$ python lac_with_dict_serving_demo.py -``` - -## 结果示例 -```python -{ - "results": [ - { - "tag": [ - "TIME", - "v", - "q", - "n" - ], - "word": [ - "今天", - "是", - "个", - "好日子" - ] - }, - { - "tag": [ - "n", - "v", - "TIME", - "v", - "v" - ], - "word": [ - "天气预报", - "说", - "今天", - "要", - "下雨" - ] - } - ] -} -``` diff --git a/demo/serving/Object_Detection_yolov3_coco2017/README.md b/demo/serving/Object_Detection_yolov3_coco2017/README.md deleted file mode 100644 index 5bf78622719204b88a44e9b8064b88110350db38..0000000000000000000000000000000000000000 --- a/demo/serving/Object_Detection_yolov3_coco2017/README.md +++ /dev/null @@ -1,46 +0,0 @@ -## 数据格式 -input: {files: {"image": [file_1, file_2, ...]}} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m yolov3_coco2017 -``` - -## python脚本 -```shell -$ python yolov3_coco2017_serving_demo.py -``` - -## 结果示例 -```python -[ - { - "path": "cat.jpg", - "data": [ - { - "left": 322.2323, - "right": 1420.4119, - "top": 208.81363, - "bottom": 996.04395, - "label": "cat", - "confidence": 0.9289875 - } - ] - }, - { - "path": "dog.jpg", - "data": [ - { - "left": 204.74722, - "right": 746.02637, - "top": 122.793274, - "bottom": 566.6292, - "label": "dog", - "confidence": 0.86698055 - } - ] - } -] -``` -结果含有生成图片的base64编码,可提取生成图片,示例python脚本生成图片位置为当前目录下的output文件夹下。 diff --git a/demo/serving/README.md b/demo/serving/README.md index 079b348917a557436c41179c253921c54bac8cfa..11467beb57042d08aa28fb6994fce21fad45de64 100644 --- a/demo/serving/README.md +++ b/demo/serving/README.md @@ -1,43 +1,54 @@ # PaddleHub-Serving ## 1. 简介 -利用PaddleHub-Serving可以完成模型服务化部署,主要包括利用Bert as Service实现embedding服务化,利用预测模型实现预测服务化。 +### 1.1 什么是PaddleHub-Serving +PaddleHub-Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务。 -## 2. Bert as Service -* [Bert as Service介绍与示例](bert_service) +### 1.2 为什么使用PaddleHub-Serving +使用PaddleHub能够完成预训练模型的管理和一键预测,但开发者还经常面临将模型部署上线以对外提供服务的需求,而利用PaddleHub-Serving可便捷的将模型部署上线,开发者只需要关注如何处理输入数据和输出结果即可。 -该示例展示了利用Bert as Service进行远程embedding服务化部署和在线预测,获取文本embedding结果。 +### 1.3 PaddleHub-Serving的组成 +PaddleHub-Serving主要包括利用Bert Service实现embedding服务化,以及利用预测模型实现预训练模型预测服务化,未来还将支持开发者利用PaddleHub自己finetune后的模型服务化。 -## 3. Serving -模型预测服务化有以下示例: +## 2. Bert Service +Bert Service是基于Paddle Serving框架的快速部署模型远程计算服务方案,可将embedding过程通过调用API接口的方式实现,减少了对机器资源的依赖。使用PaddleHub可在服务器上一键部署`Bert Service`服务,在另外的普通机器上通过客户端接口即可轻松的获取文本对应的embedding数据。 -* [图像分类-基于vgg11_imagent](./Classification_vgg11_imagenet) +关于Bert Service的具体信息和示例请参阅[Bert Service](./bert_service) + +该示例展示了利用Bert Service进行远程embedding服务化部署和在线预测,并获取文本embedding结果。 + +## 3. PaddleHub-Serving +预训练模型预测服务化能够一键完成模型服务部署,包括以下示例: + +* [图像分类-基于vgg11_imagent](serving/classification_vgg11_imagenet) 该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。 -* [图像生成-基于stgan_celeba](./GAN_stgan_celeba) +* [图像生成-基于stgan_celeba](serving/GAN_stgan_celeba) 该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。 -* [英文词法分析-基于lm_lstm](./Language_Model_lm_lstm) +* [文本审核-基于porn_detection_lstm](serving/text_censorship_porn_detection_lstm) -该示例展示了利用lm_lstm完成英文语法分析服务化部署和在线预测,获取文本的流利程度。 +该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。 -* [中文词法分析-基于lac](./Lexical_Analysis_lac) +* [中文词法分析-基于lac](serving/lexical_analysis_lac) 该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。 -* [目标检测-基于yolov3_coco2017](./Object_Detection_yolov3_coco2017) +* [目标检测-基于yolov3_darknet53_coco2017](serving/object_detection_yolov3_darknet53_coco2017) -该示例展示了利用yolov3_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 +该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 -* [中文语义分析-基于simnet_bow](./Semantic_Model_simnet_bow) +* [中文语义分析-基于simnet_bow](serving/semantic_model_simnet_bow) 该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。 -* [图像分割-基于deeplabv3p_xception65_humanseg](./Semantic_Segmentation_deeplabv3p_xception65_humanseg) +* [图像分割-基于deeplabv3p_xception65_humanseg](serving/semantic_segmentation_deeplabv3p_xception65_humanseg) 该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。 -* [中文情感分析-基于senta_lstm](./Sentiment_Analysis_senta_lstm) +* [中文情感分析-基于simnet_bow](serving/semantic_model_simnet_bow) 该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。 + +关于Paddle-Serving一键模型部署功能的具体信息请参与[serving](./serving) diff --git a/demo/serving/Semantic_Model_simnet_bow/README.md b/demo/serving/Semantic_Model_simnet_bow/README.md deleted file mode 100644 index 7a85028bbb3a00ef726ccd996476eb5c2552f83c..0000000000000000000000000000000000000000 --- a/demo/serving/Semantic_Model_simnet_bow/README.md +++ /dev/null @@ -1,36 +0,0 @@ -## 数据格式 -input: {"text1": [text_a1, text_a2, ...], "text2": [text_b1, text_b2, ...]} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m simnet_bow -``` - -## python脚本 -```shell -$ python simnet_bow_serving_demo.py -``` - -## 结果示例 -```python -{ - "results": [ - { - "similarity": 0.8445, - "text_1": "这道题太难了", - "text_2": "这道题是上一年的考题" - }, - { - "similarity": 0.9275, - "text_1": "这道题太难了", - "text_2": "这道题不简单" - }, - { - "similarity": 0.9083, - "text_1": "这道题太难了", - "text_2": "这道题很有意思" - } - ] -} -``` diff --git a/demo/serving/Semantic_Segmentation_deeplabv3p_xception65_humanseg/README.md b/demo/serving/Semantic_Segmentation_deeplabv3p_xception65_humanseg/README.md deleted file mode 100644 index 5f5ad302366e09acd52847606f576e5cba3dcad0..0000000000000000000000000000000000000000 --- a/demo/serving/Semantic_Segmentation_deeplabv3p_xception65_humanseg/README.md +++ /dev/null @@ -1,24 +0,0 @@ -## 数据格式 -input: {files: {"image": [file_1, file_2, ...]}} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m deeplabv3p_xception65_humanseg -``` - -## python脚本 -```shell -$ python deeplabv3p_xception65_humanseg_serving_demo.py -``` - -## 结果示例 -```python -[ - { - "origin": "girl.jpg", - "processed": "humanseg_output/girl_2.png" - } -] -``` -结果含有生成图片的base64编码,可提取生成图片,示例python脚本生成图片位置为当前目录下的output文件夹中。 diff --git a/demo/serving/Sentiment_Analysis_senta_lstm/README.md b/demo/serving/Sentiment_Analysis_senta_lstm/README.md deleted file mode 100644 index 6eadf2f2c3827bc4dfd042b8977f7590a898c275..0000000000000000000000000000000000000000 --- a/demo/serving/Sentiment_Analysis_senta_lstm/README.md +++ /dev/null @@ -1,35 +0,0 @@ -## 数据格式 -input: {"text": [text_1, text_2, ...]} -output: {"results":[result_1, result_2, ...]} - -## Serving快速启动命令 -```shell -$ hub serving start -m senta_lstm -``` - -## python脚本 -``` shell -$ python senta_lstm_serving_demo.py -``` - -## 结果示例 -```python -{ - "results": [ - { - "negative_probs": 0.7079, - "positive_probs": 0.2921, - "sentiment_key": "negative", - "sentiment_label": 0, - "text": "我不爱吃甜食" - }, - { - "negative_probs": 0.0149, - "positive_probs": 0.9851, - "sentiment_key": "positive", - "sentiment_label": 1, - "text": "我喜欢躺在床上看电影" - } - ] -} -``` diff --git a/demo/serving/bert_service/README.md b/demo/serving/bert_service/README.md index 57c769e1bd159245dc55c023dffd968ec4f70335..192950128fedc63752424e2a711f641cb5a89bd4 100644 --- a/demo/serving/bert_service/README.md +++ b/demo/serving/bert_service/README.md @@ -18,7 +18,7 @@ * 专注下游深度学习任务,可利用PaddleHub的`Bert Service`大幅减少embedding代码。 -`Bert as Service`具有几个突出的优点: +`Bert Service`具有几个突出的优点: * 代码精短,易于使用。简单的pip安装方式,服务端仅需一行命令即可启动,客户端仅需一行代码即可获取embedding结果。 @@ -135,29 +135,29 @@ client端接收文本数据,并获取server端返回的模型计算的embeddin client端利用PaddleHub的语义理解任务将原始文本按照不同模型的数据预处理方案将文本ID化,并生成对应的sentence type、position、input masks数据,将这些信息封装成json数据,通过http协议按照指定的IP端口信息发送至server端,等待并获取模型生成结果。 ### 5.2 启动 -连接服务端方法原型为: +服务端类BSClient初始化方法原型为: ```python -def connect(input_text, - model_name, - max_seq_len=128, - show_ids=False, - do_lower_case=True, - server="127.0.0.1:8866", - retry=3) +BSClient.__init__(self, + module_name, + server, + max_seq_len=20, + show_ids=False, + do_lower_case=True, + retry=3) +# 获取embedding方法原型为 +BSClient.get_result(self, input_text) ``` - 其中各参数说明如下表: |参数|说明|类型|样例| |:--:|:--:|:--:|:--:| -|input_text|输入文本,要获取embedding的原始文本|二维list类型,内部元素为string类型的文本|[['样例1'],['样例2']]| -|model_name|指定使用的模型名称|string|"ernie"| +|module_name|指定使用的模型名称|string|"ernie"| +|server|要访问的server地址,包括ip地址及端口号|string|"127.0.0.1:8866"| |max_seq_len|计算时的样例长度,样例长度不足时采用补零策略,超出此参数则超出部分会被截断|int|128| |show_ids|是否展现数据预处理后的样例信息,指定为True则显示样例信息,反之则不显示|bool|False| |do_lower_case|是否将英文字母转换成小写,指定为True则将所有英文字母转换为小写,反之则保持原状|bool|True| -|server|要访问的server地址,包括ip地址及端口号|string|"127.0.0.1:8866"| -|retry|连接失败后的最大重试次数|int|3| - +|retry|连接失败后的最大重试次数|int|3| +|input_text|输入文本,要获取embedding的原始文本|二维list类型,内部元素为string类型的文本|[['样例1'],['样例2']]| ## 6. Demo 在这里,我们将展示一个实际场景中可能使用的demo,我们利用PaddleHub在一台GPU机器上部署`ernie_tiny`模型服务,并在另一台CPU机器上尝试访问,获取一首七言绝句的embedding。 @@ -233,7 +233,7 @@ Paddle Inference Server exit successfully! browser.",这个页面有什么作用。 > A : 这是`BRPC`的内置服务,主要用于查看请求数、资源占用等信息,可对server端性能有大致了解,具体信息可查看[BRPC内置服务](https://github.com/apache/incubator-brpc/blob/master/docs/cn/builtin_service.md)。 -> Q : 为什么输入文本的格式为[["文本1"], ["文本2"], ],而不是["文本1", "文本2", ]? +> Q : 为什么输入文本的格式为[["文本1"], ["文本2"], ],而不是["文本1", "文本2", ]? > A : 因为Bert模型可以对一轮对话生成向量表示,例如[["问题1","回答1"],["问题2","回答2"]],为了防止使用时混乱,每个样本使用一个list表示,一个样本list内部可以是1条string或2条string,如下面的文本: > ```python > input_text = [ diff --git a/demo/serving/serving/GAN_stgan_celeba/README.md b/demo/serving/serving/GAN_stgan_celeba/README.md new file mode 100644 index 0000000000000000000000000000000000000000..45fe9a87523bbeb02a7affc29c70c87579022e87 --- /dev/null +++ b/demo/serving/serving/GAN_stgan_celeba/README.md @@ -0,0 +1,67 @@ +# 部署图像生成服务-以stgan_celeba为例 +## 1 简介 +图像生成是指根据预先设置的标签,生成对应图像的过程。stgan_celeba通过在GAN中加入encoder-decoder,可实现人脸属性的转换。关于stgan_celeba的具体信息请参阅[stgan_celeba](https://paddlepaddle.org.cn/hubdetail?name=stgan_celeba&en_category=GANs)。 + +使用PaddleHub-Serving可以轻松部署一个在线图像生成服务API,可将此API接入自己的web网站,也可接入应用程序,如美图类应用,实现传照片修饰脸的功能。 + +下面就带领大家使用PaddleHub-Serving,通过简单几步部署一个图像生成服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m stgan_celeba +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading stgan_celeba successful. +``` +这样就完成了一个图像生成服务化API的部署,默认端口号为8866。 + +## 3 测试图像生成在线API +我们用来测试的样例图片为 + +

+ +

+ +根据stgan_celeba所需信息,准备的数据包括图像文件和生成图像风格,格式为 +```python +files = [("image", file_a), ("image", file_b)] +data = {"info": ["info_a_1, info_a_2", "info_b_1, info_b_2"], "style": ["style_a", "style_b"]} +``` +注意文件列表每个元素第一个参数为"image"。 + +info为图像描述,根据示例图像信息,info应为"Male,Black_Hair,Eyeglasses,No_Beard",即"男性,黑发,戴眼镜,没有胡子"。 + +image为要生成的图像风格,我们选取"Bald"(秃顶的)作为生成图像的风格。 + +代码如下 +```python +>>> # 指定要使用的图片文件并生成列表[("image", img_1), ("image", img_2), ... ] +>>> file_list = ["../img/man.png"] +>>> files = [("image", (open(item, "rb"))) for item in file_list] +>>> # 为每张图片对应指定info和style +>>> data = {"info": ["Male,Black_Hair,Eyeglasses,No_Beard"], "style": ["Bald"]} +``` +然后就可以发送请求到图像生成服务API,并得到结果,代码如下 + +```python +>>> url = "http://127.0.0.1:8866/predict/image/stgan_celeba" +>>> r = requests.post(url=url, data=data, files=files) +``` +stgan_celeba返回的结果包括生成图像的base64编码格式,经过转换可以得到生成图像,代码如下 +```python +>>> for item in results: +... with open(output_path, "wb") as fp: +... fp.write(base64.b64decode(item["base64"].split(',')[-1])) +``` +查看指定输出文件夹,就能看到生成图像了,如图 + +

+ +

+ + +这样我们就完成了对图像生成服务化的部署和测试。 + +完整的测试代码见[stgan_celeba_serving_demo.py](stgan_celeba_serving_demo.py)。 diff --git a/demo/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py b/demo/serving/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py similarity index 75% rename from demo/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py rename to demo/serving/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py index c6b5129c32d639889319a9a4a6c3fc9721fd5dcf..f345ed272f781c5f11c81ea65cc95e18a10f9859 100644 --- a/demo/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py +++ b/demo/serving/serving/GAN_stgan_celeba/stgan_celeba_serving_demo.py @@ -6,20 +6,21 @@ import os if __name__ == "__main__": # 指定要使用的图片文件并生成列表[("image", img_1), ("image", img_2), ... ] - file_list = ["../img/woman.png"] + file_list = ["../img/man.png"] files = [("image", (open(item, "rb"))) for item in file_list] # 为每张图片对应指定info和style - data = {"info": ["Female,Brown_Hair"], "style": ["Aged"]} + data = {"info": ["Male,Black_Hair"], "style": ["Bald"]} # 指定图片生成方法为stgan_celeba并发送post请求 url = "http://127.0.0.1:8866/predict/image/stgan_celeba" r = requests.post(url=url, data=data, files=files) + print(r.text) results = eval(r.json()["results"]) # 保存生成的图片到output文件夹,打印模型输出结果 - if not os.path.exists("output"): - os.mkdir("output") + if not os.path.exists("stgan_output"): + os.mkdir("stgan_output") for item in results: - output_path = os.path.join("output", item["path"].split("/")[-1]) + output_path = os.path.join("stgan_output", item["path"].split("/")[-1]) with open(output_path, "wb") as fp: fp.write(base64.b64decode(item["base64"].split(',')[-1])) item.pop("base64") diff --git a/demo/serving/serving/GAN_stgan_celeba/stgan_output/Bald_man.png b/demo/serving/serving/GAN_stgan_celeba/stgan_output/Bald_man.png new file mode 100644 index 0000000000000000000000000000000000000000..e5b17a741668a5e1a3d1df7a4fb519b447a36e31 Binary files /dev/null and b/demo/serving/serving/GAN_stgan_celeba/stgan_output/Bald_man.png differ diff --git a/demo/serving/serving/README.md b/demo/serving/serving/README.md new file mode 100644 index 0000000000000000000000000000000000000000..03df13d55ce4b3e7c5066dfa9ddbe24fa83b3f45 --- /dev/null +++ b/demo/serving/serving/README.md @@ -0,0 +1,230 @@ +# Hub-Serving一键服务部署 +## 1 简介 +### 1.1 什么是PaddleHub-Serving一键服务部署 +PaddleHub-Serving是基于PaddleHub的一键模型服务部署工具,能够通过简单的Hub命令行工具轻松启动一个模型预测在线服务,开发者可利用PaddleHub-Serving快速得到一个预测服务API。 + +### 1.2 支持模型 +目前PaddleHub-Serving支持PaddleHub所有可直接用于预测的模型进行服务部署,包括`lac`、`senta_bilstm`等nlp类模型,以及`yolov3_coco2017`、`vgg16_imagenet`等cv类模型,未来还将支持开发者使用自己finetune后的模型用于快捷服务部署。 + +### 1.3 所需环境 +下表是使用PaddleHub-Serving的环境要求及注意事项。 + +|项目|建议版本|说明| +|:-:|:-:|:-:| +|操作系统|Linux/Darwin/Windows|建议使用Linux或Darwin,对多线程启动方式支持性较好| +|PaddleHub|>=1.4.0|无| +|PaddlePaddle|>=1.6.1|若使用GPU计算,则对应使用PaddlePaddle-gpu版本| + +## 2 使用 +### 2.1 启动Hub-Serving服务端部署 +Hub-Serving有两种启动方式,分别是使用命令行命令启动,以及使用配置文件启动。 + +#### 2.1.1 命令行命令启动 +启动命令 +```shell +$ hub serving start --modules [Module1==Version1, Module2==Version2, ...] \ + --port XXXX \ + --use_gpu \ + --use_multiprocess +``` + +**参数**: + +|参数|用途| +|-|-| +|--modules/-m|Hub-Serving预安装模型,以多个Module==Version键值对的形式列出
*`当不指定Version时,默认选择最新版本`*| +|--port/-p|服务端口,默认为8866| +|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| +|--use_multiprocess|是否启用并发方式,默认为单进程方式| + +#### 2.1.2 配置文件启动 +启动命令 +```shell +$ hub serving start --config config.json +``` +`config.json`格式如下: + +```json +{ + "modules_info": [ + { + "module": "MODULE_NAME_1", + "version": "MODULE_VERSION_1", + "batch_size": "BATCH_SIZE_1" + }, + { + "module": "MODULE_NAME_2", + "version": "MODULE_VERSION_2", + "batch_size": "BATCH_SIZE_2" + } + ], + "use_gpu": false, + "port": 8866, + "use_multiprocess": false +} +``` + +**参数**: + +|参数|用途| +|-|-| +|--modules_info|Hub-Serving预安装模型,以字典列表形式列出,其中:
`module`为预测服务使用的模型名
`version`为预测模型的版本
`batch_size`为预测批次大小 +|--use_gpu|使用GPU进行预测,必须安装paddlepaddle-gpu| +|--port/-p|服务端口,默认为8866| +|--use_multiprocess|是否启用并发方式,默认为单进程方式,推荐多核CPU机器使用此方式| + +### 2.2 访问PaddleHub-Serving服务端 + +在使用PaddleHub-Serving部署服务端的模型预测服务后,就可以在客户端访问预测接口以获取结果了,接口url格式为: + +http://0.0.0.0:8866/predict/\/\ + +其中,\为text或image,与模型种类对应,\为模型名。 + +通过发送一个POST请求,即可获取预测结果,下面我们将展示一个具体的demo,以说明使用PaddleHub-Serving部署和使用流程。 + +### 2.3 利用PaddleHub-Serving进行个性化开发 +使用PaddleHub-Serving进行模型服务部署后,可以利用得到的接口进行开发,如对外提供web服务,或接入到应用程序中,以降低客户端预测压力,提高性能,下面展示了一个web页面demo: + +

+ + + +

+ +## 3 示例-部署一个在线lac分词服务 + +### 3.1 部署lac在线服务 +现在,我们要部署一个lac在线服务,以通过接口获取文本的分词结果。 + +首先,根据2.1节所述,启动PaddleHub-Serving服务端的两种方式分别为: +```shell +$ hub serving start -m lac +``` +或 +```shell +$ hub serving start -c serving_config.json +``` +其中`serving_config.json`的内容如下: +```json +{ + "modules_info": [ + { + "module": "lac", + "version": "1.0.0", + "batch_size": 1 + } +], + "use_gpu": false, + "port": 8866, + "use_multiprocess": false +} +``` +启动成功界面如图: + +

+ + + +

+ +这样我们就在8866端口部署了lac的在线分词服务。 +*此处warning为Flask提示,不影响使用* + +### 3.2 访问lac预测接口 + +在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子`和`天气预报说今天要下雨`。 + +客户端代码如下 +```python +# coding: utf8 +import requests +import json + +if __name__ == "__main__": + # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} + text_list = ["今天是个好日子", "天气预报说今天要下雨"] + text = {"text": text_list} + # 指定预测方法为lac并发送post请求 + url = "http://127.0.0.1:8866/predict/text/lac" + r = requests.post(url=url, data=text) + + # 打印预测结果 + print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +``` +运行后得到结果 +
+ lac分词结果 + + ```python + { + "results": [ + { + "tag": [ + "TIME", + "v", + "q", + "n" + ], + "word": [ + "今天", + "是", + "个", + "好日子" + ] + }, + { + "tag": [ + "n", + "v", + "TIME", + "v", + "v" + ], + "word": [ + "天气预报", + "说", + "今天", + "要", + "下雨" + ] + } + ] + } + ``` + + + +获取其他PaddleHub-Serving的一键服务部署场景示例,可参阅下列demo + +* [图像分类-基于vgg11_imagent](serving/classification_vgg11_imagenet) + +该示例展示了利用vgg11_imagent完成图像分类服务化部署和在线预测,获取图像分类结果。 + +* [图像生成-基于stgan_celeba](serving/GAN_stgan_celeba) + +该示例展示了利用stgan_celeba生成图像服务化部署和在线预测,获取指定风格的生成图像。 + +* [文本审核-基于porn_detection_lstm](serving/text_censorship_porn_detection_lstm) + +该示例展示了利用porn_detection_lstm完成中文文本黄色敏感信息鉴定的服务化部署和在线预测,获取文本是否敏感及其置信度。 + +* [中文词法分析-基于lac](serving/lexical_analysis_lac) + +该示例展示了利用lac完成中文文本分词服务化部署和在线预测,获取文本的分词结果,并可通过用户自定义词典干预分词结果。 + +* [目标检测-基于yolov3_darknet53_coco2017](serving/object_detection_yolov3_darknet53_coco2017) + +该示例展示了利用yolov3_darknet53_coco2017完成目标检测服务化部署和在线预测,获取检测结果和覆盖识别框的图片。 + +* [中文语义分析-基于simnet_bow](serving/semantic_model_simnet_bow) + +该示例展示了利用simnet_bow完成中文文本相似度检测服务化部署和在线预测,获取文本的相似程度。 + +* [图像分割-基于deeplabv3p_xception65_humanseg](serving/semantic_segmentation_deeplabv3p_xception65_humanseg) + +该示例展示了利用deeplabv3p_xception65_humanseg完成图像分割服务化部署和在线预测,获取识别结果和分割后的图像。 + +* [中文情感分析-基于simnet_bow](serving/semantic_model_simnet_bow) + +该示例展示了利用senta_lstm完成中文文本情感分析服务化部署和在线预测,获取文本的情感分析结果。 diff --git a/demo/serving/serving/Sentiment_Analysis_senta_lstm/README.md b/demo/serving/serving/Sentiment_Analysis_senta_lstm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..be187024b153b51b7992912b83bcead3d39c3f5c --- /dev/null +++ b/demo/serving/serving/Sentiment_Analysis_senta_lstm/README.md @@ -0,0 +1,82 @@ +# 部署情感分析服务-以senta_lstm为例 +## 1 简介 +情感分析针对带有主观描述的中文文本,可自动判断该文本的情感极性类别并给出相应的置信度。利用`senta_lstm`模型可以完成中文情感分析任务,关于`senta_lstm`的具体信息请参阅[senta_lstm](https://paddlepaddle.org.cn/hubdetail?name=senta_lstm&en_category=SentimentAnalysis)。 + +使用PaddleHub-Serving可以部署一个在线情感分析服务,可以将此接口用于分析评论、智能客服等应用。 + +这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个情感分析在线服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m senta_lstm +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading senta_lstm successful. +``` +这样就完成了一个词法分析服务化API的部署,默认端口号为8866。 + +## 3 测试词法分析在线API +在服务部署好之后,我们可以进行测试,用来测试的文本为`我不爱吃甜食`和`我喜欢躺在床上看电影`。 + +准备的数据格式为 +```python +{"text": [text_1, text_2, ...]} +``` +注意字典的key为"text"。 + +根据文本和数据格式,代码如下 +```python +>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} +>>> text_list = ["我不爱吃甜食", "我喜欢躺在床上看电影"] +>>> text = {"text": text_list} +``` +接下来发送请求到词法分析API,并得到结果,代码如下 +```python +# 指定预测方法为lac并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/text/senta_lstm" +>>> r = requests.post(url=url, data=text) +``` +`LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果 +```python +# 打印预测结果 +>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +{ + "results": [ + { + "tag": [ + "TIME", + "v", + "q", + "n" + ], + "word": [ + "今天", + "是", + "个", + "好日子" + ] + }, + { + "tag": [ + "n", + "v", + "TIME", + "v", + "v" + ], + "word": [ + "天气预报", + "说", + "今天", + "要", + "下雨" + ] + } + ] +} +``` +这样我们就完成了对词法分析的预测服务化部署和测试。 + +完整的测试代码见[senta_lstm_serving_demo.py](senta_lstm_serving_demo.py)。 diff --git a/demo/serving/Sentiment_Analysis_senta_lstm/senta_lstm_serving_demo.py b/demo/serving/serving/Sentiment_Analysis_senta_lstm/senta_lstm_serving_demo.py similarity index 100% rename from demo/serving/Sentiment_Analysis_senta_lstm/senta_lstm_serving_demo.py rename to demo/serving/serving/Sentiment_Analysis_senta_lstm/senta_lstm_serving_demo.py diff --git a/demo/serving/serving/classification_vgg11_imagenet/README.md b/demo/serving/serving/classification_vgg11_imagenet/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5dc9e974004279b270f8003d0eeda325c029d469 --- /dev/null +++ b/demo/serving/serving/classification_vgg11_imagenet/README.md @@ -0,0 +1,59 @@ +# 部署图像分类服务-以vgg11_imagenent为例 +## 1 简介 +图像分类是指通过模型,预测给定的图片所属类别,vgg11_imagenent就是一种有效的图像分类模型。关于vgg11_imagenent的具体信息请参阅[vgg11_imagenent](https://paddlepaddle.org.cn/hubdetail?name=vgg11_imagenet&en_category=ImageClassification)。 + +使用PaddleHub-Serving可以部署一个在线图片分类服务,既可以对用户暴露直接预测接口,也可以利用此接口实现一个web网站,甚至可以集成到移动端应用程序中实现拍照识别功能。 + +这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个图像分类服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m vgg11_imagenet +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading vgg11_imagenet successful. +``` +这样就完成了一个图像分类服务化API的部署,默认端口号为8866。 + +## 3 测试图像分类在线API +我们用来测试的样例图片为 + +

+ +

+ +

+ +

+ +准备的数据格式为 +```python +files = [("image", file_1), ("image", file_2)] +``` +注意每个元素第一个参数为"image"。 + +代码如下 +```python +>>> file_list = ["../img/cat.jpg", "../img/flower.jpg"] +>>> files = [("image", (open(item, "rb"))) for item in file_list] +``` +然后就可以发送请求到图像分类服务API,并得到结果了,代码如下 +```python +>>> # 指定检测方法为vgg11_imagenet并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/image/vgg11_imagenet" +>>> r = requests.post(url=url, files=files) +``` +vgg11_imagenent返回的结果为图像分类结果及其对应的概率,我们尝试打印接口返回结果 +```python + +>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +{ + "results": "[[{'Egyptian cat': 0.540287435054779}], [{'daisy': 0.9976677298545837}]]" +} +``` + +这样我们就完成了对图像分类预测服务化部署和测试。 + +完整的测试代码见[vgg11_imagenent_serving_demo.py](vgg11_imagenet_serving_demo.py)。 diff --git a/demo/serving/Classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py b/demo/serving/serving/classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py similarity index 100% rename from demo/serving/Classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py rename to demo/serving/serving/classification_vgg11_imagenet/vgg11_imagenet_serving_demo.py diff --git a/demo/serving/img/cat.jpg b/demo/serving/serving/img/cat.jpg similarity index 100% rename from demo/serving/img/cat.jpg rename to demo/serving/serving/img/cat.jpg diff --git a/demo/serving/img/dog.jpg b/demo/serving/serving/img/dog.jpg similarity index 100% rename from demo/serving/img/dog.jpg rename to demo/serving/serving/img/dog.jpg diff --git a/demo/serving/img/flower.jpg b/demo/serving/serving/img/flower.jpg similarity index 100% rename from demo/serving/img/flower.jpg rename to demo/serving/serving/img/flower.jpg diff --git a/demo/serving/img/girl.jpg b/demo/serving/serving/img/girl.jpg similarity index 100% rename from demo/serving/img/girl.jpg rename to demo/serving/serving/img/girl.jpg diff --git a/demo/serving/serving/img/man.png b/demo/serving/serving/img/man.png new file mode 100644 index 0000000000000000000000000000000000000000..2a6b9755d77b7a986a7e2144034772ace2af91ff Binary files /dev/null and b/demo/serving/serving/img/man.png differ diff --git a/demo/serving/serving/img/start_serving_lac.png b/demo/serving/serving/img/start_serving_lac.png new file mode 100644 index 0000000000000000000000000000000000000000..67b1ae337549305c95bceb810fd448c3697e0dd5 Binary files /dev/null and b/demo/serving/serving/img/start_serving_lac.png differ diff --git a/demo/serving/serving/img/web_demo.png b/demo/serving/serving/img/web_demo.png new file mode 100644 index 0000000000000000000000000000000000000000..169f426251d243327bbbb05bf056cc27a7a1d7b5 Binary files /dev/null and b/demo/serving/serving/img/web_demo.png differ diff --git a/demo/serving/img/woman.png b/demo/serving/serving/img/woman.png similarity index 100% rename from demo/serving/img/woman.png rename to demo/serving/serving/img/woman.png diff --git a/demo/serving/serving/lexical_analysis_lac/README.md b/demo/serving/serving/lexical_analysis_lac/README.md new file mode 100644 index 0000000000000000000000000000000000000000..8405f9e503595886f26c6ce347e558d2f4b96299 --- /dev/null +++ b/demo/serving/serving/lexical_analysis_lac/README.md @@ -0,0 +1,99 @@ +# 部署词法分析服务-以lac为例 +## 1 简介 +`Lexical Analysis of Chinese`,简称`LAC`,是一个联合的词法分析模型,能整体性地完成中文分词、词性标注、专名识别任务。关于`LAC`的具体信息请参阅[LAC](https://paddlepaddle.org.cn/hubdetail?name=lac&en_category=LexicalAnalysis)。 + +使用PaddleHub-Serving可以部署一个在线词法分析服务,可以将此接口用于词法分析、在线分词等在线web应用。 + +这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个词法分析在线服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m lac +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading lac successful. +``` +这样就完成了一个词法分析服务化API的部署,默认端口号为8866。 + +## 3 测试语言模型在线API +### 3.1 不使用自定义词典 +在服务部署好之后,我们可以进行测试,用来测试的文本为`今天是个好日子`和`天气预报说今天要下雨`。 + +准备的数据格式为 +```python +{"text": [text_1, text_2, ...]} +``` +注意字典的key为"text"。 + +根据文本和数据格式,代码如下 +```python +>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} +>>> text_list = ["今天是个好日子", "天气预报说今天要下雨"] +>>> text = {"text": text_list} +``` +接下来发送请求到词法分析API,并得到结果,代码如下 +```python +# 指定预测方法为lac并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/text/lac" +>>> r = requests.post(url=url, data=text) +``` +`LAC`模型返回的结果为每个文本分词后的结果,我们尝试打印接口返回结果 +```python +# 打印预测结果 +>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +{ + "results": [ + { + "tag": [ + "TIME", + "v", + "q", + "n" + ], + "word": [ + "今天", + "是", + "个", + "好日子" + ] + }, + { + "tag": [ + "n", + "v", + "TIME", + "v", + "v" + ], + "word": [ + "天气预报", + "说", + "今天", + "要", + "下雨" + ] + } + ] +} +``` +这样我们就完成了对词法分析的预测服务化部署和测试。 + +完整的测试代码见[lac_serving_demo.py](lac_serving_demo.py)。 + +### 3.2 使用自定义词典 +`LAC`模型在预测时还可以使用自定义词典干预默认分词结果,这种情况只需要将自定义词典以文件的形式附加到request请求即可,数据格式如下 +```python +{"user_dict": user_dict.txt} +``` +根据数据格式,具体代码如下 +```python +>>> # 指定自定义词典{"user_dict": dict.txt} +>>> file = {"user_dict": open("dict.txt", "rb")} +>>> # 请求接口时以文件的形式附加自定义词典,其余和不使用自定义词典的请求方式相同,此处不再赘述 +>>> url = "http://127.0.0.1:8866/predict/text/lac" +>>> r = requests.post(url=url, files=file, data=text) +``` + +完整的测试代码见[lac_with_dict_serving_demo.py](lac_with_dict_serving_demo.py)。 diff --git a/demo/serving/Lexical_Analysis_lac/dict.txt b/demo/serving/serving/lexical_analysis_lac/dict.txt similarity index 100% rename from demo/serving/Lexical_Analysis_lac/dict.txt rename to demo/serving/serving/lexical_analysis_lac/dict.txt diff --git a/demo/serving/Lexical_Analysis_lac/lac_serving_demo.py b/demo/serving/serving/lexical_analysis_lac/lac_serving_demo.py similarity index 100% rename from demo/serving/Lexical_Analysis_lac/lac_serving_demo.py rename to demo/serving/serving/lexical_analysis_lac/lac_serving_demo.py diff --git a/demo/serving/Lexical_Analysis_lac/lac_with_dict_serving_demo.py b/demo/serving/serving/lexical_analysis_lac/lac_with_dict_serving_demo.py similarity index 100% rename from demo/serving/Lexical_Analysis_lac/lac_with_dict_serving_demo.py rename to demo/serving/serving/lexical_analysis_lac/lac_with_dict_serving_demo.py diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/README.md b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/README.md new file mode 100644 index 0000000000000000000000000000000000000000..2129ed0c0e4116037d816d443038d2019b98031d --- /dev/null +++ b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/README.md @@ -0,0 +1,119 @@ +# 部署图像分类服务-以yolov3_darknet53_coco2017为例 +## 1 简介 +目标检测作为深度学习常见任务,在各种场景下都有所使用。使用`yolov3_darknet53_coco2017`模型可以进行目标检测任务,关于`yolov3_darknet53_coco2017`的具体信息请参阅[yolov3_darknet53_coco2017](https://paddlepaddle.org.cn/hubdetail?name=yolov3_darknet53_coco2017&en_category=ObjectDetection)。 + +使用PaddleHub-Serving可以轻松部署一个在线目标检测服务API,可将此API接入自己的web网站进行在线目标检测,也可接入移动端应用程序,实现识图、圈人等功能。 + +下面就带领大家使用PaddleHub-Serving,通过简单几步部署一个目标检测服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m yolov3_darknet53_coco2017 +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading yolov3_darknet53_coco2017 successful. +``` +这样就完成了一个图像生成服务化API的部署,默认端口号为8866。 + +## 3 测试图像生成在线API +我们用来测试的样例图片为 + +

+ + + +

+ +

+ + + +

+ +准备的数据格式为 +```python +files = [("image", file_1), ("image", file_2)] +``` +注意文件列表每个元素第一个参数为"image"。 + +代码如下 +```python +>>> # 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ] +>>> file_list = ["../img/cat.jpg", "../img/dog.jpg"] +>>> files = [("image", (open(item, "rb"))) for item in file_list] +``` +然后就可以发送请求到目标检测服务API,并得到结果,代码如下 +```python +>>> # 指定检测方法为yolov3_darknet53_coco2017并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/image/yolov3_darknet53_coco2017" +>>> r = requests.post(url=url, files=files) +``` +我们可以打印接口返回结果 +```python +>>> results = eval(r.json()["results"]) +>>> print(json.dumps(results, indent=4, ensure_ascii=False)) +[ + { + "path": "cat.jpg", + "data": [ + { + "left": 319.489, + "right": 1422.8364, + "top": 208.94229, + "bottom": 993.8552, + "label": "cat", + "confidence": 0.9174191 + } + ] + }, + { + "path": "dog.jpg", + "data": [ + { + "left": 200.6918, + "right": 748.96204, + "top": 122.74927, + "bottom": 566.2066, + "label": "dog", + "confidence": 0.83619183 + }, + { + "left": 506.8462, + "right": 623.2322, + "top": 378.0084, + "bottom": 416.116, + "label": "tie", + "confidence": 0.5082839 + } + ] + } +] +``` +根据结果可以看出准确识别了请求的图片。 + +yolov3_darknet53_coco2017返回的结果还包括标注检测框的图像的base64编码格式,经过转换可以得到生成图像,代码如下 +```python +>>> for item in results: +... with open(output_path, "wb") as fp: +... fp.write(base64.b64decode(item["base64"].split(',')[-1])) +``` +查看指定输出文件夹,就能看到生成图像了,如图 + +

+ + + +

+ +

+ + + +

+ + +这样我们就完成了对目标检测服务化的部署和测试。 + +完整的测试代码见[yolov3_darknet53_coco2017_serving_demo.py](yolov3_darknet53_coco2017_serving_demo.py)。 diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d71260a8c364349bc0f07ef9938220eef893d857 Binary files /dev/null and b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/cat.jpg differ diff --git a/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b29ca3439b1e1f462ebf2a97ba732a7826ac834f Binary files /dev/null and b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/output/dog.jpg differ diff --git a/demo/serving/Object_Detection_yolov3_coco2017/yolov3_coco2017_serving_demo.py b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py similarity index 91% rename from demo/serving/Object_Detection_yolov3_coco2017/yolov3_coco2017_serving_demo.py rename to demo/serving/serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py index e8f9409370a9cd550bb76313978ffd787c71c436..8b85f223ada1116ddefa8000fadb42b55eb02369 100644 --- a/demo/serving/Object_Detection_yolov3_coco2017/yolov3_coco2017_serving_demo.py +++ b/demo/serving/serving/object_detection_yolov3_darknet53_coco2017/yolov3_darknet53_coco2017_serving_demo.py @@ -9,7 +9,7 @@ if __name__ == "__main__": file_list = ["../img/cat.jpg", "../img/dog.jpg"] files = [("image", (open(item, "rb"))) for item in file_list] # 指定检测方法为yolov3_coco2017并发送post请求 - url = "http://127.0.0.1:8866/predict/image/yolov3_coco2017" + url = "http://127.0.0.1:8866/predict/image/yolov3_darknet53_coco2017" r = requests.post(url=url, files=files) results = eval(r.json()["results"]) diff --git a/demo/serving/serving/semantic_model_simnet_bow/README.md b/demo/serving/serving/semantic_model_simnet_bow/README.md new file mode 100644 index 0000000000000000000000000000000000000000..05e72cf41e91586758f968e608ae2d7fd5ee549f --- /dev/null +++ b/demo/serving/serving/semantic_model_simnet_bow/README.md @@ -0,0 +1,70 @@ +# 部署语义模型服务-以simnet_bow为例 +## 1 简介 +`simnet_bow`是一个计算短文本相似度的模型,可以根据用户输入的两个文本,计算出相似度得分。关于`simnet_bow`的具体信息请参阅[simnet_bow](https://paddlepaddle.org.cn/hubdetail?name=simnet_bow&en_category=SemanticModel)。 + +使用PaddleHub-Serving可以部署一个在线语义模型服务,可以将此接口用于在线文本相似度分析、智能问答检索等应用。 + +这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个语义模型在线服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m simnet_bow +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading lac successful. +``` +这样就完成了一个语义模型服务化API的部署,默认端口号为8866。 + +## 3 测试语义模型在线API +在服务部署好之后,我们可以进行测试,用来测试的文本对分别为`[这道题太难了:这道题是上一年的考题], [这道题太难了:这道题不简单], [这道题太难了:这道题很有意思]`。 + +准备的数据格式为 +```python +{"text_1": [text_a1, text_a2, ... ], "text_2": [text_b1, text_b2, ... ]} +``` +注意字典的key分别为"text_1"和"text_2",与`simnet_bow`模型使用的输入数据一致。 + +根据文本和数据格式,代码如下 +```python +>>> # 指定用于用于匹配的文本并生成字典{"text_1": [text_a1, text_a2, ... ] +>>> # "text_2": [text_b1, text_b2, ... ]} +>>> text = { +>>> "text_1": ["这道题太难了", "这道题太难了", "这道题太难了"], +>>> "text_2": ["这道题是上一年的考题", "这道题不简单", "这道题很有意思"] +>>> } +``` +接下来发送请求到语义模型API,并得到结果,代码如下 +```python +>>> # 指定匹配方法为simnet_bow并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/text/simnet_bow" +>>> r = requests.post(url=url, data=text) +``` +`simnet_bow`模型返回的结果为每对文本对比后的相似度,我们尝试打印接口返回结果 +```python +# 打印预测结果 +>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +{ + "results": [ + { + "similarity": 0.8445, + "text_1": "这道题太难了", + "text_2": "这道题是上一年的考题" + }, + { + "similarity": 0.9275, + "text_1": "这道题太难了", + "text_2": "这道题不简单" + }, + { + "similarity": 0.9083, + "text_1": "这道题太难了", + "text_2": "这道题很有意思" + } + ] +} +``` +这样我们就完成了对语义模型simnet_bow的预测服务化部署和测试。 + +完整的测试代码见[simnet_bow_serving_demo.py](simnet_bow_serving_demo.py)。 diff --git a/demo/serving/Semantic_Model_simnet_bow/simnet_bow_serving_demo.py b/demo/serving/serving/semantic_model_simnet_bow/simnet_bow_serving_demo.py similarity index 100% rename from demo/serving/Semantic_Model_simnet_bow/simnet_bow_serving_demo.py rename to demo/serving/serving/semantic_model_simnet_bow/simnet_bow_serving_demo.py diff --git a/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md b/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3a1a11535c8b069329c2b1268d917fc867d7b785 --- /dev/null +++ b/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/README.md @@ -0,0 +1,75 @@ +# 部署图像分割服务-以deeplabv3p_xception65_humanseg为例 +## 1 简介 +图像分割是深度学习的常见任务。使用`deeplabv3p_xception65_humanseg`模型可以进行人像分割任务,关于`deeplabv3p_xception65_humanseg`的具体信息请参阅[deeplabv3p_xception65_humanseg](https://paddlepaddle.org.cn/hubdetail?name=deeplabv3p_xception65_humanseg&en_category=ImageSegmentation)。 + +使用PaddleHub-Serving可以轻松部署一个在线图像分割服务API,可将此API接入自己的web网站进行在线图像分割,也可接入移动端应用程序,实现拍照分割等功能。 + +下面就带领大家使用PaddleHub-Serving,通过简单几步部署一个目标检测服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m deeplabv3p_xception65_humanseg +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading deeplabv3p_xception65_humanseg successful. +``` +这样就完成了一个图像分割服务化API的部署,默认端口号为8866。 + +## 3 测试图像分割在线API +我们用来测试的样例图片为 + +

+ + + +

+ +准备的数据格式为 +```python +files = [("image", file_1), ("image", file_2)] +``` +注意文件列表每个元素第一个参数为"image"。 + +代码如下 +```python +>>> # 指定要检测的图片并生成列表[("image", img_1), ("image", img_2), ... ] +>>> file_list = ["../img/girl.jpg"] +>>> files = [("image", (open(item, "rb"))) for item in file_list] +``` +然后就可以发送请求到图像分割服务API,并得到结果,代码如下 +```python +>>> # 指定检测方法为deeplabv3p_xception65_humanseg并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/image/deeplabv3p_xception65_humanseg" +>>> r = requests.post(url=url, files=files) +``` +我们可以打印接口返回结果 +```python +>>> results = eval(r.json()["results"]) +>>> print(json.dumps(results, indent=4, ensure_ascii=False)) +[ + { + "origin": "girl.jpg", + "processed": "humanseg_output/girl.png" + } +] +``` + +deeplabv3p_xception65_humanseg返回的结果还包括人像分割后的图像的base64编码格式,经过转换可以得到生成图像,代码如下 +```python +>>> for item in results: +... with open(output_path, "wb") as fp: +... fp.write(base64.b64decode(item["base64"].split(',')[-1])) +``` +查看指定输出文件夹,就能看到生成图像了,如图 + +

+ + + +

+ +这样我们就完成了对图像分割模型deeplabv3p_xception65_humanseg服务化的部署和测试。 + +完整的测试代码见[deeplabv3p_xception65_humanseg_serving_demo.py](deeplabv3p_xception65_humanseg_serving_demo.py)。 diff --git a/demo/serving/Semantic_Segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py b/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py similarity index 100% rename from demo/serving/Semantic_Segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py rename to demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/deeplabv3p_xception65_humanseg_serving_demo.py diff --git a/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png b/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png new file mode 100644 index 0000000000000000000000000000000000000000..667e9e70e5e8f0cf84cc5db7728eada13bf14607 Binary files /dev/null and b/demo/serving/serving/semantic_segmentation_deeplabv3p_xception65_humanseg/output/girl.png differ diff --git a/demo/serving/serving/text_censorship_porn_detection_lstm/README.md b/demo/serving/serving/text_censorship_porn_detection_lstm/README.md new file mode 100644 index 0000000000000000000000000000000000000000..fcdbb36ad61972fa68762b071da3455cf6fe392a --- /dev/null +++ b/demo/serving/serving/text_censorship_porn_detection_lstm/README.md @@ -0,0 +1,68 @@ +# 部署文本审核服务-以porn_detection_lstm为例 +## 1 简介 +在网站建设等场景中经常需要对敏感信息进行鉴定和过滤,采用文本审核模型`porn_detection_lstm`可自动判别文本是否涉黄并给出相应的置信度,关于`porn_detection_lstm`的具体信息请参阅[porn_detection_lstm](https://paddlepaddle.org.cn/hubdetail?name=porn_detection_lstm&en_category=TextCensorship) + +使用PaddleHub-Serving可以部署一个在线文本审核服务,可以将此接口用于防止低俗交友、色情文本等应用。 + +这里就带领大家使用PaddleHub-Serving,通过简单几步部署一个文本审核在线服务。 + +## 2 启动PaddleHub-Serving +启动命令如下 +```shell +$ hub serving start -m porn_detection_lstm +``` +启动时会显示加载模型过程,启动成功后显示 +```shell +Loading porn_detection_lstm successful. +``` +这样就完成了一个文本审核服务化API的部署,默认端口号为8866。 + +## 3 测试文本审核在线API +在服务部署好之后,我们可以进行测试,用来测试的文本为`黄片下载`和`中国黄页`。 + +准备的数据格式为 +```python +{"text": [text_1, text_2, ...]} +``` +注意字典的key为"text"。 + +根据文本和数据格式,代码如下 +```python +>>> # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} +>>> text_list = ["黄片下载", "中国黄页"] +>>> text = {"text": text_list} +``` +接下来发送请求到文本审核API,并得到结果,代码如下 +```python +# 指定预测方法为lac并发送post请求 +>>> url = "http://127.0.0.1:8866/predict/text/porn_detection_lstm" +>>> r = requests.post(url=url, data=text) +``` +`porn_detection_lstm`模型返回的结果为每个文本鉴定后的结果,我们尝试打印接口返回结果 +```python +# 打印预测结果 +>>> print(json.dumps(r.json(), indent=4, ensure_ascii=False)) +{ + "results": [ + { + "not_porn_probs": 0.0121, + "porn_detection_key": "porn", + "porn_detection_label": 1, + "porn_probs": 0.9879, + "text": "黄片下载" + }, + { + "not_porn_probs": 0.9954, + "porn_detection_key": "not_porn", + "porn_detection_label": 0, + "porn_probs": 0.0046, + "text": "中国黄页" + } + ] +} +``` +可以看出正确得到了两个文本的预测结果。 + +这样我们就完成了对文本审核模型的预测服务化部署和测试。 + +完整的测试代码见[porn_detection_lstm_serving_demo.py](porn_detection_lstm_serving_demo.py)。 diff --git a/demo/serving/serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py b/demo/serving/serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py new file mode 100644 index 0000000000000000000000000000000000000000..268a8d69a1c390ee6e8bd3874298cdaf101e6ad8 --- /dev/null +++ b/demo/serving/serving/text_censorship_porn_detection_lstm/porn_detection_lstm_serving_demo.py @@ -0,0 +1,14 @@ +# coding: utf8 +import requests +import json + +if __name__ == "__main__": + # 指定用于用于预测的文本并生成字典{"text": [text_1, text_2, ... ]} + text_list = ["黄片下载", "中国黄页"] + text = {"text": text_list} + # 指定预测方法为lac并发送post请求 + url = "http://127.0.0.1:8866/predict/text/porn_detection_lstm" + r = requests.post(url=url, data=text) + + # 打印预测结果 + print(json.dumps(r.json(), indent=4, ensure_ascii=False)) diff --git a/paddlehub/serving/app_single.py b/paddlehub/serving/app_single.py index 24a44dab4f9687cca09b1f0e95eae125bae0e058..96fd56f6cd5fcf45a22239c690e309b74b87608f 100644 --- a/paddlehub/serving/app_single.py +++ b/paddlehub/serving/app_single.py @@ -133,7 +133,7 @@ def predict_gan(module, input_img, id, batch_size, extra={}): def predict_object_detection(module, input_img, id, batch_size, extra={}): - output_folder = "output" + output_folder = "detection_result" global use_gpu method_name = module.desc.attr.map.data['default_signature'].s predict_method = getattr(module, method_name) diff --git a/paddlehub/serving/templates/main.html b/paddlehub/serving/templates/main.html index 56208ea1ab83f14005ef09e613c9ad357f9e57b0..d272aae7f642fa359deddddf298ab2f1a57b3d76 100644 --- a/paddlehub/serving/templates/main.html +++ b/paddlehub/serving/templates/main.html @@ -115,7 +115,7 @@ + 'id="file_text"' + 'onblur="blur_input_text()"' + 'onfocus="focus_input_text()"' - + 'name="input_text">' + + 'name="text">' + '在此键入文本或上传文本文件' + '' + '' @@ -237,14 +237,15 @@ alert("Connection error:"+request.error); }, success: function(data) { - html = get_result_html(data["result"]); + console.log(data); + html = get_result_html(data["results"]); document.getElementById("result_text").value = html; } }); } function sub_img() { var formParam = { - "input_img": document.getElementById("file_img").src, + "image": document.getElementById("file_img").src, "input_file":document.getElementById("file").value }; to_url = "/predict/image/" + document.getElementById("inputGroupSelect02").value; @@ -258,9 +259,13 @@ alert("Connection error:"+request.error); }, success: function(data) { - data = data["result"]; - document.getElementById("result_text").value = data["desc"]; - document.getElementById("result_img").src = data["output_img"]; + data = data.results; + data = data.replace(/'/g, '"'); + data = JSON.parse(data); + data = data[0]; + + document.getElementById("result_text").value = JSON.stringify(data.data[0]); + document.getElementById("result_img").src = data.base64; } }); } diff --git a/paddlehub/serving/templates/serving_config.json b/paddlehub/serving/templates/serving_config.json index 1d4196dd7ee2cebec1b0d1daf96b14be1454a435..cd761decf67696a052f86e2a7ba2359ef6264fe5 100644 --- a/paddlehub/serving/templates/serving_config.json +++ b/paddlehub/serving/templates/serving_config.json @@ -3,30 +3,22 @@ { "module": "lac", "version": "1.0.0", - "batch_size": 200, - "queue_size": 200, - "category": "NLP" + "batch_size": 200 }, { "module": "senta_lstm", "version": "1.0.0", - "batch_size": 1, - "queue_size": 200, - "category": "NLP" + "batch_size": 1 }, { "module": "yolov3_darknet53_coco2017", "version": "1.0.0", - "batch_size": 1, - "queue_size": 10, - "category": "CV" + "batch_size": 1 }, { "module": "faster_rcnn_coco2017", "version": "1.0.0", - "batch_size": 1, - "queue_size": 10, - "category": "CV" + "batch_size": 1 } ], "use_gpu": false,