수동 라벨러용 안내 만들기

안내는 수동 라벨 지정자에게 데이터에 라벨을 적용하는 방법을 알려주는 역할을 합니다. 안내에는 라벨이 지정된 샘플 데이터와 기타 구체적인 지침이 포함되어야 합니다.

AI Platform 데이터 라벨링 서비스에서는 PDF 안내를 지원합니다.

  • PDF 안내. PDF 안내는 각 사례에 대한 긍정적/부정적 예시나 설명 같은 더 정교한 지침을 제공할 수 있습니다. 또한 이미지 경계 상자나 동영상 객체 추적처럼 복잡한 태스크 관련 지침도 쉽게 작성할 수 있습니다.

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

효과적인 안내 작성하기

효과적인 안내는 양질의 수동 라벨링 결과를 보장하는 데 가장 중요한 요소입니다. 사용 사례에 대해 가장 잘 아는 입장에서 수동 라벨러에게 원하는 작업 방식을 확실하게 알려야 합니다. 다음은 효과적인 안내 작성에 관한 몇 가지 가이드라인입니다.

  • 수동 라벨러는 사용자의 도메인 관련 지식을 보유하고 있지 않습니다. 라벨러에게 전달하는 지침은 사용 사례를 잘 모르는 사람도 쉽게 이해할 수 있어야 합니다.

  • 안내가 너무 길면 안 됩니다. 라벨러가 20분 안에 살펴보고 이해할 수 있을 정도의 길이가 가장 좋습니다.

  • 안내는 태스크의 개념과 데이터에 라벨을 지정하는 방법을 모두 설명해야 합니다. 예를 들어 경계 상자 태스크라면 라벨러가 경계 상자를 어떻게 그려야 하는지 설명합니다. 꼭 맞는 상자여야 하나요, 여유를 둔 상자여야 하나요? 객체의 인스턴스가 여러 개라면 하나의 경계 상자를 크게 그려야 하나요, 작은 상자를 여러 개 그려야 하나요?

  • 안내에 대응하는 라벨 세트가 포함되어 있다면 안내는 해당 세트에 있는 모든 라벨에 적용될 수 있어야 합니다. 안내에 있는 라벨 이름은 라벨 세트에 있는 이름과 일치해야 합니다.

  • 일반적으로 이 과정을 몇 번 거쳐야 효과적인 안내가 완성됩니다. 먼저 작은 데이터 세트에 라벨을 지정한 다음 결과를 바탕으로 안내를 수정하는 방법을 권장합니다.

효과적인 안내에는 다음 항목이 포함되어야 합니다.

  • 라벨 목록 및 설명: 사용하려는 라벨을 모두 나열하고 각 라벨의 의미를 설명합니다.
  • 예시: 각 라벨에 긍정 예시를 3개 이상, 부정 예시를 1개 이상 제시합니다. 이러한 예시는 다양한 사례에 적용될 수 있어야 합니다.
  • 특이 사례 적용: 다양한 특이 사례를 최대한 명확하게 설명합니다. 이렇게 하면 라벨러가 라벨을 해석하지 않아도 됩니다. 예를 들어 인물 주위에 경계 상자를 그려야 한다면 조건을 명확하게 설명하는 것이 좋습니다.
    • 사람이 여러 명 있다면 한 사람, 한 사람에 대해 상자를 그려야 하나요?
    • 무언가가 사람을 가리는 경우에도 상자를 그려야 하나요?
    • 이미지에 일부만 보이는 사람에도 상자를 그려야 하나요?
    • 사진이나 그림에 있는 사람에 대해서도 상자를 그려야 하나요?
  • 주석을 추가하는 방법을 설명하세요. 예를 들면 다음과 같습니다.
    • 경계 상자는 꼭 맞아야 하나요, 여유가 있어야 하나요?
    • 텍스트 항목 추출 작업에서 관심 있는 항목의 시작 지점과 종료 지점은 어디인가요?
  • 라벨을 명확하게 설명해야 합니다. 라벨 두 개가 서로 비슷하거나 뒤섞이기 쉽다면 예시를 제시해 차이를 명확하게 설명하세요.

안내 만들기

PDF 안내

아래는 PDF 안내에 포함할 수 있는 항목의 예시입니다 라벨러는 태스크를 시작하기 전에 안내를 검토합니다.

PDF 안내 1

PDF 안내 2

Google 프레젠테이션을 만든 다음 PDF 파일로 내보내 안내를 만들 수 있습니다.

안내를 프로젝트에 추가

웹 UI

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

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

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

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

  3. 새 안내 페이지에서 안내 파일의 이름과 설명을 입력합니다.

  4. 데이터 유형 드롭다운에서 라벨러가 라벨을 적용할 데이터 항목 유형(이미지, 동영상, 텍스트)을 선택합니다.

  5. 안내 위치 섹션에 안내 파일의 전체 경로를 입력합니다.

    PDF 안내 파일을 지정해야 합니다. 파일은 데이터 세트 및 라벨 세트와 같은 Google Cloud Storage 버킷에 있어야 합니다.

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

    안내 목록 페이지가 다시 표시되며, 안내를 가져오는 동안 이 페이지에 진행률이 표시됩니다.

명령줄

다음 예시에서는 test_spec_set_display_name이라는 라벨 세트를 만듭니다. 환경 변수인 PROJECT_IDGCS_PDF_FILE_PATH를 정의하고, 사용할 Google Cloud 프로젝트 ID 및 PDF의 Cloud Storage URI를 각각 지정해야 합니다.
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}/instructions \
     -d '{
         "instruction": {
             "displayName": "curl_testing_instruction",
             "description": "instruction for curl commands testing",
             "dataType": "IMAGE",
           "pdfInstruction": {
                 "gcsFileUri": "${GCS_PDF_FILE_PATH}"
           }
         },
     }'

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

{
  "name": "projects/data-labeling-codelab/instructions/5c73dbc1_0000_23e0_a25b_94eb2c119c4c"
}

Python

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

PdfInstruction을 제공해야 합니다. 다른 데이터 유형에 관한 안내라면 dataType을 'IMAGE'에서 해당하는 데이터 유형으로 변경하세요.

def create_instruction(project_id, data_type, instruction_gcs_uri):
    """Creates a data labeling PDF instruction for the given Google Cloud
    project. The PDF file should be uploaded to the project in
    Google Cloud Storage.
    """
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    project_path = f"projects/{project_id}"

    pdf_instruction = datalabeling.PdfInstruction(gcs_file_uri=instruction_gcs_uri)

    instruction = datalabeling.Instruction(
        display_name="YOUR_INSTRUCTION_DISPLAY_NAME",
        description="YOUR_DESCRIPTION",
        data_type=data_type,
        pdf_instruction=pdf_instruction,
    )

    operation = client.create_instruction(
        request={"parent": project_path, "instruction": instruction}
    )

    result = operation.result()

    # The format of the resource name:
    # project_id/{project_id}/instruction/{instruction_id}
    print(f"The instruction resource name: {result.name}")
    print(f"Display name: {result.display_name}")
    print(f"Description: {result.description}")
    print("Create time:")
    print(f"\tseconds: {result.create_time.timestamp_pb().seconds}")
    print(f"\tnanos: {result.create_time.timestamp_pb().nanos}")
    print(f"Data type: {datalabeling.DataType(result.data_type).name}")
    print("Pdf instruction:")
    print(f"\tGcs file uri: {result.pdf_instruction.gcs_file_uri}\n")

    return result

Java

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

PdfInstruction을 제공해야 합니다. 다른 데이터 유형에 관한 안내라면 dataType을 'IMAGE'에서 해당하는 데이터 유형으로 변경하세요.

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.CreateInstructionMetadata;
import com.google.cloud.datalabeling.v1beta1.CreateInstructionRequest;
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.Instruction;
import com.google.cloud.datalabeling.v1beta1.PdfInstruction;
import com.google.cloud.datalabeling.v1beta1.ProjectName;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

class CreateInstruction {

  // Create a instruction for a dataset.
  static void createInstruction(String projectId, String pdfUri) throws IOException {
    // String projectId = "YOUR_PROJECT_ID";
    // String pdfUri = "gs://YOUR_BUCKET_ID/path_to_pdf_or_csv";

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

      // There are two types of instructions: CSV (CsvInstruction) or PDF (PdfInstruction)
      PdfInstruction pdfInstruction = PdfInstruction.newBuilder().setGcsFileUri(pdfUri).build();

      Instruction instruction =
          Instruction.newBuilder()
              .setDisplayName("YOUR_INSTRUCTION_DISPLAY_NAME")
              .setDescription("YOUR_DESCRIPTION")
              .setDataType(DataType.IMAGE) // DataTypes: AUDIO, IMAGE, VIDEO, TEXT
              .setPdfInstruction(pdfInstruction) // .setCsvInstruction() or .setPdfInstruction()
              .build();

      CreateInstructionRequest createInstructionRequest =
          CreateInstructionRequest.newBuilder()
              .setInstruction(instruction)
              .setParent(projectName.toString())
              .build();

      OperationFuture<Instruction, CreateInstructionMetadata> operation =
          dataLabelingServiceClient.createInstructionAsync(createInstructionRequest);

      Instruction result = operation.get();

      System.out.format("Name: %s\n", result.getName());
      System.out.format("DisplayName: %s\n", result.getDisplayName());
      System.out.format("Description: %s\n", result.getDescription());
      System.out.format("GCS SOURCE URI: %s\n", result.getPdfInstruction().getGcsFileUri());
    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}

프로젝트의 안내 업데이트

안내를 업데이트하려면 안내 파일을 업데이트한 뒤 안내를 프로젝트에 추가에 설명된 대로 파일을 다시 업로드해야 합니다.

데이터 라벨 지정 태스크를 제출하면 서비스는 안내 파일의 스냅샷을 만들고 이 스냅샷을 이용해 해당 태스크의 데이터 라벨 지정 방법을 안내합니다. 이렇게 하면 데이터 라벨 지정 태스크가 진행 중일 때 안내가 업데이트될 경우 사례에서 일관적이지 못한 결과가 표시되는 현상을 방지할 수 있습니다. 안내를 업데이트하게 되면 새 데이터 라벨 지정 태스크를 제출해야 새 안내를 사용할 수 있습니다.