Productai

自定义标注服务

用户上传一组标注好的数据到服务。该服务使用该数据训练一个模型。并使用该模型提供API来完成图片标注工作。

注:目前,该服务只支持中国大陆(区域列表请参考这里)。如其它地区有需求,请联系客户经理或邮件联系我们。

概念介绍

每一个自定义标注服务由两部分组成:

  • 训练,用户上传标签和数据完成模型训练过程。在数据没有发生变化时,该过程只执行一次,耗时较长
  • 推理(或称为预测),使用训练出的模型,对上传的每张图片完成推理(或称为预测),返回标签

根据推理时输出结果不同,自定义标注服务分为如下几个类别:

类别训练数据推理(或预测)结果示例
单标签分类器(classifier)一组自定义标签,一组图片作为训练数据,每张图片都有一个对应的标签接受一张图片,返回预定义标签中的一个标签,该标签应符合图片中所含语义识别“猫和狗”的自定义标注服务
dog
返回标签dog
cat
返回标签cat

使用示例

目前ProductAI仅支持单标签分类器自定义训练服务。本节重点描述标签定义和训练数据选择原则。标签定义的好坏以及训练数据质量,对最终模型的准确度起到决定性作用。

室内/室外分类器

定制一个用于区分室内和室外两类图片的分类器。

标签定义

根据使用场景需求,确定该自定义标注服务需要有两个标签:indoor和outdoor。通常来说,对于自定义标签定义的要求如下:

  • 标签间的语义区别应该足够大。如:室内和室外,在人类通识中有明确的区别,是一组很好的自定义标签;花园和庭院,则本身语义间有重叠性,没有明确划分界限,不建议同时存在于标签集合中进行训练
  • 标签视觉特征区别应该足够大。如:连翘和迎春花,虽然在植物学上有明确的区分,但从视觉上极易混淆,故训练精准度难以保障
  • 因为自定义标注服务,为每张图打且仅打一个标签。故应避免在训练和实际使用时,图片包含标签中的多个。如:训练一组区分动物的标签(含:猫,狗,狮子,老虎等),则应避免使用同时包含猫,狗,狮子,老虎等多个动物种类的图片进行训练和实际使用
  • 如果所有标签表达的语义不能覆盖实际使用中图片语义。建议增加一个“其他”标签予以区分。如:柯基犬/哈士奇/萨摩耶,这三个标签作为自定义标签集合,因为无法覆盖全部犬类图片,建议增加“其他”标签。但是如果有足够多的犬种类标签,可以覆盖大部分犬类图片,则无需增加“其他”标签

训练数据选择

为每个标签准备一组训练数据。对训练数据要求如下:

  • 数量越多,训练出的模型精准度越好。但同时训练时间会更长
  • 数据越丰富,即图片能覆盖该标签应该蕴含的各种语义情况。如:餐厅,教室,体育馆,室内的床,古堡内部,暗色调室内图等都符合indoor语义,最好都包含进训练数据
自定义标签训练数据示例图片
indoor请参见搜索引擎indoor结果
outdoor请参见搜索引擎outdoor结果

训练数据集

训练数据集是一组图片数据,每张图片附带一个标签。

创建训练集

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api()
resp = api.create_training_set(name=SET_NAME, description=SET_DESC)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->createTrainingSet($name=SET_NAME, ["description" => SET_DESC]);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.*;
import cn.productai.apiv2.impl.*;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.create("NAME", "DESC");
System.out.println(result);
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-H 'Content-Type: application/json' \
-d '{"name": "SET_NAME", "description": "SET_DESC"}' \
https://api.productai.cn/custom_training/_0000194/training_sets

输入参数

参数名称类型说明必选限制
name字符串训练数据集名称最多16个unicode字符,超长的部分会被自动截断
description字符串训练数据集描述信息最多128个unicode字符,超长的部分会被自动截断

输出结果

HTTP状态码 200
{
"created_at": "2018-05-23T04:48:07Z",
"creator_id": ...,
"description": "ts100",
"id": "085ffdpo",
"modified_at": "2018-05-23T04:48:07Z",
"n_downloaded": 0,
"n_failed": 0,
"n_items": 0,
"name": "ts100",
"request_id": "7cab5d0c-5e44-11e8-b9eb-6a95ff447c19",
"status": "not-downloaded"
}
结果字段类型说明
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析
created_at字符串创建UTC时间,精确到秒,格式为:年-月-日T小时:分钟:秒Z
creator_id整数创建者ID
description字符串训练数据集的描述信息
id字符串训练数据集唯一ID,后续操作都需要使用此ID完成
modified_at字符串最后修改UTC时间,精确到秒,格式为:年-月-日T小时:分钟:秒Z
n_downloaded整数训练数据集中下载完毕的图片数
n_failed整数训练数据集中下载失败的图片数
n_items整数训练数据集图片总数
name字符串训练数据集名称
status字符串目前训练数据集状态。没有任何图片被下载完毕,是not-downloaded。如果有部分图片被下载完毕,部分没有被下载完毕,是downloading。如果所有图片都被下载完毕,或者下载失败,是downloaded。
HTTP状态码 非200
{
"error_code": 5004,
"message": "Name Should Not Be Empty.",
"request_id": "e00b8a7a-5e62-11e8-8cb4-d680a9823a64"
}
结果字段类型说明
error_code整数错误代码
message字符串详细错误信息
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

错误信息

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4005004训练集的名称或描述为空值
4033002TrainingSet的数量已达最大限制数量

获取所有训练集信息

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api()
resp = api.list_training_sets()
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->listTrainingSets();
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.listAll();
System.out.println(result);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/custom_training/_0000194/training_sets

输入参数

N/a

输出结果

{
"request_id": "ff126524-5e44-11e8-a528-d6abcabd1965",
"results": [
{
"created_at": "2018-05-23T04:48:08Z",
"creator_id": ...,
"description": "ts100",
"id": "085ffdpo",
"modified_at": "2018-05-23T04:48:08Z",
"n_downloaded": 0,
"n_failed": 0,
"n_items": 0,
"name": "ts100",
"status": "not-downloaded"
}
]
}
结果字段类型说明
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析
results数组训练数据集列表,每个元素字段描述参见results元素字段描述

results元素字段描述

结果字段类型说明
created_at字符串创建UTC时间,精确到秒,格式为:年-月-日T小时:分钟:秒Z
creator_id整数创建者ID
description字符串训练数据集的描述信息
id字符串训练数据集唯一ID,后续操作都需要使用此ID完成
modified_at字符串最后修改UTC时间,精确到秒,格式为:年-月-日T小时:分钟:秒Z
n_downloaded整数训练数据集中下载完毕的图片数
n_failed整数训练数据集中下载失败的图片数
n_items整数训练数据集图片总数
name字符串训练数据集名称
status字符串目前训练数据集状态。没有任何图片被下载完毕,是not-downloaded。如果有部分图片被下载完毕,部分没有被下载完毕,是downloading。如果所有图片都被下载完毕,或者下载失败,是downloaded。

获取单个训练集信息

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
resp = api.get_training_set()
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->getTrainingSet($trainingSetID=TRAINING_SET_ID);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.getById(TRAINING_SET_ID);
System.out.println(result);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID

输入参数

N/a

输出结果

创建训练集输出结果相同

错误信息

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4042001训练数据集不存在

修改训练集名称和描述

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
resp = api.update_training_set(name=NEW_NAME, description=NEW_DESC)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->updateTrainingSet($updateTrainingSet=TRAINING_SET_ID, ["name" => NEW_NAME, "description" => NEW_DESC]);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.update(TRAINING_SET_ID, NEW_NAME, NEW_DESC);
System.out.println(result);
curl -X PUT \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-H 'Content-Type: application/json' \
-d '{"name": "NEW_NAME", "description": "NEW_DESC"}' \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID

输入参数

参数名称类型说明必选限制
name字符串训练数据集名称最多16个unicode字符,超长的部分会被自动截断
description字符串训练数据集描述信息最多128个unicode字符,超长的部分会被自动截断

输出结果

创建训练集输出结果相同

错误信息

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4005004训练集的名称或描述为空值
4042001训练数据集不存在

删除训练集

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
api.delete_training_set()
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->deleteTrainingSet($trainingSetID=TRAINING_SET_ID);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.delete(TRAINING_SET_ID);
System.out.println(result);
curl -X DELETE \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID

输入参数

N/a

输出结果

N/a

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4042001训练数据集不存在

数据管理

向训练集批量添加数据

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
with open('added.csv') as f:
api.add_training_data_in_bulk(file=f)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->addTrainingDataToTrainingSet($trainingSetID=TRAINING_SET_ID, $images="added.csv");
import java.io.File;
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.bulkAddTrainingData(TRAINING_SET_ID, new File("./added.csv"));
System.out.println(result);
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-F "urls_to_add=@added.csv" \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID/images

输入参数

参数名称类型说明必选限制
filecsv文件训练数据文件该文件每行包含用逗号分割的两列,第一列为训练图片URL,第二列为图片对应的标注。两列间用逗号分割,故URL和标注都不应再含有逗号。点击这里查看文件示例。

输出结果

创建训练集输出结果相同

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4005001数据格式不正确
4042001训练数据集不存在

从训练集批量删除数据

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
with open('deleted.csv') as f:
api.delete_training_data_in_bulk(file=f)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->deleteTrainingDataFromTrainingSet($trainingSetID=TRAINING_SET_ID, $images="deleted.csv");
import java.io.File;
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.bulkDeleteTrainingData(TRAINING_SET_ID, new File("./deleted.csv"));
System.out.println(result);
curl -X DELETE \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-F "urls_to_delete=@deleted.csv" \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID/images

输入参数

参数名称类型说明必选限制
filecsv文件训练数据文件该文件格式可以是每行1列或者2列文件。如果是1列文件,则每行应该包含一个要删除的数据的URL;如果是2列文件,则第一列应该包含要删除数据的URL。点击这里查看文件示例。

输出结果

创建训练集输出结果相同

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4005001数据格式不正确
4042001训练数据集不存在

清空训练集

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
# 必须输入训练集名称作为确认信息
api.clear_training_set(SET_NAME)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingSetApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->clearTrainingDataFromTrainingSet($trainingSetID=TRAINING_SET_ID, $name=SET_NAME);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.TrainingSet;
import cn.productai.apiv2.impl.TrainingSetImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

TrainingSet trainingSet = new TrainingSetImpl();
trainingSet.setProfile(profile);

String result = trainingSet.clearTrainingSet(TRAINING_SET_ID, SET_NAME);
System.out.println(result);
curl -X DELETE \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-H 'Content-Type: application/json' \
-d '{"name": SET_NAME,"training_set_id":TRAINING_SET_ID,"token": BASE64_CODE}' \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID/clear

输入参数

参数名称类型说明必选限制
name字符串训练数据集名称只有name、training_set_id和token3者都与当前要清空训练数据集值一致时,才进行清理。防止填错training_set_id造成未预期数据清除
training_set_id字符串训练数据集ID只有name、training_set_id和token3者都与当前要清空训练数据集值一致时,才进行清理。防止填错training_set_id造成未预期数据清除
token字符串“selfserve_admin:SET_NAME”的BASE64编码只有name、training_set_id和token3者都与当前要清空训练数据集值一致时,才进行清理。防止填错training_set_id造成未预期数据清除

输出结果

创建训练集输出结果相同

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4011004name和训练数据名称不一致
4042001训练数据集不存在

服务管理

创建服务

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_training_set_api(TRAINING_SET_ID)
resp = api.create_service(name=NAME, description=DESC, scenario='classifier')
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingServiceApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->createService(
$trainingSetID=TRAINING_SET_ID,
$name=NAME,
$description=DESC,
$scenario='classifier');
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.CustomTraining;
import cn.productai.apiv2.impl.CustomTrainingImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

CustomTraining customTraining = new CustomTrainingImpl();
customTraining.setProfile(profile);

String result = customTraining.createService(TRAINING_SET_ID,
NAME,
DESC,
"classifier");
System.out.println(result);
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-H 'Content-Type: application/json' \
-d '{"name": "NAME", "description": "DESCRIPTION","scenario":"classifier"}' \
https://api.productai.cn/custom_training/_0000194/training_sets/TRAINING_SET_ID/services

输入参数

参数名称类型说明必选限制
name字符串自定义标注服务名称N/a
description字符串自定义标注服务描述N/a
scenario字符串自定义标注服务类别目前仅支持”classifier”,参考服务类别

输出结果

200 HTTP状态码
{
"created_at": "2018-05-23T07:03:25Z",
"creator_id": ...,
"id": "lewj7738",
"last_updated_at": "2018-05-23T07:03:25Z",
"name": "ts100",
"request_id": "633188fc-5e57-11e8-8cb4-d680a9823a64",
"scenario": "classifier",
"status": "pending",
"training_set_id": "085ffdpo"
}
结果字段类型说明
created_at字符串创建UTC时间,精确到秒,格式为:年-月-日T小时:分钟:秒Z
creator_id整数创建者ID
id字符串训练数据集唯一ID,后续操作都需要使用此ID完成
last_updated_at字符串最后修改UTC时间,精确到秒,格式为:年-月-日T小时:分钟:秒Z
name字符串自定义标注服务名称
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析
scenario字符串目前固定使用classifier
status字符串目前服务状态,详情参见服务状态说明
training_set_id字符串服务依赖的训练数据集ID

服务状态说明

状态说明
pending此时服务不可用,表示已接收到创建服务的请求。等待资源进行训练
preparing此时服务不可用,表示服务已经开始训练模型
evolving此时服务正在运行,服务可以正常使用(模型持续迭代优化中)。
running此时服务正在运行,表示模型训练完毕,服务可以正常使用
failed此时服务不可用,表示创建服务失败(如训练异常终止)
deleted此时服务不可用,表示服务已经被删除
非200 HTTP状态码
{
"error_code": 2001,
"message": "Training Set(id=XXXXXXXX) Not Found.",
"request_id": "d95c13be-5e64-11e8-8cb4-d680a9823a64"

}
结果字段类型说明
message字符串详细错误信息
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4033004超出可创建服务器配额限制
4042001训练数据集不存在

获取所有服务信息

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_custom_training_api()
resp = api.list_services()
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingServiceApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->listServices();
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.CustomTraining;
import cn.productai.apiv2.impl.CustomTrainingImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

CustomTraining customTraining = new CustomTrainingImpl();
customTraining.setProfile(profile);

String result = customTraining.listAllService();
System.out.println(result);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/custom_training/_0000194/services

输入参数

N/a

输出结果

{
"request_id": "f158f3ca-6f75-11e8-a528-d6abcabd1965",
"results": [
{
"created_at": "2018-06-06T01:46:34Z",
"creator_id": ...,
"description": "Foo Description",
"id": "276qb4gp",
"last_updated_at": "2018-06-06T01:46:42Z",
"message": "TrainingSet Does Not Have Enough Images For Training.",
"name": "Foo Service",
"scenario": "classifier",
"status": "failed",
"training_set_id": "pk72inyt"
}
]
}
结果字段类型说明
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析
results数组服务列表,每个元素的字段定义请参见results内元素字段说明

results内元素字段说明

结果字段类型说明
description字符串服务创建时,传入的描述信息
id字符串服务ID
message字符串仅当status字段值为failed时,结构体中会包含该字段,详细描述failed原因,如:训练集图片不足,太多图片下载失败等
name字符串服务创建或者修改时,传入的名称
status字符串目前服务状态,详情参见服务状态说明
training_set_id字符串服务依赖的训练数据集ID

获取服务信息

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_custom_training_api(SERVICE_ID)
resp = api.get_service()
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingServiceApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->getService($serviceID=SERVICE_ID);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.CustomTraining;
import cn.productai.apiv2.impl.CustomTrainingImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

CustomTraining customTraining = new CustomTrainingImpl();
customTraining.setProfile(profile);

String result = customTraining.getServiceById(SERVICE_ID);
System.out.println(result);
curl -X GET \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/custom_training/_0000194/services/SERVICE_ID

输入参数

N/a

输出结果

创建服务输出结果相同。当status字段值为failed时,输出结果中会包含该字段,详细描述failed原因,如:训练集图片不足,太多图片下载失败等

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4042002服务不存在

修改服务名称

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_custom_training_api(SERVICE_ID)
resp = api.update_service(name=NEW_NAME)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingServiceApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->updateService($serviceID=SERVICE_ID, ["name" => NEW_NAME]);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.CustomTraining;
import cn.productai.apiv2.impl.CustomTrainingImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

CustomTraining customTraining = new CustomTrainingImpl();
customTraining.setProfile(profile);

String result = customTraining.updateServiceName(SERVICE_ID, NEW_NAME);
System.out.println(result);
curl -X PUT \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-H 'Content-Type: application/json' \
-d '{"name": "NEW_NAME"}' \
https://api.productai.cn/custom_training/_0000194/services/SERVICE_ID

输入参数

参数名称类型说明必选限制
name字符串自定义标注服务新名称N/a

输出结果

创建服务输出结果相同

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4005004服务名称为空值
4042002服务不存在

删除服务

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_custom_training_api(SERVICE_ID)
api.delete_service()
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingServiceApi(ACCESS_KEY_ID, SECRET_KEY);
$result = $product_ai->deleteService($serviceID=SERVICE_ID);
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.CustomTraining;
import cn.productai.apiv2.impl.CustomTrainingImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

CustomTraining customTraining = new CustomTrainingImpl();
customTraining.setProfile(profile);

String result = customTraining.deleteServiceById(SERVICE_ID);
System.out.println(result);
curl -X DELETE \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
https://api.productai.cn/custom_training/_0000194/services/SERVICE_ID

输入参数

N/a

输出结果

{
"request_id": "63a36ee2-6f76-11e8-b9eb-6a95ff447c19"
}

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4042002服务不存在

预测

Python

PHP

Java

cURL

from productai import Client

cli = Client(ACCESS_KEY_ID, SECRET_KEY)
api = cli.get_custom_training_api()

# 上传图片URL调用API完成预测
resp = api.predict(image="http://xxxx.jpg")

# 或者直接上传本地图片调用API完成预测
with open("zzzz.jpg", mode='rb') as q:
resp = api.predict(image=q)
use ProductAI\Api;

$product_ai = new ProductAI\Api\TrainingServiceApi(ACCESS_KEY_ID, SECRET_KEY);

// 上传图片URL调用API完成预测
$result = $product_ai->predict($serviceID=SERVICE_ID, $image="http://xxxx.jpg");

// 上传本地文件调用API完成预测
$result = $product_ai->predict($serviceID=SERVICE_ID, $image="./zzzz.jpg");
import cn.productai.api.core.*;
import cn.productai.api.core.enums.*;
import cn.productai.apiv2.CustomTraining;
import cn.productai.apiv2.impl.CustomTrainingImpl;

IProfile profile = new DefaultProfile();
profile.setAccessKeyId(ACCESS_KEY_ID);
profile.setVersion("1");
profile.setGlobalLanguage(LanguageType.Chinese);

CustomTraining customTraining = new CustomTrainingImpl();
customTraining.setProfile(profile);

// 上传图片URL调用API完成预测
String result = customTraining.predict(SERVICE_ID, "http://xxxx.jpg", null);

// 上传本地文件调用API完成预测
String result = customTraining.predict(SERVICE_ID, null, "./zzzz.jpg");

System.out.println(result);
# 上传本地文件调用API完成预测
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-F "search=@./zzzz.jpg" \
https://api.productai.cn/custom_training/SERVICE_ID

# 上传图片URL调用API完成预测
curl -X POST \
-H 'x-ca-version: 1.0' \
-H 'x-ca-accesskeyid: ACCESS_KEY_ID' \
-F "url=http://xxxx.jpg" \
https://api.productai.cn/custom_training/SERVICE_ID

输入参数

参数名称类型说明必选限制
image字符串或者图片文件内容预测的QueryN/a

输出结果

{
"request_id": "cbab3410-5c3f-11e8-8cb4-d680a9823a64",
"results": [
{
"category": "patio",
"score": 0.9299805603279995
},
...
]
}
结果字段类型说明
message字符串HTTP状态码非200时,返回具体的错误信息
request_id字符串本次调用的唯一ID,可以用于和ProductAI团队进行联调分析
results数组包含每一个标签及其在该标签上的预测分值,数组内内容按score字段降序排序。参见results内元素字段说明

results内元素字段说明

结果字段类型说明
category标签模型预测结果
score浮点数在标签上的预测分值,越大说明置信度越高

错误代码

SDK/API使用http状态码来通知客户端本次调用成功和失败

http状态码详细错误代码说明
200N/a操作成功
4002004训练进行中,服务暂时不可用
4005005无效图片类型
4042002服务不存在
5004001图片下载失败
5004003服务启动失败