Envoyer des demandes d'ajout d'étiquettes à des images

Le service AI Platform d'ajout d'étiquettes aux données est compatible avec six types de tâches d'ajout d'étiquettes à des images :

  • La classification, où les étiqueteurs humains attribuent une ou plusieurs étiquettes à chaque image.
  • Les cadres de délimitation, où les étiqueteurs choisissent une étiquette, puis tracent un ou plusieurs cadres de délimitation pour appliquer l'étiquette à la ou aux parties de l'image concernées.
  • Les tâches de cadre de délimitation orienté, semblables aux tâches de cadre de délimitation dans lesquels ces cadres sont alignés sur l'axe des abscisses, à la différence que les cadres de délimitation orientés peuvent être orientés dans n'importe quelle direction.
  • Les polygones de délimitation, semblables aux cadres de délimitation, où les étiqueteurs choisissent une étiquette et tracent des polygones fermés pour appliquer l'étiquette sur la ou les parties de l'image concernées.
  • Les tâches de polylignes, semblables à celles du cadre de délimitation, où les étiqueteurs choisissent une étiquette et tracent des polylignes pour appliquer l’étiquette sur la ou les parties de l’image concernées. Une polyligne est constituée d'une liste d'au moins deux points reliés bout à bout par des segments de ligne.
  • Les tâches de segmentation, où les étiqueteurs génèrent des masques pour chaque étiquette. Le résultat est un tableau de correspondance des couleurs, qui met en correspondance l'étiquette et la couleur.

Tâches de classification d'images

UI Web

  1. Ouvrez l'interface utilisateur du service d'ajout d'étiquettes aux données.

  2. Sélectionnez Ensembles de données dans le menu de navigation de gauche.

    La page Ensembles de données indique l'état des ensembles de données créés précédemment pour le projet en cours.

  3. Cliquez sur le nom de l'ensemble de données pour lequel vous souhaitez demander un ajout d'étiquettes.

    Les ensembles de données dont l'état est Importation terminée peuvent être envoyés. La colonne Type de données indique si l'ensemble de données inclut des images, des vidéos ou du texte.

  4. Sur la page Détails relatifs à l'ensemble de données, cliquez sur le bouton Créer une tâche d'étiquetage dans la barre de titre.

  5. Sur la page Nouvelle tâche d'étiquetage, saisissez un nom et une description pour l'ensemble de données annoté.

    L'ensemble de données annoté correspond à la version de cet ensemble de données une fois qu'il a été étiqueté manuellement.

  6. Dans le menu déroulant Objectif, sélectionnez le type de tâche d'ajout d'étiquettes que vous souhaitez appliquer à cet ensemble de données.

    La liste déroulante n'inclut que les objectifs disponibles pour le type des données contenues dans cet ensemble de données. Si vous ne trouvez pas l'objectif que vous souhaitez, cela signifie probablement que vous avez sélectionné un ensemble de données contenant un type de données différent. Fermez la page Nouvelle tâche d'ajout d'étiquettes et sélectionnez un autre ensemble de données.

  7. Dans le menu déroulant Ensemble d'étiquettes, choisissez l'ensemble d'étiquettes que les étiqueteurs devront appliquer aux éléments de données de cet ensemble.

    La liste déroulante inclut tous les ensembles d'étiquettes associés à ce projet. Vous devez sélectionner un ensemble d'étiquettes.

  8. Dans le menu déroulant Instruction, choisissez les instructions que vous souhaitez fournir aux étiqueteurs travaillant sur cet ensemble de données.

    La liste déroulante inclut toutes les instructions associées à ce projet. Vous devez inclure des instructions dans la demande d'ajout d'étiquettes.

  9. Dans le menu déroulant étiqueteurs par élément de données, spécifiez le nombre d'étiqueteurs qui devront réviser chaque élément de l'ensemble de données.

    La valeur par défaut est d'un étiqueteur par élément, mais vous pouvez demander à ce que trois ou cinq étiqueteurs travaillent sur chaque élément.

  10. Cochez la case pour confirmer que vous comprenez comment l'ajout d'étiquettes vous sera facturé.

  11. Cliquez sur Créer.

Ligne de commande

Définissez les variables d'environnement suivantes :
  1. La variable PROJECT_ID à votre ID de projet Google Cloud
  2. La variable DATASET_ID à l'ID de votre ensemble de données, issue de la réponse obtenue lorsque vous avez créé l'ensemble de données. L'ID apparaît à la fin du nom complet de l'ensemble de données :

    projects/PROJECT_ID/locations/us-central1/datasets/DATASET_ID
  3. La variable INSTRUCTION_RESOURCE_NAME au nom de votre ressource d'instruction.
  4. La variable ANNOTATION_SPEC_SET_RESOURCE_NAME sur le nom de votre ressource d'ensemble d'étiquettes.
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}/image:label \
  -d '{
  "basicConfig": {
    "instruction": "${INSTRUCTION_RESOURCE_NAME}",
    "annotatedDatasetDisplayName": "curl_testing_annotated_dataset",
    "labelGroup": "test_label_group",
    "replica_count": 1
  },
  "feature": "TEXT_CLASSIFICATION",
  "imageClassificationConfig": {
    "annotationSpecSet": "${ANNOTATION_SPEC_SET_RESOURCE_NAME}",
  },
}'

Des résultats semblables aux lignes suivantes devraient s'afficher : Vous pouvez obtenir l'état de la tâche à l'aide de l'ID d'opération. Obtenir l'état d'une opération en est un exemple.

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

Python

Avant de pouvoir exécuter cet exemple de code, vous devez installer les bibliothèques clientes Python.

def label_image(
    dataset_resource_name, instruction_resource_name, annotation_spec_set_resource_name
):
    """Labels an image dataset."""
    from google.cloud import datalabeling_v1beta1 as datalabeling

    client = datalabeling.DataLabelingServiceClient()

    basic_config = datalabeling.HumanAnnotationConfig(
        instruction=instruction_resource_name,
        annotated_dataset_display_name="YOUR_ANNOTATED_DATASET_DISPLAY_NAME",
        label_group="YOUR_LABEL_GROUP",
        replica_count=1,
    )

    feature = datalabeling.LabelImageRequest.Feature.CLASSIFICATION

    # annotation_spec_set_resource_name needs to be created beforehand.
    # See the examples in the following:
    # https://cloud.google.com/ai-platform/data-labeling/docs/label-sets
    config = datalabeling.ImageClassificationConfig(
        annotation_spec_set=annotation_spec_set_resource_name,
        allow_multi_label=False,
        answer_aggregation_type=datalabeling.StringAggregationType.MAJORITY_VOTE,
    )

    response = client.label_image(
        request={
            "parent": dataset_resource_name,
            "basic_config": basic_config,
            "feature": feature,
            "image_classification_config": config,
        }
    )

    print(f"Label_image operation name: {response.operation.name}")
    return response

Java

Avant de pouvoir exécuter cet exemple de code, vous devez installer les bibliothèques clientes Java.
import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.datalabeling.v1beta1.AnnotatedDataset;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceClient;
import com.google.cloud.datalabeling.v1beta1.DataLabelingServiceSettings;
import com.google.cloud.datalabeling.v1beta1.HumanAnnotationConfig;
import com.google.cloud.datalabeling.v1beta1.ImageClassificationConfig;
import com.google.cloud.datalabeling.v1beta1.LabelImageRequest;
import com.google.cloud.datalabeling.v1beta1.LabelImageRequest.Feature;
import com.google.cloud.datalabeling.v1beta1.LabelOperationMetadata;
import com.google.cloud.datalabeling.v1beta1.StringAggregationType;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

class LabelImage {

  // Start an Image Labeling Task
  static void labelImage(
      String formattedInstructionName,
      String formattedAnnotationSpecSetName,
      String formattedDatasetName)
      throws IOException {
    // String formattedInstructionName = DataLabelingServiceClient.formatInstructionName(
    //      "YOUR_PROJECT_ID", "YOUR_INSTRUCTION_UUID");
    // String formattedAnnotationSpecSetName =
    //     DataLabelingServiceClient.formatAnnotationSpecSetName(
    //         "YOUR_PROJECT_ID", "YOUR_ANNOTATION_SPEC_SET_UUID");
    // String formattedDatasetName = DataLabelingServiceClient.formatDatasetName(
    //      "YOUR_PROJECT_ID", "YOUR_DATASET_UUID");


    DataLabelingServiceSettings settings =
        DataLabelingServiceSettings.newBuilder()
            .build();
    try (DataLabelingServiceClient dataLabelingServiceClient =
        DataLabelingServiceClient.create(settings)) {
      HumanAnnotationConfig humanAnnotationConfig =
          HumanAnnotationConfig.newBuilder()
              .setAnnotatedDatasetDisplayName("annotated_displayname")
              .setAnnotatedDatasetDescription("annotated_description")
              .setInstruction(formattedInstructionName)
              .build();

      ImageClassificationConfig imageClassificationConfig =
          ImageClassificationConfig.newBuilder()
              .setAllowMultiLabel(true)
              .setAnswerAggregationType(StringAggregationType.MAJORITY_VOTE)
              .setAnnotationSpecSet(formattedAnnotationSpecSetName)
              .build();

      LabelImageRequest labelImageRequest =
          LabelImageRequest.newBuilder()
              .setParent(formattedDatasetName)
              .setBasicConfig(humanAnnotationConfig)
              .setImageClassificationConfig(imageClassificationConfig)
              .setFeature(Feature.CLASSIFICATION)
              .build();

      OperationFuture<AnnotatedDataset, LabelOperationMetadata> operation =
          dataLabelingServiceClient.labelImageAsync(labelImageRequest);

      // You'll want to save this for later to retrieve your completed operation.
      System.out.format("Operation Name: %s\n", operation.getName());

      // Cancel the operation to avoid charges when testing.
      dataLabelingServiceClient.getOperationsClient().cancelOperation(operation.getName());

    } catch (IOException | InterruptedException | ExecutionException e) {
      e.printStackTrace();
    }
  }
}

Cadres de délimitation

UI Web

  1. Ouvrez l'interface utilisateur du service d'ajout d'étiquettes aux données.

  2. Sélectionnez Ensembles de données dans le menu de navigation de gauche.

    La page Ensembles de données indique l'état des ensembles de données créés précédemment pour le projet en cours.

  3. Cliquez sur le nom de l'ensemble de données pour lequel vous souhaitez demander un ajout d'étiquettes.

    Les ensembles de données dont l'état est Importation terminée peuvent être envoyés. La colonne Type de données indique si l'ensemble de données inclut des images, des vidéos ou du texte.

  4. Sur la page Détails relatifs à l'ensemble de données, cliquez sur le bouton Créer une tâche d'étiquetage dans la barre de titre.

  5. Sur la page Nouvelle tâche d'étiquetage, saisissez un nom et une description pour l'ensemble de données annoté.

    L'ensemble de données annoté correspond à la version de cet ensemble de données une fois qu'il a été étiqueté manuellement.

  6. Dans le menu déroulant Objectif, sélectionnez le type de tâche d'ajout d'étiquettes que vous souhaitez appliquer à cet ensemble de données.

    La liste déroulante n'inclut que les objectifs disponibles pour le type des données contenues dans cet ensemble de données. Si vous ne trouvez pas l'objectif que vous souhaitez, cela signifie probablement que vous avez sélectionné un ensemble de données contenant un type de données différent. Fermez la page Nouvelle tâche d'ajout d'étiquettes et sélectionnez un autre ensemble de données.

  7. Dans le menu déroulant Ensemble d'étiquettes, choisissez l'ensemble d'étiquettes que les étiqueteurs devront appliquer aux éléments de données de cet ensemble.

    La liste déroulante inclut tous les ensembles d'étiquettes associés à ce projet. Vous devez sélectionner un ensemble d'étiquettes.

  8. Dans le menu déroulant Instruction, choisissez les instructions que vous souhaitez fournir aux étiqueteurs travaillant sur cet ensemble de données.

    La liste déroulante inclut toutes les instructions associées à ce projet. Vous devez inclure des instructions dans la demande d'ajout d'étiquettes.

  9. Dans le menu déroulant étiqueteurs par élément de données, spécifiez le nombre d'étiqueteurs qui devront réviser chaque élément de l'ensemble de données.

    La valeur par défaut est d'un étiqueteur par élément, mais vous pouvez demander à ce que trois ou cinq étiqueteurs travaillent sur chaque élément.

  10. Cochez la case pour confirmer que vous comprenez comment l'ajout d'étiquettes vous sera facturé.

  11. Cliquez sur Créer.

Ligne de commande

Définissez les variables d'environnement suivantes :
  1. La variable PROJECT_ID à votre ID de projet Google Cloud
  2. La variable DATASET_ID à l'ID de votre ensemble de données, issue de la réponse obtenue lorsque vous avez créé l'ensemble de données. L'ID apparaît à la fin du nom complet de l'ensemble de données :

    projects/PROJECT_ID/locations/us-central1/datasets/DATASET_ID
  3. La variable INSTRUCTION_RESOURCE_NAME au nom de votre ressource d'instruction.
  4. La variable ANNOTATION_SPEC_SET_RESOURCE_NAME sur le nom de votre ressource d'ensemble d'étiquettes.
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}/image:label \
  -d '{
  "basicConfig": {
    "instruction": "${INSTRUCTION_RESOURCE_NAME}",
    "annotatedDatasetDisplayName": "curl_testing_annotated_dataset",
    "labelGroup": "test_label_group",
    "replica_count": 1
  },
  "feature": "BOUNDING_BOX",
  "boundingPolyConfig": {
    "annotationSpecSet": "${ANNOTATION_SPEC_SET_RESOURCE_NAME}",
  },
}'

Des résultats semblables aux lignes suivantes devraient s'afficher : Vous pouvez obtenir l'état de la tâche à l'aide de l'ID d'opération. Obtenir l'état d'une opération en est un exemple.

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