wangsiyuan06 5 éve
szülő
commit
80531eda30

+ 0 - 0
docs/restful/data_struct.md → docs/gui/data_struct.md


+ 0 - 0
docs/restful/img/classify_help.jpg → docs/gui/img/classify_help.jpg


+ 0 - 0
docs/restful/img/detect_help.jpg → docs/gui/img/detect_help.jpg


+ 0 - 0
docs/restful/img/framework.png → docs/gui/img/framework.png


+ 0 - 0
docs/restful/img/ins_seg_help.jpg → docs/gui/img/ins_seg_help.jpg


+ 0 - 0
docs/restful/img/restful_api.png → docs/gui/img/restful_api.png


+ 0 - 0
docs/restful/img/seg_help.jpg → docs/gui/img/seg_help.jpg


+ 33 - 0
docs/gui/index.rst

@@ -57,3 +57,36 @@ PaddleX GUI覆盖深度学习模型开发必经的 **数据处理** 、 **超参
 * 官方QQ用户群: 1045148026  
 * GitHub Issue反馈: http://www.github.com/PaddlePaddle/PaddleX/issues
 
+
+PaddleX RESTful
+=======================================
+
+PaddleX RESTful是基于PaddleX开发的RESTful API。
+
+目前对于开发者来说通过如下指令启动PaddleX RESTful服务,开启RESTful服务后可以通过下载Remote版本的GUI连接开启RESTful服务的服务端完成深度学习全流程开发。
+
+同样您还可以根据RESTful API来开发自己的可视化界面。
+
+**paddlex --start_restful --port [端口号] --workspace_dir [工作空间地址]**
+
+PaddleX Remote GUI
+---------------------------------------
+
+PaddleX Remote GUI是针对PaddleX RESTful开发的可视化客服端。开发者可以通过客服端连接开启RESTful服务的服务端,通过GUI实现深度学习全流程:**数据处理** 、 **超参配置** 、 **模型训练及优化** 、 **模型发布**,无需开发一行代码,即可得到高性深度学习推理模型。
+
+
+
+PaddleX RESTful API 二次开发
+---------------------------------------
+
+开发者可以使用PaddleX RESTful API 进行二次开发,按照自己的需求开发可视化界面,详细请参考以下文档
+
+.. toctree::
+   :maxdepth: 2
+   :caption: 文档目录
+
+   introduction_restful.md
+   quick_start.md
+   restful_api.md
+   data_struct.md
+   tree.md

+ 0 - 0
docs/restful/introduction.md → docs/gui/introduction_restful.md


+ 86 - 1
docs/restful/quick_start.md → docs/gui/quick_start.md

@@ -29,7 +29,8 @@ url = "https://127.0.0.1:5000"
 - 2):创建项目并绑定数据集
 - 3):获取参数并创建任务
 - 4):开始训练
-
+- 5):评估任务
+- 6):导出模型
 
 
 ### 数据集操作
@@ -129,9 +130,93 @@ ret = requests.get(url+'/project/task/metrics', json=params)
 ret.json()获取返回值:
 {'status': 1, 'train_log': 训练日志}
 ```
+
 ### 停止训练任务
 通过如下操作,停止正在训练的任务
 ```
 params = {'tid': tid, 'act': 'stop'}
 ret = requests.put(url+'/project/task/train', json=params)
 ```
+
+### 获取训练任务信息
+```
+params = {'tid': tid, 'type': 'train'}
+ret = requests.get(url+'/project/task/metrics', json=params)
+#任务训练信息
+train_log = ret.json()['train_log']
+```
+
+### 创建一个评估任务,并获取评估结果
+```
+#获取任务状态
+params = {'tid': tid}
+ret = requests.get(url+'/project/task', json=params)
+#判断是否训练完成
+if TaskStatus(ret.json()['task_status']) == TaskStatus.XTRAINDONE:
+    #创建一个评估任务,可以指定score_thresh
+    params = {'tid': tid, 'score_thresh', 0.3}
+    ret = requests.post(url+'/project/task/evaluate', json=params)
+#获取评估任务状态
+import time
+while:
+    params = {'tid': tid}
+    ret = requests.get(url+'/project/task/evaluate', json=params)
+    #判断是否评估完成
+    if TaskStatus(ret.json()['evaluate_status']) == TaskStatus.XEVALUATED:
+        break
+    else:
+        time.sleep(1)
+#获取评估结果
+result = ret.json()['result']
+```
+
+### 使用模型进行预测
+
+```
+import cv2
+import numpy as np
+#预测图片路径
+img_path = '/path/to/img'
+params = dict()
+#base64编码
+with open(img_path, 'rb') as f:
+    base64_data = base64.b64encode(f.read())
+    base64_str = str(base64_data,'utf-8')
+    params['image_data'] = base64_str
+params['tid'] = tid
+#单张推理
+ret = requests.post(url + 'project/task/predict', json=params)
+#获取结果保存地址
+result_path = ret.json()['path']
+#判断是否预测完成
+while:
+    params = {'tid': tid}
+    ret = requests.get(url+'/project/task/predict', json=params)
+    #判断是否评估完成
+    if PredictStatus(ret.json()['predict_status']) == PredictStatus.XPREDONE:
+        break
+    else:
+        time.sleep(1)
+# 获取结果
+params = {'path' : result_path}
+ret = requests.get(url+'/file', json=params)
+#图片based64数据
+img_data = ret.json()['img_data']
+#转换为numpy数据
+img_data = base64.b64decode(img_data)
+img_array = np.frombuffer(img_data, np.uint8)
+img = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR)
+```
+
+### 导出inference模型
+
+```
+#导出inference模型
+#保存地址
+save_dir = '/path/to/save/inference/model'
+params = {'tid': tid ,'type': 'inference', 'save_dir' : save_dir}
+ret = requests.post(url+'/project/task/export', json=params)
+#workspace创建inference模型信息
+params = {'pid' : pid, 'tid': tid, 'name': 'my_inference_model', 'type': 'exported', 'path' : save_dir, 'exported_type': 0}
+ret = requests.post(url+'/model', json=params)
+```

+ 134 - 33
docs/restful/restful_api.md → docs/gui/restful_api.md

@@ -20,6 +20,11 @@
 
 
 ### /workspace [GET,PUT]
+主要是对工作空间的结构化信息进行操作,包括修改合和获取工作空间中数据集、项目、任务的属性
+- GET请求:获取workspace中数据集、项目、任务、模型的属性
+- PUT请求:修改workspace中数据集、项目、任务、模型的属性,对于创建项目之后我们需求通过该接口将数据集与项目绑定才能进行训练任务
+对于可以获取和修改的属性请参考[Protobuf结构化数据](./data_struct.md#Protobuf结构化数据)  
+
 ```
 methods=='GET':获取工作目录中项目、数据集、任务的属性
 	Args:
@@ -55,11 +60,18 @@ methods=='PUT':修改工作目录中项目、数据集、任务的属性
 		params = {'struct': 'project', 'id': 'P0001', 'attr_dict': attr_dict}
 		ret = requests.post(url + '/workspace', json=params)
 ```
-**说明:对于可以获取和修改的属性请参考[Protobuf结构化数据](./data_struct.md#Protobuf结构化数据)**
+
 
 
 
 ### /dataset
+对数据集进行操作,包括创建、导入、查询、删除数据集的功能
+- POST请求:创建数据集,创建时需要指定数据集类型可以是['classification', 'detection', 'segmentation','instance_segmentation']中的一种
+- GET请求:创建好数据集后,可以通过GET请求获取数据集信息,目前支持获取单个或者所有数据集的信息
+- PUT请求:导入数据集,创建数据集后并没有真实的数据与数据集关联,需要通过导入功能,将数据导入到工作空间内,需要导入的数据集必须按照
+- DELETE:删除一个数据集  
+DatasetStatus定义了数据集状态,具体请参考[数据集状态变量](./data_struct.md#状态枚举变量)  
+
 methods = [GET,POST,PUT,DELETE]
 ```
 methods=='GET':获取所有数据集或者单个数据集的信息
@@ -116,7 +128,7 @@ methods=='POST':创建一个新的数据集
 	Args:
 		name(str):数据集名字
 		desc(str):数据集描述
-		dataset_type(str):数据集类型,可以是['classification', 'detection', 'segmentation','instance_segmentation','remote_segmentation']
+		dataset_type(str):数据集类型,可以是['classification', 'detection', 'segmentation','instance_segmentation']
 	Return:
 		did(str):数据集id
 		status
@@ -149,7 +161,26 @@ methods=='DELETE':删除已有的某个数据集
 		ret = requests.delete(url + '/dataset', json=params)
 ```
 
+### /dataset/split [PUT]
+按照比例切分一个已经导入数据的数据集  
+
+```
+methods=='PUT':切分某个数据集
+	Args:
+		did(str):数据集id
+		val_split(float): 验证集比例
+		test_split(float): 测试集比例
+	Return:
+		status
+	Example:
+		#按照训练集,验证集,测试集,7:2:1的形式切分D0001数据集
+		params = {'did':'D0001', 'val_split': 0.2, 'test_split': 0.1}
+		ret = requests.put(url + '/dataset/split', json=params)
+```
+
 ### /dataset/details [GET]
+获取切分后数据集的具体信息  
+
 ```
 methods=='GET':获取某个数据集的详细信息
 	Args:
@@ -164,33 +195,22 @@ methods=='GET':获取某个数据集的详细信息
 	Ruturn中的自定数据结构:
 		数据集详细信息(details),其中的key包括如下:
 		details{
-			'file_info'(dict): 全量数据集文件与标签映射表,
-			'label_info'(dict): 标签与全量数据集文件映射表,
-			'labels'(list): 标签列表,
-			'train_files'(list): 训练集文件列表,
-			'val_files'(list): 验证集文件列表,
-			'test_files'(list): 测试集文件列表
+			'file_info'(dict): 全量数据集文件与标签映射表,key:图片相对于数据集地址的相对路径;value:标签文件相对于数据集地址的相对路径
+			'label_info'(dict): 标签与全量数据集文件映射表,key:标签的类别;value:标签文件相对于数据集地址的相对路径
+			'labels'(list): 标签列表
+			'train_files'(list): 训练集文件列表,相对于据集地址的相对路径
+			'val_files'(list): 验证集文件列表,相对于据集地址的相对路径
+			'test_files'(list): 测试集文件列表,相对于据集地址的相对路径
+			'class_train_file_list(dict)':类别与训练集映射表,key为类别、value为训练图片相对于据集地址的相对路径
+			'class_val_file_list(dict)':类别与评估集映射表,key为类别、value为评估图片相对于据集地址的相对路径
 		}
 ```
 
-### /dataset/split [PUT]
-```
-methods=='PUT':切分某个数据集
-	Args:
-		did(str):数据集id
-		val_split(float): 验证集比例
-		test_split(float): 测试集比例
-	Return:
-		status
-	Example:
-		#按照训练集,验证集,测试集,7:2:1的形式切分D0001数据集
-		params = {'did':'D0001', 'val_split': 0.2, 'test_split': 0.1}
-		ret = requests.put(url + '/dataset/split', json=params)
-```
-
 ### /file [GET]
+#用于文件传输,目前支持图片、xml格式文件、log或者txt格式文件,对于图片文件如果带有did参数则会返回带可视化label的图片数据  
+
 ```
-methods=='GET':获取服务端的文件,目前支持图片、xml格式文件
+methods=='GET':获取服务端的文件,目前支持图片、xml格式文件、log文件
 	Args:
 		'path'(str):文件在服务端的路径
 		'did'(str, optional):可选,数据集id仅在文件为图片时有效。若存在返回图片带label可视化。注意当前不支持分类数据集数据的标注可视化
@@ -200,7 +220,7 @@ methods=='GET':获取服务端的文件,目前支持图片、xml格式文件
 		status
 		#数据为xml文件
 		ret:数据流
-		#数据为log文件
+		#数据为log或者txt文件
 		ret:json数据
 	Example1:
 		#获取图片,目前支持的图片格式有:
@@ -225,6 +245,11 @@ methods=='GET':获取服务端的文件,目前支持图片、xml格式文件
 ```
 
 ### /project [GET,POST,DELETE]
+项目相关操作,包括创建、删除、查询项目
+- POST请求:创建一个项目,支持分类、检测、语义分割、实例分割
+- GET请求:查询已经创建项目中的信息,可以是单个项目或者是所有项目
+- DELETE:删除一个项目,同时会删除项目里面所有task  
+
 ```
 methods=='GET':获取指定项目id的信息
 	Args:
@@ -242,6 +267,22 @@ methods=='GET':获取指定项目id的信息
 	Example2:
 		#获取所有项目信息
 		ret = requests.get(url + '/project', json=params)
+	Ruturn中的自定数据结构:
+		单个项目属性attr(dict){
+			id(str):项目id,
+			name(str):项目名字,
+			desc(str):项目描述,
+			type(str):项目类型,
+			did(str):项目绑定的数据集id,
+			path(str):项目在服务端的路径,
+			create_time(str):项目创建时间,
+			tasks(list):项目中包含所有任务的任务状态变量的int值
+		}
+		多个项目的属性projects(list),对于list里面每一个元素表示了单个项目属性的字典project其数据结构如下
+		project(dict){
+			id(str):项目id,
+			attr(dict):项目属性字典,与单个项目属性一致
+		}
 
 methods=='POST':创建一个项目
 	Args:
@@ -252,8 +293,8 @@ methods=='POST':创建一个项目
 		pid(str):项目id
 		status
 	Example:
-		#创建一个新的项目,project_type支持{'classification', 'detection', 'segmentation', 'instance_segmentation', 'remote_segmentation')}
-		params = {'name' : '分类项目','desc': '一个新的项目',project_type}
+		#创建一个新的项目,project_type支持{'classification', 'detection', 'segmentation', 'instance_segmentation'}
+		params = {'name' : '分类项目','desc': '一个新的项目','project_type' : 'classification'}
 		ret = requests.post(url + '/project', json=params)
 		#获取项目id
 		pid = ret.json()['pid']
@@ -270,6 +311,12 @@ methods=='DELETE':删除一个项目,以及项目相关的task
 ```
 
 ### /project/task [GET,POST,DELETE]
+任务相关,创建、获取、删除任务
+- POST请求:创建一个任务可以是训练任务也可以是剪裁任务,剪裁任务需要指定parent_id
+- GET请求: 获取单个任务、单个项目内所有任务、所有任务的信息,当tid存在时返回指定任务的信息,如果任务状态(TaskStatus)显示任务停止可以通过resume查询任务是否可以恢复训练以及保存的最大epoch;当pid存在时返回该项目下面所有任务信息
+- DELETE请求:删除任务  
+TaskStatus定义了任务状态,具体请参考[任务状态变量](./data_struct.md#状态枚举变量)  
+
 ```
 methods=='GET':#获取某个任务的信息或者所有任务的信息
 	Args:
@@ -321,6 +368,10 @@ methods=='DELETE':#删除任务
 ```
 
 ### /project/task/params [GET,POST]
+获取和设置训练参数
+- GET请求:获取已有的参数信息或者默认的参数信息,当tid存在时获取该任务已有的参数信息、当pid存在时获取该项目的推荐参数给该任务,在创建任务之前需要先获取默认参数
+- POST请求:设置训练参数,用户修改训练参数后通过该接口设置训练参数,在workspace内会将训练参数保存为params.pkl文件  
+
 ```
 methods=='GET':#获取任务id对应的参数,或者获取项目默认参数
 	Args:
@@ -356,6 +407,10 @@ methods=='POST':#设置任务参数,将前端用户设置训练参数dict保
 ```
 
 ### /project/task/train [POST,PUT]
+任务训练(包括剪裁任务训练),主要是启动和停止任务,需要先设置好训练参数
+-POST请求:启动一个训练任务,异步操作,启动前需要设置好训练的参数
+-PUT请求:暂停一个训练任务或者重启一个暂停的训练任务,重启训练任务可以设置重启的epoch数  
+
 ```
 methods=='POST':#异步,启动训练或者裁剪任务
 	Args:
@@ -382,25 +437,31 @@ methods=='PUT':#改变任务训练的状态,即终止训练或者恢复训练
 ```
 
 ### /project/task/prune [GET,POST,PUT]
+创建、获取、停止剪裁任务分析;在启动剪裁任务训练之前需要通过此接口完成剪裁任务分析
+- GET请求:获取剪裁任务状态信息
+- POST请求:创建剪裁分析任务,异步操作
+- PUT请求:停止正在进行的剪裁分析任务  
+PruneStatus定义了裁剪分析任务状态,具体请参考[裁剪分析状态变量](./data_struct.md#状态枚举变量)  
+
 ```
-methods=='GET':#获取裁剪任务的状态
+methods=='GET':#获取剪任务的状态
 	Args:
 		tid(str):任务id
 	Return:
-		prune_status(int): 裁剪任务状态(PruneStatus)枚举变量的值
+		prune_status(int): 剪任务状态(PruneStatus)枚举变量的值
 		status
 	Example:
 		#启动任务id为T0001的任务的训练
 		params = {'tid':'T0001'}
 		ret = requests.get(url + '/project/task/prune',json=params)
 
-methods=='POST':#异步,创建一个剪分析,对于启动剪任务前需要先启动剪分析
+methods=='POST':#异步,创建一个剪分析,对于启动剪任务前需要先启动剪分析
 	Args:
 		tid(str):任务id
 	Return:
 		status
 	Example:
-		#对任务id为T0001的任务启动剪分析任务
+		#对任务id为T0001的任务启动剪分析任务
 		params = {'tid':'T0001'}
 		ret = requests.post(url + '/project/task/prune',json=params)
 
@@ -417,6 +478,10 @@ methods=='PUT':#改变裁剪分析任务的状态
 ```
 
 ### /project/task/evaluate [GET,POST]
+创建、获取一个评估任务
+- POST请求:创建一个评估任务,需要模型训练好后调用,异步操作
+- GET请求: 获取评估任务的状态  
+
 ```
 methods=='GET':#获取模型评估的结果
 	Args:
@@ -448,6 +513,9 @@ methods=='POST':#异步,创建一个评估任务
 ```
 
 ### /project/task/metrics [GET]
+获取训练、评估、剪裁的日志和敏感度与模型裁剪率关系图
+- GET请求:通过type来确定需要获取的内容  
+
 ```
 methods=='GET':#获取日志数据
 	Args:
@@ -467,9 +535,24 @@ methods=='GET':#获取日志数据
 		#获取训练日志
 		paramas = {'tid': 'T0002', 'type': 'train'}
 		ret = requests.get(url + '/project/task/metrics',json=params)
+	Ruturn中的自定数据结构:
+		train_log(dict){
+			eta: 剩余时间,
+			train_metrics: 训练指标,
+			eval_metircs: 评估指标,
+			download_status: 下载模型状态,
+			eval_done: 是否已保存模型,
+			train_error: 训练错误原因
+		}
 ```
 
 ### /project/task/predict [GET, POST]
+创建、查询、停止一个预测任务
+- POST请求:创建一个预测任务、图片输入需要先进行base64编码、异步操作
+- GET请求:获取预测任务的状态
+- PUT请求:停止一个预测任务
+PredictStatus定义了预测任务状态变量,具体请参考[预测任务状态变量](./data_struct.md#状态枚举变量)  
+
 ```
 methods=='GET':#获取预测状态
 	Args:
@@ -516,7 +599,7 @@ methods=='POST':#创建预测任务,目前仅支持单张图片的预测
 			ret = requests.get(url + '/file',json=params)
 			img_data = ret.json()['img_data']
 
-methods=='PUT':#创建预测任务,目前仅支持单张图片的预测
+methods=='PUT':#停止一个预测任务
 	Args:
 		tid(str):任务id
 	Return:
@@ -525,6 +608,10 @@ methods=='PUT':#创建预测任务,目前仅支持单张图片的预测
 ```
 
 ### /project/task/export [GET,POST,PUT]
+创建、获取、停止模型装换或者导出、支持导出inference和lite的模型
+- POST请求:创建模型导出,可以通过type确定导出inference模型还是lite模型
+- GET请求:获取导出的结果日志、或者时导出状态
+- PUT请求:停止模型的导出  
 
 ```
 methods=='GET':#获取导出模型的状态
@@ -576,6 +663,9 @@ methods=='PUT':#停止导出模型
 ```
 
 ### /project/task/vdl [GET]
+打开任务的可视化分析工具(VisualDL)  
+- GET请求:打开任务的vdl  
+
 ```
 methods=='GET':#打开某个任务的可视化分析工具(VisualDL)
 	Args:
@@ -591,7 +681,9 @@ methods=='GET':#打开某个任务的可视化分析工具(VisualDL)
 		url = ret.json()['url']
 ```
 
-### /system [GET,DELETE]
+### /system [GET]
+获取系统信息包括CPU、GPU信息
+- GET请求:获取系统信息、在paddlex启动restful时会自行调用此api、若需要使用GPU请确定已经安装好了pycuda包
 ```
 methods=='GET':#获取系统GPU、CPU信息
 	Args:
@@ -626,6 +718,11 @@ info={
 ```
 
 ### /demo [GET,POST,PUT]
+创建、获取、删除demo项目,
+- GET请求: 获取demo下载的进度
+- POST请求: 下载和载入demo项目
+- PUT请求: 停止下载demo项目  
+
 ```
 methods=='GET':#获取demo下载进度
 	Args:
@@ -673,6 +770,10 @@ methods=='PUT':#停止下载或创建demo工程
 ```
 
 ### /model [GET,POST,DELETE]
+- GET请求: 获取所有或者单个模型的信息,可以是预训练模型或者inference模型
+- POST请求: 在workspace中创建模型,对于inference模型需要先通过/project/task/export接口现在导出inference模型
+- DELETE请求: 删除一个模型
+
 ```
 methods=='GET':#获取一个或者所有模型的信息
 	Args:

+ 6 - 4
docs/restful/tree.md → docs/gui/tree.md

@@ -13,8 +13,8 @@ restful
 | |____seg_dataset.py	// 分割数据集
 | |____cls_dataset.py	// 分类数据集
 | |____dataset.py	// 处理/dataset 请求
-| |____operate.py	// 操作函数
-| |____utils.py		// 工具函数
+| |____operate.py	// 数据集基础操作函数
+| |____utils.py		// 数据集基础工具函数
 | |____ins_seg_dataset.py	// 示例分割数据集
 | |____det_dataset.py	// 检测数据集
 |______init__.py
@@ -23,7 +23,7 @@ restful
 | |____task.py	// 处理/project/task 请求
 | |______init__.py
 | |____visualize.py	// 数据可视化
-| |____operate.py	// 操作函数
+| |____operate.py	// 任务基础操作函数
 | |____evaluate		// 模型评估
 | | |____detection.py	// 检测模型评估
 | | |____classification.py	// 分类模型评估
@@ -43,11 +43,13 @@ restful
 | | |______init__.py
 | | |____segmentation.py	// 分割模型剪裁
 | |____project.py	// 处理/project请求
-|____utils.py	// 工具函数
+|____utils.py	// 基础工具函数
 |____app.py	// 创建flask app
 |____front_demo	// 前端demo
 |____workspace.py	// 处理/workspace请求
 |____demo.py	// 处理/demo 请求
 |____workspace.proto	// workspace 结构化信息
+|____frontend_demo // 前端demo
+| |____paddlex_restful_demo.html    //前端demo文件
 
 ```

+ 6 - 0
docs/index.rst

@@ -74,6 +74,12 @@ PaddleX是基于飞桨核心框架、开发套件和工具组件的深度学习
    gui/download.md
    gui/how_to_use.md
    gui/FAQ.md
+   gui/introduction_restful.md
+   gui/quick_start.md
+   gui/restful_api.md
+   gui/data_struct.md
+   gui/tree.md
+
 
 .. toctree::
    :maxdepth: 1

+ 0 - 0
docs/restful/download.md


+ 0 - 37
docs/restful/index.rst

@@ -1,37 +0,0 @@
-PaddleX RESTful
-=======================================
-
-PaddleX RESTful是基于PaddleX开发的RESTful API。
-
-目前对于开发者来说通过如下指令启动PaddleX RESTful服务,开启RESTful服务后可以通过官网下载Remote版本的GUI连接开启RESTful服务的服务端完成深度学习全流程开发。
-
-同样您还可以根据RESTful API来开发自己的可视化界面。
-
-**paddlex --start_restful --port [端口号] --workspace_dir [工作空间地址]**
-
-PaddleX Remote GUI
----------------------------------------
-
-PaddleX Remote GUI是针对PaddleX RESTful开发的可视化客服端。开发者可以通过客服端连接开启RESTful服务的服务端,通过GUI实现深度学习全流程:**数据处理** 、 **超参配置** 、 **模型训练及优化** 、 **模型发布**,无需开发一行代码,即可得到高性深度学习推理模型。
-
-.. toctree::
-   :maxdepth: 2
-   :caption: 文档目录
-
-   download.md
-
-
-PaddleX RESTful API 二次开发
----------------------------------------
-
-开发者可以使用PaddleX RESTful API 进行二次开发,按照自己的需求开发可视化界面,详细请参考以下文档
-
-.. toctree::
-   :maxdepth: 2
-   :caption: 文档目录
-
-   introduction.md
-   quick_start.md
-   restful_api.md
-   data_struct.md
-   tree.md

+ 0 - 4
docs/restful/requirements.txt

@@ -1,4 +0,0 @@
-sphinx
-recommonmark
-sphinx_markdown_tables
-sphinx_rtd_theme

+ 61 - 0
paddlex/restful/README.md

@@ -0,0 +1,61 @@
+# RESTful API
+本目录为PaddleX RESTful API的代码,使用教程请参考
+- [简介](../../docs/gui/introduction_restful.md)
+- [快速开始](../../docs/gui/quick_start.md)
+- [api详细介绍](../../docs/gui/restful_api.md)
+- [自定义数据结构](../../docs/gui/data_struct.md)
+
+## 文档目录结构
+
+
+```
+restful
+|____system.py	// 处理/system 请求
+|____workspace_pb2.py
+|____dir.py
+|____dataset	// 数据集相关
+| |____datasetbase.py	// 数据集基类
+| |______init__.py
+| |____seg_dataset.py	// 分割数据集
+| |____cls_dataset.py	// 分类数据集
+| |____dataset.py	// 处理/dataset 请求
+| |____operate.py	// 数据集基础操作函数
+| |____utils.py		// 数据集基础工具函数
+| |____ins_seg_dataset.py	// 示例分割数据集
+| |____det_dataset.py	// 检测数据集
+|______init__.py
+|____model.py	// 处理/model 请求
+|____project	// 项目相关
+| |____task.py	// 处理/project/task 请求
+| |______init__.py
+| |____visualize.py	// 数据可视化
+| |____operate.py	// 任务基础操作函数
+| |____evaluate		// 模型评估
+| | |____detection.py	// 检测模型评估
+| | |____classification.py	// 分类模型评估
+| | |______init__.py
+| | |____draw_pred_result.py	// 评估与预测结果可视化
+| | |____segmentation.py	// 分割模型评估
+| |____train	//模型训练
+| | |____detection.py	// 检测模型训练
+| | |____params.py	// 模型参数
+| | |____classification.py	// 分类模型训练
+| | |______init__.py
+| | |____params_v2.py	// 模型参数V2版本
+| | |____segmentation.py	// 分割模型训练
+| |____prune	// 模型剪裁
+| | |____detection.py	// 检测模型剪裁
+| | |____classification.py	// 分类模型剪裁
+| | |______init__.py
+| | |____segmentation.py	// 分割模型剪裁
+| |____project.py	// 处理/project请求
+|____utils.py	// 基础工具函数
+|____app.py	// 创建flask app
+|____front_demo	// 前端demo
+|____workspace.py	// 处理/workspace请求
+|____demo.py	// 处理/demo 请求
+|____workspace.proto	// workspace 结构化信息
+|____frontend_demo // 前端demo
+| |____paddlex_restful_demo.html    //前端demo文件
+
+```

+ 5 - 3
paddlex/restful/project/operate.py

@@ -471,9 +471,11 @@ def get_task_max_saved_epochs(task_path):
     saved_epoch_num = -1
     output_path = osp.join(task_path, "output")
     if osp.exists(output_path):
-        for file in os.listdir(output_path):
-            if file.startswith("epoch_"):
-                curr_epoch_num = int(file[6:])
+        for f in os.listdir(output_path):
+            if f.startswith("epoch_"):
+                if not osp.exists(osp.join(output_path, f, '.success')):
+                    continue
+                curr_epoch_num = int(f[6:])
                 if curr_epoch_num > saved_epoch_num:
                     saved_epoch_num = curr_epoch_num
     return saved_epoch_num

+ 1 - 1
paddlex/restful/project/task.py

@@ -731,7 +731,7 @@ def export_lite_model(data, workspace):
     if not osp.exists(osp.join(save_dir, "model.nb")):
         if osp.exists(save_dir):
             shutil.rmtree(save_dir)
-        return {'status': -1, 'message': "导出为lite模型失败,Ubuntu下请保证 gcc版本 >= 5.0"}
+        return {'status': -1, 'message': "导出为lite模型失败"}
     return {'status': 1, 'message': "完成"}