快速开始

环境依赖

  • paddlepaddle-gpu/paddlepaddle
  • paddlex
  • pycocotools

服务端启动PaddleX RESTful服务

 paddlex_restful --start_restful --port [端口号] --workspace_dir [工作空间目录]

客户端请求服务端

import requests
url = "https://127.0.0.1:5000"
  • url为实际服务端ip与端口
  • 所有的请求,通过ret.status_code是否为200,判断是否正确给Server执行
  • 在status_code为200的前提下,如果ret.json()[’status’]为-1,则表明出错,出错信息在ret.json()[’message’]里面,如果执行成功, status是1

创建一个PaddleX的训练任务

下面介绍如何通过API完成模型的训练、评估、预测与导出,对于每个RESTful API的详细介绍请参考API 接口文档,对于示例中用到自定的数据结构请参考数据结构

流程

对于通过RESTful API创建一个PaddleX的训练任务的主要流程如下

  • 1):创建并导入数据集
  • 2):创建项目并绑定数据集
  • 3):获取参数并创建任务
  • 4):开始训练
  • 5):评估任务
  • 6):导出模型

数据集操作

创建数据集

# dataset_type: 支持"detection"/"classification"/"segmentation"/"instance_segmentation"
params = {"name": "我的第一个数据集", "desc": "这里是数据集的描述文字", "dataset_type": "detection"}  
ret = requests.post(url+"/dataset", json=params)  
#获取数据集id
did = ret.json()['id']

导入数据集

# 导入数据集
params = {'did' : did, 'path' : '/path/to/dataset'}
ret = requests.put(url+"/dataset", json=params)

# 数据集导入是一个异步操作,可以通过不断发送请求,获取导入的状态
params = {"did": did}
ret = requests.get(url+"/dataset", json=params)
#导入状态获取,其中DatasetStatus为自定义枚举标量,用来表示数据集的状态,具体定义请参考数据结构部分
import_status = DatasetStatus(ret.json['dataset_status'])
if import_status == DatasetStatus.XCOPYDONE:
    print("数据集导入成功")
elif import_status == DatasetStatus.XCOPYING:
    print("数据集正在导入中")
elif import_status == DatasetStatus.XCHECKFAIL:
    print("数据集格式校验未通过,请确定数据集格式是否正确)

切分数据集

# 当数据集导入成功后,可以对数据集进行切分
# 切分数据集按照训练集、验证集、测试集为:6:2:2的形式切分
params = {'did' : did, 'val_split' : 0.2 , 'test_split' : 0.2}
ret = requests.put(url+"/dataset/split', json=params)

#切分数据集后需要获取具体切分情况
params = {'did': did}  
ret = requests.get(url+"/dataset/details', json=params)  
#获取切分情况
dataset_details = ret.json()

项目操作

创建项目

# project_type: 支持detection/classification/segmentation/instance_segmentation
params = {'name': '项目名称', 'desc': '项目描述文字', 'project_type' : 'detection'}
ret = requests.post(url+'/project', json=params)
# 获取项目id
pid = ret.json['pid']

绑定数据集

# 修改project中的did属性
# struct支持 project/dataset/task
params = {'struct': 'project', 'id': pid, 'attr_dict': {'did':did}}
ret = requests.put(url+'/workspace', json=params)

获取训练默认参数

params = {"pid", "P0001"}
ret = requests.get(url+"/project/task/parmas", json=params)
#获取默认训练参数
train_params = ret.json()['train']

任务操作

创建任务

#将训练参数json化
params_json = json.dumps(train_params)
#创建任务
params = {'pid': 'P0001', 'train':params_json}
ret = requests.post(url+'/task', json=params)
#获取任务id
tid = ret.json()['tid']

启动训练任务

params = {'tid' : tid}
ret = requests.post(url+'/project/task/train', json=params)

#训练任务是一个后台异步操作,可通过如下操作,获取任务训练的最新状态
params = {'tid' : 'T0001', 'type': 'train'}
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)