Sfoglia il codice sorgente

add str project_type input for demo

wangsiyuan06 4 anni fa
parent
commit
6ac555643a

BIN
docs/gui/img/gui_use.png


+ 21 - 21
docs/gui/index.rst

@@ -42,28 +42,12 @@ PaddleX GUI覆盖深度学习模型开发必经的 **数据处理** 、 **超参
 点选式选择模型发布平台、格式,一键导出预测模型,并匹配完善的模型预测部署说明文档,贴心助力产业端到端项目落地
 
 
-.. toctree::
-   :maxdepth: 2
-   :caption: 文档目录
-   
-   download.md
-   usage/index
-   faq.md
-
-
-* PaddleX GUI版本: v1.0
-* 项目官网: http://www.paddlepaddle.org.cn/paddle/paddlex  
-* 项目GitHub: https://github.com/PaddlePaddle/PaddleX/tree/develop  
-* 官方QQ用户群: 1045148026  
-* GitHub Issue反馈: http://www.github.com/PaddlePaddle/PaddleX/issues
-
-
 PaddleX RESTful
 =======================================
 
 PaddleX RESTful是基于PaddleX开发的RESTful API。
 
-目前对于开发者来说通过如下指令启动PaddleX RESTful服务,开启RESTful服务后可以通过下载Remote版本的GUI连接开启RESTful服务的服务端完成深度学习全流程开发。
+对于开发者来说通过如下指令启动PaddleX RESTful服务,开启RESTful服务后可以通过下载Remote版本的GUI或者是web demo连接开启RESTful服务的服务端完成深度学习全流程开发。
 
 同样您还可以根据RESTful API来开发自己的可视化界面。
 
@@ -75,18 +59,34 @@ PaddleX Remote GUI
 PaddleX Remote GUI是针对PaddleX RESTful开发的可视化客服端。开发者可以通过客服端连接开启RESTful服务的服务端,通过GUI实现深度学习全流程:**数据处理** 、 **超参配置** 、 **模型训练及优化** 、 **模型发布**,无需开发一行代码,即可得到高性深度学习推理模型。
 
 
-
 PaddleX RESTful API 二次开发
 ---------------------------------------
 
-开发者可以使用PaddleX RESTful API 进行二次开发,按照自己的需求开发可视化界面,详细请参考以下文档
+开发者可以使用PaddleX RESTful API 进行二次开发,按照自己的需求开发可视化界面
+
+
 
 .. toctree::
    :maxdepth: 2
    :caption: 文档目录
-
-   introduction_restful.md
+   
+   download.md
+   usage/index
+   faq.md
+   introduction.md
+   restful.md
    quick_start.md
    restful_api.md
    data_struct.md
    tree.md
+
+
+* PaddleX GUI版本: v1.0
+* 项目官网: http://www.paddlepaddle.org.cn/paddle/paddlex  
+* 项目GitHub: https://github.com/PaddlePaddle/PaddleX/tree/develop  
+* 官方QQ用户群: 1045148026  
+* GitHub Issue反馈: http://www.github.com/PaddlePaddle/PaddleX/issues
+
+
+
+

+ 44 - 0
docs/gui/introduction.md

@@ -0,0 +1,44 @@
+# PaddleX RESTful介绍与使用
+PaddleX RESTful是基于PaddleX开发的RESTful API。  
+
+对于开发者来说通过如下指令启动PaddleX RESTful服务,开启RESTful服务后可以通过下载Remote版本的GUI或者是web demo连接开启RESTful服务的服务端完成深度学习全流程开发。  
+
+同样您还可以根据RESTful API来开发自己的可视化界面。  
+
+**paddlex --start_restful --port [端口号] --workspace_dir [工作空间地址]**
+
+## PaddleX Remote GUI
+PaddleX Remote GUI是针对PaddleX RESTful开发的可视化客服端。开发者可以通过客服端连接开启RESTful服务的服务端,通过GUI实现深度学习全流程:**数据处理** 、 **超参配置** 、 **模型训练及优化** 、 **模型发布**,无需开发一行代码,即可得到高性深度学习推理模型。  
+### 客户端下载地址
+- [MAC]()
+- [Windows]()
+
+### 客户端使用流程
+
+#### step1:安装paddlex  
+```
+pip install paddlex
+```  
+**注意**:若需要使用GPU请安装pycuda
+```
+pip install pycuda
+```
+
+#### step2:开启restful 服务
+```
+paddlex --start_restful --port [端口号] --workspace_dir [工作空间地址]
+```
+
+#### setp3:根据上面的连接下载Remote版本的客户端
+
+#### step4:运行客户端、如图所示填写开启RESTful后端的ip与端口,点击确定遍可正常使用GUI
+![alt](./img/gui_use.png)
+
+
+## PaddleX Web Demo
+PaddleX Web Demo是针对PaddleX RESTful开发的web可视化客户端。
+
+
+
+## PaddleX RESTful API 二次开发
+开发者可以使用PaddleX RESTful API 进行二次开发,按照自己的需求开发可视化界面,详细请参考以下文档

+ 1 - 1
docs/gui/introduction_restful.md → docs/gui/restful.md

@@ -1,4 +1,4 @@
-# 简介
+# RESTful API 二次开发简介
 如图,PaddleX Restful主要由数据集(dataset),项目(project),任务(task),模型(model)组成。上述模块数据保存在指定的工作空间(workspace)内,相应的结构化信息通过protobuf保存,[workspace的protobuf消息定义](./data_struct.md#Protobuf结构化数据)。  
 
 ![alt](./img/framework.png)  

+ 2 - 2
docs/gui/restful_api.md

@@ -741,13 +741,13 @@ info={
 ```
 methods=='GET':#获取demo下载进度
 	Args:
-		prj_type(int):项目类型ProjectType枚举变量的int值
+		prj_type(str):项目类型可以是['classification', 'detection', 'segmentation','instance_segmentation']
 	Return:
 		status
 		attr(dict):demo下载信息
 	Example:
 		#分类项目示例demo下载
-		params = {'prj_type' = 0}
+		params = {'prj_type' = 'classification'}
 		ret = requests.get(url + 'demo', json=params)
 #attr(dict):demo下载信息,包含
 attr={

+ 10 - 7
paddlex/restful/app.py

@@ -9,7 +9,7 @@ import json
 import sys
 import multiprocessing as mp
 from . import workspace_pb2 as w
-from .utils import CustomEncoder, ShareData, is_pic, get_logger
+from .utils import CustomEncoder, ShareData, is_pic, get_logger, TaskStatus
 import numpy as np
 
 app = Flask(__name__)
@@ -29,10 +29,11 @@ def init(dirname, logger):
     get_system_info(SD.machine_info)
 
 
-@app.errorhandler(Exception)
+'''@app.errorhandler(Exception)
 def handle_exception(e):
     ret = {"status": -1, 'message': repr(e)}
     return ret
+'''
 
 
 @app.route('/workspace', methods=['GET', 'PUT'])
@@ -548,11 +549,13 @@ def task_evaluate():
     if request.method == 'GET':
         from .project.task import get_evaluate_result
         ret = get_evaluate_result(data, SD.workspace)
+        if ret['evaluate_status'] == TaskStatus.XEVALUATED and ret[
+                'result'] is not None:
+            if 'Confusion_Matrix' in ret['result']:
+                ret['result']['Confusion_Matrix'] = ret['result'][
+                    'Confusion_Matrix'].tolist()
+            ret['result'] = CustomEncoder().encode(ret['result'])
         ret['evaluate_status'] = ret['evaluate_status'].value
-        if 'Confusion_Matrix' in ret['result']:
-            ret['result']['Confusion_Matrix'] = ret['result'][
-                'Confusion_Matrix'].tolist()
-        ret['result'] = CustomEncoder().encode(ret['result'])
         return ret
     if request.method == 'POST':
         from .project.task import evaluate_model
@@ -902,4 +905,4 @@ def run(port, workspace_dir):
             os.makedirs(dirname)
     logger = get_logger(osp.join(dirname, "mcessages.log"))
     init(dirname, logger)
-    app.run(host='0.0.0.0', port=port, threaded=True)
+    app.run(host='0.0.0.0', port=port, threaded=True, debug=True)

+ 9 - 0
paddlex/restful/dataset/operate.py

@@ -30,6 +30,15 @@ dataset_url_list = [
     'https://bj.bcebos.com/paddlex/demos/xiaoduxiong_ins_det.tar.gz',
     'https://bj.bcebos.com/paddlex/demos/remote_sensing_seg.tar.gz'
 ]
+dataset_url_dict = {
+    'classification':
+    'https://bj.bcebos.com/paddlex/demos/vegetables_cls.tar.gz',
+    'detection': 'https://bj.bcebos.com/paddlex/demos/insect_det.tar.gz',
+    'segmentation':
+    'https://bj.bcebos.com/paddlex/demos/optic_disc_seg.tar.gz',
+    'instance_segmentation':
+    'https://bj.bcebos.com/paddlex/demos/xiaoduxiong_ins_det.tar.gz'
+}
 
 
 def _check_and_copy(dataset, dataset_path, source_path):

+ 20 - 5
paddlex/restful/demo.py

@@ -5,6 +5,10 @@ from .utils import DownloadStatus, DatasetStatus, ProjectType, get_folder_status
 from .project.train.params import PARAMS_CLASS_LIST
 from .utils import CustomEncoder
 
+prj_type_list = [
+    'classification', 'detection', 'segmentation', 'instance_segmentation'
+]
+
 
 def download_demo_dataset(data, workspace, load_demo_proc_dict):
     """下载样例工程
@@ -13,7 +17,10 @@ def download_demo_dataset(data, workspace, load_demo_proc_dict):
             data为dict, key包括
             'prj_type' 样例类型(ProjectType)
         """
-    prj_type = ProjectType(data['prj_type'])
+    if isinstance(data['prj_type'], str):
+        prj_type = ProjectType(prj_type_list.index(data['prj_type']))
+    else:
+        prj_type = ProjectType(data['prj_type'])
     assert prj_type.value >= 0 and prj_type.value <= 4, "不支持此样例类型的导入(type:{})".format(
         prj_type)
     target_path = osp.join(workspace.path, "demo_datasets")
@@ -118,12 +125,20 @@ def get_download_demo_progress(data, workspace):
         data为dict, key包括
         'prj_type' 样例类型(ProjectType)
     """
-    prj_type = ProjectType(data['prj_type'])
-    target_path = osp.join(workspace.path, "demo_datasets", prj_type.name)
+    if isinstance(data['prj_type'], str):
+        target_path = osp.join(workspace.path, "demo_datasets",
+                               data['prj_type'])
+    else:
+        prj_type = ProjectType(data['prj_type'])
+        target_path = osp.join(workspace.path, "demo_datasets", prj_type.name)
     status, message = get_folder_status(target_path, True)
     if status == DownloadStatus.XDDOWNLOADING:
-        from .dataset.operate import dataset_url_list
-        url = dataset_url_list[prj_type.value]
+        if isinstance(data['prj_type'], str):
+            from .dataset.operate import dataset_url_dict
+            url = dataset_url_dict[data['prj_type']]
+        else:
+            from .dataset.operate import dataset_url_list
+            url = dataset_url_list[prj_type.value]
         fname = osp.split(url)[-1] + "_tmp"
         fullname = osp.join(target_path, fname)
         total_size = int(message)