데이터 세트 만들기

데이터세트는 수동 라벨러가 라벨을 지정할 데이터 항목 모음입니다. 여기에는 분류하거나 분석할 대표 샘플이 포함됩니다. 라벨이 지정된 데이터 세트는 커스텀 모델을 학습시키는 데 사용될 수 있습니다.

데이터 세트 빌드의 주요 단계는 다음과 같습니다.

  1. Cloud Storage 버킷에 데이터 항목을 업로드합니다.
  2. 데이터 항목의 목록을 만드는 쉼표로 구분된 값(CSV) 파일을 만들고 동일한 Cloud Storage 버킷에 업로드합니다.
  3. 데이터 세트 리소스 만들기
  4. 데이터 세트 리소스로 데이터 항목을 가져옵니다.

프로젝트에는 서로 다른 AI Platform 데이터 라벨링 서비스 요청에 사용하는 여러 데이터 세트가 있어도 됩니다. 사용 가능한 데이터 세트 목록을 가져오거나 필요 없는 데이터 세트를 삭제할 수 있습니다. 자세한 내용은 데이터 세트 리소스 페이지에서 확인하세요.

라벨 없는 데이터 스테이징

데이터 세트를 만드는 첫 번째 단계는 라벨 지정을 위해 Cloud Storage 버킷에 데이터 항목을 업로드하는 것입니다. 버킷 만들기에 대한 자세한 내용은 시작하기 전에를 참조하세요.

데이터 라벨링 서비스는 세 가지 데이터 유형의 라벨 지정을 지원합니다. 아래 섹션을 펼치면 각 유형에 적합한 데이터 항목을 제공하는 방법에 대한 자세한 내용을 확인할 수 있습니다. 현재 영어로 된 데이터 세트만 라벨 지정이 지원됩니다.

이미지

이미지에 지원되는 파일 유형을 사용해야 합니다.

  • JPEG
  • PNG

이미지 세분화를 제외한 모든 이미지 라벨 지정 케이스의 최대 파일 크기는 30MB입니다. 이미지 세분화 라벨 지정의 최대 파일 크기는 10MB입니다.

이미지의 최대 크기는 1920X1080입니다.

학습 데이터는 예측을 수행할 데이터와 최대한 유사해야 합니다. 예를 들어 사용 사례에 보안 카메라 영상처럼 흐릿한 저해상도 이미지가 포함된다면 학습 데이터도 흐릿한 저해상도 이미지로 구성해야 합니다. 또한 일반적으로 다양한 각도, 해상도, 배경으로 촬영한 학습 이미지를 제공하는 것이 좋습니다.

가장 흔한 라벨의 이미지가 가장 흔하지 않은 라벨의 이미지보다 최대 100배 많을 때 모델 학습 효과가 가장 뛰어납니다. 빈도가 극히 낮은 라벨은 삭제하는 것이 좋습니다.

동영상

동영상은 H.264, H.265, MPEG4 코덱이 포함된 MP4 형식이어야 합니다. 최대 동영상 크기는 2GB입니다.

학습 데이터는 예측을 수행할 데이터와 최대한 유사해야 합니다. 예를 들어 사용 사례에 보안 카메라 영상처럼 흐릿한 저해상도 동영상이 포함된다면 학습 데이터도 흐릿한 저해상도 동영상으로 구성해야 합니다. 또한 일반적으로 다양한 각도, 해상도, 배경으로 촬영한 학습 동영상을 제공하는 것이 좋습니다.

권장되는 학습 동영상 개수는 라벨당 약 1,000개입니다. 라벨당 최소 개수는 10개, 고급 모델은 50개입니다. 동영상 하나에 라벨이 여러 개인 모델을 학습시키는 경우 일반적으로 라벨당 필요한 예의 수가 늘어나며, 결과 점수를 해석하기도 어려워집니다.

가장 흔한 라벨의 동영상이 가장 흔하지 않은 라벨의 동영상보다 최대 100배 많을 때 모델의 성능이 가장 좋습니다. 빈도가 극히 낮은 라벨은 삭제하는 것이 좋습니다.

텍스트

텍스트 파일은 UTF-8 텍스트 파일 인코딩 형식을 사용해야 합니다.

각 문서는 별도의 텍스트 파일이어야 합니다. 하나의 텍스트 파일로 여러 문서를 제공할 수 없습니다. 예를 들어 텍스트 파일의 각 행을 자체 문서로 취급할 수 없습니다.

텍스트 파일당 최대 문자 수는 100,000자입니다.

학습 데이터를 예측을 수행할 데이터만큼 다양하게 만들어 주세요. 데이터 세트는 다양한 길이의 문서, 다양한 사람이 작성한 문서, 문구나 스타일이 다른 문서를 포함해야 합니다.

라벨당 최소 1,000개의 학습 문서를 제공하세요. 라벨당 최소 문서 수는 10개입니다. 그러나 라벨당 예제를 더 많이 사용하면 모델에서 신뢰도 점수를 올릴 수 있습니다. 높은 신뢰도 점수는 특히 모델이 문서를 분류할 여러 개의 라벨을 반환할 때 유용합니다.

가장 일반적인 라벨의 문서가 가장 일반적이지 않은 라벨의 문서보다 최대 100배 더 많을 때 모델의 성능이 가장 좋습니다. 빈도가 극히 낮은 라벨은 삭제하는 것이 좋습니다.

입력 CSV 파일 만들기

샘플 데이터 항목은 물론, 모든 데이터를 분류하는 쉼표로 구분된 값(CSV) 파일도 만들어야 합니다. CSV 파일의 이름에는 제한이 없지만 파일은 UTF-8로 인코딩되어야 하고 .csv 확장자로 끝나야 합니다.

이미지 및 동영상 데이터의 경우 CSV 파일의 각 행은 1개의 이미지 또는 동영상의 위치(프로젝트의 Google Cloud Storage 버킷 내)입니다. 예를 들면 다음과 같습니다.

gs://my_project_bucket/image1.png
gs://my_project_bucket/image2.png
gs://my_project_bucket/image3.png
gs://my_project_bucket/image4.png

텍스트 데이터의 경우 CSV 파일의 각 행은 텍스트 파일의 저장 위치입니다. 예를 들면 다음과 같습니다.

gs://my_project_bucket/file1.txt
gs://my_project_bucket/file2.txt
gs://my_project_bucket/file3.txt
gs://my_project_bucket/file4.txt

각 데이터 파일에는 라벨을 지정할 데이터가 포함되어 있어야 합니다. 각 데이터 파일의 내용은 라벨러에게 하나의 라벨링 질문으로 표시됩니다.

데이터 항목을 분류하는 CSV 파일을 만든 후 데이터 항목과 동일한 Cloud Storage 버킷에 업로드합니다.

데이터 세트 리소스 만들기

다음 단계는 데이터 항목을 최종적으로 보유할 데이터 세트 리소스를 만드는 것입니다. 새로 만든 데이터 세트는 다음 단계에서 데이터 항목을 가져올 때까지는 비어있는 상태입니다.

웹 UI

데이터 라벨링 서비스 UI에서 데이터 세트를 만들고 동일한 페이지에서 해당 데이터 세트로 항목을 가져옵니다.

  1. 데이터 라벨링 서비스 UI를 엽니다.

    데이터 세트 페이지에는 현재 프로젝트에 사용할 수 있는 이전에 작성한 데이터 세트의 상태가 표시됩니다.

    다른 프로젝트에 데이터 세트를 추가하려면 제목 표시줄의 오른쪽 위에 있는 드롭다운 목록에서 프로젝트를 선택하세요.

  2. 제목 표시줄에서 만들기 버튼을 클릭합니다.

  3. 데이터 세트 추가 페이지에서 데이터 세트의 이름과 설명을 입력합니다.

  4. 데이터 세트 유형 드롭다운 목록에서 이 데이터 세트에 업로드하려는 데이터 항목 유형(이미지, 동영상, 텍스트)을 선택합니다.

  5. CSV 파일 위치 상자에 입력 CSV 파일의 전체 경로를 입력합니다.

    CSV 파일은 나열하는 데이터 항목과 같은 Google Cloud Storage 버킷에 있어야 합니다.

  6. 만들기를 클릭합니다.

    데이터 세트 페이지로 돌아가게 되며, 문서를 가져오는 동안에는 데이터 세트가 '진행 중' 상태로 표시됩니다. 이 프로세스는 항목 1,000개당 약 10분이 소요되지만 처리 시간이 더 짧거나 길 수도 있습니다.

    서비스에서 405 오류를 반환하는 경우 한꺼번에 업로드하는 문서 수를 줄여보세요. 페이지를 새로고침한 후 다시 시도해야 합니다.

명령줄

다음 예시에서는 이름이 test_dataset인 데이터 세트를 만듭니다. 새로 만든 데이터 세트에는 새 항목을 가져올 때까지는 어떤 데이터도 포함되지 않습니다.

데이터 세트로 항목 가져오기 같은 다른 작업에 사용할 수 있도록 응답에서 새 데이터 세트의 "name"을 저장합니다.

curl -X POST \
   -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
   -H "Content-Type: application/json" \
   https://datalabeling.googleapis.com/v1beta1/projects/${PROJECT_ID}/datasets \
   -d '{
     "dataset": {
     "displayName": "test_dataset",
     "description": "dataset for curl commands testing",
     },
   }'

다음과 비슷한 출력이 표시됩니다.

{
  "name": "projects/data-labeling-codelab/datasets/5c897e1e_0000_2ab5_9159_94eb2c0b4daa",
  "displayName": "test_dataset",
  "description": "dataset for curl commands testing",
  "createTime": "2019-03-14T03:11:50.926475415Z"
}

Python

이 코드 예시를 실행하려면 우선 Python 클라이언트 라이브러리를 설치해야 합니다.

def create_dataset(project_id):
    """Creates a dataset for the given Google Cloud project."""
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    formatted_project_name = f"projects/{project_id}"

    dataset = datalabeling.Dataset(
        display_name="YOUR_DATASET_SET_DISPLAY_NAME", description="YOUR_DESCRIPTION"
    )

    response = client.create_dataset(
        request={"parent": formatted_project_name, "dataset": dataset}
    )

    # The format of resource name:
    # project_id/{project_id}/datasets/{dataset_id}
    print(f"The dataset resource name: {response.name}")
    print(f"Display name: {response.display_name}")
    print(f"Description: {response.description}")
    print("Create time:")
    print(f"\tseconds: {response.create_time.timestamp_pb().seconds}")
    print(f"\tnanos: {response.create_time.timestamp_pb().nanos}\n")

    return response

Java

이 코드 예시를 실행하려면 우선 자바 클라이언트 라이브러리를 설치해야 합니다.
import com.google.cloud.datalabeling.v1beta1.CreateDatasetRequest;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceSettings;
import com.google.cloud.datalabeling.v1beta1.Dataset;
import com.google.cloud.datalabeling.v1beta1.ProjectName;
import java.io.IOException;

class CreateDataset {

  // Create a dataset that is initially empty.
  static void createDataset(String projectId, String datasetName) throws IOException {
    // String projectId = "YOUR_PROJECT_ID";
    // String datasetName = "YOUR_DATASET_DISPLAY_NAME";


    DataLabelingServiceSettings settings =
        DataLabelingServiceSettings.newBuilder()
            .build();
    try (DataLabelingServiceClient dataLabelingServiceClient =
        DataLabelingServiceClient.create(settings)) {
      ProjectName projectName = ProjectName.of(projectId);

      Dataset dataset =
          Dataset.newBuilder()
              .setDisplayName(datasetName)
              .setDescription("YOUR_DESCRIPTION")
              .build();

      CreateDatasetRequest createDatasetRequest =
          CreateDatasetRequest.newBuilder()
              .setParent(projectName.toString())
              .setDataset(dataset)
              .build();

      Dataset createdDataset = dataLabelingServiceClient.createDataset(createDatasetRequest);

      System.out.format("Name: %s\n", createdDataset.getName());
      System.out.format("DisplayName: %s\n", createdDataset.getDisplayName());
      System.out.format("Description: %s\n", createdDataset.getDescription());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

데이터세트로 데이터 항목 가져오기

데이터 세트를 만들었다면 CSV 파일을 이용해 데이터 항목을 데이터 세트로 가져올 수 있습니다.

웹 UI

이전 단계에서 가져오기가 이미 완료되었으므로 데이터 라벨링 서비스 UI에서 이 단계를 건너뛸 수 있습니다.

명령줄

  • DATASET_ID를 데이터 세트를 만들 때 작성한 응답의 데이터 세트 ID로 바꿉니다. ID는 데이터 세트 전체 이름 끝에 표시됩니다. projects/{project-id}/locations/us-central1/datasets/{dataset-id}

  • CSV_FILE을 입력 CSV 파일의 전체 경로로 바꿉니다.

    curl -X POST \
       -H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
       -H "Content-Type: application/json" \
       https://datalabeling.googleapis.com/v1beta1/projects/${PROJECT_ID}/datasets/${DATASET_ID}:importData \
       -d '{
         "inputConfig": {
           "dataType": "IMAGE",
           "gcsSource": {
              "inputUri": "${CSV_FILE}",
              "mimeType": "text/csv",
            }
           },
       }'

    다음과 비슷한 출력이 표시됩니다. 작업 ID를 사용하여 작업 상태를 가져올 수 있습니다. 예시는 작업 상태 가져오기를 참조하세요.

    {
      "name": "projects/data-labeling-codelab/operations/5c73dd6b_0000_2b34_a920_883d24fa2064",
      "metadata": {
        "@type": "type.googleapis.com/google.cloud.data-labeling.v1beta1.ImportDataOperationMetadata",
        "dataset": "projects/data-labeling-codelab/datasets/5c73db3d_0000_23e0_a25b_94eb2c119c4c"
      }
    }
    

Python

이 코드 예시를 실행하려면 우선 Python 클라이언트 라이브러리를 설치해야 합니다.

def import_data(dataset_resource_name, data_type, input_gcs_uri):
    """Imports data to the given Google Cloud project and dataset."""
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    gcs_source = datalabeling.GcsSource(input_uri=input_gcs_uri, mime_type="text/csv")

    csv_input_config = datalabeling.InputConfig(
        data_type=data_type, gcs_source=gcs_source
    )

    response = client.import_data(
        request={"name": dataset_resource_name, "input_config": csv_input_config}
    )

    result = response.result()

    # The format of resource name:
    # project_id/{project_id}/datasets/{dataset_id}
    print(f"Dataset resource name: {result.dataset}\n")

    return result

Java

이 코드 예시를 실행하려면 우선 자바 클라이언트 라이브러리를 설치해야 합니다.
import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceSettings;
import com.google.cloud.datalabeling.v1beta1.DataType;
import com.google.cloud.datalabeling.v1beta1.GcsSource;
import com.google.cloud.datalabeling.v1beta1.ImportDataOperationMetadata;
import com.google.cloud.datalabeling.v1beta1.ImportDataOperationResponse;
import com.google.cloud.datalabeling.v1beta1.ImportDataRequest;
import com.google.cloud.datalabeling.v1beta1.InputConfig;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

class ImportData {

  // Import data to an existing dataset.
  static void importData(String datasetName, String gcsSourceUri) throws IOException {
    // String datasetName = DataLabelingServiceClient.formatDatasetName(
    //     "YOUR_PROJECT_ID", "YOUR_DATASETS_UUID");
    // String gcsSourceUri = "gs://YOUR_BUCKET_ID/path_to_data";


    DataLabelingServiceSettings settings =
        DataLabelingServiceSettings.newBuilder()
            .build();
    try (DataLabelingServiceClient dataLabelingServiceClient =
        DataLabelingServiceClient.create(settings)) {
      GcsSource gcsSource =
          GcsSource.newBuilder().setInputUri(gcsSourceUri).setMimeType("text/csv").build();

      InputConfig inputConfig =
          InputConfig.newBuilder()
              .setDataType(DataType.IMAGE) // DataTypes: AUDIO, IMAGE, VIDEO, TEXT
              .setGcsSource(gcsSource)
              .build();

      ImportDataRequest importDataRequest =
          ImportDataRequest.newBuilder().setName(datasetName).setInputConfig(inputConfig).build();

      OperationFuture<ImportDataOperationResponse, ImportDataOperationMetadata> operation =
          dataLabelingServiceClient.importDataAsync(importDataRequest);

      ImportDataOperationResponse response = operation.get();

      System.out.format("Imported items: %d\n", response.getImportCount());
    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}

데이터 세트의 데이터 항목 보기

가져온 데이터 세트의 데이터 항목을 보려면 다음 단계를 따르세요.

  1. 데이터 라벨링 서비스 UI를 엽니다.

    데이터 세트 페이지에는 현재 프로젝트의 데이터 라벨링 서비스 데이터 세트가 표시됩니다.

  2. 데이터 세트 목록에서 항목을 보려는 데이터 세트의 이름을 클릭합니다.

  3. 데이터 세트 세부정보 페이지의 세부정보 탭을 사용하여 데이터 세트에 포함된 개별 데이터 항목을 봅니다.