# Graviti Help Center

Welcome to Graviti data platform. Start to create, manage and use your datasets today.

Graviti focuses on solving data problems in AI development. From collecting data to managing data, it helps you carry out AI development efficiently. Connect Graviti data platform to your data pipeline from now!

## Developer Documentation

{% content-ref url="/pages/-MPHldAyMMAd\_N6eFJ99" %}
[Developer Tools](/dev-doc/tools)
{% endcontent-ref %}

## Production Instructions

{% content-ref url="/pages/-MPILKngMU2iwqIrhkz3" %}
[TensorBay](/guide/tensorbay)
{% endcontent-ref %}

{% content-ref url="/pages/-MPIPB69JfxSUXxS962V" %}
[Open Datasets](/guide/opendataset)
{% endcontent-ref %}

## Graviti APPs Help

{% content-ref url="/pages/-MPITMgXNAFeL0WuUg5M" %}
[APPs](/apps/groundtruth-tools)
{% endcontent-ref %}


# Developer Tools

Graviti provides developer tools including Python SDK, CLI, and Open API with documentation and use cases for quick integration with your data and data pipelines.

#### Python SDK&#x20;

{% content-ref url="/pages/-MWUa3IW-xBX\_s23xZcU" %}
[Broken mention](broken://pages/-MWUa3IW-xBX_s23xZcU)
{% endcontent-ref %}

#### CLI

{% content-ref url="/pages/-MWUaSdK4fc0s48db8N6" %}
[Broken mention](broken://pages/-MWUaSdK4fc0s48db8N6)
{% endcontent-ref %}

#### Open API

{% content-ref url="/pages/-MPHm7oVNKKluQZ4Wtn4" %}
[Broken mention](broken://pages/-MPHm7oVNKKluQZ4Wtn4)
{% endcontent-ref %}


# Graviti Open API

## Api Overview <a href="#api-overview" id="api-overview"></a>

### Actions on Datasets <a href="#actions-on-datasets" id="actions-on-datasets"></a>

| API                                                                                                                                                                                                     | Description                                      |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ |
| [ListAuthStorageConfig](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listauthstorageconfig)                                                                                | Acquire the list of authentication configuration |
| [CreateDataset](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#createdataset)                                                                                                | Create a dataset                                 |
| [DeleteDataset](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listauthstorageconfighttps://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#deletedataset) | Delete a dataset                                 |
| [updateDataset](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#updatedataset)                                                                                                | Update a dataset                                 |
| [ListDataset](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listdataset)                                                                                                    | List datasets                                    |
| [GetDataset](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#getdataset)                                                                                                      | Get a dataset                                    |
| [CreateBranch](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#createbranch)                                                                                                  | Create a branch                                  |
| [DeleteBranch](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#deletebranch)                                                                                                  | Delete a branch                                  |
| [ListBranch](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listbranch)                                                                                                      | List branches                                    |
| [CreateDraft](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#createdraft)                                                                                                    | Create a draft                                   |
| [ListDraft](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listdraft)                                                                                                        | List drafts                                      |
| [CommitDataset](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#commitdataset)                                                                                                | Commit a dataset                                 |
| [ListCommit](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listcommit)                                                                                                      | List commits                                     |
| [CreateTag](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#createtag)                                                                                                        | Create a tag                                     |
| [DeleteTag](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#deletetag)                                                                                                        | Delete a tag                                     |
| [ListTag](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#listtag)                                                                                                            | List tags                                        |
| [UploadNote](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#updatenote)                                                                                                      | Upload a dataset note                            |
| [GetNote](https://docs.graviti.com/dev-doc/tools/graviti-open-api/dataset-operation#getnote)                                                                                                            | Get the note of a dataset                        |

### Actions on Data <a href="#actions-on-data" id="actions-on-data"></a>

| API                                                                                                                                                                                       | Description                            |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------- |
| [GetPolicy](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#getpolicy)                                                                                             | Acquire data upload token              |
| [PutCallback](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#putcallback)                                                                                         | Put callback                           |
| [MultiPutCallback](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#multiputcallback)                                                                               | Batch callback                         |
| [CreateSegment](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#createsegment)                                                                                     | Create a segment                       |
| [DeleteSegment](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#deletesegment)                                                                                     | Delete a segment                       |
| [ListSegment](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#listsegment)                                                                                         | List segments                          |
| [UploadLabelCatalog](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#uploadlabelcatalog)                                                                           | Upload label catalog                   |
| [GetLabelCatalog](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#getlabelcatalog)                                                                                 | Acquire label catalog                  |
| [UploadSensor](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#getlabelcataloghttps://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#uploadsensor) | Create a sensor                        |
| [DeleteSensor](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#deletesensor)                                                                                       | Delete a sensor                        |
| [ListSensor](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#listsensor)                                                                                           | List sensors                           |
| [ListData](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#listdata)                                                                                               | List data                              |
| [ListDataUri](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#listdatauri)                                                                                         | Acquire data URL                       |
| [UploadLabel](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#uploadlabel)                                                                                         | Upload label                           |
| [ListLabel](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#listlabel)                                                                                             | Acquire annotation labels of a dataset |
| [DeleteData](https://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#listlabelhttps://docs.graviti.com/dev-doc/tools/graviti-open-api/data-operation#deletedata)           | Delete data                            |

## Common <a href="#common" id="common"></a>

### Common Parameters <a href="#common-parameters" id="common-parameters"></a>

Some common parameters in the doc

| Name            | Descriptions                                                                              | Value                                                  |
| --------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------ |
| service         | Prefix of API request address                                                             | <https://gas.graviti.com/gatewayv2/tensorbay-open-api> |
| your\_accesskey | Get the AccessKey at [GAS Help Center](https://docs.graviti.com/dev-doc/tools/api-center) |                                                        |

This module mainly illustrates HTTP common request headers and common response headers.

| Name         | Type   | Descriptions                                                                  |
| ------------ | ------ | ----------------------------------------------------------------------------- |
| Content-Type | string | HTTP request content type defined in RFC2616. Default value: application/json |
| X-Token      | string | The AccessKey obtained by the user                                            |

| Name         | Type   | Descriptions                                                                                                                                                                                  |
| ------------ | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| X-Request-Id | string | X-Request-Id is created by Graviti and is the only UUID that identifies this response. If you encounter any difficulties when using this service, please contact Graviti. Default value: null |

### Error code description <a href="#error-code-description" id="error-code-description"></a>

#### Error Code Return Type <a href="#error-code-return-type" id="error-code-return-type"></a>

```
{
  "code": "error_code",
  "message": "***"
}
```

The server may return any of the following type of errors when your request generates an error. For example, the 404 error code occurs when acquiring a dataset. 。

```
# Response status
HttpStatus 404
#  Response result
{
    "code": "ResourceNotExist", 
    "message": "dataset not exist!"
}
```

#### Error Code <a href="#error-code" id="error-code"></a>

| Code                 | Description                                             |
| -------------------- | ------------------------------------------------------- |
| AccessDenied         | Request is denied and lack of authorized access.        |
| InvalidParamsValue   | Invalid parameter value, e.g., invalid parameter format |
| NameConflict         | Name is conflicted                                      |
| RequestParamsMissing | The required parameters are missing                     |
| ResourceNotExist     | The resource does not exist when requested              |
| SystemError          | System error                                            |

#### Fuzzy Query <a href="#fuzzy-query" id="fuzzy-query"></a>

**For API that supports fuzzy query, please follow these rules:**

1. Support MySQL wildcard query, such as %, \_, and other wildcard characters.
2. If there is no MySQL wildcard, the default is %{fuzzy query}% with fuzzy matching before and after.
3. If the query field contains MySQL wildcard, automatic fuzzy matching is disabled.
4. If you want the wildcard to be treated only as a normal string, you need to transcribe it, and degrade it to non-fuzzy matching. If you still need fuzzy matching, you need to construct the wildcard query manually.

**For example： result： graviti\_1, great\_graviti\_1, graviti%1**

1. name = graviti, return graviti\_1, great\_graviti\_1, graviti%1
2. name = graviti\\\_%, return graviti\_1, great\_graviti\_1
3. name = graviti\\\_, return none
4. name = graviti%, return graviti\_1，graviti%1
5. name = graviti\\%%, return graviti%1
6. name = graviti\\%, return none
7. name = graviti\\%1, return graviti%1
8. name = %graviti, return none


# DataSet Operation

## ListAuthStorageConfig <a href="#listauthstorageconfig" id="listauthstorageconfig"></a>

**ListAuthStorageConfig**

Acquire the list of authentication configuration

**Request path**

> **GET** /v1/auth-storage-configs

**Request parameter**

**Query**

| Name   | Type   | Required | Descriptions                                                                                    |
| ------ | ------ | -------- | ----------------------------------------------------------------------------------------------- |
| name   | string | No       | Configuration Name                                                                              |
| limit  | int    | No       | Need to be greater than 0 and the default is 128 with a maximum of 128 for a single acquisition |
| offset | int    | No       | The default is 0                                                                                |

**Request instance**

```
curl --location --request GET '{service}/v1/auth-storage-configs?name=aws_1&limit=1&offset=0' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "configs": [
        {
            "name": "aws_1",
            "type": "s3",
            "endpoint": "s3.cn-northwest-1.amazonaws.com.cn",
            "accesskeyId": "AKIKU7KYZCWGOTEV5GNE",
            "bucketName": "graviti-210415"
        }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

## CreateDataset <a href="#createdataset" id="createdataset"></a>

**Create a dataset**

Create a TensorBay dataset with version control. The dataset name must be unique

**Request path**

> **POST** /v1/datasets

**Request parameter**

**Body**

| Name          | Type   | Required | Descriptions                                                                        |
| ------------- | ------ | -------- | ----------------------------------------------------------------------------------- |
| name          | string | Yes      | Dataset name                                                                        |
| type          | int    | No       | The default is 0, 0-normal dataset; 1-Fusion dataset                                |
| storageConfig | object | No       | Create parameters for using authenticated datasets; mutually exclusive with regions |
| ├─name        | string | Yes      | Configuration name                                                                  |
| ├─name        | path   | No       | Create storage path for datasets                                                    |

**Request instance**

```
curl --location --request POST '{service}/v1/datasets' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' \
--data-raw '{
   "name": "my first dataset",
   "type": 0,
   "storageConfig": {
        "name": "aws_1",
        "path": "graviti"
    }
}'
```

**Output**

```
# Response status
HttpStatus 201
# Response result
{
    "id": "154e35bae8954f09969ef8c9445efd2c"
}
```

* **id**: the ID of the created dataset

## DeleteDataset <a href="#deletedataset" id="deletedataset"></a>

**Delete a dataset**

> **DELETE** /v1/datasets/{id}

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name   | Type   | Required | Descriptions            |
| ------ | ------ | -------- | ----------------------- |
| commit | string | No       | Commit ID or commit tag |

**Request instance**

```
curl --location --request DELETE '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c' \
--header 'x-token: {your_accesskey}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## UpdateDataset <a href="#updatedataset" id="updatedataset"></a>

**Update dataset information**

> **PATCH** /v1/datasets/{id}

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name | Type   | Required | Descriptions                                                       |
| ---- | ------ | -------- | ------------------------------------------------------------------ |
| name | string | No       | dataset name, and the provided value cannot be the empty value "". |

**Request instance**

```
curl --location --request PATCH '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c' \
--header 'x-token: {your_accesskey}'\
--data-raw '{
    "name": "my dataset",
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## ListDataset <a href="#listdataset" id="listdataset"></a>

**List datasets**

Return the list of datasets owned by the user:

* Individual users acquire the list of datasets under their personal accounts
* Team users acquire the list of datasets under their enterprise accounts

**Request path**

> **GET** /v1/datasets

**Request parameter**

**Query**

| Name           | Type   | Required | Descriptions                                                                                                           |
| -------------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------- |
| limit          | int    | No       | Need to be greater than 0 and the default is 128 with a maximum of 128 for a single acquisition                        |
| offset         | int    | No       | The default is 0                                                                                                       |
| name           | string | No       | Dataset name                                                                                                           |
| needFuzzyQuery | bool   | No       | If true, fuzzy query of the dataset name is supported.                                                                 |
| sortBy         | string | No       | Currently sorting is based on created\_at and updated\_at while entering other content will return InvalidParamsValue. |
| orderBy        | string | No       | The default is desc (descending order). The valid content is asc (ascending order) and desc                            |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets?offset=0&limit=10'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "datasets": [
      {
        "id": "154e35bae8954f09969ef8c9445efd2c",
        "name": "my-great-data-set",
        "defaultBranch": "main",
        "type": 0,
        "updateTime": 1604977282,
        "owner": ""
      }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

* **datasets**: List of datasets
  * **id**: Dataset ID
  * **name**: Dataset name
  * **defaultBranch**: default branch name
  * **type**: the default is 0, 0-normal dataset, 1-Fusion dataset

## GetDataset <a href="#getdataset" id="getdataset"></a>

**Request path**

> **GET** /v1/datasets/{id}

**Request parameter**

**PATH**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "name": "my-great-data-set",
    "type": 1,
    "defaultBranch": "main",
    "commitId": "00000000000000000000000000000000",
    "updateTime": 1604977282,
    "owner": ""
}
```

## CreateBranch <a href="#createbranch" id="createbranch"></a>

**Create a branch**

Create a branch

**Request path**

> **POST** /v1/datasets/{id}/branches

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name   | Type   | Required | Descriptions                                                                        |
| ------ | ------ | -------- | ----------------------------------------------------------------------------------- |
| name   | string | Yes      | The name of the created branch                                                      |
| commit | string | Yes      | The commit that branch is based on. It can be commit ID, commit tag, or branch name |

**Request instance**

```
curl --location --request POST '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/branches' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json'\
--data-raw '{
  "name": main2,
  "commit": "fde63f357daf46088639e9f57fd81cad"
}'
```

**Output**

```
# Response status
HttpStatus 201
# Response result
{}
```

## DeleteBranch <a href="#deletebranch" id="deletebranch"></a>

**Delete branch**

Delete branch

**Request path**

> **DELETE** /v1/datasets/{id}/branches

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name | Type   | Required | Descriptions |
| ---- | ------ | -------- | ------------ |
| name | string | Yes      | Branch name  |

**Request instance**

```
curl --location --request DELETE '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/branches' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json'\
--data-raw '{
  "name": main2
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## ListBranch <a href="#listbranch" id="listbranch"></a>

**Acquire a branch list**

Acquire a list of dataset branches

**Request path**

> **GET** /v1/datasets/{id}/branches

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name   | Type | Required | Descriptions                                                                                    |
| ------ | ---- | -------- | ----------------------------------------------------------------------------------------------- |
| limit  | int  | No       | Need to be greater than 0 and the default is 128 with a maximum of 128 for a single acquisition |
| offset | int  | No       | The default is 0                                                                                |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/branches?limit=1&offset=0' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "branches": [
        {
            "name": "main",
            "commitId": "fde63f357daf46088639e9f57fd81cad",
            "parentCommitId": "f68b1375454f459b8a486b8d1f4d9ddb",
            "title": "first commit",
            "committer": {
                "name": "graviti",
                "date": 1616579313
            }
        }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

## CreateDraft <a href="#createdraft" id="createdraft"></a>

**Create a dataset draft**

Create a TensorBay dataset draft. Only one draft can be created on a branch

**Request path**

> **POST** /v1/datasets/{id}/drafts

**Request parameter**

**Path**

| Name | Required | Descriptions |
| ---- | -------- | ------------ |
| id   | Yes      | Dataset ID   |

**Body**

| Name       | Type   | Required | Descriptions                                     |
| ---------- | ------ | -------- | ------------------------------------------------ |
| title      | string | No       | Draft name                                       |
| branchName | string | No       | Branch name. The default branch is named as main |

**Request instance**

```
curl --location --request POST '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/drafts' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' \
--data-raw '{
  "title": "my first draft",
  "branchName": "main"
}'
```

**Output**

```
# Response status
HttpStatus 201
# Response result
{
    "draftNumber": 1
}
```

* **draftNumber**: draft number

## ListDraft <a href="#listdraft" id="listdraft"></a>

**Acquire a list of dataset drafts**

Acquire a list of dataset drafts

**Request path**

> **GET** /v1/datasets/{id}/drafts

**Request parameter**

**Path**

| Name | Required | Descriptions |
| ---- | -------- | ------------ |
| id   | Yes      | Dataset ID   |

**Query**

| Name   | Type | Required | Descriptions                                                                                    |
| ------ | ---- | -------- | ----------------------------------------------------------------------------------------------- |
| limit  | int  | No       | Need to be greater than 0 and the default is 128 with a maximum of 128 for a single acquisition |
| offset | int  | No       | The default is 0                                                                                |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/drafts?limit=1&offset=0' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
  "drafts": [
    {
      "draftNumber": "1",
      "branchName": "main",
      "title": "my first draft"
    }
  ],
  "offset": 0,
  "recordSize": 1,
  "totalCount": 10
}
```

## CommitDataset <a href="#commitdataset" id="commitdataset"></a>

**Commit a dataset**

Update a dataset with a pending status to a committed status. Once a dataset is published, it cannot be modified.

**Request path**

> **POST** /v1/datasets/{id}

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name        | Type   | Required | Descriptions                                                            |
| ----------- | ------ | -------- | ----------------------------------------------------------------------- |
| draftNumber | int    | Yes      | Draft number                                                            |
| title       | string | yes      | The number of characters of the submitted title should be less than 255 |
| tag         | string | No       | Dataset version tag. The number of characters should range from 2 to 80 |

**Request instance**

```
curl --location --request POST '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' \
--data-raw '{
  "draftNumber": "1",
  "title": "checkout a new version dataset",
  "tag": "v1.0"
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
  "commitId": "fde63f357daf46088639e9f57fd81cad"
}
```

## ListCommit <a href="#listcommit" id="listcommit"></a>

**list commits**

Acquire a list of dataset commits

**Request path**

> **GET** /v1/datasets/{id}/commits

**Request parameter** **Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name   | Type   | Required | Descriptions                                                             |
| ------ | ------ | -------- | ------------------------------------------------------------------------ |
| commit | string | No       | Commit ID, commit tag, or branch name. The default is the default branch |
| limit  | int    | No       | The default is set to 128. The maximum value for a single time is 128    |
| offset | int    | No       | The default is 0                                                         |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/commits?commit=main&limit=1&offset=0' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
  "commits": [
    {
      "parentCommitId": "0d213a06a85d46fa8662946bdb1afe7e",
      "commitId": "fde63f357daf46088639e9f57fd81cad",
      "title": "checkout a new version dataset",
      "committer": {
        "date": 1617268600,
        "name": "graviti"
      }
    }
  ],
  "offset": 0,
  "recordSize": 1,
  "totalCount": 10
}
```

## CreateTag <a href="#createtag" id="createtag"></a>

**Create a tag**

Create a tag

**Request path**

> **POST** /v1/datasets/{id}/tags

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name   | Type   | Required | Descriptions                                                 |
| ------ | ------ | -------- | ------------------------------------------------------------ |
| commit | string | Yes      | Commit ID, commit tag, or branch name                        |
| name   | string | Yes      | Tag name. The number of characters should range from 2 to 80 |

**Request instance**

```
curl --location --request POST '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/tags' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' \
--data-raw '{
  "commit": "fde63f357daf46088639e9f57fd81cad",
  "name": "v1"
}'
```

**Output**

```
# Response status
HttpStatus 201
# Response result
{}
```

## DeleteTag <a href="#deletetag" id="deletetag"></a>

**Delete a tag**

Delete a tag

**Request path**

> **DELETE** /v1/datasets/{id}/tags

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name | Type   | Required | Descriptions |
| ---- | ------ | -------- | ------------ |
| name | string | Yes      | tag name     |

**Request instance**

```
curl --location --request DELETE '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/tags' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' \
--data-raw '{
  "name": "v1"
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## ListTag <a href="#listtag" id="listtag"></a>

**List tags**

Acquire a list of dataset tags

**Request path**

> **GET** /v1/datasets/{id}/tags

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name   | Type   | Required | Descriptions                                                          |
| ------ | ------ | -------- | --------------------------------------------------------------------- |
| name   | string | 否        | tag name                                                              |
| limit  | int    | No       | The default is set to 128. The maximum value for a single time is 128 |
| offset | int    | No       | The default is 0                                                      |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/tags?name=v1&limit=1&offset=0' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "tags": [
        {
            "name": "v1",
            "commitId": "fde63f357daf46088639e9f57fd81cad",
            "parentCommitId": "f68b1375454f459b8a486b8d1f4d9ddb",
            "title": "first commit",
            "committer": {
                "name": "graviti",
                "date": 1617268600
            }
        }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

## updateNote <a href="#updatenote" id="updatenote"></a>

**Update a dataset note**

Update a dataset note

**Request path**

> **PATCH** /v1/datasets/{id}/notes

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name                | Type      | Required | Descriptions                                    |
| ------------------- | --------- | -------- | ----------------------------------------------- |
| draftNumber         | int       | Yes      | draft number                                    |
| binPointCloudFields | string\[] | No       | Dimension name of the point cloud in bin format |
| isContinuous        | bool      | No       | Is it continuous                                |

**Request instance**

```
curl --location --request PATCH '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/notes' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' \
--data-raw '{
  "draftNumber": 1,
  "fileFormat": {
    "draftNumber": 1,
    "binPointCloudFields": [
       "X",
       "Y",
       "Z",
       "Intensity"
    ],
    "isContinuous": true
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## GetNote <a href="#getnote" id="getnote"></a>

**Get note**

Get the note of a dataset

**Request path**

> **GET** /v1/datasets/{id}/notes

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                        |
| ----------- | ------ | -------- | --------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time |
| commit      | string | No       | Commit ID, commit tag, or branch name                                                               |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/notes?draftNumber=1' \
--header 'x-token: {your_accesskey}' \
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "isContinuous": true，
    "binPointCloudFields": [
        "X",
        "Y",
        "Z",
        "Intensity"
    ]
}
```


# Data Operation

## UploadData <a href="#uploaddata" id="uploaddata"></a>

**Upload data to a dataset**

Users upload data to a dataset

1. Acquire data upload credentials
2. Transfer data directly to S3
3. Put callback

### GetPolicy <a href="#getpolicy" id="getpolicy"></a>

Acquire upload credentials

**Request path**

> GET /v1/datasets/{id}/policies

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Descriptions | Value                                                                                                                                                    |   |
| ----------- | ------ | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------- | - |
| draftNumber | int    | Yes          | Draft number                                                                                                                                             |   |
| segmentName | string | No           | Dataset segmentation                                                                                                                                     |   |
| expired     | int    | No           | The token expiration time measured in seconds cannot be negative. The default is 60 seconds and any time greater than 300 seconds will be treated as 300 |   |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/policies?expired=60&draftNumber=1' \
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "result": {
        "policy": "eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJmYXQtZGF0YXBsYXRmb3JtLXZlcnNpb24ifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsIjNhZTBiYzI5M2Q3N2FiYjQwODZhMzc5ZjAyNjkwNmNlL2YwODk3NDUwLWNlZjEtNGQ3Zi05NDI3LWNiZGRhZjcxYzc1YS8iXSxbInN0YXJ0cy13aXRoIiwiJHN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyIsIiJdLFsic3RhcnRzLXdpdGgiLCIkQ29udGVudC1UeXBlIiwiIl0seyJ4LWFtei1jcmVkZW50aWFsIjoiQUtJQVFIVFdDQTNKTTZESTdVQ0YvMjAyMTAzMjQvdXMtd2VzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LHsieC1hbXotYWxnb3JpdGhtIjoiQVdTNC1ITUFDLVNIQTI1NiJ9LHsieC1hbXotZGF0ZSI6IjIwMjEwMzI0VDA1NDIwMFoifV0sImV4cGlyYXRpb24iOiIyMDIxLTAzLTI0VDA1OjQ0OjAwWiJ9",
        "success_action_status": "200",
        "x-amz-algorithm": "AWS4-HMAC-SHA256",
        "x-amz-credential": "AKIAQHTWCA3JM6DI7UCF/20210324/us-west-1/s3/aws4_request",
        "x-amz-date": "20210324T054200Z",
        "x-amz-signature": "8dbc309fa36caad5791907c385632e74a47362ca6f1517b748e150f1306851a0"
    },
    "extra": {
        "backendType": "s3",
        "host": "https://dataplatform-version.s3.us-west-1.amazonaws.com",
    },
    "expireAt": 1616564580
}
```

### Front-end direct transmission based on the acquired credentials <a href="#front-end-direct-transmission-based-on-the-acquired-credentials" id="front-end-direct-transmission-based-on-the-acquired-credentials"></a>

The obtained result can be deserialized directly and transferred directly to S3. extra host is the access address

**Request path**

> POST The value of "host" within the "extra" array from the output above

**Request parameter**

**body**

| Name                    | Type   | Required | Descriptions                                                                                    |
| ----------------------- | ------ | -------- | ----------------------------------------------------------------------------------------------- |
| x-amz-credential        | string | Yes      | Consistent with the returned x-amz-credential of the previously obtained credentials            |
| success\_action\_status | string | Yes      | Consistent with the return value success\_action\_status of the previously obtained credentials |
| x-amz-algorithm         | string | Yes      | Consistent with the returned x-amz-algorithm of the previously obtained credentials             |
| x-amz-signature         | string | Yes      | Consistent with the return value x-amz-signature of the previously obtained credentials         |
| policy                  | string | Yes      | Consistent with the returned policy of the previously obtained credentials                      |
| x-amz-date              | string | Yes      | Consistent with the return value x-amz-date of the previously obtained credentials              |
| key                     | string | Yes      | Calculate the checksum of a file with SHA-1 cryptographic hash                                  |
| file                    | file   | Yes      | File                                                                                            |

**Request instance**

```
curl --location --request POST 'https://dataplatform-version.s3.us-west-1.amazonaws.com/' \
--form 'x-amz-credential=AKIAQHTWCA3JM6DI7UCF/20210323/us-west-1/s3/aws4_request' \
--form 'x-amz-algorithm=AWS4-HMAC-SHA256' \
--form 'x-amz-date=20210323T120601Z' \
--form 'x-amz-signature=42d7455003455a76796d67087b6a314b6c28445a14b80c9145029aeaa0091ec4' \
--form 'policy=eyJjb25kaXRpb25zIjpbeyJidWNrZXQiOiJmYXQtZGF0YXBsYXRmb3JtLXZlcnNpb24ifSxbInN0YXJ0cy13aXRoIiwiJGtleSIsIjNhZTBiYzI5M2Q3N2FiYjQwODZhMzc5ZjAyNjkwNmNlL2YwODk3NDUwLWNlZjEtNGQ3Zi05NDI3LWNiZGRhZjcxYzc1YS8iXSxbInN0YXJ0cy13aXRoIiwiJHN1Y2Nlc3NfYWN0aW9uX3N0YXR1cyIsIiJdLFsic3RhcnRzLXdpdGgiLCIkQ29udGVudC1UeXBlIiwiIl0seyJ4LWFtei1jcmVkZW50aWFsIjoiQUtJQVFIVFdDQTNKTTZESTdVQ0YvMjAyMTAzMjMvdXMtd2VzdC0xL3MzL2F3czRfcmVxdWVzdCJ9LHsieC1hbXotYWxnb3JpdGhtIjoiQVdTNC1ITUFDLVNIQTI1NiJ9LHsieC1hbXotZGF0ZSI6IjIwMjEwMzIzVDEyMDYwMVoifV0sImV4cGlyYXRpb24iOiIyMDIxLTAzLTIzVDEyOjA4OjAxWiJ9' \
--form 'success_action_status=200' \
--form 'key=b9676b075dff6d3333bbebb7cdd154f3631bb926' \
--form 'file=@/{localFile}'
```

**Output**

```
# Response status
HttpStatus 204
# Response result
{}
```

### PutCallback <a href="#putcallback" id="putcallback"></a>

Upload complete callback

**Request path**

> PUT /v1/datasets/{id}/callback

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**body**

| Name        | Type   | Required | Descriptions                                                                                                                                 |
| ----------- | ------ | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- |
| draftNumber | int    | Yes      | Draft number                                                                                                                                 |
| checksum    | string | Yes      | The checksum of an uploaded file. Calculate the checksum of a file with SHA-1 cryptographic hash                                             |
| remotePath  | string | Yes      | The remote file path, such as a.jpg                                                                                                          |
| segmentName | string | Yes      | Segment name                                                                                                                                 |
| sensorName  | string | No       | Must be passed for the upload of fusion data; sensor name                                                                                    |
| frameId     | string | No       | Must be provided for the upload of fusion data. The frameID should be in the format of ulid. Please refer to <https://github.com/oklog/ulid> |
| timestamp   | float  | No       | Not required to be provided for Fusion data upload                                                                                           |
| label       | map    | No       | For the annotation labels of the file, please refer to uploadLabel                                                                           |

**Request instance**

```
curl --location --request PUT '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/callback' \
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json'\
--data-raw '{
  "draftNumber": "1",
  "checksum": "b9676b075dff6d3333bbebb7cdd154f3631bb926",
  "remotePath": "car1.jpg",
  "frameId": "01D78XYFJ1PRM1WPBCBT3VHMNV",
  "segmentName": "car",
  "sensorName": "camera_car",
  "timestamp": 1532402934
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

### MultiPutCallback <a href="#multiputcallback" id="multiputcallback"></a>

Batch callback

**Request path**

> PUT /v1/datasets/{id}/multi/callback

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**body**

| Name         | Type      | Required | Descriptions                                                                                                                                 |   |
| ------------ | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------- | - |
| draftNumber  | int       | Yes      | Draft number                                                                                                                                 |   |
| segmentName  | string    | Yes      | Segment name                                                                                                                                 |   |
| objects      | \[]object | Yes      | The batch callback objects                                                                                                                   |   |
| ├─checksum   | string    | Yes      | The checksum of an uploaded file. Calculate the checksum of a file with SHA-1 cryptographic hash                                             |   |
| ├─remotePath | string    | Yes      | The remote file path, such as a.jpg                                                                                                          |   |
| ├─sensorName | string    | No       | Must be passed for the upload of fusion data; sensor name                                                                                    |   |
| ├─frameId    | string    | No       | Must be provided for the upload of fusion data. The frameID should be in the format of ulid. Please refer to <https://github.com/oklog/ulid> |   |
| ├─timestamp  | float     | No       | Not required to be provided for Fusion data upload                                                                                           |   |
| ├─label      | map       | No       | For the annotation labels of the file, please refer to uploadLabel                                                                           |   |

**Request instance**

```
curl --location --request PUT '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/callback' \
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json'\
--data-raw '{
  "draftNumber": "1",
  "segmentName": "car",
  "objects": [
        {
        "remotePath": "car1.jpg",
        "checksum": "b9676b075dff6d3333bbebb7cdd154f3631bb926",
        "frameId": "01D78XYFJ1PRM1WPBCBT3VHMNV",
        "sensorName": "camera_car",
        "timestamp": 1532402934,
        "label":{}
        }
  ]
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## createSegment <a href="#createsegment" id="createsegment"></a>

**Create a segment**

> **POST** /v1/datasets/{id}/segments

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name        | Type   | Required | Descriptions                                                    |
| ----------- | ------ | -------- | --------------------------------------------------------------- |
| draftNumber | int    | Yes      | Draft number                                                    |
| name        | string | Yes      | Segment name. This cannot be null and should not include ".","" |
| description | string | No       | Segment description                                             |

**Request instance**

```
curl --location --request POST '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/segments'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' \
--data-raw '{
        "draftNumber":1,
        "name": "graviti",
        "description": "this is a segment"
    }'
```

**Output**

```
# Response status
HttpStatus 201
# Response result
{}
```

## DeleteSegment <a href="#deletesegment" id="deletesegment"></a>

**Delete segment**

> **DELETE** /v1/datasets/{id}/segments

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name        | Type   | Required | Descriptions |
| ----------- | ------ | -------- | ------------ |
| draftNumber | int    | Yes      | Draft number |
| segmentName | string | Yes      | segmentName  |

**Request instance**

```
curl --location --request DELETE '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/segments' \
--header 'x-token: {your_accesskey}'\
--data-raw '{
    "draftNumber":1,
    "segmentName": "car",
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## ListSegment <a href="#listsegment" id="listsegment"></a>

**Acquire dataset segment**

> **GET** /v1/datasets/{id}/segments

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                                           |
| ----------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time                    |
| commit      | string | No       | Commit ID, commit tag, or branch name                                                                                  |
| limit       | int    | No       | The default is set to 128. The maximum value for a single time is 128                                                  |
| offset      | int    | No       | The default is 0                                                                                                       |
| sortBy      | string | No       | Currently sorting is based or created\_at and updated\_at while entering other content will return InvalidParamsValue. |
| orderBy     | string | No       | The default is desc (descending order). The valid content is asc (ascending order) and desc                            |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/segments?commit=v1.0&offset=0&limit=2'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**&#x20;

Normal dataset

```
# Response status
HttpStatus 200
{
  "segments": [
    {
        "name": "car",
        "description": "this is car"
    },
    {
        "name": "graviti",
        "description": "this is a segment"
    }
  ],
  "offset": 0,
  "recordSize": 2,
  "totalCount": 10
}
```

## UploadLabelCatalog <a href="#uploadlabelcatalog" id="uploadlabelcatalog"></a>

**Upload the labelCatalog**

> **PUT** /v1/datasets/{id}/labels/catalogs

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name                | Type             | Required | Descriptions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ------------------- | ---------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| draftNumber         | int              | Yes      | Draft number                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| catalog             | map              | yes      | <p>Annotation Type.<br><strong>key:</strong><br>CLASSIFICATION: annotation classification<br>BOX2D: 2D box annotation<br>BOX3D: 3D box annotation<br>POLYGON2D: 2D polygon annotation<br>POLYLINE2D: 2D polyline annotation<br>KEYPOINTS2D: 2D keypoints annotation<br>CUBOID2D: 2D cuboid annotation<br>SENTENCE: audio transcription annotation<br> <strong>For the annotation type above, each one of them has its own structure. You can refer to the request instances for detailed information. Please follow the format of the input value for each annotation type</strong></p> |
| ├─description       | string           | false    | Descriptions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ├─categoryDelimiter | string           | false    | The delimiter used to separate the parent-child relationship of category. The default is not to support the parent-child relationship. The recommended delimiter is "."                                                                                                                                                                                                                                                                                                                                                                                                                 |
| ├─categories        | object\[]        | false    | Item type: object and category list, which includes all category information                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ├─isTracking        | bool             | No       | Tracking or not                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| ├─name              | string           | yes      | Category name                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ├─description       | string           | No       | Category description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ├─attributes        | object\[]        | No       | Item type. It includes attribute-related information                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ├─name              | string           | Yes      | Attribute name                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| ├─type              | string/string\[] | false    | attribute type:**string, boolean, integer, number, array, null,such as"interger", \["integer", "null"]**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| ├─minimum           | float            | No       | The minimum value of the attribute. When the attribute is numerical, this field defines the minimum value (closed interval)                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ├─maximum           | float            | No       | The maximum value of the attribute. When the attribute is numerical, this field defines the maximum value (closed interval)                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ├─description       | string           | No       | Attribute description                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| ├─enum              | string\[]        | No       | The options of the value of an attribute. This represents all the possible options this attribute may have.                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ├─parentCategories  | string\[]        | No       | Relational categories represent the categories to which the attribute belongs to. If it is empty, then this is a global attribute                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| ├─items             | object\[]        | No       | Item type that defines multiple attributes. (When the "type" field is "array", it indicates multiple attributes)                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ├─type              | string/string\[] | No       | type of an attribute value with multiple options:**string, boolean, integer, number, array, null,such as "interger", \["integer", "null"]**                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| ├─minimum           | float            | No       | The minimum value (closed interval) of the attribute value with multiple options                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| ├─maximum           | float            | No       | The maximum value (closed interval) of the multiple attribute                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| ├─enum              | string\[]        | No       | The enumeration of the value of an attribute with multiple options. This represents all the possible options this attribute may have.                                                                                                                                                                                                                                                                                                                                                                                                                                                   |

**Request instance**

```
curl --location --request PUT '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/labels/catalogs'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json'\
--data-raw '{
  "draftNumber": 1,
  "BOX2D": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog",
    "isTracking": false
  },
  "BOX3D": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog",
    "isTracking": false
  },
  "CLASSIFICATION": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog"
  },
  "CUBOID2D": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog",
    "isTracking": false
  },
  "KEYPOINTS2D": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog",
    "isTracking": false,
    "keypoints": [
      {
        "description": "this is key point",
        "names": [
          "ear",
          "leg",
          "mouse"
        ],
        "number": 3,
        "parentCategories": [],
        "skeleton": [
          [
            0,
            1
          ],
          [
            1,
            2
          ]
        ],
        "visible": "1"
      }
    ]
  },
  "POLYGON2D": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog",
    "isTracking": false
  },
  "POLYLINE2D": {
    "attributes": [
      {
        "description": "attribute 'traffic_light_color' is a multiple choice attribute",
        "items": {
          "enum": [
            "unknown",
            "red",
            "yellow",
            "green"
          ]
        },
        "name": "traffic_light_color",
        "parentCategories": [
          "traffic_light"
        ],
        "type": "array"
      },
      {
        "description": "attribute 'visibility' is a float value between 0 to 1",
        "maximum": 1,
        "minimum": 0,
        "name": "visibility",
        "type": "number"
      },
      {
        "description": "this is color",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "name": "color",
        "parentCategories": [
          "car"
        ],
        "type": "string"
      }
    ],
    "categories": [
      {
        "description": "this is a car",
        "name": "car"
      }
    ],
    "categoryDelimiter": ".",
    "description": "this is a description of label catalog",
    "isTracking": false
  },
  "SENTENCE": {
    "attributes": [
      {
        "description": "this is a description of attribute",
        "enum": [
          "red",
          "blue",
          "green"
        ],
        "items": {
          "enum": [
            "red",
            "blue",
            "green"
          ],
          "maximum": 10,
          "minimum": 0,
          "type": {}
        },
        "maximum": 10,
        "minimum": 0,
        "name": "color",
        "parentCategories": [],
        "type": {}
      }
    ],
    "description": "this is a description of label catalog",
    "isSample": false,
    "lexicon": "[[\"啊\", \"aa\", \"a1\"], [\"阿婆\": \"aa\", \"a1\", \"p\", \"o2\"], [\"爱\", \"aa\", \"ai4\"], [\"爱祖国\",\"aa\", \"ai4\", \"z\", \"u3\", \"g\", \"uo2\"]]",
    "sampleRate": 32
  }
}'
```

**Output**

```
HttpStatus 200
{}
```

## GetLabelCatalog <a href="#getlabelcatalog" id="getlabelcatalog"></a>

**Acquire dataset label**

> **GET** /v1/datasets/{id}/labels/catalogs

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                        |
| ----------- | ------ | -------- | --------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time |
| commit      | string | false    | Commit ID, commit tag, or branch name                                                               |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/labels/catalogs?commit=v1.0'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
  "catalog": {
    "BOX2D": {
      "attributes": [
        {
          "name": "color"
        }
      ],
      "categories": [
        {
          "description": "hello",
          "name": "car"
        }
      ]
    }
  }
}
```

## UploadSensor <a href="#uploadsensor" id="uploadsensor"></a>

**Upload sensor**

> **POST** /v1/datasets/{id}/sensors

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name                     | Type   | Required | Descriptions                                                     |
| ------------------------ | ------ | -------- | ---------------------------------------------------------------- |
| draftNumber              | int    | 是        | Draft number                                                     |
| segmentName              | string | Yes      | Segment Name                                                     |
| name                     | string | Yes      | Sensor name                                                      |
| type                     | string | Yes      | Sensor type                                                      |
| description              | string | No       | Descriptions                                                     |
| extrinsics               | object | No       | The extrinsics of sensor                                         |
| ├─rotation               | object | No       | Rotation matrix                                                  |
| ├─w                      | float  | Yes      | w                                                                |
| ├─x                      | float  | Yes      | x                                                                |
| ├─y                      | float  | Yes      | y                                                                |
| ├─z                      | float  | Yes      | z                                                                |
| ├─translation            | object | No       | Translation matrix                                               |
| ├─x                      | float  | Yes      | x                                                                |
| ├─y                      | float  | Yes      | y                                                                |
| ├─z                      | float  | Yes      | z                                                                |
| intrinsics               | object | No       | The intrinsics of sensor (required only for camera-like devices) |
| ├─cameraMatrix           | object | No       |                                                                  |
| ├─cx                     | float  | Yes      |                                                                  |
| ├─cy                     | float  | Yes      | cy                                                               |
| ├─fx                     | float  | Yes      | fx                                                               |
| ├─fy                     | float  | Yes      | fy                                                               |
| ├─skew                   | float  | No       | skew                                                             |
| ├─distortionCoefficients | object | No       |                                                                  |

Distortion coefficients (p1, p2, k1, k2, k3, k4, k5, k6 and so on. The more coefficients are provided, the more accurate the calculation)        ├─p1|float|No|p1        ├─p2|float|No|p2        ├─k1|float|No|k1        ├─k2|float|No|k2        ├─k3|float|No|k3

**Request instance**

```
curl --location --request POST '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/sensors' \
--header 'x-token: {your_accesskey}'\
--data-raw '{
  "description": "This is a example camera sensor",
  "extrinsics": {
    "rotation": {
      "w": 0.6924185592174665,
      "x": -0.7031619420114925,
      "y": -0.11648342771943819,
      "z": 0.11203317912370753
    },
    "translation": {
      "x": 1.03569100218,
      "y": 0.484795032713,
      "z": 1.59097014818
    }
  },
  "intrinsics": {
    "cameraMatrix": {
      "cx": 1256.7414812095406,
      "cy": 492.7757465151356,
      "fx": 1256.7414812095406,
      "fy": 792.1125740759628,
      "skew": 122.7757465151356
    },
    "distortionCoefficients": {
      "k1": 0.12,
      "k2": 0.33,
      "k3": 0.13,
      "k4": 0.93,
      "k5": 0.23,
      "p1": 1,
      "p2": 0.3
    }
  },
  "name": "camera_01",
  "segmentName": "car",
  "type": "CAMERA"
}'
```

## DeleteSensor <a href="#deletesensor" id="deletesensor"></a>

**Delete sensor**

> **DELETE** /v1/datasets/{id}/sensors

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name        | Type   | Required | Descriptions |
| ----------- | ------ | -------- | ------------ |
| draftNumber | int    | Yes      | Draft number |
| segmentName | string | Yes      | Segment name |
| sensorName  | string | Yes      | Sensor name  |

**Request instance**

```
curl --location --request DELETE '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/sensors' \
--header 'x-token: {your_accesskey}'\
--data-raw '{
    "draftNumber": 1,
    "segmentName": "car",
    "name": "sensor1",
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## ListSensor <a href="#listsensor" id="listsensor"></a>

**Acquire the sensor**

> **GET** /v1/datasets/{id}/sensors

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                        |
| ----------- | ------ | -------- | --------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time |
| commit      | string | No       | The tag of commitId or commit                                                                       |
| segmentName | string | Yes      | Segment name                                                                                        |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/sensors?segmentName=car&commit=v1.0' \
--header 'x-token: {your_accesskey}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "segmentName": "car",
    "sensors": [
        {
            "name": "sensor1",
            "type": "camera",
            "extrinsics": {
                "rotation": {
                    "w": 1.1,
                    "x": 1.2,
                    "y": 1.3,
                    "z": 1.4
                },
                "translation": {
                    "x": 1.2,
                    "y": 1.3,
                    "z": 1.4
                }
            },
            "intrinsics": {
                "cameraMatrix": {
                    "cx": 1.1,
                    "cy": 1.2,
                    "fx": 1.1,
                    "fy": 1.2,
                    "skew": 1.3
                },
                "distortionCoefficient": {
                    "k1": 1.4,
                    "k2": 1.5,
                    "k3": 1.6,
                    "k4": 1.7,
                    "k5": 1.8,
                    "k6": 1.9,
                    "p1": 1.2,
                    "p2": 1.3
                }
            },
            "description": "this is a sensor"
        },
        {
            "name": "sensor2",
            "type": "camera",
            "extrinsics": {
                "rotation": {
                    "w": 1.1,
                    "x": 1.2,
                    "y": 1.3,
                    "z": 1.4
                },
                "translation": {
                    "x": 1.2,
                    "y": 1.3,
                    "z": 1.4
                }
            },
            "intrinsics": {
                "cameraMatrix": {
                    "cx": 1.1,
                    "cy": 1.2,
                    "fx": 1.1,
                    "fy": 1.2,
                    "skew": 1.3
                },
                "distortionCoefficient": {
                    "k1": 1.4,
                    "k2": 1.5,
                    "k3": 1.6,
                    "k4": 1.7,
                    "k5": 1.8,
                    "k6": 1.9,
                    "p1": 1.2,
                    "p2": 1.3
                }
            },
            "description": "this is a sensor"
        }
    ]
}
```

## ListData <a href="#listdata" id="listdata"></a>

**List data**

> **GET** /v1/datasets/{id}/data

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                                           |
| ----------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time                    |
| commit      | string | No       | Commit ID, commit tag, or branch name                                                                                  |
| segmentName | string | Yes      | Segment name                                                                                                           |
| limit       | int    | No       | The default is set to 128. The maximum value for a single time is 128                                                  |
| offset      | int    | No       | The default is 0                                                                                                       |
| sortBy      | string | No       | Currently sorting is based on created\_at and updated\_at while entering other content will return InvalidParamsValue. |
| orderBy     | string | No       | The default is desc (descending order). The valid content is asc (ascending order) and desc                            |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/data?draftNumber=1&segmentName=car'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**

Normal datasets

```
{
    "segmentName": "car",
    "type": 0,
    "data": [{"remotePath": "car.jpg."}],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

Fusion datasets

```
{
    "segmentName": "car",
    "type": 1,
    "data": [
        {
            "frameId": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
            "frameIndex": 1,
            "frame": [
                {
                    "sensorname": "camera_car",
                    "remotePath": "fusion_data_car3.jpg",
                    "timestamp":1609430401,
                }
            ]
        }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

## ListDataUri <a href="#listdatauri" id="listdatauri"></a>

**Acquire the data resource address**

> **GET** /v1/datasets/{id}/data/urls

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                                                                               |
| ----------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time                                                        |
| commit      | string | No       | Commit ID, commit tag, or branch name                                                                                                                      |
| remotePath  | string | No       | The data path. If you want to pass a value, search for the specific URL of this data                                                                       |
| segmentName | string | Yes      | Segment name                                                                                                                                               |
| limit       | int    | No       | The default is set to 128. The maximum value for a single time is 128                                                                                      |
| offset      | int    | No       | The default is 0                                                                                                                                           |
| sortBy      | string | No       | Currently sorting is based on the name (remotePath) and supports created\_at and updated\_at while entering other contents would return InvalidParamsValue |
| orderBy     | string | No       | The default is desc (descending order). The valid content is asc (ascending order) and desc                                                                |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/data/urls?draftNumber=1&remotePath=graviti.jpg&segmentName=car' \
--header 'x-token: {your_accesskey}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{
    "offset": 0,
    "recordSize": 5,
    "totalCount": 5,
    "segmentName": "car",
    "urls": [
        {
            "remotePath": "00000010.jpg",
            "url": "https://dataplatform-version.s3.us-west-1.amazonaws.com/61457d9174d2367811a2adae3ad94eae%2F63bedc17-8b4f-423f-893c-42b9ceff028e%2F%E7%AC%AC%E4%BA%8C%E6%AE%B5_00000010.jpg?Expires=1611304780&OSSAccessKeyId=LTAI4FjgXD3yFJUat4KADigE&Signature=DJbZOXSF1FSBQT4wEv69O%2B3OhyI%3D&versionId=CAEQPRiBgMD1o.mEshciIDk4ZmZkMWM2NmQ5ZTQ1NWRhNTBmZDZjNzJjNjM4OGRl"
        },
        {
            "remotePath": "00040820.jpg",
            "url": "https://dataplatform-version.s3.us-west-1.amazonaws.com/61457d9174d2367811a2adae3ad94eae%2F63bedc17-8b4f-423f-893c-42b9ceff028e%2F%E7%AC%AC%E4%BA%8C%E6%AE%B5_00040820.jpg?Expires=1611304780&OSSAccessKeyId=LTAI4FjgXD3yFJUat4KADigE&Signature=DihdFjHDtE3xEyIx3eGbTmN%2B%2Bzc%3D&versionId=CAEQPRiBgMD_pOmEshciIGFjYjVjY2FjYmZkMzRjYjVhZTQ5ZjQxZWMwMzhkOTMx"
        },
        {
            "remotePath": "00040890.jpg",
            "url": "https://dataplatform-version.s3.us-west-1.amazonaws.com/61457d9174d2367811a2adae3ad94eae%2F63bedc17-8b4f-423f-893c-42b9ceff028e%2F%E7%AC%AC%E4%BA%8C%E6%AE%B5_00040890.jpg?Expires=1611304780&OSSAccessKeyId=LTAI4FjgXD3yFJUat4KADigE&Signature=pwhm9liDx9%2BbDp2VlPghd1Kw0as%3D&versionId=CAEQPRiBgMD0pemEshciIGExZDdlOTBjMmQxMDQxMmFiM2QxMTAzNmU3N2I5ODFk"
        },
        {
            "remotePath": "00040900.jpg",
            "url": "https://dataplatform-version.s3.us-west-1.amazonaws.com/61457d9174d2367811a2adae3ad94eae%2F63bedc17-8b4f-423f-893c-42b9ceff028e%2F%E7%AC%AC%E4%BA%8C%E6%AE%B5_00040900.jpg?Expires=1611304780&OSSAccessKeyId=LTAI4FjgXD3yFJUat4KADigE&Signature=GpvY%2BJqbX7qKA70E7t58bRVn%2FcI%3D&versionId=CAEQPRiBgMC9p.mEshciIGY2YzIzNGZmM2EyZDQwMzZiODc4MzNmMmVlY2E0MTAy"
        },
        {
            "remotePath": "00040940.jpg",
            "url": "https://dataplatform-version.s3.us-west-1.amazonaws.com/61457d9174d2367811a2adae3ad94eae%2F63bedc17-8b4f-423f-893c-42b9ceff028e%2F%E7%AC%AC%E4%BA%8C%E6%AE%B5_00040940.jpg?Expires=1611304780&OSSAccessKeyId=LTAI4FjgXD3yFJUat4KADigE&Signature=TguAbiIM0pjWFse1S0MQRUbMuBg%3D&versionId=CAEQPRiBgIDLqemEshciIGM2YmRkZGJlNmY2OTQ5NmViNTEzMDg0NjFmNjczNmYw"
        }
    ]
}
```

## UploadLabel <a href="#uploadlabel" id="uploadlabel"></a>

**Upload labels**

> **PUT** /v1/datasets/{id}/labels

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name        | Type   | Required | Descriptions                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| ----------- | ------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| draftNumber | int    | Yes      | Draft number                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| segmentName | string | Yes      | Segment name                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
| remotePath  | string | Yes      | The corresponding resources                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| label       | map    | Yes      | <p>Label.<br>key:<br>CLASSIFICATION: annotation classification<br>BOX2D:2D box annotation<br>BOX3D: 3D box annotation<br>POLYGON2D: 2D polygon annotation<br>POLYLINE2D: 2D polyline annotation<br>KEYPOINTS2D: 2D keypoints annotation<br>CUBOID2D: 2D cuboid annotation<br>SENTENCE: audio transcription annotation<br><strong>Please refer to the request instances for the corresponding value content format for each key. Please follow the format of the input parameters for each annotation type.</strong></p> |

**Request instance**

```
curl --location --request PUT '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/labels' \
--header 'x-token: {your_accesskey}'\
--data-raw '{
  "remotePath": "car1.jpg",
  "segmentName": "car",
  "draftNumber": 1,
  "label": {
    "BOX2D": [
      {
        "attributes": {
          "color": "blue"
        },
        "box2d": {
          "xmax": 10,
          "xmin": 1,
          "ymax": 18,
          "ymin": 6
        },
        "category": "car",
        "instance": "400a7ec7faa643e38e7ab220463bc4b5"
      }
    ],
    "BOX3D": [
      {
        "attributes": {
          "color": "blue"
        },
        "box3d": {
          "rotation": {
            "w": 1,
            "x": 1.1,
            "y": 1.2,
            "z": 1.3
          },
          "size": {
            "x": 1.1,
            "y": 1.2,
            "z": 1.3
          },
          "translation": {
            "x": 1.1,
            "y": 1.2,
            "z": 1.3
          }
        },
        "category": "car",
        "instance": "400a7ec7faa643e38e7ab220463bc4b5"
      }
    ],
    "CLASSIFICATION": {
      "attributes": {
        "color": "blue"
      },
      "category": "car"
    },
    "CUBOID2D": [
      {
        "attributes": {
          "color": "blue"
        },
        "category": "car",
        "cuboid2d": {
          "back": [
            {
              "x": 1,
              "y": 2
            },
            {
              "x": 1.1,
              "y": 2.1
            },
            {
              "x": 1.2,
              "y": 2.2
            },
            {
              "x": 1.3,
              "y": 2.3
            }
          ],
          "front": [
            {
              "x": 1,
              "y": 2
            },
            {
              "x": 1.1,
              "y": 2.1
            },
            {
              "x": 1.2,
              "y": 2.2
            },
            {
              "x": 1.3,
              "y": 2.3
            }
          ]
        },
        "instance": "400a7ec7faa643e38e7ab220463bc4b5"
      }
    ],
    "KEYPOINTS2D": [
      {
        "attributes": {
          "color": "blue"
        },
        "category": "car",
        "instance": "400a7ec7faa643e38e7ab220463bc4b5",
        "keypoints2d": [
          {
            "v": 1.3,
            "x": 1.1,
            "y": 1.2
          }
        ]
      }
    ],
    "POLYGON2D": [
      {
        "attributes": {
          "color": "blue"
        },
        "category": "car",
        "instance": "400a7ec7faa643e38e7ab220463bc4b5",
        "polygon2d": [
          {
            "x": 1.1,
            "y": 1.2
          }
        ]
      }
    ],
    "POLYLINE2D": [
      {
        "attributes": {
          "color": "blue"
        },
        "category": "car",
        "instance": "400a7ec7faa643e38e7ab220463bc4b5",
        "polyline2d": [
          {
            "x": 1.1,
            "y": 1.2
          }
        ]
      }
    ],
    "SENTENCE": [
      {
        "attributes": {
          "color": "blue"
        },
        "category": "car",
        "instance": "400a7ec7faa643e38e7ab220463bc4b5",
        "phone": [
          {
            "begin": "b",
            "end": "e",
            "text": "hello"
          }
        ],
        "sentence": [
          {
            "begin": "b",
            "end": "e",
            "text": "hello"
          }
        ],
        "spell": [
          {
            "begin": "b",
            "end": "e",
            "text": "hello"
          }
        ]
      }
    ]
  }
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```

## **ListLabel** <a href="#listlabel" id="listlabel"></a>

**Acquire dataset label**

> **GET** /v1/datasets/{id}/labels

**Request parameter**

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Query**

| Name        | Type   | Required | Descriptions                                                                                                           |
| ----------- | ------ | -------- | ---------------------------------------------------------------------------------------------------------------------- |
| draftNumber | int    | No       | Draft number. Only one of draft and commit should exist, but they should not exist at the same time                    |
| commit      | string | No       | Commit ID, commit tag, or branch name                                                                                  |
| limit       | int    | No       | The default is set to 128. The maximum value for a single time is 128                                                  |
| offset      | int    | No       | The default is 0                                                                                                       |
| segmentName | string | Yes      | Segment name                                                                                                           |
| sortBy      | string | No       | Currently sorting is based on created\_at and updated\_at while entering other content will return InvalidParamsValue. |
| orderBy     | string | No       | The default is desc (descending order). The valid content is asc (ascending order) and desc                            |

**Request instance**

```
curl --location --request GET '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/labels?draftNumber=1&offset=0&limit=1&segmentName=car'\
--header 'x-token: {your_accesskey}'\
--header 'Content-Type: application/json' 
```

**Output**

Normal dataset

```
# Response status
HttpStatus 200
{
    "segmentName": "",
    "type": 0,
    "labels": [
        {
           "remotePath": "data_car.jpg",
           "label": {
           
           } 
        }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

Fusion datasets

```
# Response status
HttpStatus 200
{
    "segmentName": ""
    "type": 1,
    "labels": [
        {
            "frameId": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
            "order": 1,
            "frame": [
                {
                    "sensorName": "camera_car",
                    "remotePath": "fusion_data_car2.jpg",
                    "timestamp":1609430400,
                    "label": {
                    
                    }
                },
                 {
                    "sensorname": "camera_car",
                    "remotePath": "fusion_data_car3.jpg",
                    "timestamp":1609430401,
                    "label": {
                        
                    }
                }
            ]
        }
    ],
    "offset": 0,
    "recordSize": 1,
    "totalCount": 1
}
```

## **DeleteData** <a href="#deletedata" id="deletedata"></a>

**Delete Data**

> **DELETE** /v1/datasets/{id}/data

**Path**

| Name | Descriptions | Value      |
| ---- | ------------ | ---------- |
| id   | Yes          | Dataset ID |

**Body**

| Name        | Type      | Required | Descriptions                                                                                             |
| ----------- | --------- | -------- | -------------------------------------------------------------------------------------------------------- |
| draftNumber | int       | Yes      | Draft number                                                                                             |
| segmentName | string    | Yes      | Segment name                                                                                             |
| remotePaths | string\[] | Yes      | The list of remote paths that needs to be deleted. The number of the list should not be greater than 128 |

**Request instance**

```
curl --location --request DELETE '{service}/v1/datasets/154e35bae8954f09969ef8c9445efd2c/segments' \
--header 'x-token: {your_accesskey}'\
--data-raw '{
    "draftNumber": 1,
    "segmentName": "test",
    "remotePaths": ["car1.jpg"]
}'
```

**Output**

```
# Response status
HttpStatus 200
# Response result
{}
```


# Examples

Click to have a grasp of how to start your tour in the Graviti Data platform. Graviti Help Center provides examples as a Quickstart guide to help you learn how to train models and do data mining.

## Model training

This example covers the online training process of classification model based on MINST dataset to give you a grasp of Graviti data platform.

{% content-ref url="/pages/YpfBBqQ4BmCLWmPNGQcL" %}
[Model training](/dev-doc/tools/api-center/examples/model-training)
{% endcontent-ref %}

## Data mining

This example covers four steps to create a workflow integrating the crawling, conversion, parsing, and analysis of data based on TensorBay Action Feature.

{% content-ref url="/pages/ALjSekcvrY5BMWhj4aHA" %}
[Data mining](/dev-doc/tools/api-center/examples/data-mining)
{% endcontent-ref %}


# Model training

Based on TensorBay Action, this example integrates four steps: data crawling, conversion, parsing, and analytics into a complete workflow, giving you a quick overview of the Graviti Data platform.

#### 1. Prepare data

a. Enter the Open Datasets page. Search and fork `MNIST` to your own workspace.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FIxCIkt260Fus33Sh1D1u%2F1.png?alt=media\&token=05f92e0e-dd24-4764-870d-64f861f14840)

#### 2. Configurate the AccessKey

a. Enter the Developer Tools page，create and copy an AccessKey.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FINHHWRWUaxGj4ZWbNhTs%2FAccessKey.png?alt=media\&token=732b0728-339b-4995-94ee-9baa7bd87d19)

b. Enter the`MNIST`dataset you have forked.

c. Click Action Configuration and create Secret on the Settings page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FIIZ8sB9DRBxX6ZzpzmH5%2FConfiguration.png?alt=media\&token=818eb437-5319-44bd-931f-e0e19eb0378b)

d. Name the secret you have created as `accesskey`, and paste the secret value that was copied in step a.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FSVODZRtuOWZEvGjfztVT%2Fconfi.png?alt=media\&token=0a2da76b-64e2-4cbc-84df-d2c9b7ba26be)

#### 3. Create a training evaluation workflow

a. Click Create Workflow on the Action page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FJ2I278ZKo15pv6QPpFDE%2Fworkflow.png?alt=media\&token=ce4ca658-08ad-4f7e-abb4-1981d4e7dabb)

b. Use the yaml file to create a workflow.

```
//tasks:
  #  Create a dataset to save the training Model.
  createModelDataset:
    script:
      # The docker image on which this task depends is as below (Images from public and private repositories are both available)
      image: hub.graviti.cn/algorithm/mnist:1.0

      # Use python3 to execute the script
      command: [python3]

      source: |
        import logging
        import os
        from tensorbay import GAS
        logging.basicConfig(level=logging.INFO)
        dataset_name = "MNIST_MODEL"
        ACCESS_KEY = os.environ.get("secret.accesskey")
        gas = GAS(ACCESS_KEY)
        try:
            gas.create_dataset(dataset_name)
            logging.info(f"Created dataset {dataset_name} Successfully")
        except:
            logging.info(f"{dataset_name} aleady exists.")
  #  Train a mnist Model, and use the output model file for prediction
  training:
    dependencies:
      - createModelDataset
    script:
      image: hub.graviti.cn/algorithm/mnist:1.0
      command: [python3]
      source: |
        import logging
        import os

        import torch
        from PIL import Image
        from tensorbay import GAS
        from tensorbay.dataset import Dataset as TensorBayDataset
        from tensorbay.dataset.data import Data
        from torch import nn
        from torch.utils.data import DataLoader, Dataset
        from torchvision import transforms
        from tensorbay.client import config
        
        config.timeout = 150
        config.max_retries = 4

        logging.basicConfig(level=logging.INFO)


        # Building a Network Architecture.
        class NeuralNetwork(nn.Module):
            def __init__(self):
                super(NeuralNetwork, self).__init__()
                self.flatten = nn.Flatten()
                self.linear_relu_stack = nn.Sequential(
                    nn.Linear(28 * 28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10)
                )

            def forward(self, x):
                x = self.flatten(x)
                logits = self.linear_relu_stack(x)
                return logits


        # Read Datasets from Graviti platform.
        class MNISTSegment(Dataset):
            """class for wrapping a MNIST segment."""

            def __init__(self, dataset, segment_name, transform):
                super().__init__()
                self.dataset = dataset
                self.segment = self.dataset[segment_name]
                self.category_to_index = self.dataset.catalog.classification.get_category_to_index()
                self.transform = transform

            def __len__(self):
                return len(self.segment)

            def __getitem__(self, idx):
                data = self.segment[idx]
                with data.open() as fp:
                    image_tensor = self.transform(Image.open(fp))

                return image_tensor, self.category_to_index[data.label.classification.category]


        def train(dataloader, model, loss_fn, optimizer):
            size = len(dataloader.dataset)
            model.train()
            for batch, (X, y) in enumerate(dataloader):
                X, y = X.to(device), y.to(device)

                # Compute prediction error
                pred = model(X)
                loss = loss_fn(pred, y)

                # Backpropagation
                optimizer.zero_grad()
                loss.backward()
                optimizer.step()

                if batch % 100 == 0:
                    loss, current = loss.item(), batch * len(X)
                    logging.info(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")


        def test(dataloader, model, loss_fn):
            size = len(dataloader.dataset)
            num_batches = len(dataloader)
            model.eval()
            test_loss, correct = 0, 0
            with torch.no_grad():
                for X, y in dataloader:
                    X, y = X.to(device), y.to(device)
                    pred = model(X)
                    test_loss += loss_fn(pred, y).item()
                    correct += (pred.argmax(1) == y).type(torch.float).sum().item()
            test_loss /= num_batches
            correct /= size
            logging.info(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

        if __name__ == "__main__":
            BTACH_SIZE = 64
            EPOCHS = 3
            ACCESS_KEY = os.environ.get("secret.accesskey")
            gas = GAS(ACCESS_KEY)
            mnist_dataset = TensorBayDataset("MNIST", gas)
            mnist_dataset.enable_cache()
            to_tensor = transforms.ToTensor()
            normalization = transforms.Normalize(mean=[0.485], std=[0.229])
            my_transforms = transforms.Compose([to_tensor, normalization])

            train_segment = MNISTSegment(mnist_dataset, segment_name="train", transform=my_transforms)
            test_segment = MNISTSegment(mnist_dataset, segment_name="test", transform=my_transforms)
            train_dataloader = DataLoader(train_segment, batch_size=BTACH_SIZE, num_workers=10)
            test_dataloader = DataLoader(test_segment, batch_size=BTACH_SIZE, num_workers=10)

            device = "cuda" if torch.cuda.is_available() else "cpu"
            logging.info(f"Using {device} device")

            model = NeuralNetwork().to(device)
            logging.info(model)
            loss_fn = nn.CrossEntropyLoss()
            optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

            for epoch in range(EPOCHS):
                logging.info(f"Epoch {epoch+1}\n-------------------------------")
                train(train_dataloader, model, loss_fn, optimizer)
                test(test_dataloader, model, loss_fn)
            logging.info("Done!")

            torch.save(model.state_dict(), "model.pth")
            logging.info("Saved PyTorch Model State to model.pth")

            # Upload model file.
            model_dataset = TensorBayDataset("MNIST_MODEL")
            segment = model_dataset.create_segment("model")
            segment.append(Data("./model.pth"))
            dataset_client = gas.upload_dataset(model_dataset)
            dataset_client.commit("upload mnist model file")
            logging.info("Uploaded model!")
  evaluate:
    dependencies:
      - training
    script:
      image: hub.graviti.cn/algorithm/mnist:1.0
      command: [python3]
      source: |
        import logging
        import os
        from concurrent.futures import ThreadPoolExecutor

        import torch
        from PIL import Image
        from tensorbay import GAS
        from tensorbay.dataset import Dataset as TensorBayDataset
        from tensorbay.dataset.data import Data
        from tensorbay.label import Classification
        from torch import nn
        from torchvision import transforms
        from tensorbay.client import config
        
        config.timeout = 150
        config.max_retries = 4



        logging.basicConfig(level=logging.INFO)


        # Building a network structure
        class NeuralNetwork(nn.Module):
            def __init__(self):
                super(NeuralNetwork, self).__init__()
                self.flatten = nn.Flatten()
                self.linear_relu_stack = nn.Sequential(
                    nn.Linear(28 * 28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10)
                )

            def forward(self, x):
                x = self.flatten(x)
                logits = self.linear_relu_stack(x)
                return logits



        def upload_label(model, segment_client, data):
            with data.open() as fp:
                image_tensor = my_transforms(Image.open(fp))
            pred = model(image_tensor)
            pred_data = Data(data.path)
            pred_data.label.classification = Classification(str(int(pred[0].argmax(0))))
            segment_client.upload_label(pred_data)


        if __name__ == "__main__":
            BTACH_SIZE = 64
            EPOCHS = 3
            ACCESS_KEY = os.environ.get("secret.accesskey")
            gas = GAS(ACCESS_KEY)
            to_tensor = transforms.ToTensor()
            normalization = transforms.Normalize(mean=[0.485], std=[0.229])
            my_transforms = transforms.Compose([to_tensor, normalization])
            model_dataset = TensorBayDataset("MNIST_MODEL", gas)
            data = model_dataset[0][0]
            with open(f"./model.pth", "wb") as fp:  # Path where data is stored locally
                fp.write(data.open().read())
            model = NeuralNetwork()
            model.load_state_dict(torch.load("model.pth", map_location=torch.device("cpu")))
            logging.info(model)

            mnist_dataset = TensorBayDataset("MNIST", gas)
            mnist_dataset.enable_cache()
            mnist_dataset_client = gas.get_dataset("MNIST")
            mnist_dataset_client.create_branch("training")
            mnist_dataset_client.create_draft("update label")

            for segment in mnist_dataset:
                segment_client = mnist_dataset_client.get_segment(segment.name)
                with ThreadPoolExecutor(10) as executor:
                    for data in segment:
                        executor.submit(upload_label, model, segment_client, data)
            mnist_dataset_client.commit("update label")
```

## Create a dataset to save the training Model.

createModelDataset: script: # The docker image on which this task depends is as below (Images from public and private repositories are both available) image: hub.graviti.cn/algorithm/mnist:1.0

```
  # Use python3 to execute the script
  command: [python3]

  source: |
    import logging
    import os
    from tensorbay import GAS
    logging.basicConfig(level=logging.INFO)
    dataset_name = "MNIST_MODEL"
    ACCESS_KEY = os.environ.get("secret.accesskey")
    gas = GAS(ACCESS_KEY)
    try:
        gas.create_dataset(dataset_name)
        logging.info(f"Created dataset {dataset_name} Successfully")
    except:
        logging.info(f"{dataset_name} aleady exists.")
```

## Train a mnist Model, and use the output model file for prediction

training: dependencies: - createModelDataset script: image: hub.graviti.cn/algorithm/mnist:1.0 command: \[python3] source: | import logging import os

```
    import torch
    from PIL import Image
    from tensorbay import GAS
    from tensorbay.dataset import Dataset as TensorBayDataset
    from tensorbay.dataset.data import Data
    from torch import nn
    from torch.utils.data import DataLoader, Dataset
    from torchvision import transforms
    from tensorbay.client import config
    
    config.timeout = 150
    config.max_retries = 4

    logging.basicConfig(level=logging.INFO)


    # Building a Network Architecture.
    class NeuralNetwork(nn.Module):
        def __init__(self):
            super(NeuralNetwork, self).__init__()
            self.flatten = nn.Flatten()
            self.linear_relu_stack = nn.Sequential(
                nn.Linear(28 * 28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10)
            )

        def forward(self, x):
            x = self.flatten(x)
            logits = self.linear_relu_stack(x)
            return logits


    # Read Datasets from Graviti platform.
    class MNISTSegment(Dataset):
        """class for wrapping a MNIST segment."""

        def __init__(self, dataset, segment_name, transform):
            super().__init__()
            self.dataset = dataset
            self.segment = self.dataset[segment_name]
            self.category_to_index = self.dataset.catalog.classification.get_category_to_index()
            self.transform = transform

        def __len__(self):
            return len(self.segment)

        def __getitem__(self, idx):
            data = self.segment[idx]
            with data.open() as fp:
                image_tensor = self.transform(Image.open(fp))

            return image_tensor, self.category_to_index[data.label.classification.category]


    def train(dataloader, model, loss_fn, optimizer):
        size = len(dataloader.dataset)
        model.train()
        for batch, (X, y) in enumerate(dataloader):
            X, y = X.to(device), y.to(device)

            # Compute prediction error
            pred = model(X)
            loss = loss_fn(pred, y)

            # Backpropagation
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

            if batch % 100 == 0:
                loss, current = loss.item(), batch * len(X)
                logging.info(f"loss: {loss:>7f}  [{current:>5d}/{size:>5d}]")


    def test(dataloader, model, loss_fn):
        size = len(dataloader.dataset)
        num_batches = len(dataloader)
        model.eval()
        test_loss, correct = 0, 0
        with torch.no_grad():
            for X, y in dataloader:
                X, y = X.to(device), y.to(device)
                pred = model(X)
                test_loss += loss_fn(pred, y).item()
                correct += (pred.argmax(1) == y).type(torch.float).sum().item()
        test_loss /= num_batches
        correct /= size
        logging.info(f"Test Error: \n Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

    if __name__ == "__main__":
        BTACH_SIZE = 64
        EPOCHS = 3
        ACCESS_KEY = os.environ.get("secret.accesskey")
        gas = GAS(ACCESS_KEY)
        mnist_dataset = TensorBayDataset("MNIST", gas)
        mnist_dataset.enable_cache()
        to_tensor = transforms.ToTensor()
        normalization = transforms.Normalize(mean=[0.485], std=[0.229])
        my_transforms = transforms.Compose([to_tensor, normalization])

        train_segment = MNISTSegment(mnist_dataset, segment_name="train", transform=my_transforms)
        test_segment = MNISTSegment(mnist_dataset, segment_name="test", transform=my_transforms)
        train_dataloader = DataLoader(train_segment, batch_size=BTACH_SIZE, num_workers=10)
        test_dataloader = DataLoader(test_segment, batch_size=BTACH_SIZE, num_workers=10)

        device = "cuda" if torch.cuda.is_available() else "cpu"
        logging.info(f"Using {device} device")

        model = NeuralNetwork().to(device)
        logging.info(model)
        loss_fn = nn.CrossEntropyLoss()
        optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

        for epoch in range(EPOCHS):
            logging.info(f"Epoch {epoch+1}\n-------------------------------")
            train(train_dataloader, model, loss_fn, optimizer)
            test(test_dataloader, model, loss_fn)
        logging.info("Done!")

        torch.save(model.state_dict(), "model.pth")
        logging.info("Saved PyTorch Model State to model.pth")

        # Upload model file.
        model_dataset = TensorBayDataset("MNIST_MODEL")
        segment = model_dataset.create_segment("model")
        segment.append(Data("./model.pth"))
        dataset_client = gas.upload_dataset(model_dataset)
        dataset_client.commit("upload mnist model file")
        logging.info("Uploaded model!")
```

evaluate: dependencies: - training script: image: hub.graviti.cn/algorithm/mnist:1.0 command: \[python3] source: | import logging import os from concurrent.futures import ThreadPoolExecutor

```
    import torch
    from PIL import Image
    from tensorbay import GAS
    from tensorbay.dataset import Dataset as TensorBayDataset
    from tensorbay.dataset.data import Data
    from tensorbay.label import Classification
    from torch import nn
    from torchvision import transforms
    from tensorbay.client import config
    
    config.timeout = 150
    config.max_retries = 4



    logging.basicConfig(level=logging.INFO)


    # Building a network structure
    class NeuralNetwork(nn.Module):
        def __init__(self):
            super(NeuralNetwork, self).__init__()
            self.flatten = nn.Flatten()
            self.linear_relu_stack = nn.Sequential(
                nn.Linear(28 * 28, 512), nn.ReLU(), nn.Linear(512, 512), nn.ReLU(), nn.Linear(512, 10)
            )

        def forward(self, x):
            x = self.flatten(x)
            logits = self.linear_relu_stack(x)
            return logits



    def upload_label(model, segment_client, data):
        with data.open() as fp:
            image_tensor = my_transforms(Image.open(fp))
        pred = model(image_tensor)
        pred_data = Data(data.path)
        pred_data.label.classification = Classification(str(int(pred[0].argmax(0))))
        segment_client.upload_label(pred_data)


    if __name__ == "__main__":
        BTACH_SIZE = 64
        EPOCHS = 3
        ACCESS_KEY = os.environ.get("secret.accesskey")
        gas = GAS(ACCESS_KEY)
        to_tensor = transforms.ToTensor()
        normalization = transforms.Normalize(mean=[0.485], std=[0.229])
        my_transforms = transforms.Compose([to_tensor, normalization])
        model_dataset = TensorBayDataset("MNIST_MODEL", gas)
        data = model_dataset[0][0]
        with open(f"./model.pth", "wb") as fp:  # Path where data is stored locally
            fp.write(data.open().read())
        model = NeuralNetwork()
        model.load_state_dict(torch.load("model.pth", map_location=torch.device("cpu")))
        logging.info(model)

        mnist_dataset = TensorBayDataset("MNIST", gas)
        mnist_dataset.enable_cache()
        mnist_dataset_client = gas.get_dataset("MNIST")
        mnist_dataset_client.create_branch("training")
        mnist_dataset_client.create_draft("update label")

        for segment in mnist_dataset:
            segment_client = mnist_dataset_client.get_segment(segment.name)
            with ThreadPoolExecutor(10) as executor:
                for data in segment:
                    executor.submit(upload_label, model, segment_client, data)
        mnist_dataset_client.commit("update label")
```

#### 4. Start Training

a. Choose the target workflow and click **Run** on the Action page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FpHJr2Ag4vRZErzg9LaCM%2FRun.png?alt=media\&token=523e7797-839f-434c-9b51-87dd656fdcbb)

#### 5. View the result

a. View the details of the running on the Workflow Detail page.

b. View the Model Prediction result, diff visualizations and distribution changes in the `training` Branch.

c. Check the training Model that has been saved


# Data mining

Based on TensorBay Action, this example integrates four steps: data crawling, conversion, parsing, and analytics into a complete workflow, giving you a quick overview of the Graviti Data platform.

#### 1. Create a dataset

a. Click TensorBay to your Private workspace or Team workspace，and click *Create a New Dataset*

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FYljblzfV2G8TQGd1BxIu%2FCreateDataset.png?alt=media\&token=b1faf395-e4f3-4e3a-8b97-30f674de0d63)

a. Enter the Developer Tools page，click *Create AccessKey* and copy it.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FZwe0JJUxCae3QViCQ9Z0%2Faccesskey.png?alt=media\&token=1acecb27-d873-49c3-a2c9-586e6d21132b)

b. Enter the dataset page you have created, Click *Action Configuration* and *Create Secret* on the Settings page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FwGuOWA74lj79ZryzaMNr%2Fconfig.png?alt=media\&token=d7d887e8-5e9d-4da3-af6a-6b9cedb459a5)

c. Name the secret you have created as `accesskey`, and paste the secret value that was copied in step a.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FDF0WZDU1AQOMWq2rDefn%2Faccesskey2.png?alt=media\&token=6ad83c68-8d9e-4e5e-9c21-6229491396a8)

#### 3. Create a workflow

a. Click *Create Workflow* on the Action page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FxGbxt1SSIc9sYFwVQiax%2Fworkflow.png?alt=media\&token=ee6be809-f632-4171-84af-5f755e5cb4c7)

b. Fill in the *workflow name*.（Notice： Workflow names can only contain lowercase letters, numbers and minus signs, and must not be less than 2 characters with a minus sign at the beginning.）

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FHoJD3wmZ7yHymunJDMiA%2Fworkflow_name.png?alt=media\&token=2d0002ca-fb86-4080-a869-c39b316f2cc3)

c. Choose the workflow *trigger* mode.（Default: on manual）

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FHXm0NuVBvgsJ3eqebXeF%2Fworkflow_trigger.png?alt=media\&token=dfd824f5-51e7-4bf5-918f-96bbac4cff2e)

d. Configurate the workflow *parameter*.（Notice：This example parameter is derived from the command line parameter of the Images setting to adjust the month of crawled paper. The default is 1.）

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FPY9MBIuNRbwVQtG23FHw%2Fworkflow_parameter.png?alt=media\&token=880d9765-baeb-4961-a07c-071ba788e8bd)

e. Configurate the workflow *Instance*.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FGFc749ED0bistaDQMcIt%2Fworkflow_instance.png?alt=media\&token=3e6c6019-aae1-4f0f-9dfb-00cfe722261d)

f. Use the following code to create *YAML* fil&#x65;**.**

```
# A Workflow consists of multiple tasks that can be run serially or in parallel.
tasks:
  # This workflow includes four tasks: the scraper, pdf2txt, parser, statistics
  scraper:
    container:
         # The docker image on which this task depends is as below (Images from public and private repositories are both available)
      image: hub.graviti.cn/miner/scraper:2.3

      # The commaand`./archive/run.py {{workflow.parameters.month}}`will be excuted after Images running.
      command: [python3]
      args: ["./archive/run.py", "{{workflow.parameters.month}}"]
  pdf2txt:
    # pdf2txt depends on scraper, i.e. it only starts running after scraper has finished running
    dependencies:
      - scraper
    container:
      image: hub.graviti.cn/miner/pdf2txt:2.0
      command: [python3]
      args: ["pdf2txt.py"]
  parser:
    # parser depends on pdf2txt, i.e. it will only start running after pdf2txt has finished running
    dependencies:
      - pdf2txt
    container:
      image: hub.graviti.cn/miner/parser:2.0
      command: [python3]
      args: ["parser.py"]
  statistics:
    # statistics depend on the parser, i.e. they only start running after the parser has finished running
    dependencies:
      - parser
    container:
      image: hub.graviti.cn/miner/statistics:2.0
      command: [python3]
      args: ["statistics.py"]
```

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FcrNsw67LzIw867NQNqHz%2Fworkflow_yaml.png?alt=media\&token=7c6bb8cb-e2ff-4ee6-9c55-6a8c7d3bed18)

g. Publish the workflow.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FOppOwGLs9HiM4PP4h2Kz%2Fworkflow_public.png?alt=media\&token=ebccb428-7915-4885-b586-b8e094343dd5)

#### 4. Run the workflow

a. On the Action page, click the workflow you have created and run it.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FU1Rr567fuEFlD6FA5MDw%2Fworkflow_run.png?alt=media\&token=b1be1916-04c7-492c-9c1d-3aefc7b93630)

b. Adjust the parameter, for example, change the value to 10 (month), and click *Run*.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FIyzGxN6My55M0Gf3kP2c%2Fworkflow_run_para.png?alt=media\&token=083f29bd-d842-4b7a-9103-b08d283d266c)

#### 5. View the results

a. Click the outcome to enter workflow detail page, and click *User Logs* to view details of the workflow log.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F80Wu8JNzXljc49xIbt6X%2Fworkflow_log.png?alt=media\&token=9be54f29-bc9f-47b1-8f08-3af63a8a2a27)

b. On dataset detail page, click *General* -> *Dataset Preview* to view the statistics, which is the outcome of this workflow.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F3KPODmd7aL2a6H5SLmo8%2Foutcome1.png?alt=media\&token=a3576670-d7b8-420c-ab54-b9677480b084)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FiGOIisqVyJQSI9KVZ488%2Fimage.png?alt=media\&token=68eba8aa-3092-4011-96e4-172dae4bf343)


# TensorBay

Welcome to TensorBay, your unstructured Data Management Expert

## **What is TensorBay?** <a href="#id-1" id="id-1"></a>

TensorBay is a SaaS platform for unstructured data management. TensorBay provides services in data hosting, version control, data visualization, and collaboration. You can also integrate TensorBay into your pipeline using developer tools.

## **How to Enter TensorBay?** <a href="#id-2" id="id-2"></a>

* Enter our website: <https://www.graviti.com>. Click **Product** on the navigation bar, and enter the TensorBay introduction page. Learn about the main functions of TensorBay, and click **Start For Free** to start your algorithm journey.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MYE-RIMjZS8jPGumev1%2F-MYE2FPSE5AksYg8ayBH%2Fimage.png?alt=media\&token=b49ee39d-8a9b-4c3d-9179-3f5e7082db2e)

* Before using TensorBay, you need to sign up for Graviti. If you have not yet signed up, please sign up with email address or Github account. For more details, please see Enter TensorBay. If you have already signed up, please sign in with your Graviti account.&#x20;

## **Features at A Glance** <a href="#id-3" id="id-3"></a>

* Cloud Data Hosting

Upload and read datasets with Developer Tools to manage large amounts of raw data, metadata, annotations online. It also supports authentication of mainstream public cloud storage services to avoid data migration. Try Now - How to Create a New Dataset.

{% content-ref url="/pages/-MWWoJQYMp5bTPiv6rjL" %}
[How to Create a New Dataset](/guide/tensorbay/data/create)
{% endcontent-ref %}

* Version Control

TensorBay provides traceable version control, supports the version management of raw data and annotations. It can easily trace the version iteration of data without worrying about any changes. Try Now - Version Control.

{% content-ref url="/pages/-MWWsTimzZ3Ee4CP\_2Ea" %}
[Version Control](/guide/tensorbay/version)
{% endcontent-ref %}

* Online Data Visualization

Utilize visualization widgets that are compatible with common data formats and annotation types. Multiple previews of data distribution are provided without having to download the dataset or write code. Try Now - Online Data Visualization.

{% content-ref url="/pages/-MWWwvF1avrzIjUvlu1W" %}
[Pharos Online Data Visualization](/guide/tensorbay/visualization)
{% endcontent-ref %}

* Collaboration for Development Teams

TensorBay supports collaborative data management in a team. Through flexible settings of team member roles and dataset access permissions, you can safely synchronize and share data, avoid replications and migrations of data, and efficiently cooperate to accelerate your algorithm development. Try Now - Collaboration.

{% content-ref url="/pages/-MWWzP3NBBSWR8BVNNC8" %}
[Collaboration](/guide/tensorbay/collaboration)
{% endcontent-ref %}

* User-friendly Developer Tools

For rapid integration of the data with your pipeline, TensorBay provides developer tools including SDK, CLI, and API with specific documentations.

{% content-ref url="/pages/-MPHldAyMMAd\_N6eFJ99" %}
[Developer Tools](/dev-doc/tools)
{% endcontent-ref %}


# TensorBay: For All Stages of Algorithm Research

## Dataset Management: ZERO to ONE <a href="#id-1" id="id-1"></a>

On TensorBay, you can manage your data by uploading your own dataset and hosting it on TensorBay.

{% content-ref url="/pages/-MWWoJQYMp5bTPiv6rjL" %}
[How to Create a New Dataset](/guide/tensorbay/data/create)
{% endcontent-ref %}

* [Open Datasets](https://www.graviti.com/open-datasets) can provide you with numerous high-quality public datasets. Some datasets support [Fork](https://docs.graviti.com/guide/tensorbay/data/fork) and can be directly read and used in the cloud without downloading and data structure conversion.
* After creating your dataset, you can quickly use TensorBay to manage your datasets using visualization widgets to preview datasets online, view dataset label distributions, and more.

## Use Datasets for Your Algorithm Research <a href="#id-2" id="id-2"></a>

* You can use [Python SDK, CLI, or Open API](https://docs.graviti.com/dev-doc/tools) to create new datasets, read your data and annotations, and use your datasets in your pipeline. For your convenience, we have prepared code samples for you to copy directly, attached on pages with relevant functions.
* If you want to iterate over datasets, you can upload and publish your datasets directly with developer tools. This function will increase your efficiency in the process of data cleaning and backup, allowing you to quickly use datasets after release.

## Accelerate Dataset Preparation and Version Control

* GroundTruth Tools enable you to annotate your raw data and manage your annotations. It supports many people to annotate at the same time and to get twice the result with half the effort.&#x20;
* If a dataset is too small to meet your research needs or has severe data maldistribution, you can try to [merge](https://docs.graviti.com/guide/tensorbay/data/merge) your datasets or create by [filter](https://docs.graviti.com/guide/tensorbay/data/filter) to reduce your preparation time.
* TensorBay's [Version Control](https://docs.graviti.com/guide/tensorbay/version) allows you to release different versions of your data and trace back any published versions at any time for a truly clear, traceable version control experience.


# Quick Start for Developers

## Start to Use TensorBay <a href="#id-1" id="id-1"></a>

* Each Graviti user can get a developer community account with 100GB of free storage space. If you have signed up before, please sign in directly to your GAS dashboard and start building your AI world. You can invite your team members to use TensorBay, and see how to collaborate in a team. For details, see Collaboration.

{% content-ref url="/pages/-MWWzP3NBBSWR8BVNNC8" %}
[Collaboration](/guide/tensorbay/collaboration)
{% endcontent-ref %}

* On the GAS page, you can learn about TensorBay's main functions, including data hosting, version control, data visualization, team collaboration, and developer tools. You can also have a clear overview of current account details in your TensorBay workspace, including the number of datasets, the storage space used, the total capacity, the used data volume and the total data volume. You can also go to Recent Activities to quickly access your recent datasets.
* The navigation bar on the right displays your current workspace and related information. You can switch workspaces at the top navigation bar.&#x20;

{% hint style="info" %}
The data and permissions of your personal workspace and those of your team workspaces are independent of each other.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhN7F4Fi-Iz3lwRFctj%2F-MhNCnXfBgaLOkrW8EW8%2F1629272531.png?alt=media\&token=fc0c09ad-b7c7-41f2-a539-bd090aef0d58)

* On the home page **Recent Activities**, you can view all your activity history on TensorBay. If you share your dataset, you can also see the history of other users’ activities on the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhN7F4Fi-Iz3lwRFctj%2F-MhNBfq4VfXhfae1Qm6o%2F1629272108.png?alt=media\&token=c6f4fbde-6810-4757-98e0-e8c0d3869c93)

## Create a New Dataset <a href="#id-2" id="id-2"></a>

* You can enter your personal TensorBay workspace by clicking **Create a New Dataset** or click **TensorBay** at the navigation bar, and select **Create a New Dataset** to start your data journey.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhN7F4Fi-Iz3lwRFctj%2F-MhNAGhRUZ0eDksnGLbV%2F1629271862\(1\).png?alt=media\&token=65f5bb02-eb25-49c3-8855-658574cafa9f)

* Enter the **Create Dataset** page, fill in the dataset name, select the storage location，add storage configuration, and the visibility of the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mhm3foHXC0qLEWpbWTg%2F-Mhm52PvX9ZvZLYN_KeN%2Fd3009d4f5574ea77fe079e6a37cabed.png?alt=media\&token=8db160e5-1607-49d0-9e40-e1e0a17c690a)

* After clicking **Create**, you will enter the Create Draft page. The draft is based on the default (main) branch.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiJzWSrIPNhdUHxIQ4H%2F-MiJzamOqNPni8iALx1l%2F71ca7db08956028ee9a87a1a8366e84.png?alt=media\&token=d3ab3e0e-38e3-4ff1-9edc-3673e59e5917)

* Click **Confirm** to enter the Data Upload page. Create a segment so that you can upload data to the designated segment. You can upload files from local or upload with developer tools.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiJzWSrIPNhdUHxIQ4H%2F-MiK2SavBvFCfMvxg40H%2F1.png?alt=media\&token=3c129b80-a157-4727-bba6-8dfee3414198)

* After completing the data upload, click **Back to Commit,** enter **Commit message** and **Tag** as the description of the version, click **Confirm** to publish the new version, and complete the Commit action. The version cannot be modified after the release.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiJzWSrIPNhdUHxIQ4H%2F-MiK2an3LhwWHt55iAWe%2Fdce0888c27094cf28bf3d525e2ac6c9.png?alt=media\&token=6ec91e5d-89d4-4700-bf05-bf722215c4c3)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiJzWSrIPNhdUHxIQ4H%2F-MiK2g9kGI0TgMQma32c%2Ffa0822db3a69a780821f5a1db64cc98.png?alt=media\&token=7ee388a8-1671-4128-bfc4-9c3b8b557875)

## Version Control <a href="#id-3" id="id-3"></a>

* After clicking **Commit**, you will enter the dataset details page, where you can view all the commit versions and the dataset details. Click **View All Tags** to see all Commit records.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiK2k_8BqwY9PATJ1Tc%2F-MiK3YpOsxUH-9ZmXJw6%2Ff079371a076c3990ef8fc55d0127366.png?alt=media\&token=67c0523c-4e08-431d-af4e-0133171df995)

* You can click the <img src="https://lh5.googleusercontent.com/YCeYD36AHUV1td0KrccGHSHROE6B3J1YvDdVkTCDnfzAv3KUAwd7OnClQxHQunvqLUiABFXz8QkhTlKewzaAGYk0HKm5Wy5KiWb6ThHGwKTK_kn8SZevtGdLBebeYXKZzT03lTGk=s0" alt="" data-size="line">icon to view the details of the corresponding Commit version.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiK2k_8BqwY9PATJ1Tc%2F-MiK3mBNSg891rvDsmWH%2Fd2d52f09b91b638a3a2382dc2e10bd1.png?alt=media\&token=77b041a8-fef0-435c-a2c6-9b2a12fc014d)

* With Version Control, you can view all data and information of all committed datasets. For details, see Version Control.

{% content-ref url="/pages/-MWWsTimzZ3Ee4CP\_2Ea" %}
[Version Control](/guide/tensorbay/version)
{% endcontent-ref %}

## Use Data on TensorBay <a href="#id-4" id="id-4"></a>

You can read your dataset on TensorBay and quickly integrate the datasets into your pipeline with developer tools, including Python SDK, CLI, and Open APIs.

{% content-ref url="/pages/-MWX0bdrKDpcx1Bvxyhv" %}
[How to Integrate TensorBay into Your Pipeline](/guide/tensorbay/pipeline)
{% endcontent-ref %}


# Quick Start for Team

## Start to Use TensorBay <a href="#id-1" id="id-1"></a>

* &#x20;Sign in to your Graviti account and switch to your team workspace that you want to enter on the navigation bar. If you haven't created or joined any team workspace, you need to select Create Team Workspace or contact your team admin to invite you. For details, see How to Work as a Team on TensorBay.

{% content-ref url="/pages/-MWWzP3NBBSWR8BVNNC8" %}
[Collaboration](/guide/tensorbay/collaboration)
{% endcontent-ref %}

## Create Your Team Workspace <a href="#id-2" id="id-2"></a>

* Click Create a New Team to enter the Create Team page in your space list on the home page or the top navigation bar of the GAS Dashboard. For details, see [Create a New Team](/guide/tensorbay/collaboration/create).

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiK6OCCWenQShLwWXhZ%2F-MiK6Xll6e-oVsyE8hPo%2F2ca04646b4b6db96fc933b2396846c2.png?alt=media\&token=57c9480a-0288-40db-9b2c-dc2945246a0c)

{% content-ref url="/pages/-MWWzaXI\_WdOBQruXY3k" %}
[Create a New Team](/guide/tensorbay/collaboration/create)
{% endcontent-ref %}

* Enter your team information on the **Create a New Team** page, and invite your team members to join the team. For details, see Invite Members.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiK6OCCWenQShLwWXhZ%2F-MiK6klyEyj1z2kqnlmm%2F11a9251d4bfb9ccac0dd12462e1c29e.png?alt=media\&token=852cbc1c-a50a-4320-bfc3-3e6e168cb930)

{% content-ref url="/pages/-MWX-8rW8QyfLOLheY6g" %}
[Invite Team Members](/guide/tensorbay/collaboration/invite)
{% endcontent-ref %}

* By default, Team Founder refers to the super admin of a team. A team founder can manage the personnel and the data of the team, regarding team data management, team member management, team asset management, etc. For details, see Team Management.

{% content-ref url="/pages/-MWX-VM0OeM1weZbyZzt" %}
[Team Management](/guide/tensorbay/collaboration/manage)
{% endcontent-ref %}

* After the team is created, you can enter the Team Space page, and check out the data usage profile of the current team, i.e. the number of Team Datasets, the usage of storage space, authenticated storage，and the data volume. Recent Activities displays the activity records of your team.

{% hint style="info" %}
The data and access permissions of your personal workspace and that of your team workspace are independent of each other.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhNCuGikV7qq-srOxC0%2F-MhNEiteNvDgSYrbggMI%2F1629273101\(1\).png?alt=media\&token=3cfa26c9-8f22-486f-807b-b2302bed18c5)

* On the team home page **Recent Activities**, you can view all the activity history of you and your team members on TensorBay.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mi0eV_TnS1uYnTl-VCM%2F-Mi0fuP4vkZTEJIXmssg%2Fd2e6a620faff0eff1a8c79d9f6fecb7.png?alt=media\&token=7489032b-bfb4-4d02-83cc-b6899477e083)

## Create a New Dataset in Your Team <a href="#id-3" id="id-3"></a>

* Enter your team's workspace on the navigation bar. Select Create a New Dataset to start your team's dataset journey.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FF2JuzJZoNRKHnMUclQML%2Fdataset_activities.jpg?alt=media\&token=19a83cb9-03fe-4f4f-b3df-e4eae6688bd3)

* Enter your dataset name, select the storage location and visibility of the dataset and add storage configuration.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mhm3foHXC0qLEWpbWTg%2F-Mhm5N2iLR_w5z9dPhZn%2F805ad03994d1e2d3005388057cde3af.png?alt=media\&token=f2a8bc5d-c426-4aef-bb9b-ec1426d2c7a5)

* After clicking **Create,** you will enter the Create Draft page. The draft is based on the default (main) branch.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiKtCQhX06vW_ONJeGb%2F-MiKuvpwvauvVcvyQ6jP%2Fe6d9ecdf2aff4ee9d5020c7a832b509.png?alt=media\&token=880221d0-52f1-4547-bb46-3aaadfeb3e01)

* Click **Confirm** to enter the Data Upload page. Create a segment so that you can upload data to the designated segment. You can upload files from local or upload with developer tools.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiKtCQhX06vW_ONJeGb%2F-MiKvHYBK_0G1ZUhPt8G%2F3.png?alt=media\&token=809aad54-58f7-4419-a930-3a38874d91aa)

* After completing the data upload, click **Back to Commit.** Click **Commit** and then enter **Commit Message** and **Tag** as the description of the version. Click **Confirm** to publish the new version to complete the Commit action. The version cannot be modified after the release.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiKtCQhX06vW_ONJeGb%2F-MiKvthJfoLdB653-RwH%2F843d99fcb51ef3eb66941bffa364c92.png?alt=media\&token=4fff4649-530e-4b42-bb86-1033feb6b5b3)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiKtCQhX06vW_ONJeGb%2F-MiKw3Nm8aAQmMby5_NV%2F4f7bc11fc00bd2c57901d6e0e4ec403.png?alt=media\&token=e3b67ab6-8e61-451f-ab5d-8eeac63b8efb)

## Version Control <a href="#id-4" id="id-4"></a>

* After Commit, you can enter your Dataset Details page to view all the versions and details of the dataset. Click **View All Tags,** and then you can view all the tags and Commit records.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiK6OCCWenQShLwWXhZ%2F-MiK7EFIDkOmzXYao0G0%2Fa64414dc74676e9c06a8a01c6300c42.png?alt=media\&token=c5bb0e45-255a-474b-a36b-f7ac3cfede11)

* Click the <img src="https://lh5.googleusercontent.com/YCeYD36AHUV1td0KrccGHSHROE6B3J1YvDdVkTCDnfzAv3KUAwd7OnClQxHQunvqLUiABFXz8QkhTlKewzaAGYk0HKm5Wy5KiWb6ThHGwKTK_kn8SZevtGdLBebeYXKZzT03lTGk=s0" alt="" data-size="line">icon to view the details of the corresponding version.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiK6OCCWenQShLwWXhZ%2F-MiK7QCJO4dUaume9Xgi%2F2715ff8fa550e8c7ab735a099fe6f1a.png?alt=media\&token=cd5c4d26-c90c-459d-a1ef-25f7c4c00e6c)

* With Version Control, you can view all data and information of all committed datasets. For details, see Version Control.

{% content-ref url="/pages/-MWWsTimzZ3Ee4CP\_2Ea" %}
[Version Control](/guide/tensorbay/version)
{% endcontent-ref %}

## Use Data on TensorBay <a href="#id-5" id="id-5"></a>

* With developer tools like PythonSDK, CLI, and Open API, you can read your datasets on TensorBay and quickly integrate them into your pipeline with your team members. For details, see Graviti Help Center.

{% content-ref url="/pages/-MWX0bdrKDpcx1Bvxyhv" %}
[How to Integrate TensorBay into Your Pipeline](/guide/tensorbay/pipeline)
{% endcontent-ref %}


# How to Quickly Prepare a Dataset

TensorBay provides you with a number of ways to quickly prepare your datasets. There are multiple methods to create a new dataset.

* Create a New Dataset Directly

{% content-ref url="/pages/-MWWoJQYMp5bTPiv6rjL" %}
[How to Create a New Dataset](/guide/tensorbay/data/create)
{% endcontent-ref %}

* Create a New Dataset from an Existing Dataset by Filtering the Data

{% content-ref url="/pages/-MWWp5Tjdsbk44ql2SEj" %}
[Create a Dataset by Filtering](/guide/tensorbay/data/filter)
{% endcontent-ref %}

* Create a New Dataset by Merging Existing Datasets

{% content-ref url="/pages/-MWWrECxrfPbCFcHCzRv" %}
[Create a Dataset by Merging](/guide/tensorbay/data/merge)
{% endcontent-ref %}

* Create a New Dataset by Forking a Dataset from the Open Datasets

{% content-ref url="/pages/-MWWro4TxVuiSsF6U2wW" %}
[Quick Use of Open Datasets by Forking](/guide/tensorbay/data/fork)
{% endcontent-ref %}

TensorBay supports two ways to store datasets:

* Default Storage Location: your data will be stored in TensorBay Cloud Storage (Storage of Amazon S3) and each registered user will be provided with 100GB of free storage.


# How to Create a New Dataset

You can select Graviti Storage to upload data to your private storage space on TensorBay, or select the Authorized Storage to authorise TensorBay to manage your data stored on other cloud servers.

## Create a New Dataset <a href="#id-1" id="id-1"></a>

* Click **TensorBay** on the top navigation bar to enter **My Datasets**, and select **Create a New Dataset** in the new dataset drop-down box to create a dataset. By clicking TensorBay, an individual developer user will enter the My Datasets page by default, whereas a team user will enter the Team Datasets page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F1c7S0DbP8wCooYGbWvZO%2Fimage.png?alt=media\&token=0acd9715-7ecd-4323-bc73-b19adf32dbd8)

## Enter the Dataset Name and Alias (Optional)&#x20;

After entering the dataset name and its alias, the URL including the dataset name will be generated automatically. Both the dataset name and alias can be changed.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FimMWEssgGc9Fp90kfnxR%2Fimage.png?alt=media\&token=3e27ee00-5491-4cc8-9fab-b3d51b1af5c1)

## Select Data Storage Configuration <a href="#id-2" id="id-2"></a>

Select or create your data storage method and upload the data to the corresponding storage space.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FzfZtjMcQZgIVfTan0txF%2Fimage.png?alt=media\&token=b52542b1-1480-407d-83dc-8772655bfee4)

{% hint style="info" %}
Note: this will take up your Graviti storage or Authorized storage space
{% endhint %}

## Add Data Storage Configuration&#x20;

If the storage configuration in the drop-down box does not meet your needs, you can click Add Data Storage Configuration to add a suitable storage method.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FPy3qbNS5x5MzBreww96m%2Fimage.png?alt=media\&token=0dad3b83-1ed0-4e75-bd52-db31a64367f2)

Developers are only supported to select Graviti Storage to upload data to your private storage space on TensorBay (note: this will take up your Graviti storage)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FkWSnugjf9A523ad2HPde%2Fimage.png?alt=media\&token=5d4861a1-6787-4e9b-97a2-18d6abdc06aa)

In addition to Graviti Storage, team members can choose Authorized Storage. TensorBay will read and manage your data on your other cloud storage platforms after being authorized, which will not occupy your Graviti storage space but your authorized storage space.&#x20;

After filling in the corresponding configuration information, you can use your data on Alibaba Cloud OSS, Amazon S3 and Azure Blob by authorization. For details, please refer to [Manage Data on the Cloud Storage Platforms](/guide/tensorbay/data/authorize).

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FYpgkb4ufV6EIsruOnwcq%2Fimage.png?alt=media\&token=c57c9d82-b460-4ebb-9f54-af66fa74b06c)

## Choose Visibility <a href="#id-3" id="id-3"></a>

* **Public** indicates that the data in your dataset will be open to the public. Anyone can search, view, retrieve, and browse the data of this public dataset. Graviti supports your contribution to the AI community and will provide unlimited free storage capacity for your open datasets.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FMnlxDPydR9A4ZHStKVuS%2Fvisibility.jpg?alt=media\&token=f48be29e-cc2a-4452-9cc8-03f62e5dd372)

* **Private** indicates that this is your private dataset, and no one has access to it without permission. If you create a private team dataset, by default, your team members can search for and view basic information about the dataset, and you can control who can view, use, edit, or manage the data in the team.

## Add Data <a href="#id-4" id="id-4"></a>

After creating a dataset, you will enter the Upload Data page belonging to the default draft. The draft is based on the Main Branch.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FlPLMVZffRzt37rROaRSC%2FS1.jpg?alt=media\&token=dfa29fad-ccc5-4cbf-91fd-9ef9a7a680d8)

* You can upload your data to a target Segment (You should create a segment before uploading). Tensorbay supports users to choose **Upload Files from Local** or **Upload Files from Developers Tools** to upload their data.
* You can also choose **Skip** to enter Commit Draft page

### Upload Files from Local

* Select **Upload Files from Local**. You can drag the local folders into the page, or select multiple data files to upload in the local directory. After adding the data, click **Upload**, and TensorBay will read the data from your local and transfer it to your private cloud storage space. Please do not leave the upload interface before the process is finished, otherwise, the transfer of the remaining data will fail.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgdSSjf_R246cE12MKJ%2F-MgdSVWAcMD-8QTZdStt%2F4.png?alt=media\&token=b3d984b3-3345-4792-ae4d-f86cacd4cb0c)

### Upload with Developer Tools

* With **Upload with Developer** **Tools**, you can upload data files and annotate data with Python SDK or Open API. This method supports the uploading, editing, and managing of fusion datasets, continuous data, and annotations. For details, see How to Use [Developer Tools](https://docs.graviti.com/dev-doc/tools).

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FkY9PUIM6UnofiQHrL0Dv%2F11.png?alt=media\&token=5c528e98-fe8a-4d78-947b-c254f16340b4)

{% content-ref url="/pages/-MPHldAyMMAd\_N6eFJ99" %}
[Developer Tools](/dev-doc/tools)
{% endcontent-ref %}

## Commit Draft <a href="#id-5" id="id-5"></a>

* After completing the data upload, click **Confirm** to Commit draft page and enter **Commit Title**, **Description(Optional)**  and **Tag(Optional)** as the description of the version, click **Commit** to publish the new version, and complete the Commit action. The version cannot be modified after the release.

{% hint style="info" %}
Only committed datasets can be used for labeling, merging, filtering, training, and so on.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FwUDHFgtBjelNHNAEHvmY%2FCD1.png?alt=media\&token=60dc164c-b953-4d74-aad3-bea3a4c55e04)

* If you do not want to publish the draft, you can click **Skip**, and the dataset will remain a draft. Return to the Dataset Details page and click **Manage Data**, you can enter the Data List page to continue editing your data. You can also click **Enter to Draft** and enter the Draft List page to choose a draft and modify the dataset details.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgdSSjf_R246cE12MKJ%2F-MgdSvga82NPO7WA0v7m%2F9.png?alt=media\&token=eadeadf1-742c-4cec-bdbe-dedc108e9a2c)

* Click **Manage Data** to enter the Data List page and continue to edit your data. You can view you dataset, conduct **Search**, viewing **Catalog,** creating new draft to edit data and creating a new dataset.


# Manage Data in Cloud Storage

You can efficiently manage your data on cloud storage with TensorBay through Cloud Storage Authentication

## Add Storage Configurations&#x20;

In the developer's workspace, you can manage your Graviti Storage configuration. In the team workspace, only a super admin or an admin of the team can manage the Graviti Storage configuration and Authorized Storage configuration of the team datasets.

#### Configuration Entry 1&#x20;

1. Click TensorBay on the top navigation bar to enter the List interface of my dataset in your current personal workspace or team dataset in your team space.
2. Click <img src="https://lh4.googleusercontent.com/GNth16L4vbcf7KfI3-80e8Rba_ZLFuLvxPdbJa4JQDtRQw5979GNi3WRRkE2LNVmFtTxbxMApBwxKrEOaAX0YL7SbU-C-uygawSMlaQVtZqUBUADLoAvefxHx7H2Q3Nu7YwdSS9H=s0" alt="" data-size="line">to enter the configuration list interface.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FaMl9zcTGZQsaYMoCIEkU%2Fimage.png?alt=media\&token=49ec71e2-0cc9-47f3-9827-da838c0bb4f6)

You can manage the storage configuration information of the current workspace in the Storage Configuration List. Click **New Configuration** and you will enter the New Configuration Page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FYo5cuz3alf1nG8b7l6Jp%2Fimage.png?alt=media\&token=0ade6ba7-62e9-40e7-aad5-96be4cb0d754)

#### Configuration Entry 2

1. Click **Create Dataset**.
2. Click **Add New Configuration** to enter the Add New Configuration page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FABORvB4ZgvNSLt8WDOIF%2Fimage.png?alt=media\&token=2aa5be19-8e82-4b80-a1ff-4bb6d8be2176)

After entering the Add New Configuration page, developers can select **Graviti Storage** and **Region**.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FtQmQOJXAXX1tXgg1DgoY%2Fimage.png?alt=media\&token=15b1f241-2790-45f2-8aad-c2ddc74f62eb)

Team members can select either **Graviti Storage** or **Authorized Storage**.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FDc9QZOR2CFACwH6lh7iS%2Fimage.png?alt=media\&token=186cbbf4-e18e-44d1-aff9-c07981ce36df)

For Authorized Storage, you need to select your cloud storage provider, fill in the configuration name and relevant authorization information. Click **Confirm** to finish setting.

TensorBay will check with your cloud storage provider about the accuracy of the relevant configuration information and AccessKey, and then save the authentication information after after they are successfully verified. Currently, GAS supports the use of data on Amazon S3、Azure Blob by authentication.

## Manage Storage Configurations

You can manage your cloud storage configuration in the configuration list. Select the configuration you need to edit and click ![](https://lh5.googleusercontent.com/F65VzF-81G_2L_x-wQ5uLUV3RSwo6A02XJuFGkzqkT7d4ABDwQ2VWa4YxdaXuf-pND3vzfJQfRObGrV5oZ_1a-jqgU40nzOSp62YtVi9YTsVLrCPOg5tOn9wcrzWj6vYO9G3bbps=s0) to select the corresponding action.

* Support to set the selected configuration as default configuration or delete the selected configuration in **Graviti Storage**
* Support to edit the selected configuration, set the selected configuration as default configuration or delete the selected configuration in **Authorized Storage.**

{% hint style="info" %}
Note: The storage configuration management permission is limited to developer users and super admin or admins in a team. It can be viewed but not be modified by members.
{% endhint %}

### &#xD;Manage the Graviti Storage Configuration

You can click **Set as Default** to set the current storage configuration as your default configuration. And it will be displayed as the default configuration when you create a dataset.

You can click **Delete** to delete the default configuration. The datasets created with this configuration will not affected after deleting the default configuration.

### Manage the Authorized Storage Configuration

Only a super admin or an admin has permission to set the authorized storage configuration

* Click **Set as default** to set the current storage configuration as your default configuration, and it will be displayed as your default configuration when you create a dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fkx759VUwj04VlE955XvR%2Fimage.png?alt=media\&token=92bf2d9c-9a27-476a-9bf4-661a90bb5032)

* You can click **Delete** to delete authorized storage configuration.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FU8bwpTC7citPxHX8ZzEH%2Fimage.png?alt=media\&token=9eaa0aa7-f7ed-4586-b896-f2a2158b1a86)

{% hint style="info" %}
Note: If you delete the configuration, it will not be available when you create a dataset. Please make sure that there are no datasets currently using this configuration before deleting it.
{% endhint %}

* Click **Edit Configuration** to enter the authorized storage configuration editing page. Support to edit Accesskey ID or Accesskey Secret on this page.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F9cCBDCvlHzDzP8kaBYN9%2Fimage.png?alt=media\&token=d5f08bad-c722-413c-a938-4daa6c5dfe8f)

* Select **Confirm** to save your changes when you finish editing. After that, the system will reverify whether your configuration and authentication information is correct or not.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FN3E4EoVBsrgJPXR4Ea6X%2Fimage.png?alt=media\&token=b19604d6-5690-4813-9648-c3f6393a9f6d)


# Create a Dataset by Filtering

Create a dataset by filtering data of the current dataset. This will not duplicate data and will help you save a lot of storage space. You can also view data details, label distribution, and other information online with visualization widgets while filtering a dataset.

* Select **Create by Filter** from the drop-down box on the TensorBay Dataset List page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FoxILmQZHwkKSyRtfkSAu%2Ffilter.jpg?alt=media\&token=5aa0c4a2-bb9c-4c3b-9e20-bb304ca30d72)

## Filter Data <a href="#id-1" id="id-1"></a>

* Enter the **Data List page**, and select the dataset version you want to manage from the drop-down box on the left.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiV9i2vXdNE2ULctyvl%2F-MiVCXbqwlX8cdYwIBG8%2F659defcaa65de971cad50a92ceef8eb.png?alt=media\&token=390598bb-95d0-43ec-927e-70e1a15c3358)

* Confirm the version to be managed. You can filter data with the data name, segment, and annotation. The filtered data will be shown in the **Data List** on the right.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiV9i2vXdNE2ULctyvl%2F-MiVCj_u5wy9xYy40K_e%2F2f2da19dcd9e5a29c59e315a3d12feb.png?alt=media\&token=1433b681-e910-45e2-815f-4ac9a925321e)

## View Data Details <a href="#id-2" id="id-2"></a>

* On the **Data List** page, you can also preview the data online and view the specific annotation status with the visualization on the right. For details, please see Data Visualization widget.

{% content-ref url="/pages/-MWWyT3Keo9v1HgMkMDu" %}
[Pharos Visualization Widgets Instruction](/guide/tensorbay/visualization/visualization-widgets)
{% endcontent-ref %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiV9i2vXdNE2ULctyvl%2F-MiVCteHZYMnOxss71Ls%2F104154462caabda99129b4a42eb2da0.png?alt=media\&token=8b20c99c-0966-4b79-ad26-f52051305621)

## View Label Distribution <a href="#id-3" id="id-3"></a>

* View the distribution of labels and annotations on the right.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiVDjLYiauac5glf4Cs%2F-MiVE72GRpkmnOY-sOH_%2Fa25299dd00c5f6ca883b8dd7acb602d.png?alt=media\&token=e42e770a-1768-4807-b824-430f99b192f6)

## Create a Dataset by Filtered Results <a href="#id-4" id="id-4"></a>

* Select **Create a new dataset based on this result**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiVDjLYiauac5glf4Cs%2F-MiVEvI_hTsVMUfC67pj%2Fe30ac547f733feda74fe17aa1350e57.png?alt=media\&token=4a87553f-7f64-4ff9-b79d-1fe22d50520b)

* Fill in dataset name, select storage location and set vsibility (public or private). Select **Create** to complete the dataset creation.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiVG2NkP3ws4g9lq4U8%2F-MiVGK5YVWQNKfVioLpb%2F270dd92ec4d1e56d6f638e2fed5f590.png?alt=media\&token=eaa3c26a-10ec-4550-869c-b3628de3cee8)

* When the dataset is created, you can jump to the Details page of the newly created dataset.

## **Advanced Search**

For fusion and normal datasets, you can not only search by filters (including segment name, annotation type, and with or without annotation) but also customize the advanced search. All you need to do is add a GitHub URL to get a file and use the file to filter data.

* On the Dataset Details page, click **Manage Data** and **View Data** to enter the Data List page.
* Click **Advanced Search**
* You will see the pop-up window for uploading GitHub Repo Link. Copy the link of the file you want to upload into the window and click **Search** to start filtering.\
  Note: The link should be under the HTTPS protocol, which means that the link should begin with “https”, and the address and revision should be separated by“:”.
* After completing the advanced search, the search results will be automatically saved in **Search Records.**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MiVG2NkP3ws4g9lq4U8%2F-MiVGhRPlZEetM-z9kKN%2F8d7e4027d3040936e76eef512c0cdc4.png?alt=media\&token=c3e7f9e9-c63a-4e11-b915-9f0868ce6cbe)

\ <br>


# Create a Dataset by Merging

This function is being upgraded and is not available for now.

Create new datasets by merging existing datasets on TensorBay.

* Click TensorBay on the top navigation bar to enter the **Dataset List** of your workspace. Select **Create by Merge** in the drop-down box of Create Dataset. Create a new dataset by merging existing datasets

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FpEx1ACBvmJF4Lsvt8AUC%2Fdataset_merge1.jpg?alt=media\&token=0f6fac83-adfd-4532-b0a5-a8194194cede)

* Select datasets to merge, and click Confirm 2/2.&#x20;

{% hint style="info" %}
Datasets that have been merged cannot be merged again.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FztcMpyOO5Rxg7aZTPdyl%2Fdataset_merge2.jpg?alt=media\&token=6ce88804-1121-47e8-8b70-38ab38f72ea2)

* Select the dataset version you want to merge in the drop-down box. The default version is the latest version, which cannot be merged. View the versions to be merged in the drop-down box. Before you start merging datasets, you can select **Include Annotations** or **Exclude Annotations**. Click **Merge and Review** to start merging and reviewing the datasets to be merged.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FHRsV4xyMibLBdYL0ojaD%2Fdataset_merge3.jpg?alt=media\&token=d93ee6b0-be41-4da4-b107-23a3ca543422)

* After entering the Merge and Review page, the system will check whether the data to be merged has data conflicts. If the data file names are the same, the datasets cannot be merged. If Merge and Verify is successful, you can click **Create Merged Dataset** to enter the creation page. If the step of Merge and Verify fails, please modify it according to the error prompt and try again.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F59sk610ppuwunIeXoa9X%2Fdataset_merge4.jpg?alt=media\&token=647c2e55-1b1b-4c1a-bd9f-62b1f00066f3)

* Fill in the name information of the newly created dataset. Select the visibility (public or private) of the dataset, and click **Create** to complete the creation of a merged dataset. Note: When you create a new dataset by merging two datasets, the storage location of the original datasets will not be migrated.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FeoNzteADj27FCIC90ciU%2Fdataset_merge5.jpg?alt=media\&token=72b902d2-9eb9-4aa7-8a37-a7a778ac0203)

* When the dataset is created, jump to the details page of the newly created dataset to view the dataset created by filtering.


# Quick Use of Open Datasets by Forking

Acquire and use datasets swiftly by forking datasets on Open Datasets.

* Select **Create by Fork** in the drop-down box to enter the home page of Open Datasets.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FEn8PuowUn4DZlMOKMu2r%2Fopen_dataset1.jpg?alt=media\&token=638fecd0-da33-426b-9fc6-2e2cbd655113)

* Search for the open datasets you need on the Open Datasets page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fjql1gTrW7ADe6RDhwm7r%2Fopen_dataset2.jpg?alt=media\&token=98b3b5e4-1724-4f5a-86db-5ac63f1cc9b2)

* Select a dataset to enter the Dataset Details page. Click Explore Datasets in the upper right corner. Click the Explore Datasets drop-down, and then select **Fork** from the dropdown. You will get a copy of the dataset to your TensorBay workspace.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fhx1GfuiutreUIn8RTZ1b%2Fopen_dataset3.jpg?alt=media\&token=0a473e9a-b4e6-433d-bad1-8ce3e3c1c6f9)

* After Fork, you can view the dataset in the dataset list of your workspace with a corresponding icon.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FIB15nK9jhKkHfxpeHRKa%2Fopen_dataset4.jpg?alt=media\&token=f3235926-88ae-4da4-92b8-f9c052d1c23a)


# Version Control

In TensorBay, you can version the data of a dataset, including the files of raw data, annotations, and dataset details.

{% content-ref url="/pages/-MWWsceMh92QAUDrS4SO" %}
[Manage Data Files](/guide/tensorbay/version/data)
{% endcontent-ref %}

{% content-ref url="/pages/-MWWt-N9LH6JwcTay9I0" %}
[Manage Annotations](/guide/tensorbay/version/annotation)
{% endcontent-ref %}

{% content-ref url="/pages/-MWWtRhceyzfTXgb1xT-" %}
[Manage Dataset Information](/guide/tensorbay/version/dataset)
{% endcontent-ref %}

{% content-ref url="/pages/-MWWtzH77Ec\_kvvsHpZF" %}
[Manage Versions](/guide/tensorbay/version/version-info)
{% endcontent-ref %}

{% content-ref url="/pages/-MWWv6Y6qsYG7wcmJmPK" %}
[Dataset Activities](/guide/tensorbay/version/activity)
{% endcontent-ref %}

{% content-ref url="/pages/-MWWvLCVlRaAuEOcr1Bi" %}
[Dataset Settings](/guide/tensorbay/version/setting)
{% endcontent-ref %}


# Manage Data Files

Unstructured data for AI developers will be stored and managed in file forms. The data file storage is stored on the corresponding public cloud storage according to the default storage or authenticated cloud storage. TensorBay supports uploading data on the Web end or with Python SDK and Open API.&#x20;

{% hint style="info" %}
Only the Draft version of a dataset can be updated with actions such as uploading and deleting data.
{% endhint %}

* Select **Draft** in the versions under the selection summary. Enter the **Manage Data** page in the upper right to manage data.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FNfEYUga5l3B17grjiObm%2Fversion1.jpg?alt=media\&token=dd49c8d5-a1bc-4b88-832c-f2b3110a9410)

## Types of Raw Data <a href="#id-1" id="id-1"></a>

Use and manage raw data of pictures, videos, audios, texts on TensorBay. Supports complex structures like continuous data and multi-sensor data.

## Upload/Delete Data <a href="#id-2" id="id-2"></a>

* In the Dataset Details page, click Enter Your Draft to enter the Draft List.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mcgf3z6mJqE5dRmWGMY%2F-Mcgg8q-VlD4m0SBPrTV%2Fimage.png?alt=media\&token=e34affbc-99aa-4849-bd29-c65286809af9)

* Select a draft to enter Data List (only one draft can be created on each branch for now), click Upload Data in the upper right corner for subsequent actions.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mcgf3z6mJqE5dRmWGMY%2F-McggEC2Q4g-7U9Qf4lO%2Fimage.png?alt=media\&token=8d5f8483-5b43-42c2-8f93-94223e09ee25)

* In the Draft Details page, click the right arrow in Data to enter the Data List page where you can find Upload Data. You can select a specific file to Delete.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mcgf3z6mJqE5dRmWGMY%2F-McghUvwVPDdaexOBaMc%2Fimage.png?alt=media\&token=8dc26449-cb00-4ff7-ad52-ebbefa1202ca)

* In the Draft Details page, click Commit Draft, enter Commit message and Tag, then click Confirm to publish a new version.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mcgf3z6mJqE5dRmWGMY%2F-Mcgi_CFtBFtZHzXspEx%2Fimage.png?alt=media\&token=96b5b0f5-fdd3-4fbf-9bae-f4c90e1d845c)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mcgf3z6mJqE5dRmWGMY%2F-McgjDXcewdYro1-rJEw%2Fimage.png?alt=media\&token=18933e49-373b-4429-b020-dc3773e8dbba)


# Manage Annotations

Upload, delete, and control your dataset versions on TensorBay.

## Upload, Delete, and Modify Annotations

* Select Upload with **Developer Tools** such as Python SDK, CLI, or API to upload, delete, and modify annotations. For details, see Developer Tools.

{% content-ref url="/pages/-MPHldAyMMAd\_N6eFJ99" %}
[Developer Tools](/dev-doc/tools)
{% endcontent-ref %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FHKYkQphrZIldiHcYNJ6k%2Fversion2.jpg?alt=media\&token=73411e15-d7b2-4479-9780-ea7851bb7e0b)


# Manage Dataset Information

* In **My Dataset** or **Team Dataset**, select the dataset you want to edit and enter the dataset Details page. Click **Enter Draft To Edit** on the upper right corner to enter the Draft List page. After creating a new draft, you can manage your dataset information.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgjbXNce-JLTOKiAcq%2F-McgkYM-UVNTDAzu9u4Z%2Fimage.png?alt=media\&token=dd148a4a-0712-4a6d-80e6-d9116add8c2c)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgjbXNce-JLTOKiAcq%2F-McgkR30_wOJh9hHzKQm%2Fimage.png?alt=media\&token=39feeb02-365b-44ec-94e2-c8a7200e6329)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgjbXNce-JLTOKiAcq%2F-McgkbFOWtlZ2NHa4oMY%2Fimage.png?alt=media\&token=a5dfcca4-828e-4110-bc9e-9534a043e4ee)

## Edit Dataset Labels <a href="#id-1" id="id-1"></a>

* Select **Dataset Labels** in the Dataset Information list. Select data types and its application scenarios. Add a custom label to make it easier for you to search for datasets.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FvSerAdpEojLl385BFUIs%2Fversion3.jpg?alt=media\&token=c7c0f6fb-7279-4586-851a-b4b618ff8b59)

## Edit Dataset Descriptions <a href="#id-2" id="id-2"></a>

* Select Dataset Description in the Dataset Information list, where you can describe the dataset in detail, so that others can understand the dataset better.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FphvLotOED9cJu467UfCL%2Fversion4.jpg?alt=media\&token=e03887d5-db31-4247-875e-e78c625148c7)

## Edit Dataset Copyright Information <a href="#id-3" id="id-3"></a>

Select Dataset Copyright Requirements in the Dataset Information list:&#x20;

* Modify copyright owner information: Select a copyright owner in the drop-down box.&#x20;

{% hint style="info" %}
Multiple copyright owners can be added. The drop-down box shows the optional copyright owners. The selection of a copyright owner cannot be repetitive.&#x20;
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fc0OQAUvnjZwRWHLloXND%2Fversion5.jpg?alt=media\&token=66607138-0058-4c50-ad18-4cf36903d20f)

* Edit and remove copyright owners: You can also **edit** and **remove** existing copyright owners.&#x20;

{% hint style="info" %}
For a team member, only admins have the permission to add and edit copyright owners, and members can only choose from the existing copyright owners.&#x20;
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FNPym0Ngb5hhAaxZzCv3V%2Fversion6.jpg?alt=media\&token=abfd1cc8-fad2-4f8b-81bf-9288f1dd174d)

* Add copyright owners: You can click "**+**" on the right side of the drop-down box to add a new copyright owner. The name of the copyright owner is required, and the profile photo, link, and description are optional.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FWGxjYbKUtgtZrrb7ZQjP%2Fversion7.jpg?alt=media\&token=5d7bc745-9f64-4ddb-abb2-40df0485525e)

* After editing the copyright information of the dataset, click Save at the bottom to save your modification.&#x20;


# Manage Versions

Manage dataset versions with clarity and ease on TensorBay. After modifying the data, you can commit a new dataset version, view its historical versions, visualize version iteration, trace back any historical versions, modify version tags, delete versions, and more.&#x20;

## Commit Dataset Versions <a href="#id-1" id="id-1"></a>

* After confirming revisions on a draft, click **Commit Draft** on the lower left corner to enter the Commit page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgknCFL4M2p4nZA-tw%2F-McgkqPKZibamddqE774%2Fimage.png?alt=media\&token=56a5a705-7068-4a25-8c08-a9f0d37c44ef)

* After entering the Commit Message and Tag, click **Confirm** to complete the release of the new version.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgksV4Su8iARBXszZr%2F-McgxO2eeYr7e-fwYuC-%2Fimage.png?alt=media\&token=ee5f9886-6a0a-4663-afc8-58c19db7086a)

{% hint style="info" %}
The current dataset version cannot be updated anymore after it is committed. Subsequent data will be saved in the Draft mode, and updated data can be modified to the next version.
{% endhint %}

## View Historical Versions <a href="#id-2" id="id-2"></a>

* Click **View All Tags** on the Dataset Details page to enter and browse Commits History. Enter Commits History by clicking either Tags or Commits on the right side of the version list.
* View all historical commit versions in Commits History. Click the eye icon![](https://lh4.googleusercontent.com/-Zbxuwm3gXAY_4cijMz7T8i_L_jsYmcHMaMhEi-dckNMzL5Qo251YEV-THJ2r6a2n7n4qddS6c4iJ_IVDMTs2hqGe2YoqQ3y4X8S8fYHYzS7st2VWGD-8GmnMf_Jdlt6ImCZQu4) and view the details of the corresponding version.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgksV4Su8iARBXszZr%2F-Mcgxmt54keYo-apijgd%2Fimage.png?alt=media\&token=c8915397-84db-4661-9f00-3aa31a045a43)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgksV4Su8iARBXszZr%2F-McgxjJ6kXh6E2VQMyTz%2Fimage.png?alt=media\&token=08383e83-6ad2-494d-8e2b-e973f566a8c9)

## Version Iteration Visualization <a href="#id-3" id="id-3"></a>

* Select **Version Visualization** in the upper right corner on the **Commits History** page.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgksV4Su8iARBXszZr%2F-McgxswjOd0IWXQBm4eL%2Fimage.png?alt=media\&token=84490e7a-5d29-4b9a-b9ca-d2c88d5abff4)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-McgksV4Su8iARBXszZr%2F-McgziGjfCQFXqZQXXWv%2Fimage.png?alt=media\&token=240cbcce-bc12-4a7d-85b2-04ab4be7dde1)


# Manage Dataset Branches

## Manage Dataset Through Branches <a href="#id-1" id="id-1"></a>

* Without affecting the original dataset and other data versions, the branch function allows users to safely make changes as needed on different branches and conduct comparative experiments on datasets.
* Multiple users can edit their own datasets simultaneously through branches to find out the relationship between commits or branches and trace the source of each version, without interfering with each other's work.

### Default Branch <a href="#id-1-1" id="id-1-1"></a>

* When creating a dataset on TensorBay, the default branch is automatically created as the first branch and is named as "main" by default. Users can rename or switch the default branch.

### View Branch <a href="#id-1-2" id="id-1-2"></a>

* After the branch is successfully created, it will automatically switch to the Branch Details page.
* Enter the dataset details page, click the drop-down list in the upper left corner, switch to the target branch, view the data details of the latest version, and filter or create a draft to modify the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch-q0dofWlHG4hVbpr%2F-Mch04CzwtJTRaTTZMSk%2Fimage.png?alt=media\&token=8209a263-a4ed-4016-aedd-1d3a0c3adeee)

### Create Branch <a href="#id-1-3" id="id-1-3"></a>

* **Create a new branch based on the original branch/ Tags/ Commit**
  * Enter the Dataset Details page, click the drop-down list in the upper left corner to select a branch or tag and switch versions; or click View All Tags to enter the commit records, and click the icon on the right to switch.
  * After entering the corresponding Dataset Details page, click the drop-down list in the upper left corner to switch versions, and enter the new branch name in the Find or Create Branch input box to create a branch.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch-q0dofWlHG4hVbpr%2F-Mch0Z-5anidf00o1Vig%2Fimage.png?alt=media\&token=4172640b-c81f-48a7-92c2-898674b74bd6)

### Delete/Rename Branch <a href="#id-1-4" id="id-1-4"></a>

* Go to the details page of the branch list.
* For any branch, click the Delete / Rename button on the right to delete or rename the branch.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch-q0dofWlHG4hVbpr%2F-Mch10ggNNYAIixM7XW1%2Fimage.png?alt=media\&token=96b13a38-99d4-4de4-9ea1-70bdd66b4b30)

{% hint style="info" %}
The default branch can be renamed but cannot be deleted.
{% endhint %}

### Switch Branch <a href="#id-1-5" id="id-1-5"></a>

* After entering the details page of the branch list, click the switch branch button and select the target branch that needs to be set as the default branch.&#x20;

![Branch List](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch-q0dofWlHG4hVbpr%2F-Mch1BVaUi0tl_FsXcKG%2Fimage.png?alt=media\&token=dba794d6-d247-479a-9321-3afdd483b251)

![Switch Default Branch](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch-q0dofWlHG4hVbpr%2F-Mch1FtyS53UET225EM4%2Fimage.png?alt=media\&token=185f929c-b54b-4017-aa78-f92a9212ef49)


# Dataset Activities

On TensorBay, you can view the activity log of a dataset, including modifications to the dataset, use of the data, commit information, and more.

* On the Dataset Details page, select **Activities** to view all the activity history of the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch4yuLdwlKdH4ANGF3%2Fimage.png?alt=media\&token=ea107630-8627-4950-9b84-d3b9dd6632f0)


# Dataset Settings

On TensorBay, you can manage and set up your dataset. You can modify the dataset name, manage the dataset members and their permissions, view the storage location of the dataset, and delete the current dataset.&#x20;

{% hint style="info" %}
Only the creator or admin of the dataset can set up permissions.&#x20;
{% endhint %}

* On the Dataset Details page, select **Settings** to enter the Settings interface.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch5TTVzeFKbDRElgHG%2Fimage.png?alt=media\&token=930289b4-aa5f-4cf7-8b45-16f1af137e07)

## **Modify Dataset Name/ Alias** <a href="#id-1" id="id-1"></a>

* In General Settings on the left navigation bar, click the edit icon![](https://lh4.googleusercontent.com/WbQQyYsb2x7h3qeLUTYH_ztDH8-mZUXlWWW2RaGfpXpnxOHmRqPnAHoTv2JytZbDH2Eu708y7-nqRUgdd2ISbMRshLPS3XK4rEyFkisfgP7nmpwAzqOedMKftYvUUo5Xy1Z-Tdg) on the right to edit Dataset Name or Alias. Note: The length of a dataset name is limited to 80 and only English letters, numbers, spaces, hyphens "-", and underscores "\_" are allowed.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch57Ek4t4yYzpCpC_I%2Fimage.png?alt=media\&token=2aa78291-d9ce-4d3e-99dd-378c60d33e46)

* After revision, click **Confirm** to confirm the revision. Please make sure that dataset names are not duplicated.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch5Hs-MGrh3ZcHJMhs%2Fimage.png?alt=media\&token=cebcfa29-fdac-44ca-8478-444a567db872)

## **Dataset Visibility Settings** <a href="#id-2" id="id-2"></a>

* You can set the visibility of a dataset when it is created, or modify the visibility in the dataset settings.&#x20;
* If you adjust the visibility to Public, you agree that any community user can search, view, retrieve, and browse all data files in this public dataset.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch5dI8npWQwYnMWxnD%2Fimage.png?alt=media\&token=a09fd8fc-54a6-443d-bdab-6cb38b738267)

## **Dataset Member and Permission Management** <a href="#id-3" id="id-3"></a>

* Select **Members** in the left navigation bar of the Settings page, and view all members of the dataset, including the creator of the dataset, super admins, and members.&#x20;

{% hint style="info" %}
If you are a team user, the team admin has administrative rights to the team dataset by default.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch5ll43XNrcFhrqlk-%2Fimage.png?alt=media\&token=90150cf2-7f06-4cc6-81ed-cc21a7682948)

* Add Member: You can click **Invite Members** to add new members to the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch5pHPwlnhvWwIWkQ3%2Fimage.png?alt=media\&token=0f6536a5-716b-4209-b27d-25d5a7525658)

* Select the member in the group member list to add. Click **Send Invitation** to confirm.&#x20;

{% hint style="info" %}
You can only add members in your team.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FGvlINI2U7rKcx9xC7Kkm%2Fversion8.jpg?alt=media\&token=aa69eed3-9b77-4b50-9ea4-293774dbdb1d)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FB4Ju8JMaAm5VWuCSd7aU%2Fversion9.jpg?alt=media\&token=4ccc4384-9e24-4921-a659-bc9d9636c349)

## **Dataset Storage Location** <a href="#id-4" id="id-4"></a>

* You can view the default storage information of the dataset in **Storage Information** in the left navigation bar.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch5x1SaT-NbqJeGCqf%2Fimage.png?alt=media\&token=d0044ad8-90c3-454e-8771-a4dc1f7ac49c)

## **Delete Dataset** <a href="#id-5" id="id-5"></a>

* Click **Delete The Dataset** to delete the dataset.&#x20;

{% hint style="danger" %}
This will delete the dataset and all of its versions. The action cannot be undone, and any use of the dataset will be disabled after deletion.&#x20;
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mch4S5suKpmdwILK2Cp%2F-Mch646CQxijtQBPvShJ%2Fimage.png?alt=media\&token=ac84c4bf-2afe-451c-b52c-a9be38b8dd97)


# Pharos Online Data Visualization

### Manage Data with Visualization

Pharos provides multiple visualization widgets to manage a variety of data files and annotation types. Quickly filter and iterate high-quality data needed for AI development using TensorBay.

Access Online Visualization:&#x20;

1.Visualize Open Datasets

To complete the online data visualization, slide down the details page of your target dataset, and click Dataset Preview.

{% content-ref url="/pages/-MWWx8f7Ej13R39xEbeU" %}
[Broken mention](broken://pages/-MWWx8f7Ej13R39xEbeU)
{% endcontent-ref %}

2.Visualize Your Datasets&#x20;

Upload your dataset to TensorBay first. For details, see Upload Data. Sign in to the account and enter the Details Page, and click Visualization

{% content-ref url="/pages/-MWWyT3Keo9v1HgMkMDu" %}
[Pharos Visualization Widgets Instruction](/guide/tensorbay/visualization/visualization-widgets)
{% endcontent-ref %}


# Explore Pharos

## Visualize Open Datasets <a href="#id-1" id="id-1"></a>

Pharos is a convenient tool that enables you to visualize datasets online in our Open Datasets community. All you need to do is go to the General tab on the Dataset Details page, scroll down and find Data Preview to explore online data visualization. For more information, please see:

{% content-ref url="/pages/-MWXnURM4t4\_MBiOLfW9" %}
[Preview Data and Label Distribution Online](/guide/opendataset/visualization)
{% endcontent-ref %}

## Visualize Custom Datasets <a href="#id-2" id="id-2"></a>

To visualize your own dataset, Pharos offers the following two available ways:

1. Upload your dataset to TensorBay. You can refer to the link below for more details. After uploading the data, sign in to your account, enter the Dataset Details page, click General, and start to visualize your own dataset.

{% content-ref url="/pages/-MWWnuVASpJRl\_DoaSdy" %}
[How to Quickly Prepare a Dataset](/guide/tensorbay/data)
{% endcontent-ref %}

&#x20;   2\. Read local data via TensorBay SDK and use Pharos to visualize immediately. You can access all the functions of the data visualization tool and have a clear view of the data quality, with no need to sign in or upload. Please check the [PythonSDK Help Doc](https://tensorbay-python-sdk.graviti.com/en/latest/features/visualization.html) for details.

{% hint style="info" %}
This method is only available for the visualization of data and annotations. If you want to visualize the annotation distribution, you have to upload your data to TensorBay.
{% endhint %}


# Pharos Visualization Widgets Instruction

## Pharos Data Visualization Widgets <a href="#id-1" id="id-1"></a>

Graviti's data visualization widgets provide visualization support for a variety of data types and annotation data types, helping AI developers to quickly and intuitively grasp the content and quality of data and its annotation information, saving the time spent on identifying data.&#x20;

* Supported Data and Annotation Types

| Data Types  | File Types and Formats           | Annotation Types                                             |
| ----------- | -------------------------------- | ------------------------------------------------------------ |
| Image Types | Images (jpg, jpeg, png)          | 2D Box, 2D Polygon, 2D Polyline, 2D Keypoint, Classification |
|             | Point Cloud (bin, pcd, ply, las) | 3D Box, Classification                                       |
|             | Consecutive Frame Data           | 2D Box Tracking, 3D Box Tracking                             |
|             | Video (mp4)                      | Classification                                               |
| Audio Types | Audio (MP3, wav, flac)           | Transcription, Classification                                |
| Text Types  | Text (txt)                       | Classification                                               |

### Image Type Data Visualization <a href="#id-1-1" id="id-1-1"></a>

Graviti’s visualization widgets support the visualization of a variety of image data, including multi-sensor data and continuous data. You can select the annotation type and data to be viewed in the upper left corner. In the case of multi-sensor data, select the frame to be viewed.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FthhI9OIGg22hvdkYWxID%2Fph1.jpg?alt=media\&token=82b9d6f0-f805-45b4-aa18-534a8b0f495b)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FOstpN9TYyaH0RK4KMSj9%2Fph2.jpg?alt=media\&token=b6e4019a-bc1b-4215-8b53-aeab9abd343f)

* After selecting the annotation type and data, the selected data and the corresponding annotation type content will be visually displayed in the main window on the right. In the Annotation on the left, you can view the annotation information of the current data. After selecting one piece of annotation information, you can expand and display the corresponding attribute information.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FpyWnnrOy7lD0q3lQpByf%2Fph3.jpg?alt=media\&token=59d4242a-011a-4bd4-acce-da6e3bfa21b6)

* The left side of the data visualization widgets is annotation list, which supports two viewing modes: by annotation and by category. By annotation mode shows the information of a single annotation and by category mode shows the statistics of all annotations under one category.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FmXCKBy3gkpwpR94d52IJ%2Fph4.jpg?alt=media\&token=ca64b85b-0e31-4eff-892a-339146a39b80)

{% hint style="info" %}
When the data has no annotation information, the list displays No Annotations to indicate that the data has been annotated, but there is no object to annotate; the list will display Not Annotated to indicate the data has not been annotated.&#x20;
{% endhint %}

* When visualizing the multi-sensor data, you can select the target sensor data to be viewed in the lower left corner of the main window; when visualizing the multi-sensor data containing both point cloud files and image files, you can put the image file into the small window for display, and click the small window to change the display content with the main window.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGRxxxdRW2rDTbj_Kw%2F-MZGSa1MuUzzmKjlTsjb%2Fimage.png?alt=media\&token=37e3dc7b-ff65-4cdf-978c-ab37d0745281)

* You can visualize continuous data including continuous frame data and video data by clicking Play/Pause, Previous Frame/Next Frame in the left corner of the main window.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGRxxxdRW2rDTbj_Kw%2F-MZGSTpZWD9myEz4kmu7%2Fimage.png?alt=media\&token=e74eb207-bbeb-4595-8d14-c7b9f03c6b82)

* From left to right, the buttons in the lower right corner are Switch between Light/Dark Mode, Share, View Help Doc and Fullscreen.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGRxxxdRW2rDTbj_Kw%2F-MZGSg6F91g4KB3HqgHf%2Fimage.png?alt=media\&token=99501cba-48ac-44b8-8be9-ea3d51c2b251)

### Audio Data Visualization <a href="#id-1-2" id="id-1-2"></a>

Graviti data visualization supports visualization of audio files and their annotations, allowing users to view data in the upper left corner. The annotation information is displayed in the right main window.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FiSeBgWxHNhemBXPajwEp%2Fph5.jpg?alt=media\&token=6c2310fb-0fc9-40fc-8e62-fc4e852d9350)

* The window in the lower left corner can Play/Pause, Previous/Next File, and Play Speed and Volume.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FzwtgncdcPCPQ7bLnWJ18%2Fph6.jpg?alt=media\&token=4159a255-c255-4aca-ab2c-068f1f11013d)

### Text Data Visualization <a href="#id-1-3" id="id-1-3"></a>

The functions of the text data visualization are similar to that of the image data. The user can select the data to be viewed in the upper left corner; the annotation list on the left side shows the annotation information, and the main window on the right shows the original data information.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FiT8DgUKGzlyvdTNL7UCz%2Fph7.jpg?alt=media\&token=9925363c-609b-4470-a152-595fb960e39a)

## Pharos Label Distribution Visualization Widgets <a href="#id-2" id="id-2"></a>

Graviti's label distribution visualization widgets support visualization of label statistics and attribute statistics in image datasets, enabling users to quickly grasp the distribution of labels and attribute information in the dataset.&#x20;

### View the distribution of annotations and label types.  <a href="#id-2-1" id="id-2-1"></a>

Select the annotation type you need to view in the upper left corner.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FAMP0mOIxNJeUo68VP1VX%2Fph8.jpg?alt=media\&token=fb4cc9c5-52cf-4f1a-accd-af4bafdda8ce)

* In the left operation area, select label view mode (Category)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FwSpg17cuTPNSjv27Q2U7%2Fph9.jpg?alt=media\&token=405fd9c5-c93c-4324-aec9-6853482e53d2)

* The right main window displays all label statistics for the current dataset under this annotation type.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FxeaQYp0aghoThFwekbpD%2Fph10.jpg?alt=media\&token=d1b548fe-b8b6-4441-b5fc-150954b8acb6)

### View the distribution of attribute information. <a href="#id-2-2" id="id-2-2"></a>

In the left operation area, select label view mode and the right main window to switch to attribute information view mode.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FXMYqhr3RDEZhKrUxHEh2%2Fph11.jpg?alt=media\&token=b010e1dd-31fd-4bbd-9da8-e39349853164)

* Select the data layer you need to view in the menu on the right side. ALL means to view all data. Select the attribute category you need to view in the drop-down box in the upper right corner. The main window will show the distribution data of all attributes under the selected category.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F8LeH3kNDMAMXP7D2hWKe%2Fph12.jpg?alt=media\&token=3e58fa49-2e9f-4573-bae4-a1202363d560)

### Switch Display Mode <a href="#id-2-3" id="id-2-3"></a>

The Graviti annotation distribution visualization widgets support three view modes: list, bar, and pie chart. Click the mode switch button in the left operation area to switch different display modes.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FHaGwuvCzUMOiWcEXieC8%2Fph13.jpg?alt=media\&token=4e119dc4-fd95-47ca-be02-790dbbe5f33b)

* Bar Chart:&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FFZzM66Tr4pAN4DcF5lCj%2Fph14.jpg?alt=media\&token=cfe030b9-328e-4209-a446-34b3760ead17)

* Pie Chart:&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FmUtTt0BMgwY1RCuZY0Z1%2Fph15.jpg?alt=media\&token=0705b7f5-e191-4b28-859c-cd65a164eba8)

{% hint style="info" %}
&#x20;If there are too many data label types, the label distribution visualization widgets will not support the pie chart display mode.&#x20;
{% endhint %}


# Collaboration

TensorBay supports collaborative data management in a team. Through flexible setting of team member roles and dataset permissions, you can safely synchronize and share data, avoid replications and migrations of data, and efficiently cooperate to accelerate algorithm development.&#x20;

Users with developer accounts can create teams for free, and have 100GB of free data hosting capacity and team privileges for team community edition. For details of privileges, please see [Product Pricing](https://www.graviti.com/price).

{% content-ref url="/pages/-MWWzaXI\_WdOBQruXY3k" %}
[Create a New Team](/guide/tensorbay/collaboration/create)
{% endcontent-ref %}

{% content-ref url="/pages/-MWX-8rW8QyfLOLheY6g" %}
[Invite Team Members](/guide/tensorbay/collaboration/invite)
{% endcontent-ref %}

{% content-ref url="/pages/-MWX-VM0OeM1weZbyZzt" %}
[Team Management](/guide/tensorbay/collaboration/manage)
{% endcontent-ref %}


# Create a New Team

* Sign in to the GAS home page, click **Create a New Team**

  &#x20;in Collaboration of the navigation bar, or click **Create a New Team**

  &#x20;in the workspace drop-down list in the top navigation bar.
* Click **Create a New Team** to enter the team creation page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhNCuGikV7qq-srOxC0%2F-MhNFnmISHcgdIJPo8sx%2F1629273375\(1\).png?alt=media\&token=66cff5e0-f109-4dba-bee4-de0511c99af1)

* Edit team profile: Enter team name, team workspace name, contact email, and team profile in turn, and confirm the Terms of Use and the Privacy Policy.&#x20;

{% hint style="info" %}
Once the team workspace name is created, it cannot be modified. Please confirm when entering your team workspace name.&#x20;
{% endhint %}

* Click **Next Step** and invite members to join.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FVvO8s1Bm7hwL1ZytJqKf%2Fcollaboration1.jpg?alt=media\&token=f1a9729c-003e-43bd-8154-73433cb3b8b2)


# Invite Team Members

## Invite Team Members <a href="#id-1" id="id-1"></a>

* After updating the team profile, you will enter the Invite Members page. You can invite members to join by adding their **email addresses**. In the invitation, you can select the team role of each member, namely administrator or member.&#x20;
* Click Invite Member, and the system will send an invitation link to the email address. The invited member needs to complete registration and accept the invitation within 24 hours. If the time limit is exceeded, the invitation needs to be resent.&#x20;
* You can also select **Continue Later** to add new members in Team Member Management.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FOlgn68ajd33UjRKhqlt4%2Fcollaboration2.png?alt=media\&token=5ac12f2a-6704-4992-b28b-6eff65f52eef)

## **Enter team workspace** <a href="#id-2" id="id-2"></a>

* Enter team workspace when it is created. You can also switch to your personal workspace or other team workspaces by clicking on the upper right corner of the navigation bar.&#x20;

{% hint style="info" %}
Data, members, and permissions of different workspaces are independent of each other.&#x20;
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhNCuGikV7qq-srOxC0%2F-MhNHwIy-22kQKd8ZUFH%2F1629273942\(1\).png?alt=media\&token=5de45a27-1160-44bc-87e9-9a6711db29b2)


# Team Management

* Enter team management: Select Team Management to the right of the team name in the upper right corner of the navigation bar to enter the corresponding team management page.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FK6abPxdVi3EQmEMcaZZS%2Fcollaboration3.png?alt=media\&token=037ea5e0-ac5f-4edf-9bff-0daf1187302e)

## Team Profile Management <a href="#id-1" id="id-1"></a>

* Update Team Profile: Only super admins and admins of a team can update team profile.

Information that can be changed:

* Team Name: Modify your team name. It cannot be empty or duplicated.&#x20;
* Workspace URL: Set up an URL address if you have not done so yet. Note: Workspace URL can only be modified once.
* Team Profile: Edit your team profile. Note: The number of words cannot exceed 400 characters.
* Email Address: Update the email address for your team. The email address will be displayed on the team home page for contact use. It will also be used to receive important messages from the system. Please make sure your email address is correct.
* Location: Change your location here.

After editing, select **Update Team Profile** to confirm the updates.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FdryUXSC74Jqmp5hwq9Sk%2Fcollaboration4.png?alt=media\&token=6561c3c2-61d8-45ba-bcee-a989d71d1f4f)

* View Team Profile: After changing the information, you can click **Team Profile** in the upper left corner to return to the home page and confirm the display change. Team Profile is used to show your team information.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FLgxpOAGMwmc9FjXVzEQz%2Fcollaboration5.png?alt=media\&token=5ba8ba3a-5fba-4f96-aefd-a25cfbe9b1f0)

## Team Members Management <a href="#id-2" id="id-2"></a>

* Team Membership Roles: Super Admin, Admin, and Member.
  * Super Admin: A team founder is the default super admin of the team and has all of the team permissions. There is only one super administrator for each team. The role of super administrator can only be transferred. The super administrator cannot leave the team.
  * Admin: An admin has the same team management permissions as those of super admins.
  * Member: A member can be invited by a super admin or an admin to join a team.&#x20;
* **Team Members List**

In the Team Members List, you can view the number of members who have joined the team, member information, joining time, and role permissions (such as super admin, admin or member). For specific permissions and setting rules, click Role Permission Description in the upper right corner.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fquv1muRu6Q7NJjzbENjr%2Fcollaboration6.png?alt=media\&token=78758387-bc1b-409b-ba72-f2cbb72dc543)

* **Team Members Management**
  * Add member: Super admin and admin actions only Click Invite Member to enter the member invitation page.&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FLfFCbiFAp23xj5wQCpZW%2Fcollaboration7.png?alt=media\&token=9a2f3176-b0c8-455a-aacf-713d0e6fb581)

Invite team members by entering their email addresses, and set the corresponding team roles for the invitees. The super admin can select an admin or a member, and the admin can only select a member;

After clicking Send Invitation, the system will send a message to the invitee's email. If an email address is added repeatedly, the system will only send the message once by default . Invited members should finish registration and accept the invitation within 24 hours. Re-invitation is required if the time limit is exceeded.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FbD9YEWDBaP6Pqe7LITNr%2Fcollaboration8.png?alt=media\&token=3e496866-9e7d-4e72-9d31-aeceb1527ea1)

* Remove Member: super admin and admin actions only

Click a team member's role settings, then Click **Remove Member** from the drop-down box to remove members from the team. The super admin can remove admins and members, and the admin can only remove members. When a member is removed, the member will not be able to view or use any data of the team, so please be cautious.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FmFCBJ7osv14EYdbgIEtl%2Fcollaboration9.png?alt=media\&token=4a710656-de5c-4a66-95d7-df42af3ab33f)

* Modify team member role: Super Admin actions only.

Click role settings for a team member and select the target role in the drop-down box. Select **Set as Admin** or **Set As Member** to change the role of the team member.

Select **Set As Super Admin** to transfer the super administrator role. After the setting, the super admin becomes a member. Please be careful. If the super admin needs to cancel the account, he must transfer the super administrator permission to another member of the team before canceling.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F1rrKcU6vxa9YjrZuenCe%2Fcollaboration10.png?alt=media\&token=e5f5e940-f82b-4026-be9a-427510284a93)

* Exit Team: Admins and members only.

In the top navigation bar, select Personal Workspace to enter the developer account management interface, and click **Your Team** to check the list of teams you have joined. You can select the team you want to quit and click **Quit** the Team to leave.&#x20;

{% hint style="danger" %}
&#x20;You will not be able to check and use team data after quitting the team.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FCTT3a5VYr7pEmfE8AyA5%2Fcollaboration11.png?alt=media\&token=a74143df-89a9-4e1c-b90c-07fed4a877a2)


# Dataset Management

## Create Team Datasets <a href="#id-1" id="id-1"></a>

* All members in the team can create datasets in the Team Workspace.
* The Creator is also the Owner of the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhNIS1Oox2jBCRjichD%2F-MhNJvLAixO4Zzm5NITg%2F1629274434\(1\).png?alt=media\&token=6bb6e5fb-02c1-45d4-8600-218316bcdefb)

## Team Members Management <a href="#id-2" id="id-2"></a>

* Public datasets are available to all users and do not take up team storage space.
*

```
Private datasets can only be accessed by inviting team members to join. After members join the collaboration, they can operate on the dataset on different levels according to their corresponding permissions (Viewer, User, Editor, Admin).
```

* By default, the Super Admin has all the Admin permissions on team datasets.

### &#xD;**Dataset Permission Types** <a href="#id-2-1" id="id-2-1"></a>

*

```
**Previewer**
```

The default permission for team members on all the datasets within the team. You can preview data and view the details page of the team's private datasets but cannot view the data list and version records.

* **Viewer**

Besides Previewer permission, you can also view the data list and version records.

* **User**

Besides Viewer permission, you can create datasets by filtering and merging, create annotation tasks, and use developer tools (AccessKey is required) in the team's private datasets.

* **Editor**

Besides User permission, you can view draft data (not committed), edit dataset info, upload data, commit draft, delete data and conduct other modifications on data. You can also edit tags, switch versions, delete versions and more.

* **Admin**

Besides Editor permission, you can change dataset name, delete dataset, set dataset status as public or private, and configure authentication info. You can manage dataset members such as adding members, setting dataset permissions for members, and removing members.

* **owner**

Besides Admin permission, you can approve or reject the applications for the dataset membership.

### Invite Dataset Members <a href="#id-2-2" id="id-2-2"></a>

* In the upper right corner of the navigation bar, you can select the Team Workspace you need to enter.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhNIS1Oox2jBCRjichD%2F-MhNKJJtG5CKHQ0dSMFb%2F1629274562\(1\).png?alt=media\&token=198f647e-4503-4af3-a1aa-d7f9320247f5)

* After entering the Team Workspace, you can click Members.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGUDqMQ2JCh6o2gEYj%2F-MZGVM2F_Lx9oaQ7DfL5%2Fimage.png?alt=media\&token=8090dac5-4c74-42a5-bf77-9a9220ab1011)

* Invite members and set their permissions on datasets at the same time.
  * Drop down the list of team members and add users who have joined the team to the dataset.
  * Fill in the member's email address and press Enter to confirm. Invite members who have not joined in TensorBay collaboration to register and join the team.
  * Copy the link and forward it to the team members who need to join the dataset. Signed-in users can join the team dataset by clicking the link. Users who have not registered or signed in can click the link to register and sign in before they join the team.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGX4mbq20TUmgnKnBw%2F-MZGeaYiSgzGHbow4dAF%2Fimage.png?alt=media\&token=7548cc6d-4db7-448f-b921-ef09943b695a)

{% hint style="info" %}

Apart from **Admin** and **Owner**, users invited by other members should be approved by the dataset owner before they join the dataset.
{% endhint %}

* Users who have not joined the TensorBay Team Workspace should apply to join when they receive the invitation. They can join the team and dataset when their applications are approved by the Super Admin (view and approve the applications in the Notification Center).

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGX4mbq20TUmgnKnBw%2F-MZGf1m3BGfjltsIRGoj%2Fimage.png?alt=media\&token=5f66e581-1bf9-4478-a074-c47bdbd1eecc)

### **Change Dataset Permissions/Remove Members** <a href="#id-2-3" id="id-2-3"></a>

* Enter the Dataset Details page, click Settings, then click General, and you can see the Caution sign.
*

```
Click Delete the Dataset.
```

{% hint style="info" %}
Only Admin and Owner can change permissions or remove members.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGX4mbq20TUmgnKnBw%2F-MZGfY3oTDh1L87FIzDg%2Fimage.png?alt=media\&token=6a32c63d-c670-4f8d-b334-92c020ef2562)

### Delete Dataset <a href="#id-2-4" id="id-2-4"></a>

* Enter the Dataset Details page, click Settings, then click General, and you can see the Caution sign.
* Click Delete the Dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGUDqMQ2JCh6o2gEYj%2F-MZGVvvhdDCbwKaEHBd_%2Fimage.png?alt=media\&token=49b3ef77-a7bb-4534-856c-d92659c7dfb2)

{% hint style="danger" %}
Only Admin and Owner have the permission to delete the dataset. This action is irrevocable and any use of the dataset will be disabled after deletion.
{% endhint %}


# View Activity Log

## **What is Activity Log?** <a href="#id-1" id="id-1"></a>

The team activity log consists of team management log and dataset management log. Not only does it keep comprehensive and real-time records of the team's collaborative work on managing data, but also it maintains an open and transparent progress in an easily accessible way.

* **Team management log** records team management activities such as adding new members and changing member permissions.
* **Dataset management log** records dataset related activities such as creating datasets, changing dataset status, different commits, adding dataset members, and changing dataset permissions.

## View Activity Log <a href="#id-2" id="id-2"></a>

### **Team Datasets Home Page** <a href="#id-2-1" id="id-2-1"></a>

When you switch to Team Workspace, scroll down the page and then you can view team management log and and dataset management log of all the team datasets

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGUDqMQ2JCh6o2gEYj%2F-MZGWdau643lIe_a_e7Z%2Fimage.png?alt=media\&token=846e81da-3d17-48c6-bf27-a195f3c08ce2)

### **Team Datasets Home Page** <a href="#id-2-2" id="id-2-2"></a>

You can enter the Team Datasets Details page, click Activities and view the dataset management log of a specific dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MZGUDqMQ2JCh6o2gEYj%2F-MZGWw_-u62MlxCwbeDf%2Fimage.png?alt=media\&token=f2f03377-0afd-4abb-8c52-2b25bbc4fe82)


# How to Integrate TensorBay into Your Pipeline

Graviti provides multiple flexible developer tools, including PythonSDK, CLI, and Open API, to quickly integrate your data with your pipeline through specific documentation and use cases.&#x20;

{% content-ref url="/pages/-MPHldAyMMAd\_N6eFJ99" %}
[Developer Tools](/dev-doc/tools)
{% endcontent-ref %}

## Developer Tools <a href="#id-1" id="id-1"></a>

* Click **Developer Tools** in the top navigation bar at GAS to view examples of usage of PythonSDK, CLI, and Open API. Select the corresponding tools according to your needs, and view the specific use documentation.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FyisLhoj1eeZQduElaLRA%2FHOW1.png?alt=media\&token=2ff2ea96-b6b6-44f9-bc78-ac2f97738707)

* When reading or uploading data into your workspace through Graviti developer tools, users are required to use their own AccessKey for authentication. Note: The AccessKey of different workspaces have the same permissions as the workspace, and the AccessKey of different spaces are not compatible with each other.

## Obtain AccessKey <a href="#id-2" id="id-2"></a>

* Click **Developer Tools** in the top navigation bar at GAS, and select AccessKey in the left menu.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FbCOrkH6U5sDuEEOvNnKA%2FHOW2.png?alt=media\&token=bf551bab-034a-4900-9364-d5e64236c212)

* Click **Create AccessKey** to create the AccessKey of your current workspace. Note: The access permissions of the AccessKey are consistent with those of your current workspace, and each workspace can have at most 5 AccessKeys. You can also cancel the access permission of the created key by clicking on Delete AccessKey.

{% hint style="info" %}
The AccessKey in the notification message is the key for you to access the Graviti SDK and Open API. You have full permissions for the account. Please keep the key properly. Do not disclose your AccessKey to external channels in any way to avoid malicious exploitation and security threats.
{% endhint %}


# Action

Action is designed to help you automate your data usage workflow in an efficient and simple way

## Entry

Click **Actions** on the Dataset Details page to enter the Actions page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXNjVTy-MzT7wQp2Xb%2F1.png?alt=media\&token=0426c3cf-747c-4df2-896d-5aecf23bfa69)


# Create a Workflow

## **Enter the Workflow Name**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXFznSc0j079n-C5b6%2F2.png?alt=media\&token=e5a13085-073c-4e51-8b28-25f508f03d7c)

{% hint style="info" %}
(Note: A workflow name can only contain lowercase letters, numbers, and minus signs. The name cannot be less than 2 characters, and its first character cannot be a minus sign.)
{% endhint %}

## Set Workflow Running Conditions

### 1. Set Running Parameters

Click **Add** to set parameters.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXNthS_zCtz939SeHV%2F5.png?alt=media\&token=e67670a4-283e-4aa9-a576-4103a036ff92)

Fill in **Parameters name** (Note: A parameter name can only contain letters, numbers, and underscores. The name cannot be less than 2 characters, and its first character cannot be a number.), **type of data**, and **default value**.

### 2. Set Environmental Parameters

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXO-C4fdRJAxdiqB39%2F6.png?alt=media\&token=d0afbeb4-c1c6-437a-a058-c03cbcaf33e2)

Click **Add** in the Environment column, and then enter the corresponding parameters in the **Key** (Note: A key can only contain letters, numbers, and underscores. The name cannot be less than 2 characters, and its first character cannot be a number) and **Value** columns respectively .

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXO5L3UHDT_x9nx848%2F7.png?alt=media\&token=347e756a-d714-4e95-bd09-e9be6d25cf6c)

### 3. Set Instance Parameters

Select instance configuration and the number of instances in the Instances column.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXOA-R-dyUhQtzhBf8%2F8.png?alt=media\&token=e6d98c83-bc23-4437-b52d-f954d617a5d2)

## Enter Your YAML Code

Enter your YAML code in the YAML File.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXOOfJdKBXz3G3c_SY%2F10.png?alt=media\&token=7514daf6-f2f8-4d8a-8329-f2d6530366b8)

{% content-ref url="/pages/-MhSsTxURGTWVeXE7WHa" %}
[YAML Syntax Description](/guide/tensorbay/action/yaml-syntax-description)
{% endcontent-ref %}

### **Publish the Workflow**

After all settings are completed, you can click **Publish** to create or update the workflow, or click **Cancel** to return to the Actions Details page, which will not save the change.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXOULJtMBUK9lrCybt%2F11.png?alt=media\&token=7fa659d1-2abd-4ec2-afb8-352da5fdb42a)


# Run Workflows

## ‌Run Workflow

On the Action Details page, choose a workflow to enter the Workflow Management page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXSl29-9IQYQi4CHDZ%2F1.png?alt=media\&token=3fc1d1a3-a985-443c-969f-72ab2a6e72a8)

On the Workflow Management page, click **Manage workflow**, and click **Run** to enter the Parameters Setting page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXSqqXkjcRvPiZcVA8%2F2.png?alt=media\&token=763bd79c-6cd8-4d0d-aa2e-b7d59bb1d1d4)

Enter the corresponding parameters and the number of instances, and then click **Run** to run the workflow.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXSw1jYeyS0Arq-09h%2F3.png?alt=media\&token=3e4224a2-cad9-4c9b-879d-ba7b6dde1928)

## ‌‌View Parameters

On the Workflow Details page, you can view all previous records. Support to filter and sort the records by clicking **Status** and **Sort**.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXT0QHYaCBmem89vGh%2F4.png?alt=media\&token=dffceb9a-6c97-4dc1-9798-828a90196336)

Click the latest record to enter its Details page

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXT4pJ4zr5fROaZxEj%2F5.png?alt=media\&token=5fbfcefa-9799-4aaf-9422-8b7ac1e04450)

On the Run Details page, you can view the running time, effective duration, status, etc. You can also click **Logs** to view the running code. If you want to view detailed **Parameters,** just click **Parameters.**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXTA7l8y8nj7kzFGAp%2F6.png?alt=media\&token=8b77801c-2830-40b4-8475-b0d7dc905a23)

In the Parameters Details Page, you can view the parameters configuration, YAML files, and other details. Support to modify parameters of the whole workflow by clicking **Edit**.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXTDqIfGTszegK0B6f%2F7.png?alt=media\&token=5a86c9bb-dc2a-4ea3-8887-dd898aa8a2ed)


# Manage Workflows

### Edit Workflow

‌On the Workflow Details page, click a **workflow name** to enter the corresponding Workflow Parameters Details page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXEQyJFKh5Ad4tP5B-%2F-MhXSl29-9IQYQi4CHDZ%2F1.png?alt=media\&token=3fc1d1a3-a985-443c-969f-72ab2a6e72a8)

On the Workflow Details page, click **Edit** to start editing.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mhq2lY2RLZCa-C3qKkv%2F-Mhq2yaKoF3lRvaE_9b0%2F1a4229225aec42c38299a6383c09a4e.png?alt=media\&token=8bca8d09-4d7b-43a5-ba65-bc04454942b6)

On the Workflow Editing page, you can modify the **workflow name**, **running parameters**, **environment parameters**, **instance parameters**, and **YAML file**.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXTHi4xT4ZYfDe2i5h%2F-MhXYPtF9ORtlLJXl4XX%2F2.png?alt=media\&token=4e3aa7f4-71fc-487c-a69e-db1445d1b3d0)

Click **Publish** to update the changes in your workflow. You can also cancel the changes by clicking **Cancel.**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXTHi4xT4ZYfDe2i5h%2F-MhXYV2JoP4-rkv5xQK3%2F3.png?alt=media\&token=64aef136-6f9a-4281-b911-1e25fb834c6e)

### Disable Workflow

You can Click **Manage Workflow** on the Workflow Management page, and then click **Disable** to disable the current workflow.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXTHi4xT4ZYfDe2i5h%2F-MhXYc8XtTD_lu5g_wyG%2F4.png?alt=media\&token=1f1edc32-ddb6-4a59-a7c0-be7b5ebf7ba7)

If you want to enable the workflow again, you can go back to the previous page and click **Enable**.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXTHi4xT4ZYfDe2i5h%2F-MhXYpDFe6L_OXewtqfm%2F6.png?alt=media\&token=b7ff3690-66fb-4aee-b3ad-66094cf39d68)


# YAML Syntax Description

## Related Concepts

Job is the basic unit of the Action workflow. A [DAG](https://en.wikipedia.org/wiki/Directed_acyclic_graph) is generated by defining multiple jobs and setting the dependencies of the jobs. The TensorBay workflow engine can automate tasks by executing DAGs. Set the following YAML file as an example.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhWjgr7_236wXVdQhav%2F-MhX2C_dhXqrINAy7JAy%2Fpasted%20image%200.png?alt=media\&token=32a509c3-f46a-48db-aed1-89b5408a2e76)

1. &#x20;\[tasks]: Define all the jobs under this workflow.
2. &#x20;\[tasks.hello-world]: Defines a task, with the name "hello-world".
3. &#x20;\[tasks.hello-world.container]: This job is executed under the docker container.
4. \[tasks.hello-world.container.image]: The image used by the docker container is alpine:latest.
5. &#x20;\[tasks.hello-world.container.command]: The command executed in the docker container is 991\`called echo.
6. \[tasks.hello-world.container.args]: The argument to echo is "hello world".

## Runtime Environment of Job

Job supports the following three runtime environments. Each job has only one runtime environment.

**1. Container**

In this environment you can use a specified image to generate a container and execute it.The job content will be defined by the image.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-Mhll0skw2BgvPESiKsp%2F-MhllnSpT7CfaGvCjdAe%2Fpasted%20image%200%20\(1\).png?alt=media\&token=bcd8399e-b7e2-401b-b8dc-66998ca3e006)

**2. Script**

In this environment, a specified script wil be excuted in the docker container.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhWjgr7_236wXVdQhav%2F-MhX2Uj-DskoLHQtzko-%2Fpasted%20image%200%20\(2\).png?alt=media\&token=a0fbcbfe-041e-4928-9506-883be612a550)

&#x20;**3. Git**

In this environment, a git repo code will be executed inside the docker container.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhWjgr7_236wXVdQhav%2F-MhX2b-Y2H7sKEfGk9lh%2Fgit.png?alt=media\&token=a84cc171-1f32-4056-bfec-1e7c671d8ffe)

## Job Dependencies

**Dependencies**

Jobs can define their dependencies by keywords.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhWjgr7_236wXVdQhav%2F-MhX2qkVdKXdzefuhTCb%2Fpasted%20image%200%20\(3\).png?alt=media\&token=e1df623b-28aa-40ec-a5c5-4fed041d33a7)

**Flowchart**

A diamond-shaped DAG. Task A executes first, then task B and task C conduct simultaneously. Task D only starts to run when task B and task C are finished.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhWjgr7_236wXVdQhav%2F-MhX2vkUwqy72p9F0gsX%2Fpasted%20image%200%20\(4\).png?alt=media\&token=e8221f91-9fb3-4a5c-b3f9-120d8dd9a4b4)

## Parameters Setting of Job&#x20;

### Attributes of Parameters

#### **Name**

The name of a parameter, which is used to refer to the parameter in the code of a workflow.

#### **Type**

The type of a parameter. The following three types of parameters are supported in Actions now.

* String: string
* Number: number, including integers and floating-point numbers
* Boolean: boolean value, true/false

#### **Default**

The default value of a parameter. If the default value is not specified at the beginning, the system will automatically use a preset default value.

### Definition of Parameters

Support to view and set the detailed parameters on the parameter details page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXYsVVi4fAutS3FBkk%2F-MhXdWRR0XZtgNIR3DAS%2Fp2.png?alt=media\&token=2b2c16d7-5a94-47d5-80ad-6d8906f89a2d)

### Parameters Setting

**Manual Parameters Setting**: If a workflow is started manually, then its values can be set via the TensorBay console.

**Automatic Parameters Setting**: If a workflow is started automatically, then the system will use default values.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhXYsVVi4fAutS3FBkk%2F-MhXc6lmzyPLqBiv29T3%2Fr.png?alt=media\&token=c1678631-e1e4-4128-949c-5b80cbec0bed)

### How to Quote Parameters

You can quote a parameter in workflow with its name.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MhX3y7qwfkd8_QEnN4D%2F-MhX9HFBmnXa4F3Pb7ew%2Fpasted%20image%200%20\(5\).png?alt=media\&token=15390fb6-64e4-464a-a0e7-066737629fb2)

{% hint style="info" %}

1. The parameter to be quoted must be within {{}}.
2. The parameter name must start with **workflow\.parameters**.
3. The parameter name must be the same as **the preset one**.
   {% endhint %}

### Environment Settings of Jobs

**Environment** defines the environment variables of the **container**, which can be quoted in the same way as the environment variables of the normal **docker container**.


# Crontab syntax Description

Users can create scheduled workflow through Crontab in Action.

Crontab is a set of commands used to schedule the execution of tasks. Users can set the time parameters to make the programs run on schedule.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FiQ8PPSxNvHsBeeRjXpSC%2F20220122.png?alt=media\&token=8786caa8-2b0e-445f-9b52-1c495231b28f)

A crontab file has five fields for specifying day, date, and time followed by the command to be run at that interval. After being set, your workflow will run automatically on schedule.

```
# the format of crontab: 
    *    *    *    *    *
    -    -    -    -    -
    |    |    |    |    |
    |    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7) 
    |    |    |    +---------- month (1 - 12)
    |    |    +--------------- day of the month (1 - 31)
    |    +-------------------- hour (0 - 23)
    +------------------------- minute (0 - 59)
    
# Examples：
    0 0 1 * *       # the firth day of a month
    10 6 * * 1-5    # every Monday to Friday at 6:10 a.m. 
```

You also can enter Crontab online editor for more syntax descriptions and examples through the link.

{% embed url="<https://crontab.guru>" %}


# Automatic Configurations

Configure secrets for workflows to protect your data security.

Secrets are encrypted variables created for protecting your confidential data. After finishing the settings of your secret, you can use it with the format `{{ secret. keyname }}` in workflows. The value of secrets will not be displayed explicitly in YAML files or any code so that your data security will be guaranteed when using automatic workflows in Action.

### Access your secrets <a href="#accessing-your-secrets" id="accessing-your-secrets"></a>

* Entering the Dataset Overview page, click **Actions** to the Action Details page, and then click **Configure** to create or manage your secret.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F924dtEoH1NJY5ykpwmlK%2F1.10.1.png?alt=media\&token=022bc457-ede5-4b3f-b5f2-2b75084af2a4)

* You can also click **Settings** on the Datasets Overview page, then click **Action Configuration** to manage your secrets.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FPlgYwNXCmKGquTYMULL8%2F1.10.2.png?alt=media\&token=d7d7b3a1-6019-431a-82c1-c606565f75e2)

### Create Your Secrets

* Click **Create Secret**
* Type a name and enter the value for your secret in the input boxes.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FtoPvlFLHw7coSx1pemPc%2F1.10.3.png?alt=media\&token=023e63f0-5cbc-4198-9b5a-77203bed763a)

* Then click **Create** to finish the setting.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FaX9yVnPz1kyJqcczFOSq%2F1.10.4.png?alt=media\&token=66ef00ff-47dc-4d5e-9657-ef2642b563a3)

### Name Your Secrets <a href="#naming-your-secrets" id="naming-your-secrets"></a>

* Secret names can only contain alphanumeric characters (\[a-z], \[A-Z], \[0-9]) or underscores (\_). Spaces and other special characters are not allowed.
* Secret names must not start with a number.
* Secret names are case-sensitive.
* Secret names must be unique at the level they are created at. (For example, a secret created for a dataset must have a unique name in this dataset.)
* Secret names can contain a maximum of 40 characters and a minimum 2 characters.
* No limits for the value of a secret.

### Permissions

* Only administrators of a dataset can create, delete, and update secrets for that dataset.
* Members of a dataset can only copy secrets used in that dataset.
* The value of a secret is only displayed during the creation step, after that all users cannot see the explicit value.

### Manage Secrets

* All the secrets will be displayed in the secret management list, including their names, updating time and all the history operations. You can update or delete secrets in this list.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F6329je8uXsZtyRx9DWvE%2F1.11.1.png?alt=media\&token=31739ca8-f0c8-4b03-bc89-b3323c7c6b90)

### Update Secrets

* Select the secret that should be updated from the secret management list, and then click **Update** in the operation bar. Enter a new secret value in the pop-up window. Click **Update** to complete the procedure. The updated secret value will be automatically referenced when you use it the next time.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FcT5DFttmolsxkkDaQYoD%2F1.11.2.png?alt=media\&token=2b319ecc-eb43-444a-8e72-aff81ebb412e)

### Delete Secrets

* Select the secret that you want to delete from the secret management list and click **Delete** in the operation bar.&#x20;
* Click **Delete** again in the pop-up window to confirm your operation.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FrWlnnQ6voAEgh8agEcdU%2F1.11.3.png?alt=media\&token=28bd9e5c-e8aa-42fd-8daa-ab15d120e713)

{% hint style="info" %}
Deleting a secret may cause workflows using the secret to not work properly, so please be cautious.&#x20;
{% endhint %}

### Use Secrets

* To use a secret, you need to go to the secret management list to copy its name.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FRLc59P1k6ftEEbe2oKJd%2F1.11.4.png?alt=media\&token=8e0c6e94-47da-4a11-a772-b2c47c67d85a)

* Once the name is copied, you can use it with the format`{{ secret. keyname }}` in the YAML file of a selected workflow.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FIYohAGikC9lFxmdzBC7Q%2F765e0c5999f40e770cf8184271c15a3.jpg?alt=media\&token=0998cd82-f4ac-47a1-a3c6-09c4c5a0bf9e)

&#x20;


# Open Datasets

We are committed to fostering an open dataset community where everyone can acquire, use, and manage massive high-quality open datasets in the cloud.<br>

> Convenient Use in the Cloud: Start an efficient AI development journey.

### **Diverse Datasets** <a href="#id-1" id="id-1"></a>

1000+ high-quality datasets: Choose from 50+ application scenarios, 30+ annotation types, and 10+ data formats [Explore Datasets Now](https://www.graviti.com/open-datasets)<br>

### **Efficient Dataset Search**

You can accurately locate datasets not only through keywords, but also through associative-words, application scenarios, and annotation types.

By structuring the application scenarios, annotation types, metadata, and license information of the datasets, you can quickly locate the key information of the data.

Open Datasets brings together high-quality open datasets at home and abroad, creating a shared and open dataset exchange community for AI developers around the world.

{% content-ref url="/pages/-MWXkCIyxu2Ki5QrXVWN" %}
[Search for Datasets](/guide/opendataset/get)
{% endcontent-ref %}

### **Real-time Online Data Visualization** <a href="#id-1" id="id-1"></a>

With Graviti data visualization widgets, you can preview raw data, annotations, label distribution, and attribute distribution  online.

{% content-ref url="/pages/-MWXnURM4t4\_MBiOLfW9" %}
[Preview Data and Label Distribution Online](/guide/opendataset/visualization)
{% endcontent-ref %}

### **Access and Use Datasets Online** <a href="#id-2" id="id-2"></a>

Create a copy of a dataset on Open Datasets by forking, and edit it on TensorBay.

{% content-ref url="/pages/-MWXofMPVeH2RgoREV0X" %}
[Use and Manage Datasets Online](/guide/opendataset/fork)
{% endcontent-ref %}

### **Direct Dataset Community Support** <a href="#id-5" id="id-5"></a>

Follow and resolve users' dataset needs, and problems encountered in the data management process.

{% content-ref url="/pages/-MWXqle922EawNNHj-6M" %}
[Didn't find the dataset you want?](/guide/opendataset/issue)
{% endcontent-ref %}


# Basic Concepts

When you use TensorBay, you'll come across some concepts related to dataset types, mainly Datasets and Fusion Datasets. Here we will give explanations for related concepts.&#x20;

## Datasets <a href="#id-1" id="id-1"></a>

Dataset represents the most common datasets such as MNIST and THUCNews. Datasets are the most commonly used data in algorithm research. Data files have no special correlation with one another. They may come from the same sensor.

* Datasets: Common Datasets

A dataset contains a certain number of files, annotations, and relevant information. There are a certain number of segments in one dataset.

* Catalog & SubCatalog

There could be one or several SubCatalogs under one Catalog, each of which only stores annotation metadata of one type.&#x20;

Catalog stores the annotation metadata. It collects all the annotations that occurred in all data samples of a dataset. Each SubCatalog with a single annotation type contains only one type of metadata.

* Segment

Segment refers to a data level secondary to Dataset in the TensorBay dataset structure. Each Segment contains a certain number of data. For example, all training samples can be organized into one segment.

* Data: Data Required for Algorithm Research&#x20;

Data is the most basic level in the TensorBay dataset structure. A data object contains one dataset sample, annotations, and other information such as a timestamp.&#x20;

The structure of a dataset looks like this:&#x20;

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FOCJATk3JZhLSMh4m7ZPO%2FOpenDatasets1.png?alt=media\&token=e0c4dcd7-66c3-4c5e-b388-4bb19a3421ba)

## Fusion Datasets <a href="#id-2" id="id-2"></a>

A fusion dataset is composed of complex structured data or data collected from multiple sensors, usually referring to autonomous driving datasets, such as the nuScenes and KITTI-Tracking.

* FusionDataset

A fusion dataset contains data collected from multiple sensors, including information on frames, labels, sensors, and more. A fusion dataset may contain multiple fusion segments.

* FusionSegment

FusionSegment is a data level only secondary to a fusion dataset. Each FusionSegment contains a certain amount of Frames to store information from different sensors.

* Sensor

A Sensor refers to a device that collects the data in the FusionSegment. Currently, we support the following four types of sensors, each of which stores sensor-related information, including sensor names, extrinsic parameters, and intrinsic parameters (only for camera-type sensors).

| Sensor         | Corresponding Data Category |
| -------------- | --------------------------- |
| Camera         | Image                       |
| Fisheye Camera | Image                       |
| Lidar          | Point Cloud                 |
| Radar          | Point Cloud                 |

* Frame

Frame is a component of a FusionSegment. A Frame consists of multiple types of data collected at the same time from different sensors.

* Data in a Fusion Dataset

Each of the data in a Frame corresponds to a data file collected by a Sensor. The data of fusion datasets is defined the same as the data of datasets.<br>


# Search for Datasets

## **Search by Keywords** <a href="#id-2" id="id-2"></a>

> **Search for datasets with keywords**

* Approximate Search
* Associative-keywords Search on search bar

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY4W9kRBBz-YTnuu8D%2Fimage.png?alt=media\&token=a7f39f07-b999-4b09-964a-ba931a059927)

## **Multiple Methods for Filtering and Sorting** <a href="#id-1" id="id-1"></a>

### **Filter Datasets** <a href="#id-2-1" id="id-2-1"></a>

> Mult&#x69;**-**&#x64;imensional Filtering

* 50+ Application Scenarios
* 30+ Annotation Types
* 10+ Mainstream Data Formats

### **Filtering and Sorting Search Results**  <a href="#id-2-2" id="id-2-2"></a>

> Multiple Sorting Methods

* Overall
* most popular
* newest

### **Browse Dataset List Page** <a href="#id-2-3" id="id-2-3"></a>

> Basic Dataset Information At A Glance

* Data Formats
* Annotation Types
* Views
* Data Volume
* License

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY4f905cZkoqMJooU2%2Fimage.png?alt=media\&token=5afa86ae-455d-4ef5-8d23-b45bfdde5b71)

## **Precise Locating** <a href="#id-3" id="id-3"></a>

### **Dataset Structured Descriptions** <a href="#id-3-1" id="id-3-1"></a>

* Dataset Information
* General
* Copyright Owner
* Annotator

### **Preview Data Online** <a href="#id-3-2" id="id-3-2"></a>

> **Dataset information at a glance without having to download or write code.**

* Original Data
* Annotations
* Label Distribution

### **Learn More about Datasets** <a href="#id-3-3" id="id-3-3"></a>

* Overview
* Data Collection
* Data Annotation
* Data Format
* Errata
* Citation

### **Similar Datasets** <a href="#id-3-4" id="id-3-4"></a>

> **Explore More Relevant Datasets**

<br>


# Preview Data and Label Distribution Online

Grasp the data details with the Pharos visualization tool in advance to help you significantly reduce the cost of trial and error.

## **Annotation Visualization** <a href="#id-1" id="id-1"></a>

> **View Mainstream data like Images, Videos, and the corresponding Annotations.**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY5Ok7NTe-brZYsxyo%2Fimage.png?alt=media\&token=f876c870-038b-4ecd-ba8f-ddd6ab8df8f6)

* Mini-window on the right corner: Click "<" or ">" to switch data samples.
* Annotation list on the left: Click a label name  to view its corresponding annotations in the main view

## **Label Distribution Visualization** <a href="#id-2" id="id-2"></a>

> View label distribution of a dataset

* Multiple data presentations: list, histogram, pie chart, etc.
* Copy the URL /IFRAME of the preview page and embed the visualization widget into your own page

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY5WEERyNpZTctsjn-%2Fimage.png?alt=media\&token=e1b18f0a-1f0e-42ea-93e3-b96478aa062a)

{% hint style="info" %}
Visualization widgets have not yet covered all datasets but will be available soon :)
{% endhint %}


# Use and Manage Datasets Online

> Access datasets without having to worry about data format conversion.&#x20;

* Enter the Dataset Details page, click **Explore Dataset,** and select **Fork**
* Confirm the license agreement. Select the version and workspace, and click **Confirm** to fork the dataset to **Your Dataset.**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY5cvh3F8nRmxxgPH9%2Fimage.png?alt=media\&token=93715972-1612-4cfb-a94d-150223637dc8)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY5nGkR_QgS0raLSid%2Fimage.png?alt=media\&token=601d97e4-f511-4de8-ad4a-d609b2f8fd46)

* Manage forked datasets on TensorBay.


# Download Open Datasets

* Enter the Dataset Details page, click Explore Dataset, and select Download.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY6-udqVLHr_pCFGZr%2Fimage.png?alt=media\&token=f20e3731-974e-4e77-8b79-8b9aefb13c67)

* click **Official Website** to visit dataset's official website to download the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2F9fVxvVD7GFLF67lzCa88%2Fopendataset2.png?alt=media\&token=9aa88183-56bc-479f-a0c1-2235c884e5ac)


# Didn't find the dataset you want?

## Submit Feedback

* Enter the official website and click on the "..." - Feedback on the top right of the navigation bar.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY6irjYiEOZjULasu7%2Fimage.png?alt=media\&token=73cc90e5-98af-4712-8dff-ee7f99c0e9f0)

* Click **Add Feedback**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY6qJbfvWpyzWDDZmw%2Fimage.png?alt=media\&token=8ae7eefa-4541-49c9-ab69-e308ad5e52ab)

* Select: Feedback Type - **Request**, Products - **Open Datasets**. Enter the problems you encountered, and click **submit.**

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MWY4AyZDqTata-GwhcQ%2F-MWY6xex9GZVszRyvDpD%2Fimage.png?alt=media\&token=47b7b06f-bec7-4989-aac0-acf7cc669b97)


# GroundTruth Tools

Collaborative Data Annotation Tools.

GroundTruth Tools is a collaborative data annotation tool for data preparation of machine learning. It supports multiple common annotation types and multi-user collaborative annotation. Quick start of annotation tasks, it is suitable for small teams to quickly produce data needed for cold start.&#x20;

GroundTruth Tools supports 2D BOX, Classification, 2D POLYGON, 2D POLYLINE, and 2D Keypoint.


# Annotate pictures

Collaborative Data Annotation Tools

## Create a Project <a href="#create" id="create"></a>

* Click GroundTruth Tools on the Apps page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FkG8RqHabNGQmfVzjox1Z%2F28.2.png?alt=media\&token=1d5ce775-1c62-4897-851d-ba2e7351aa8d)

* Click **CREAT ANNOTATION PROJECT** on the My Annotation page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FToAPl513NcMZimnJIE8x%2F2.9-2.png?alt=media\&token=61d9252f-0784-457d-bc55-250e9551e107)

* Select or create a dataset for annotation.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2FsyVHjgUccZnsxbDlN74p%2F22.2.9.png?alt=media\&token=64f881de-6b99-4b4d-adc4-361eccba499c)

{% hint style="info" %}
It is recommended to select datasets with less than 2, 000 data.
{% endhint %}

* Enter the Project name, select the annotation type and select whether to import legacy data from the dataset.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fyi94MooXPXJpwydPg7vM%2F22.2.9-3.png?alt=media\&token=e51cb702-305e-4f8a-bd91-ccdfa5a5291b)

* Select labels and add attributes. You can customize label subcategories and their attributes.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MGbJTODB-ncDvFhokcx%2Fuploads%2Fy7JFPe8O4K91VehJvsON%2F22.2.9-4.png?alt=media\&token=9ba26bab-42c9-40be-86de-6db8e018c320)

* Check the details of the Annotation Project and complete it.


# Sextant

Quick Evaluation Tools for Data and Models

Graviti’s Sextant are efficient evaluation tools for data and models. Sextant supports data visualization and filtering of evaluation data by metrics. You can use it to complete quality assurance for preparing high-quality data, evaluate the accuracy of models, and launch various competitions.

{% hint style="info" %}
Sextant currently only supports the evaluation of Box2D type of data and mAP metrics. More annotation types and Metrics will be supported in the future, please stay tuned!
{% endhint %}

## **Data Evaluation**

Sextant supports the comparison of labels across two datasets, which helps you gain insight into differences of datasets and quickly spot data quality defects. After filtering out the specified data, Sextant can be seamlessly integrated with GroundTruth Tools for quality assurance and relabeling to instantly improve the quality of your datasets and help you to train high-quality AI.

#### &#xD;Evaluation Process:

1.

```
Upload the data that need to be evaluated to TensorBay
```

2.

```
Create an evaluation, and select suitable benchmark data
```

3. Use other dataset to start an evaluation to obtain metrics
4. Filter the data by metrics and spot the data quality defects
5. Save the filtering results as a new dataset and start data quality assurance and optimization

## Model Evaluation

Sextant supports the evaluation of model accuracy, which helps you to quickly know the model performance, identify its weak scenarios, and provide you with references for debugging model performance. It also supports the comparison of multiple model evaluation results, which enable you to pick out the most suitable model for specific application scenarios.

#### Evaluation Process

1. Upload the ground truth data to TensorBay
2. Create an evaluation and select ground truth data as the benchmark data
3. Upload a suitable model to Github and use the model to start an evaluation
4. View metrics and comparison results


# Create an Evaluation

* Click **Apps** on the top navigation bar on the GAS page, and then click **Sextant** to enter to the page of Sextant.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLGEeaAO1yr1Pe_l6E%2Fimage.png?alt=media\&token=c24ee300-03c2-4719-91c9-7cec36e66373)

* Click **New Evaluation** on the upper right corner to enter the new page of the evaluation.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLGR2AuKB-JCZDujyr%2Fimage.png?alt=media\&token=b05ba93d-2bc0-460b-b622-8217bc8e3b61)

* Fill in basic information and select benchmark data and the categories to be evaluated to complete the creation.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLGm5xQkDKiqoyGoK6%2Fimage.png?alt=media\&token=b4ef19d5-2452-411f-895a-5b31e3f25ea9)

#### The required information for creating a new evaluation is as followin&#x67;**:**

1\. Benchmark dataset

The benchmark dataset is used to evaluate the generated metrics as a reference, such as the ground truth data. (in common model evaluation scenarios)

Currently, only the TensorBay dataset can be chosen as the benchmark dataset. If you want to use data from local or other cloud storage, please upload the data to TensorBay first. For details, please check the following article.

{% content-ref url="/pages/-MWWnuVASpJRl\_DoaSdy" %}
[How to Quickly Prepare a Dataset](/guide/tensorbay/data)
{% endcontent-ref %}

2.Evaluated annotation types

The type of data annotation that needs to be evaluated. Currently, only Box2D is supported.

3\. Evaluated categories

&#x20;The categories of objects that need to be evaluated

4\. IoU threshold

A preset IoU threshold. In evaluations, the IoU higher than the threshold is considered to be a hit; otherwise, it is considered to be a miss. Here you need to fill in a two-digit number between 0 and 1.

{% hint style="info" %}
Currently, only one IoU threshold is supported to be added for a single evaluation. Please look forward to the coming of simultaneous evaluation with multiple thresholds and other related features.
{% endhint %}


# Custom Metrics

Sextant supports custom Metrics algorithms, you just need to upload the algorithm of your metrics to Github Repo and enter its Url into Sextant.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MjSuWaLU2QwqrNhYTcP%2F-MjSugUfo2BVdJM0aCqd%2Faaed3f6733c502f862e163d7fdea403.png?alt=media\&token=bf85fa30-1009-40ee-b908-e1a3b06335d5)

The algorithm of your metrics should be written with python and upload to Github.

## Available Types of Indicators

‌Sextant supports two types of indicators, Float and Curve, and users can set their valid range.

### Float

‌The output is a floating point value, which is displayed on the front end as a "name=value" style, e.g. mAP=0.75.

### Curve

The output is two one-dimensional arrays named x and y. It will be displayed as a curve in the front-end, with the values of x and y corresponding to the horizontal and vertical coordinates of the points on the curve.

## Valid Range

‌Sextant supports setting the valid range of metrics to data or dataset.

### ‌For Data

Each data evaluated will return a corresponding value, such as the average value of IoU.

### ‌For Dataset

Each evaluation will only return one corresponding value, such as the mAP of this evaluation.

## Rules

The algorithm of your metrics needs to comply with the following rules:

1. If you need additional dependency packages in your code, you need to create requirements.txt in the root directory and write dependencies in it (GPU operations for deep learning frameworks such as torch, tensorflow, etc. are not supported).
2. You need to create an \_\_init\_\_.py, file in the root path of GitHub to ensure that the path to the repo can generate a class called Evaluator as a python package when it is cloned locally.
3. There is one and only one class named Evaluator in the python library.
4. The Evaluator needs to have the method to obtain the annotation scores of a single image. evaluate\_one\_data(input\_source: dict, input\_target: dict) -> dict method. Please refer to Graviti's docs for input\_source and input\_target values.
5. The Evaluator needs to have a method to obtain the overall annotation scores. get\_result() -> dict.
6. The return values of the above two methods must comply with the following structure. (Currently, only two types of data are supported: float and curve.)

## Code Examples

### Example of Directory Structure

```python
(yourgithubrepo_root) 
    -- __init.py 
    -- Evaluator.py 
    -- requirements.txt
```

### Init.py Example

```python
from .Evaluator import Evaluator
all = ["Evaluator"]
```

### Requirements.txt Example.

```python
numpy=1.21.0
```

### Evaluator.py Example

````python
import numpy as np

class Evaluator:
   def __init__(self):
       """
       You can initialize your model here
       """
       ...


   evaluate_one_data(self, input_source: dict， input_target: dict) -> dict:
       """
       Do the evaluation job
       :param input_source: Ground truth boxes in one image
       :param input_target：Target boxes in the same image
       :return: A dict containing evaluation on one image and each category within it.
       """
       ...
   def get_result(self) -> dict:
       """Overall evaluation.


       Returns:
           A dict containing overall evaluation on all images and all categories.
       """
```
{
   'scope':1,//1-data级别；2-dataset级别
   'overall': {
       'mAP':0.123, // Float类型返回
       'pr':{  // Curve类型返回
             'x':[1,0.5],
             'y':[1,0.5]//x数据将在前端渲染为横轴数据，y数据将在前端渲染为纵轴数据，x和y均为list，且长度一致。
            }
   },
   'categories': {
       '{your_category}': {
            'mAP': np.mean([1, 2, 3]).tolist(),
       }
   }
}

````


# Start to Evaluate

You can join the evaluation created by yourself or your team members through Sextant. Sextant supports both modes of participation, using a TensorBay dataset and loading a model from GitHub.

{% hint style="info" %}
If you have no permission to use the benchmark data, please apply according to the prompts first.
{% endhint %}

## Use a TensorBay Dataset to Start an Evaluation‌

* Find the evaluation you want to join on the evaluation list page and click **View** to enter the corresponding evaluation details page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLKke1ute_vmx-hWb_%2Fimage.png?alt=media\&token=da28684e-d856-41a7-a2ed-7fe765a2e99e)

* Click **Start to Evaluate** on the upper right corner of the evaluation details page.‌

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLKtdjD2TuZhGbMWxn%2Fimage.png?alt=media\&token=2991afec-0a48-45bb-9850-0ea2abb02902)

* Click **Choose a Dataset from TensorBay** in the pop-up window and select the dataset that needs to be evaluated and then choose the dataset version. Click **Confirm**, then the evaluation will start automatically. Meanwhile, the system will also automatically generate an evaluation record.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLLQ3M46NCoX1T1YUc%2Fimage.png?alt=media\&token=1b1841ad-1ea5-40a0-a9a1-e9a56bd94326)

{% hint style="info" %}
The status of evaluations is divided into three types: in progress, completed, and failed. If an evaluation failed, please check its log to troubleshoot and retry. If you need help, please [send us feedback.](https://www.graviti.com/forum/support)
{% endhint %}

## Load a Model from GitHub to Start an Evaluation

* Find the evaluation you want to join on the evaluation list page and click **View** to enter the corresponding evaluation details page.‌

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLKj4tdoYV8lOg8Rzz%2Fimage.png?alt=media\&token=ae3ef8f1-c0dd-4048-8595-f32edf6779e3)

* Click **Start to Evaluate** on the upper right corner of the evaluation details page.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLKtdjD2TuZhGbMWxn%2Fimage.png?alt=media\&token=2991afec-0a48-45bb-9850-0ea2abb02902)

* Select **Load a Model from GitHub** and add the corresponding GitHub Repo URL, for instance, <https://github.com/Graviti-AI/tensorbay-python-sdk.git>. Click **Confirm**, and then the evaluation will start automatically. Meanwhile, the system will also automatically generate an evaluation record.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLLUeyWE7n6VNSpxaP%2Fimage.png?alt=media\&token=135862bb-0db3-4cd0-a7c7-86fb1f347f82)

## How to prepare a suitable algorithm model for Sextant

1. First prepare the algorithm that needs to be used in evaluation and verify its availability.
2. Write python code according to the following structure:

* There is only one class named Predictor in the python library.
* There is a predict() method in the Predictor class. Please refer to Graviti’s docs for the return value.
* The model on which the algorithm depends must can be used by the algorithm.

```python
class Predict:
    def __init__(self):
        """
        You can initialize your model here
        """
        ...
    def predict(self, img_data: bytes) -> Dict[str, Any]:
        """
        Do the predict job
        :param img_data: the binary data of one image file
        :return: the predict result
        """
        ...

"""
Box2D Example

{
    "BOX2D": [
        {
            "box2d": { "xmin": 1, "ymin": 2, "xmax": 3, "ymax": 4 },
            "category": "cat"
        },
        {
            "box2d": { "xmin": 5, "ymin": 4, "xmax": 6, "ymax": 9},
            "category": "dog"
        }
    ]
}
"""
```

&#x20;   3\. For details, please see the [example](https://github.com/AChenQ/ssd-detection/blob/master/predict/predictor.py).

&#x20;   4\. Upload the code file to Github and copy and paste the .git link to Sextant to start an evaluation.

{% hint style="info" %}
If your code relies on a model, please ensure that the model can be accessed by the code successfully.
{% endhint %}

## View Evaluation Logs

Sextant will record the system logs during the evaluation process for users to track the evaluation process and resolve potential bugs in advance.‌Viewing steps are as following:

* Find the evaluation you want to view on the evaluation list page and click **View** to enter the corresponding evaluation details page.‌

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgKLZ5xk-UGDVlqGJWg%2F-MgLKj4tdoYV8lOg8Rzz%2Fimage.png?alt=media\&token=ae3ef8f1-c0dd-4048-8595-f32edf6779e3)

* Find the record you want to view on the evaluation history page and click **Log** on the right side.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLNI7xCMaLMqbF7Qj6%2Fimage.png?alt=media\&token=b74fff7e-5f55-48d8-ac46-644c5ded7797)

* Select specific steps of log that you want to view in the pop-up window, and then the required log information will be displayed on the right side.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLNd8_XlXn31cuOj71%2Fimage.png?alt=media\&token=a8ee8d54-28ea-4424-85a5-bee794986cf9)


# View Results

After an evaluation is completed, you can view its metrics. And Sextant supports the comparison of metrics among multiple evaluation records.

{% hint style="info" %}
Only a completed evaluation supports viewing its evaluation result.
{% endhint %}

## Compare Evaluation Results

Enter the evaluation details page where records the metric you want to view, and the metrics of each evaluation will be displayed in the evaluation list. The list supports being ranked by Metrics to see the metrics of each evaluation result.

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLUAyyh3d5Hw8droLI%2Fimage.png?alt=media\&token=83aaa35e-c4bf-4301-b56a-22e1ab61d219)

## View Data List‌

Find the corresponding evaluation record in the evaluation list, and click **View** to enter the data list. In the data list, you can view the metrics under each category of different files. Click the tag on the upper right corner to switch displaying metrics or data visualization.‌

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLUQIbsU_yrKorY_ez%2Fimage.png?alt=media\&token=2ec6bf8d-fcb9-4658-9e61-454a55237233)

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLU_IhKmwY97jBW4jz%2Fimage.png?alt=media\&token=17e82f9d-7ea9-4820-a0c2-2332be266712)

## View Evaluation Metrics‌

The current page will display the overall evaluation metrics for all the data in the current list, including mAP and the corresponding PR curve. When two datasets are used for an evaluation, the PR curve has only one point.‌

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLUJ4HCZ_cYVZ-rEYm%2Fimage.png?alt=media\&token=48fadf9a-8fa7-4964-a428-0c03c334eb2e)

## View Data Visualization

#### Data Visualization

Visualize the labels of the benchmark data and those of the data of evaluation objects to help you gain insight into the quality of evaluated data.&#x20;

In data visualization, the labels of the benchmark data are shown with solid boxes and the labels of the data of the evaluation objects are shown with dashed boxes.

{% hint style="info" %}
If the evaluation is invalid, the data visualization cannot be viewed.‌
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLVgHUsnJmRIGT4Q-H%2Fimage.png?alt=media\&token=4c0d83b8-2740-40ad-8c92-7824140028fa)

## Filter Data

On the data list page, you can filter the results by IoU and mAP of each category. The filtering results will be displayed after offline processing. You can view the data and metrics in the data list and data visualization. The time required for offline processing depends on the data volume that need to be filtered.

{% hint style="info" %}
The newly created dataset will not contain the metrics of the current evaluation, except for the direct output of all data without adding any filters.
{% endhint %}

![](https://2993186011-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MGbJTODB-ncDvFhokcx%2F-MgLN18_D9gFSyumVxqZ%2F-MgLVy0jINngEVI3x3so%2Fimage.png?alt=media\&token=e6f1e1d7-e31e-49ce-ac31-875dabd19d98)


# Release Note

To help you keep track of the ongoing updates and improvements to Graviti products, we publish release notes that describe recent changes.

## 2022-03-30

Graviti Data Platform Improvements:

* Added Records on the Activity page to list the new datasets that were forked or created by Filter.
* Optimized users’ login process.

## 2022-03-10

Graviti Data Platform New Feature:

* Added compute management function. The compute consumed by Offline Filter, Cross-version comparison, Action, Sextant Model Evaluation and Squash\&Merge will be automatically calculated and the results will be displayed on the dashboard page and Your Asset page for viewing and management.

Graviti Data Platform Improvements:

* Optimized the Version Control function. Simplify users’ operation process by putting all the functions of Version Control on a single management page.

## 2022-02-15

Graviti Data Platform Improvements:

* Fixed bugs on data capacity statistics.
* Optimized the login UI of Graviti data platform.
* Added Crontab drop-down box component in the scheduled trigger. Optimized the input box to support special characters “?” “\”.

## 2022-01-24

Graviti Data Platform New Features:

* Added scheduled trigger in Action. Users can make workflows run on schedule.
* Added Activity Registration on the Website Home Page. Users can enter the Event Detail page for more information, registration and documents downloading.

Graviti Data Platform Improvements:

* Optimized features of the Data Dashboard. Users can view monthly Used Data Volume on the Details page.
* Optimized the copywriting of Sextant, changing Evaluation to Benchmark.
* Added Select All option on the Delete Data page to help users quickly delete the data.
* Added the ISO9001 certification icon and modified relative copywriting on the Data Hosting page.
* Optimized the User Interface of GroundTruth on the Select Dataset page. Added details of the Commit, including Type, Amount, Creator and Updated Time, to help users quickly choose datasets. Added Paging function to improve the user experience.

Python SDK New Features:

* Add open dataset loaders `VGGFace2`

Python SDK Bug Fix:

* Fix reading cached file failed in a multiprocess environment
* Fix the J`ob.started_at` will not be updated
* Fix the `ValueError` when init `PointList2D` and `RLE` with Numpy array
* Fix the `NoneType` error in `Job.update`

Python SDK Improvements:

* Remove the multiprocess lock and add PID to cached file path

## 2021-12-30

Graviti Data Platform New Feature:

* Optimized the cross-version comparison function. Graviti Data Platform now supports cross-version comparison by selecting the corresponding commit by branch and tag.&#x20;

Python SDK New Features:

* Implement the async job framework&#x20;
  * Implement `JobMixin._create_job`&#x20;
  * Implement `JobMixin._get_job`&#x20;
  * Implement `Job.updat`&#x20;
  * Implement `JobMixin.delete_job`
  * Implement `Job.retry` and `Job.abort`
  * Implement `JobMixin._list_job`
* Implement SquashAndMerge feature by async job framework
  * Implement `SquashAndMerge.create_job`
  * Implement `SquashAndMerge.delete_job`&#x20;
  * Implement `SquashAndMerge.get_job`
  * Implement `SquashAndMerge.list_jo`&#x20;
  * Implement `SquashAndMergeJob.result`
* Add the following open dataset loader:
  * `CityscapesGTFine`
  * `CityscapesGTCoarse`&#x20;
  * `RarePlanesRea`
  * `RarePlanesSynthetic`
  * `UrbanObjectDetection`

Python SDK Improvements:

* Getting mask URLs from OpenAPI `getDataDetails` to reduce the number of requests&#x20;

Python SDK Documentation:

* Update the docs about "Squash And Merge" in "Features"
* Refine the docs&#x20;
* Refine the docstring&#x20;

Python SDK Documentation:

* Change the Sphinx Html theme to "furo"
* Change the Sphinx Html theme to "furo"

## 2021-12-17

Python SDK Bug Fix:

* Fix `RemoteFileMixin._urlopen()` failed when URL is expired

## 2021-12-16

Graviti Data Platform New Feature:

* Added secrets in Action. Users can configure their secrets in the settings of Action. The secrets that users configure are available to use in Action Yaml files. (only available for administrators)

Python SDK New Features:

* Add interfaces to communicate with Sextant Apps&#x20;
  * Implement `Sextant.list_benchmarks`
  * Implement `Sextant.list_evaluations`
  * Implement `Sextant.create_evaluations`
  * Implement `Evaluation.get_result`
* Add `SemanticMask` for `BDD100K_MOTS2020` dataset
* Add `author`, `updated_at` and `parent_commit_id` for `Draft`&#x20;
* Add `--show-drafts` for CLI `gas log` to support displaying open drafts

Python SDK Improvements:

* Remove the redundant attributes in `BDD100K` dataset
* Update `VersionControlClient` to `VersionControlMixin`
* Use `stem` to represent the filename without extension in `opendataset` module

Python SDK Bug Fixes:

* Add the missing `categoryDelimiter` to the `OxfordIIITPet` catalog

* Fix `NoneType` not subscriptable error in `listMaskUrls`

* Fix the `AttributeError` when calling the `mocker` class methods&#x20;

* Correct the wrong attribute names in `nuImages` catalog

* Add "PaddlePaddle" instructions in `INTEGRATIONS` chapter&#x20;

* Add documentation for `Sextant` in `Applications` chapter&#x20;

* Reconstruct `Storage Config` in  `Advanced Features` chapter

* Support deleting automatically generated rst files via `make clean`&#x20;

* Refine the docstring&#x20;

## 2021-12-07

Python SDK Bug Fixes:

* Fix the request timeout issue when reading data in multiprocess environment
* Fix the `TypeError` caused by positional arguments mismatch when using `Profile`&#x20;

## 2021-12-03

Graviti Data Platform New Features:

* Add a data dashboard to enable users to view the data storage capacity of each workspace and used data volume
* Add an email subscription portal for users to get our latest updates

Graviti Data Platform Improvements:

* Optimize the creation steps of datasets and user interactive experience
* Optimize the functions of Action. Add a manual option, YAML code templates, and a stop workflow button (this function is only available to the team admin)

Python SDK New Features:

* Add `--sort` option for CLI `gas branch` and `gas tag` to support sorting branches and tags&#x20;
* Support recording statistical info for `Data.open().read()` in `Profile` class
* Add `StorageConfig` class to store storage config info
* Add `SegmentClient.get_data` to get data info by its `remote_path`
* Support showing a piece of data via `remote_path` in CLI `gas ls`

Python SDK Improvements:

* add `URL` class for getting and updating the file URL
* Add `train`, `val` and `test` in segment name in `DAVIS2017`

Python SDK Bug Fixes:

* Fix the wrong graph in CLI `gas log` when merging branches
* Add the missing `categoryDelimiter` in `COCO2017` catalog
* Fix the `FileExistsError` when using cache with multiprocess

Python SDK Documentation:

* Use `autosummary` to generate `rst` files in `opendataset` module under "API" chapter&#x20;
* Refine the docs
* Refine the docstring

## 2021-12-01

Python SDK Improvement:

* Make `timeout` setting in `tensorbay.client.config` take effect for `urlopen`

## 2021-11-17

Graviti Data Platform Improvements:

* Optimize the interface and interactivity of the Apps market
* Optimize the display of the data dashboard

Python SDK New Features:

* Add checking and warning for free storage space when enabling cache&#x20;
* Add the following open dataset loaders:
  * `SCUT_FBP5500`&#x20;
  * `DAVIS2017`

Python SDK Improvements:

* Add argument `encoding='utf-8'` to open() to make it compatible for Windows&#x20;
* Use `xmltodict` to parse xml files instead of `xml.ElementTree`&#x20;
* Add file `tensorbay/py.typed` to comply with PEP-561&#x20;

Python SDK Bug Fix:

* Fix `Data.open` catch exception failed when url is expired

Python SDK Documentation:

* Reconstruct "Version Control" chapter&#x20;
* Fix the typo in the docs&#x20;
* Refine the docs&#x20;
* Refine the docstring&#x20;

Python SDK Deprecation:

* Remove the deprecated method `GAS.create_auth_dataset`

## 2021-11-02

TensorBay Bug Fix:&#x20;

* Fix some bugs to optimize the user experience&#x20;

Sextant Improvement:&#x20;

* Add the Retry button to allow a dataset to be evaluated again after failing

Python SDK New Features:

* Support setting `is_public` in `GAS.create_dataset`
* Support importing authorized cloud files to fusion dataset
* Support cache when opening remote data
* Add `DatasetClientBase.get_total_size` to get the total data size in a dataset commit
* Add `VersionControlClient.squash_and_merge` to merge two different branches&#x20;

Python SDK Improvements:

* Use `os.path.expanduser` to handle the CLI config file path in different systems&#x20;
* Replace relative import with absolute import for all python files in SDK
* Remove the useless checks about commits and drafts in `ls.py`
* Add `X-Request-Id` to all the TensorBay OpenAPI request headers
* Add a detailed resuming message when uploading process got interrupted in CLI `gas cp`&#x20;

Python SDK Bug Fixes:

* Add a workaround for the `IndexError` when loading the data with panoptic mask
* Remove the wrong error message in `gas dataset` when `tbrn` is absent

Python SDK Documentation:

* Add docs about the data cache
* Add docs for using `pharos` on remote server
* Refine the docs

## 2021-10-18

Python SDK New Features:

* Display elapsed time of the request in the debug log&#x20;
* Use `response.elapsed` to get the cost time of a request in `profile`&#x20;
* Add `DatasetClientBase.get_label_statistics` to get the label statistics info&#x20;
* Support updating file urls when the urls are expired
* Add open dataset loaders `SegTrack2`

Python SDK Improvements:

* Consolidate all config-related functions in `ContextInfo`

Python SDK Performances:

* Adapt OpenAPI `getDataDetails` to increase the speed of reading labels and URLs&#x20;
* Upload auth cloud storage data labels on the cloud-callback OpenAPI to increase the uploading speed&#x20;

Python SDK Documentation:

* Add "Update Dataset Notes" section in "Update Dataset" chapter
* Add docs about cloud file in-place importing in "Cloud Storage"&#x20;
* Add docs about getting the label statistics info in "Get Label Statistics"
* Refactor the "Version Control" chapter&#x20;
* Refine the docs

## 2021-09-28

TensorBay Enhanced Features：

* Add discussion function on the public dataset details page in the mobile terminal&#x20;
* Optimize the interaction of data list search
* Divide Apps into different types according to their attributes on the Apps Market page

Python SDK New Features:

* Support filtering drafts by `status` and `branch_name` in`VersionControlClient.list_drafts`
* Add class `Profile` to record the statistical information about the HTTP requests in SDK
  * Support using `Profile` in the multi-process environment
  * Support saving `Profile` summary to `csv`, `txt` or `json` file
* Add the following `BDD100K` related open dataset loaders&#x20;
  * `BDD100K`
  * `BDD100K-10K`
  * `BDD100K-MOT`
  * `BDD100K-MOTS`
* Add the following open dataset loaders:
  * `SegTrack`
  * `COCO2017`
* Unify the format of prompt messages in CLI

Python SDK Bug fixes:

* Fix the dataset loader `LIP` and `CIHP` cannot be imported from `opendataset` module
* Correct the wrong visible status in `LIP` dataset loader

Python SDK Improvements:

* Unify the variable names about `directory` and `tbrn`
* Use `ValueError`, `StatusError` to replace `OperationError`

Python SDK Documentation:

* Add examples about `SemanticMask` and `InstanceMask`
* Add catalog structure for different label types
* Add docs about how to use `Profile`
* Fix the typos in docs
* Refine the docs

Python SDK Deprecations:

* Remove the deprecated class `ResponseSystemError`

## 2021-09-14

Sextant New features:&#x20;

* Support customized metrics by uploading Github Repo Url into Sextant
* Add more data types that can be evaluated

TensorBay Enhanced Feature：

* Support creating new datasets by merging datasets via Python SDK

Python SDK New Features:

* Support creating a dataset with different cloud storage configs in`GAS.create_dataset`
* Add the following methods to create customized cloud storage configs for different cloud services:
  * `GAS.create_oss_storage_config`
  * `GAS.create_s3_storage_config`
  * `GAS.create_azure_storage_config`
* Add `GAS.delete_storage_config` to delete customized cloud storage config&#x20;
* Enable the method `SegmentClient.delete_data` to delete data
* Add `FusionSegmentClient.delete_frame` to delete frame
* Support getting and updating dataset `isPublic` flag&#x20;
* Add the following open dataset loaders:
  * `CIHP`
  * `VOC2012Segmentation`
  * `PASCALContext`
  * `LIP`
  * `OxfordIIITPet`
  * `nuImages`
* Print more friendly error messages in CLI

Python SDK Interface Adjustments:

* Set current revision as the default in `VersionControlClient.list_commits`
* Disable method `FusionSegmentClient.delete_data` to stop deleting data in Fusion dataset

Python SDK Improvements:

* Prohibit closing current draft in `VersionControlClient.close_draft`
* Avoid getting `done_frames` when `skip_upload_files` is `False` in `FusionDatasetClient.upload_segment`

Python SDK Documentation:

* Add docs about "Update Dataset Meta"
* Add docs about "Delete Frame"
* Fix the typos in docs
* Refine the docs

Python SDK Deprecations:

* Remove the deprecated code before v1.10.0
* Deprecate `GAS.create_auth_dataset` and use `GAS.create_dataset` instead&#x20;

## 2021-08-30

TeraGood New Feature：

* Support editing labels of the fusion dataset in TeraGood

TensorBay Enhanced Feature:

The data list is optimized from a one-dimensional list to a two-dimensional list. Users can view more details of the data list via subtables. Support users to switch versions, view information, search, view catalog, show diff and do other operations on the data list page.

Python SDK New Feature:

* Support new label types: **SemanticMask**, **InstanceMask** and **PanopticMask**&#x20;

Python SDK Interface Adjustments:

* Remove the `loads` method for `DataBase`, `Data` and `AuthData`
* Add `get_callback_body` method to replace `dumps` in `Data`
* Add `from_response_body` method to replace `loads` in `RemoteData` & `Frame`&#x20;

Python SDK Bug Fixes:

* Add a workaround for `MalformedPOSTRequest` error when posting files to Aliyun OSS&#x20;

Python SDK Improvements:

* Add `FileMixin` and `RemoteFileMixin` for file-related methods
* Support setting custom loader and dumper in `AttrsMixin`

Python SDK Documentation:

* Add docs about `SemanticMask`, `InstanceMask` and `PanopticMask`

## 2021-08-17

New Features:

* Data storage configuration supports developers to choose different regions and team members to choose different cloud platforms or regions as the default storage configuration.
* Add data usage statistics function. Users can view the used data volume on the GAS homepage and the assets page.&#x20;
* Support data synchronization within GroundTruth Tools. GroundTruth Tools support the 2d/3d fusion labeling tools and can synchronize the labeling data to Tensorbay.&#x20;
* Support booking demo on the GAS home page.

Enhanced Feature:

* Support to select, modify server configuration and record parameters in Action.&#x20;

Python SDK New Features:

* Support new label types **Polygon** and **Polyline2D**, add five label formats:
  * `Polygon` + `MultiPolygon` + `RLE`
  * `Polyline2D` + `MultiPolyline2D`
* Add the following open dataset loaders:
  * `VOC2012Detection`
  * `VOC2012ActionClassification`
  * `CCPD` & `CCPDGreen`
* Add name conflict check for `SortedNameList`
* Support setting network request config (`is_internal`, `max_retries`, and `timeout`) in CLI `gas config`
* Support to validate the AccessKey and display the user info in CLI `gas auth`
* Add `--status` option for CLI `gas auth` to display the user and auth info
* Support displaying error messages for CLI `gas auth`
* Add `-l` option for CLI `gas ls` to show the total number of resources
* Add `--all` option for CLI `gas log` to show the commits in all branches&#x20;
* Add `--graph` option for CLI `gas log` to show the graphical commits
* Set `-h` as an abbreviation of `--help` to show CLI help messages

Python SDK Interface Adjustments:

* Remove the `path` argument in `GAS.create_auth_dataset` because the `path` is bound to the cloud storage config

Python SDK Bug Fixes:

* Add a workaround for the issue Chinese characters display garbled in the Windows system&#x20;

Python SDK Improvements:

* Use list comprehension in `PointList2D.__init__` instead of for-loop
* Set `None` as the default value of the argument `alias` in `GAS.update_dataset`
* Correct the illegal remote paths for `RP2K` dataset loader
* Encapsulate the moving segment logic into `DatasetClientBase._move_segment`
* Move the deprecation related classes into `deprecated.py`
* Stop showing the redundant field `name` in `AttributeInfo .__repr__`
* Cleanup the following useless codes:
  * Remove the useless class variable `_label_attrs` from label related classes
  * Remove the useless class `SubcatalogTypeRegister`
  * Remove the useless class `LabelType`
  * Remove the useless type `Subcatalogs`

Python SDK Documentation:

* Add docs about "Shell Completion" in the "CLI" section
* Add docs about new label formats **Polygon** and **Polyline2D**&#x20;
* Add docs about setting network request config in CLI `gas config`
* Add docs about `--all` and `--graph` options in CLI `gas log`
* Fix the typo in docs
* Refine the docs&#x20;

## 2021-08-04

New Features:

* Add model evaluation tools Sextant. Sextant supports quick evaluation of data and models, enabling you to gain insight into data quality and model accuracy, and providing references for data quality improvement.
* Add advanced search. Users can upload Github URL to get the corresponding file and set the file as a filter.
* Support modifying and conducting quality assurance of labels of 2D Box and 2D Polygon in TeraGood and GroundTruth.

Enhanced Feature:

* Optimize data search. Data search is performed offline now. Users can view the search progress and results and save search results for creating new datasets and so on.

Python SDK New Features:

* Support `override` and `skip` strategies in `SegmentClient.move_data`&#x20;
* Add `GAS.get_user` to get the current user info&#x20;
* Support manipulating dataset alias:
  * Support getting the dataset alias in `GAS.get_dataset`&#x20;
  * Support setting the dataset alias in `GAS.create_dataset`&#x20;
  * Add `GAS.update_dataset` to update the dataset alias&#x20;
* Support setting and showing `description` in CLI `gas draft`&#x20;
* Add `--edit` option in CLI `gas draft` to edit a draft&#x20;
* Add `--close` option in CLI `gas draft` to close a draft&#x20;
* Add draft description to the pop-up editor of `gas commit` as default message&#x20;
* Display the corresponding message after deleting data or a segment in `gas rm`&#x20;

Python SDK Interface Adjustments:

* Change the signature of `Transform3D.set_rotation` and `Sensor.set_rotation`&#x20;

Python SDK Improvements:

* Unify the `description` display logic in `gas draft` and `gas commit`&#x20;
* Set the file name as `""` when posting files to cloud storage&#x20;
* Add utility function `chunked` to break an iterable into length n tuples&#x20;
* Set the minimum version of `urllib3` back to v1.15&#x20;

Python SDK Performance:

* Speed up file uploads for fusion dataset in `GAS.upload_dataset` by adapting OpenAPI `multiCallback`&#x20;
* Speed up file uploads by sending file size to TensorBay&#x20;
* Speed up file uploads by enlarging the batch size of `multiCallback`&#x20;

Python SDK Documentation:

* Add the docs about `--edit` and `--close` option in CLI `gas draft`&#x20;
* Add the docs about CLI "Profile"&#x20;
* Refine the docs
* Fix the typo in docstrings&#x20;

Python SDK Deprecations:

* Remove the default value of the argument `title` in `VersionControlClient.create_draft`&#x20;
* Remove the deprecated message about setting AccessKey in `gas config`&#x20;

## 2021-07-16

Python SDK bug fixes:

* Fix CLI `gas log --oneline` that displays all commits in oneline&#x20;

Python SDK Documentation:

* Replace `-t` with `-m` in the docs of CLI `gas draft`&#x20;
* Add details about `strategy` in the docs of copy and move operations&#x20;
* Fix the `Synopsis` section display error in CLI `gas commit --help`&#x20;
* Use batch move in the example code of moving data instead of one by one&#x20;

## 2021-07-14

New Features:

* Diff to compare data of different versions, view the difference between draft and parent commit, or between commit and parent commit, and visualize the corresponding data and tag distribution.
* Add or edit multiple tags for each data version, making it easy and fast to retrieve and manage.

Enhanced Feature:

* Teragood supports modifying existing annotated data and performing quality assurance on the data.

Python SDK New Features:

* Add `Data.get_url` to get the `file://` url for a local file&#x20;
* Support more operations on draft:
  * Add `status` and `description` to the `Draft` class&#x20;
  * Add `VersionControlClient.update_draft` to update `title` and `description` of a draft&#x20;
  * Add `VersionControlClient.close_draft` to close a draft&#x20;
  * Support setting `description` in `VesionControlClient.create_draft`&#x20;
* Add `--message` option in CLI `gas draft` to set `title` and `description` of a draft&#x20;
* Add `SegmentClient.list_urls` and `FusionSegmentClient.list_urls` to list the file urls&#x20;
* Add the following open dataset loaders:
  * `UAVDT`&#x20;
  * `CACD`&#x20;
  * `AADB`&#x20;
  * `COVID_CT`&#x20;

Python SDK Bug fixes:

* Fix the `ImportError` when `import tensorbay` in python 3.6&#x20;

Python SDK Improvements:

* Add `shorten` function to get the short commit ID&#x20;
* Merge the `CLASSIFICATION` label into `BOX2D` label in the `CompCars` open dataset&#x20;
* Remove useless `DatasetClient.import_all_files` interface&#x20;
* Correct the illegal segment names in all the open dataset loaders&#x20;
* Move customized `click` classes from `cli/cli.py` to `cli/custom.py`&#x20;
* Stop showing the `description` in `Commit.__repr__`&#x20;
* Exclude useless `docs` and `tests` modules from the `tensorbay` package&#x20;

Python SDK Performance:

* Speed up file uploads in `GAS.upload_dataset` by adapting OpenAPI `multiCallback`&#x20;
* Enhance the performance of `RemoteData.open` by batch requesting file urls&#x20;

Python SDK Documentation:

* Add `Synopsis` section to CLI `--help` message&#x20;
* Refine the CLI docs&#x20;

Python SDK Deprecations:

* Deprecate the `--title` option in CLI `gas draft`&#x20;
* Remove the deprecated CLI `gas create` and `gas delete`&#x20;
* Remove the deprecated exception `CommitStatusError`&#x20;

## 2021-06-22

New Features:

* Version control of datasets based on branches.
* Manage and edit datasets collaboratively with draft.
* Add operation guide on the visualization widgets Pharos.
* Developers edition users can now manage members and share "Viewer" permission for private datasets.

Enhanced Features:

* Optimized the performance and operation of dataset version control.
* Optimized the interface and UI elements of the Dashboard User Guide.

## 2021-06-03

Python SDK Bug Fixes:

* Fix the `AttributeError` when using `DatasetBase.keys()` to list segment names

## 2021-05-31

New Feature:

* Pharos visualization widgets can display JSON text files.

Enhanced Feature:

* Optimized the multi-level data interface in the list mode of the label distribution visualization widgets, and now you can directly view the distribution of sub-level data in the overall data.

Python SDK New Features:

* Redesign and implement the `gas` CLI based on TensorBay version control :
  * Support `draft number` and `revision` in `TBRN`
  * Add `gas dataset` command to create, list and delete dataset&#x20;
  * Support `gas ls` command to list segments and data in specific draft or revision
  * Add `gas draft` command to create and list drafts
  * Add `gas commit` command to commit draft&#x20;
  * Add `gas cp` command to upload files to draft
  * Add `gas rm` command to remove segment and data in draft
* Add detailed resuming message when uploading process got interrupted&#x20;
* Add `ModuleImportError` to print detailed install instruction when the optional requirement package is not installed&#x20;
* Implement `DatasetBase.__delitem__` to support delete segment from dataset by `del`&#x20;
* Add open dataset loader `LISA Traffic Sign`&#x20;

Python SDK Bug fixes:

* Fix the `ValueError` when passing the last item to `UserSequence.index`&#x20;

Python SDK Improvements:

* Remove the redundant class variable `description` in `KeypointsInfo`&#x20;
* Implement python attr framework `AttrsMixin`&#x20;
* Move `TBRN` from `utility` module to `cli` module&#x20;
* Inherit `EqMixin` to replace `__eq__` in following intrinsic classes :
  * `CameraMatrix`
  * `DistortionCoefficients`
  * `CameraIntrinsics`

Python SDK Documentation:

* Refactor CLI related docs&#x20;
* Add `Integrations` chapter for `PyTorch` and `TensorFlow` integration&#x20;
* Refine the docs&#x20;
* Fix the typo in docs&#x20;

Python SDK Deprecations:

* Deprecate CLI `gas create` and `gas delete`&#x20;
* Deprecate legacy fusion dataset `TBRN`&#x20;
* Remove the following deprecated interfaces :
  * Following exceptions：
    * `GASDatasetError`
    * `GASDatasetTypeError`
    * `GASException`
    * `GASPathError`
    * `GASResponseError`
    * `GASSegmentError`
  * The `start` and `stop` keyword arguments in following methods:
    * `GAS.list_dataset_names`
    * `DatasetClientBase.list_drafts`
    * `DatasetClientBase.list_commits`
    * `DatasetClientBase.list_tags`
    * `DatasetClientBase.list_branches`
    * `DatasetClientBase.list_segment_names`
    * `SegmentClient.list_data_paths`
    * `SegmentClient.list_data`
    * `FusionSegmentClient.list_frames`
  * Following methods：
    * `DatasetClientBase.list_draft_titles_and_numbers`

## 2021-05-17

New Features:

* You can use developer tools to access the Pharos visualization widget to visualize local data. For details, please refer to the document.
* Launched the dataset discussion function. Discussions can be posted for all the open datasets with @ and Like functions being added. You can @ dataset publishers or other relevant users to invite them to join the discussion and give your Likes to excellent content.
* Released a new version of the dashboard and added the user guide to help users quickly understand the features of TensorBay and the way to access them.
* Actions: You can monitor changes in datasets by creating a workflow, and automatically trigger a pre-defined data processing program to quickly build an automated data processing procedure (in internal testing).

Enhanced Features:

* Optimized the UI design and interface of the label distribution visualization widgets.
* Optimized the interaction of the Pharos visualization widgets on the data filters page, and you can directly view the annotation types in the filters by default.

Python SDK New Features:

* The local visualization plugin `pharos` is released, it can be installed by `pip3 install pharos`:
  * Pypi: <https://pypi.org/project/pharos/>
  * Docs: <https://tensorbay-python-sdk.graviti.com/en/v1.4.1/features/visualization.html>

Python SDK Bug fixes:

* Fix the `JSONDecodeError` occurred when uploading dataset
* Fix the `AttributeError` when using `CADC` dataloader in python3.6
* Fix the `AttributeError` when resuming upload of fusion dataset

Python SDK Documentation:

* Add docs for local visualization plugin `pharos`&#x20;

## 2021-05-15

Python SDK New Features:

* Make `PagingList` mutable, and follow `MutableSequence` protocol&#x20;
* Support reading remote data lazily in `Dataset` and `Segment`:
  * Lazy evaluation in `Segment`&#x20;
  * Lazy evaluation in `Dataset`&#x20;
* Support getting segment by name in `DatasetBase.__getitem__`&#x20;
  * Use `segment = dataset["test"]` to get segment by name instead of `segment = dataset.get_segment_by_name("test")`.
  * Use `segment_names = dataset.keys()` to get all segment names in a dataset.
* Add the following methods to convert between `category` and `index` for writing training code easier&#x20;
  * `CategoriesMixin.get_category_to_index`
  * `CategoriesMixin.get_index_to_category`
* Add the following exceptions as subclasses of `ResponseError`
  * `AccessDeniedError`
  * `InvalidParamsError`
  * `NameConflictError`
  * `RequestParamsMissingError`
  * `ResourceNotExistError`
  * `ResponseSystemError`
  * `UnauthorizedError`
* Support `skip_uploaded_files` flag in `GAS.upload_dataset` for fusion dataset&#x20;
* Add open dataset loader `COVID-chestxray` and `nuScenes`

Python SDK Improvements:

* Refactor CLI related code to a new module&#x20;
* Stop checking the `commit_id` in `DatasetClientBase.__init__` to avoid sending a redundant request&#x20;
* Fix the possibly unbound variable warning in `CompCars`&#x20;

Python SDK Documentation:

* Add `Update Dataset`, `Update Label` and `Update Data` chapter&#x20;
* Add docs for specific response exceptions&#x20;
* Add `continuity` and `tracking` in glossary&#x20;
* Update docs for reading segments from lazy evaluation `Dataset` rather than `DatasetClient`&#x20;
* Refine the example in docs&#x20;

Python SDK Deprecations:

* Deprecate `DatasetBase.get_segment_by_name`&#x20;

## 2021-05-12

Python SDK Interface Adjustment:

* Rename the following exceptions
  * `TensorBayClientException` -> `ClientError`
  * `TensorBayOpendatasetException` -> `OpenDatasetError`

## 2021-05-06

New Features:

* Filter by task types on the open datasets list page, so that you can quickly find the required dataset.
* You can modify the dataset name, URL and alias.
* A guide to help new users fill in basic information.
* Dataset discussion tab. You can post discussions on datasets (in internal testing, and currently available for MINST, BDD100K, nuScenes, CityScapes, KITTI-Object, CIFAR-10, and COCO).&#x20;
* Fork records of the open datasets.

Enhanced Features:

* Optimized the UI design and interface of the data list page, and added filter logic for annotation information.
* Optimized the UI design and interface details of the visualization widgets.

Python SDK New Features:

* Implement `PagingList` to lazy access elements from paging requests, which follows `Sequence` protocol&#x20;
* Use `PagingList` as the return value instead of `iterator` for the following methods:
  * `GAS.list_dataaset_names`&#x20;
  * `DatasetClientBase.list_drafts`&#x20;
  * `DatasetClientBase.list_commits`&#x20;
  * `DatasetClientBase.list_tags`&#x20;
  * `DatasetClientBase.list_branches`&#x20;
  * `DatasetClientBase.list_segment_names`&#x20;
  * `SegmentClient.list_data_paths`&#x20;
  * `SegmentClient.list_data`&#x20;
  * `FusionSegmentClient.list_frames`&#x20;
* Support creating a dataset with auth cloud storage:
  * Add `GAS.get_auth_storage_config` and `GAS.list_auth_storage_configs`&#x20;
  * Add `GAS.create_auth_dataset`&#x20;
* Add `client.config` to adjust the request configuration&#x20;
  * Support adjusting the config of the request retry strategy: `config.timeout`, `config.max_retry` etc.
  * Support uploading/reading data from cloud server internal endpoint&#x20;
* Build TensorBay exception system:
  * Add `TensorBayException` as TensorBay base exception&#x20;
  * Add `NoFileError` and `FileStructureError` for `opendataset` module&#x20;
  * Add `CommitStatusError`, `ResponseError`, `DatasetTypeError` and `FrameError` for `client` module&#x20;
  * Add `TBRNError` for `CLI`&#x20;
* Add `bin_point_cloud_fields` to dataset `Notes` to support `.bin` format point cloud with different fields&#x20;
* Display the upload progress by process bar in `GAS.upload_dataset` and `(Fusion)DatasetClient.upload_segment`&#x20;
* Add open dataset loader `opendataset.HalpeFullBody` and `opendataset.BioIDFace`&#x20;

Python SDK Improvements:

* Update open dataset name according to TensorBay latest naming rule&#x20;
* Display `commit_id` in `Commit.__repr__`&#x20;
* Refine the error message of unexpected status code&#x20;
* Delete duplicated loads `lexicon` code on `SentenceSubcatalog`&#x20;

Python SDK Documentation:

* Add docs for "Cloud Storage"&#x20;
* Add docs for "Request Configuration"&#x20;
* Add docs for "Use Internal Endpoint"&#x20;
* Add docs for TensorBay exception system&#x20;
* Add docs for `bin_point_cloud_fields`&#x20;
* Add `tag` to `glossary` docs&#x20;
* Refine the docstring and docs&#x20;
* Fix typos in docstring and docs

Python SDK Deprecations:

* Deprecate the `start` and `stop` arguments for methods using `PagingList` as a return value&#x20;
* Deprecate the following legacy exceptions in `client` module :
  * `GASDataTypeError`
  * `GASLabelsetError`
  * `GASLabelsetTypeError`
  * `GASFrameError`
  * `GASResponseError`

## 2021-04-21

Python SDK Bug Fixes:

* Fix `UnboundLocalError` when calling `DatasetClientBase.create_tag` with `revision`
* Fix `KeyError` when getting a `FusionSegment` instance&#x20;

## 2021-04-19

New Features:

* You can view multiple annotation types simultaneously with the visualization widgets.
* You can apply for or share the dataset permissions. The dataset Admin can give users the corresponding permissions of the dataset.
* Dataset permissions and team management log.
* Automatically generate PythonSDK code and display API on the dataset details page.

Enhanced Feature:

* Optimized the UI design of the product pricing page.

Python SDK New Features:

* Add basic methods for dataset Version Control&#x20;
  * Add `DatasetClientBase.create_tag`&#x20;
  * Add `DatasetClientBase.list_tags`
  * Add `DatasetClientBase.get_tag`&#x20;
  * Add `DatasetClientBase.delete_tag`&#x20;
  * Add `DatasetClientBase.list_branches`&#x20;
  * Add `DatasetClientBase.list_commits`
  * Add `DatasetClientBase.get_draft`&#x20;
* Support dataset with continuous data&#x20;
  * Add `Notes` to store dataset basic information&#x20;
  * Add `DatasetClientBase.update_notes`&#x20;
  * Add `DatasetClientBase.get_notes`&#x20;
* Support "Fusion Dataset"&#x20;
* Make request session safe in multiprocesses environment&#x20;
* Add SDK version info to "Event Tracking" and support "Event Tracking" for CLI&#x20;
* Add loader for CADC opendataset&#x20;
* Add method `create_segment()` for dataset client&#x20;
* Add `__eq__` for `Label`&#x20;

Python SDK Improvements:

* Modify Tensorbay gateway to "gatewayv2"&#x20;
* Refine the NotImplemented logic in binary operators&#x20;
* Check whether the url starts with "https\://" in `Client`&#x20;
* Implement decorator `Deprecated` for deprecated functions&#x20;

Python SDK Packaging:

* Add minimum versions for dependencies&#x20;

Python SDK Documentation:

* Add docs for dataset Version Control&#x20;
* Add docs for "Fusion Dataset"&#x20;
* Add docs for dataset with continuous data and `Notes`&#x20;
* Update urls in docs&#x20;
* Refine the docstring and docs&#x20;
* Fix typos in docs&#x20;
* Add examples to docstring&#x20;

Deprecations:

* Deprecate `DatasetClientBase.list_draft_titles_and_numbers`, use `DatasetClientBase.list_draft` instead&#x20;

## 2021-03-25

Python SDK New Features

* Support uploading data to Azure&#x20;

Python SDK Fix Bugs

* Correct dataset names in data loaders according to Graviti Open Dataset&#x20;

Python SDK Documentation

* Fix typos in docs&#x20;
* Remove the `url` related content in the doc of CLI&#x20;
* Refine the content of docs and docstring
* update the URLs in docs and "README.md"
* Fix typos in docs&#x20;

## 2021-03-24

New Features:

* Visibility Settings. You can set the visibility of a dataset as public or private.
* Team Collaboration. You can create teams and invite members to their teams.
* Individual & Team Profiles&#x20;
* Data visualization is available after data list filtering.

Enhanced Features:

* Upgraded UI design  .
* Optimized the process of creating new datasets and unified the interface of creating datasets (filter, merge, fork, etc.).

2021-02-19

New Feature:

* 2D Keypoints type for data visualization widgets.

2021-02-01

New Features:

* Sensor display for data visualization. The corresponding sensor name can be clearly viewed when displaying multi-sensor data.
* Light-color mode for data visualization. Users can switch between Light and Dark Mode.

Enhanced Features:

* Optimized the UI, interaction and loading speed of data visualization.
* Optimized the UI and interaction of the distribution visualization.

2021-01-25

New Features:

* Users can select the region where the Bucket is stored when uploading data on TensorBay.
* Version Control for TensorBay cloud authenticated data and AWS authentication.
* You can merge the annotations of the same type and the same label table.
* "Closed" status in Feedback.

Enhanced Feature:

* Optimized the display of text and images in the Feedback.

2021-01-05

New Features:

* Users can merge data from different datasets on TensorBay.
* Version Control for datasets after the annotations are synced.
* Designated reply in the Feedback Module enables users to reply to a specific message.
* "Disable Reminders" of the reply pop-up window in the Feedback Module.

Enhanced Features:

* Optimized the display of the Feedback Module on the mobile side.
* Optimized the statistical mode of the attribute data of the label distribution visualization widgets.

2020-12-21

New Features:

* Graviti Open API, please refer to Graviti Open API for details.
* Full-screen function for visualizing label distribution.

Enhanced Features:

* Optimized the UI design of the label distribution visualization widgets.
* Optimized the user experience of adding feedback.

2020-12-02

New Features:

* Users can create a new dataset by filtering data.
* Dataset types and custom labels are available when creating a new dataset.
* Audio data visualization is available for MP3 and WAV files. Added two annotation types: transcription and classification.
* Text data visualization is available for txt files and their annotation classification.
* You can visualize attribute statistics of data annotation.

Enhanced Features:

* Optimized the logic of deleting data.
* Removed the corresponding annotations when a file is deleted.
* Raw data that has already been cited will not be deleted.
* Versions can be deleted.

2020-11-18

New Features:

* Access TensorBay via cloud storage authentication.
* Graviti Developer Tools menu and documentation are added to introduce the use of SDK and other tools.
* Code samples for the use of API.
* Feedback board allows you to post feedback and suggestions, communicate in real time, and send messages through WeChat official accounts.
* Pie chart mode to visualize data distribution.

Enhanced Features:

* Optimized the Help Doc and highlighted the developer documentation.
* Optimized the UI design and interface of the official website.

2020-11-09

New Features:

* Version Control for Datasets & Annotation sets. Raw data and annotations are included when the dataset version is released.
* Open datasets can be forked and accessed on GAS where users can release versions, upload data and perform other operations.
* Project 3D point cloud annotation info onto the corresponding 2D image, visualize Gzip compressed point cloud and select the annotation box of 3D view to automatically turn the view angle.
* View sub-category with the data distribution visualization widgets.
* The order management system where you can purchase team seats and expand TensorBay capacity.

Enhanced Feature:

* Optimized account types to "Developers" and "Teams". Visit the link for details.

2020-10-19

New Features:

* On TensorBay My Datasets, users can manage raw data versioning, create new versions, and continue to edit and modify the data of the dataset after creating a version.
* The file list on the left side of the visualization widgets helps users quickly locate and switch the displayed files.
* 2D Classification, 3D type, Tracking type data and its annotations.
* You can view multiple annotations in the open datasets with the visualization widgets.

Enhanced Features:

* Optimized the return function of visualization widgets when sharing to off-site.
* Optimized the release page UI of GroundTruth My Annotation Order.

2020-09-14

New Features:

* You can filter data with segments and view data list on My Datasets.
* You can view the annotation details of open datasets, filter list and label, and visualize annotations and label distribution.
* You can now download final performance review on GroundTruth.
* You can download the JSON file of the project output in advance during the final review or approval phase on GroundTruth.

2020-08-24

New Features:

* Access to open datasets. On the GAS platform, users can acquire open datasets to view, download and visualize.
* Data visualization widgets: 2D rectangular boxes, 2D polygons, and 2D classification. The widgets can check the annotation quality and can be shared off-site.
* Data distribution visualization widgets. Users can view the label distribution of a dataset.

2020-07-21

New Features:

* AccessKey: When using PythonSDK, users need to obtain their AccessKey for identity and permission authentication.
* PythonSDK: Users can upload datasets to GAS through PythonSDK.
* Label filtering for annotation sets. You can filter an annotation set by labels on the annotation details page.
* Users can download the JSON files of a single project in the approval records.

2020-07-06

New Features:

* Help Center: a detailed introduction to GAS features.
* Enterprise users can post data requests on TensorBay to obtain or provide data.

Enhanced Features:

* Optimized the UI and interaction of the platform.
* Optimized the layout of the home page and the left navigation bar, highlighting TensorBay and GroundTruth.
* Renamed the "Developers Edition" of GAS platform to "Team Edition", with no change in functions.

2020-06-17

New Features:

* Message notification type.
* Individual users invited to My Annotation project will receive an invitation message. After processing, the user will be notified with an accepted/rejected reply.
* Enterprise users invited to join the team will receive an invitation message. After processing, the user will be notified with an accepted/rejected reply.

Enhanced Feature:

* Optimized the interaction of label selection, added English name content, and allowed users to customize label colors.

2020-05-28

New Features:

* Switch platform language between Chinese & English.
* The annotation committee establishes the standards for each annotation, determines annotation quality, ensures quality control, and reviews the annotations.
* Three types of WeChat official account notification  s.
* When all my annotation tasks are completed, the project creator will receive a push notification.
* When annotation orders are awaiting confirmation, the project creator will receive a push notification.
* When annotation orders are awaiting approval, the project creator will receive a push notification.
* Annotation completion report. You can download the report from the order details page after the order is completed. The report includes the total number of labels, accuracy rate, approval records, capacity report, etc.
* You can upload datasets in local zip file and the file will be automatically decompressed and saved after uploading to GAS.

2020-05-13

New Features:

* Instructions on role-based access control for Enterprise users.
* Enterprise users can invite members to join the enterprise on the enterprise member management page.
* Enterprise Admin can manage and modify the roles of the members on the enterprise member management page.
* Notification Center. The platform pushes messages such as member invitations, permission applications and project progress reminders.
* Sandbox model training (in internal testing). Please refer to the sandbox training section for details.

Enhanced Features:

* Optimized the dataset viewing. After clicking View Data on the data platform, users will be automatically directed to the annotation platform to view the data.
* Optimized the dataset selection interface when creating a new project, and sorted the dataset list by creation time.

2020-04-20

New Feature:

* Distinguish between Individual and Enterprise users on the home page.

Enhanced Feature:

* Optimized the order performance data processing algorithm. Now the number of boxes is used as the statistical unit.

2020-04-16

New Features:

* Users can modify their names in the personal center.
* Note for non-Chrome users to use Chrome to improve user experience.

Enhanced Feature:

* Optimized the UI of the sign-in interface.

2020-04-06

New Feature:

* View sample annotations: click view sample annotations when the order is confirmed.

Enhanced Feature:

* Optimized the guidance for enterprise user authentication to facilitate mailbox authentication.

2020-03-30

Enhanced Feature:

* Optimized the copywriting of SMS verification code.

2020-03-13

New Features:

* User self-registration. Users can register their own accounts on the Graviti official website as an Developers edition user. For enterprise edition users, please contact Graviti customer service for registration.
* User authentication. Developers edition users can complete email authentication in the personal center. After authentication, they can become authenticated users and enjoy the rights of authenticated users.
* My Annotation. You can create annotation projects and invite up to four members to join.
* Enterprise member role management. Enterprise Admin can manage the roles of enterprise members on the enterprise member management page.

Enhanced Feature:

* Optimized the order release process. Users can now directly select datasets to release orders.

2020-02-29

New Features:

* Order progress, capacity, and total amount.
* Rejected records. Users can view the records of accepted or rejected projects.
* Demand analysis feedback records. Users can view all the demand analysis feedback of the orders and view the sample annotations.
* The annotation service process is introduced when creating an order.

Enhanced Features:

* Optimized the description of the order status.
* Original order status: order in parsing, pending confirmation, customer feedback, order in progress, completed order.
* New order status: parsing, annotating and completed.
* Parsing refers to the orders that need the parsing confirmation. For the orders to be confirmed, the label "awaiting confirmation" is displayed in the upper right corner of the order.
* Annotating refers to the confirmed orders that have not been fully approved. For the orders to be approved, the label "awaiting approval" is displayed in the upper right corner of the order. Annotation progress calculation: approved data volume/total data volume.
* Completed refers to the orders that have completed all the processes and acquired approval.

2020-02-18

New Feature:

* Approval records. Users can view the approval records.

2020-01-14

New Features:

* Notification for binding the WeChat official account. When users follow the Graviti official account and bind it with their GAS accounts, they can receive reminder messages of the project progress.

Enhanced Features:

* Optimized the export format of annotations, converted the relative coordinates of 3D annotations to absolute coordinates, and unified the output format of annotations.

2020-01-06

New Features:

* Orders on the annotation platform are directly linked to datasets on the data platform, and users can directly select the datasets when placing orders.

Enhanced Features:

* Optimized item numbering from the original 32-digit code to a shorter and easier-to-use code.
* Optimized the display of project performance: separately display the annotation progress and the quality inspection progress to avoid confusion.
* Optimized the display of annotation type: the original icon is replaced by text.

2019-12-23

Enhanced Features:

* Optimized the UI of the sign-in interface.
* Optimized the order of the project list: sorting by creation time instead of project number.


