
# 创建Workflow数据集节点
#### 功能介绍
通过对ModelArts数据集能力进行封装，实现新版数据集的创建功能。主要用于通过创建数据集对已有数据（已标注/未标注）进行统一管理的场景，后续常见数据集导入节点或者数据集标注节点。
#### 属性总览
您可以使用**CreateDatasetStep** 来构建数据集创建节点，**CreateDatasetStep**及相关对象结构如下。
表1**CreateDatasetStep** 
| 属性           | 描述                                                                                         | 是否必填 | 数据类型                                        |
|:---|:---|:---|:---|
| name         | 数据集创建节点的名称，命名规范(只能包含英文字母、数字、下划线（_）、中划线（-），并且只能以英文字母开头，长度限制为64字符)，一个Workflow里的两个step名称不能重复。 | 是    | str                                         |
| inputs       | 数据集创建节点的输入列表。                                                                              | 是    | CreateDatasetInput或者CreateDatasetInput的列表   |
| outputs      | 数据集创建节点的输出列表。                                                                              | 是    | CreateDatasetOutput或者CreateDatasetOutput的列表 |
| properties   | 数据集创建相关的配置信息。                                                                              | 是    | DatasetProperties                           |
| title        | title信息，主要用于前端的名称展示。                                                                       | 否    | str                                         |
| description  | 数据集创建节点的描述信息。                                                                              | 否    | str                                         |
| policy       | 节点执行的policy。                                                                               | 否    | StepPolicy                                  |
| depend_steps | 依赖的节点列表。                                                                                   | 否    | Step或者Step的列表                               |
   
表2**CreateDatasetInput** 
| 属性   | 描述                                                                                   | 是否必填 | 数据类型                                                                       |
|:---|:---|:---|:---|
| name | 数据集创建节点的输入名称，命名规范(只能包含英文字母、数字、下划线（_）、中划线（-），并且只能以英文字母开头，长度限制为64字符)。同一个Step的输入名称不能重复。 | 是    | str                                                                        |
| data | 数据集创建节点的输入数据对象。                                                                      | 是    | OBS相关对象，当前仅支持OBSPath、OBSConsumption、OBSPlaceholder、DataConsumptionSelector |
   
表3**CreateDatasetOutput** 
| 属性     | 描述                                                                                   | 是否必填 | 数据类型                 |
|:---|:---|:---|:---|
| name   | 数据集创建节点的输出名称，命名规范(只能包含英文字母、数字、下划线（_）、中划线（-），并且只能以英文字母开头，长度限制为64字符)。同一个Step的输出名称不能重复。 | 是    | str                  |
| config | 数据集创建节点的输出相关配置。                                                                      | 是    | 当前仅支持OBSOutputConfig |
   
表4**DatasetProperties** 
| 属性             | 描述                                                | 是否必填 | 数据类型                                                      |
|:---|:---|:---|:---|
| dataset_name   | 数据集的名称，只能是中文、字母、数字、下划线或中划线组成的合法字符串，长度为1-100位。     | 是    | str、Placeholder                                           |
| dataset_format | 数据集格式，默认为0，表示文件类型。                                | 否    | 0：文件类型 1：表格类型 |
| data_type      | 数据类型，默认为FREE_FORMAT。                              | 否    | DataTypeEnum                                              |
| description    | 描述信息。                                             | 否    | str                                                       |
| import_data    | 是否要导入数据，当前只支持表格数据，默认为False。                       | 否    | bool                                                      |
| work_path_type | 数据集输出路径类型，当前仅支持OBS，默认为0。                          | 否    | int                                                       |
| import_config  | 标签导入的相关配置，默认为None，当基于已标注的数据创建数据集时，可指定该字段导入相关标注信息。 | 否    | ImportConfig                                              |
   
表5**Importconfig** 
| 属性                       | 描述                                                                                                                                                                                                                                                                                                                                                                                      | 是否必填 | 数据类型                              |
|:---|:---|:---|:---|
| import_annotations       | 是否自动导入输入目录下的标注信息，支持检测/图像分类/文本分类。可选值如下： - true：导入输入目录下的标注信息（默认值）  - false：不导入输入目录下的标注信息   | 否    | str、Placeholder                   |
| import_type              | 导入方式。可选值如下： - dir：目录导入  - manifest：按manifest文件导入                                            | 否    | 0：文件类型ImportTypeEnum              |
| annotation_format_config | 导入的标注格式的配置参数。                                                                                                                                                                                                                                                                                                                                                                           | 否    | DAnnotationFormaTypeEtConumfig的列表 |
   
表6**AnnotationFormatConfig** 
| 属性          | 描述         | 是否必填 | 数据类型                 |
|:---|:---|:---|:---|
| format_name | 标注格式的名称。   | 否    | AnnotationFormatEnum |
| scene       | 标注场景，可选参数。 | 否    | LabelTaskTypeEnum    |
   
| 枚举类型                 | 枚举值                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
|:---|:---|
| ImportTypeEnum       | DIR MANIFEST                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| DataTypeEnum         | IMAGE TEXT AUDIO TABULAR VIDEO FREE_FORMAT                                                                                                                                                                                                                                   |
| AnnotationFormatEnum | MA_IMAGE_CLASSIFICATION_V1 MA_IMAGENET_V1 MA_PASCAL_VOC_V1 YOLO MA_IMAGE_SEGMENTATION_V1 MA_TEXT_CLASSIFICATION_COMBINE_V1 MA_TEXT_CLASSIFICATION_V1 MA_AUDIO_CLASSIFICATION_DIR_V1 |
   
#### 使用案例
主要包含两种场景的用例。
- 基于未标注数据创建数据集
- 基于已标注的数据创建数据集，并自动导入标注信息
基于未标注数据创建数据集
数据准备：存储在OBS文件夹中的未标注的数据。
```
from modelarts import workflow as wf
# 通过CreateDatasetStep将存储在OBS中的数据创建成一个新版数据集
# 定义数据集输出路径参数
dataset_output_path = wf.Placeholder(name="dataset_output_path", placeholder_type=wf.PlaceholderType.STR, placeholder_format="obs")
# 定义数据集名称参数
dataset_name = wf.Placeholder(name="dataset_name", placeholder_type=wf.PlaceholderType.STR)
create_dataset = wf.steps.CreateDatasetStep(
    name="create_dataset",# 数据集创建节点的名称，命名规范(只能包含英文字母、数字、下划线（_）、中划线（-），并且只能以英文字母开头，长度限制为64字符)，一个Workflow里的两个step名称不能重复
    title="数据集创建", # 标题信息，不填默认使用name值
    inputs=wf.steps.CreateDatasetInput(name="input_name", data=wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory")),# CreateDatasetStep的输入，数据在运行时配置；data字段也可使用wf.data.OBSPath(obs_path="fake_obs_path")对象表示
    outputs=wf.steps.CreateDatasetOutput(name="output_name", config=wf.data.OBSOutputConfig(obs_path=dataset_output_path)),# CreateDatasetStep的输出
    properties=wf.steps.DatasetProperties(
        dataset_name=dataset_name, # 该名称对应的数据集如果不存在，则创建新的数据集;如果已存在，则直接使用该名称对应的数据集
        data_type=wf.data.DataTypeEnum.IMAGE, # 数据集对应的数据类型, 示例为图像
    )
)
# 注意dataset_name这个参数配置的数据集名称需要用户自行确认在该账号下未被他人使用，否则会导致期望的数据集未被创建，而后续节点错误使用了他人创建的数据集
workflow = wf.Workflow(
    name="create-dataset-demo",
    desc="this is a demo workflow",
    steps=[create_dataset]
)
```
基于已标注数据创建数据集，并导入标注信息
数据准备：存储在OBS文件夹中的已标注数据。
OBS目录导入已标注数据的规范：可参见[从OBS目录导入数据规范说明](https://support.huaweicloud.com/usermanual-standard-modelarts/dataprepare-modelarts-0013.html)。
```
from modelarts import workflow as wf
# 通过CreateDatasetStep将存储在OBS中的数据创建成一个新版数据集
# 定义数据集输出路径参数
dataset_output_path = wf.Placeholder(name="dataset_placeholder_name", placeholder_type=wf.PlaceholderType.STR, placeholder_format="obs")
# 定义数据集名称参数
dataset_name = wf.Placeholder(name="dataset_placeholder_name", placeholder_type=wf.PlaceholderType.STR)
create_dataset = wf.steps.CreateDatasetStep(
    name="create_dataset",# 数据集创建节点的名称，命名规范(只能包含英文字母、数字、下划线（_）、中划线（-），并且只能以英文字母开头，长度限制为64字符)，一个Workflow里的两个step名称不能重复
    title="数据集创建", # 标题信息，不填默认使用name值
    inputs=wf.steps.CreateDatasetInput(name="input_name", data=wf.data.OBSPlaceholder(name="obs_placeholder_name", object_type="directory")),# CreateDatasetStep的输入，数据在运行时配置；data字段也可使用wf.data.OBSPath(obs_path="fake_obs_path")对象表示
    outputs=wf.steps.CreateDatasetOutput(name="output_name", config=wf.data.OBSOutputConfig(obs_path=dataset_output_path)),# CreateDatasetStep的输出
    properties=wf.steps.DatasetProperties(
        dataset_name=dataset_name, # 该名称对应的数据集如果不存在，则创建新的数据集;如果已存在，则直接使用该名称对应的数据集
        data_type=wf.data.DataTypeEnum.IMAGE, # 数据集对应的数据类型, 示例为图像
        import_config=wf.steps.ImportConfig(
            annotation_format_config=[
                wf.steps.AnnotationFormatConfig(
                    format_name=wf.steps.AnnotationFormatEnum.MA_IMAGE_CLASSIFICATION_V1, # 已标注数据的标注格式
                    scene=wf.data.LabelTaskTypeEnum.IMAGE_CLASSIFICATION) # 标注的场景类型
            ]
        )
    )
)
# 注意dataset_name这个参数配置的数据集名称需要用户自行确认在该账号下未被他人使用，否则会导致期望的数据集未被创建，而后续节点错误使用了他人创建的数据集
workflow = wf.Workflow(
    name="create-dataset-demo",
    desc="this is a demo workflow",
    steps=[create_dataset]
)
```
