Realiza un seguimiento de objetos en videos

Después de crear (entrenar) un modelo, puedes solicitar una predicción para uno o más videos con el método batchPredict. Proporciona un archivo CSV con una lista de videos al método batchPredict. El método batchPredict anota videos mediante la detección y el seguimiento de objetos que predice tu modelo.

La vida útil máxima de un modelo personalizado es de dos años. Después de dos años, debes crear y entrenar un modelo nuevo para seguir anotando tus videos.

Ejemplo de predicción

Para solicitar un lote de predicciones a partir del seguimiento de objetos de AutoML Video, crea un archivo CSV que enumere las rutas de Cloud Storage a los videos que deseas anotar. También puedes especificar una hora de inicio y de finalización para indicarle a AutoML Video Object Tracking que solo debe anotar un segmento del video. La hora de inicio debe ser igual o mayor que la hora de finalización y debe ser anterior a la hora de finalización. La hora de finalización debe ser superior a la hora de inicio y menor o igual que la duración del video.

En el siguiente ejemplo, se muestra cómo anotar un video completo si se especifica una hora de inicio y de finalización como 0,inf.

gs://my-videos-vcm/cow_video.mp4,0,inf
gs://my-videos-vcm/bird_video.mp4,10.00000,15.50000

También debes especificar una ruta de acceso de archivo de salida en la que el seguimiento de objetos de AutoML Video deba escribir los resultados de las predicciones de tu modelo. Esta ruta debe ser un objeto y un depósito de Cloud Storage en el que tengas permisos de escritura.

Cada video puede tener hasta 3 horas de duración con un tamaño máximo de archivo de 50 GB. El seguimiento de objetos de AutoML Video puede generar predicciones durante, aproximadamente, 100 horas de video en 12 horas de tiempo de procesamiento.

IU web

  1. Abre la IU de seguimiento de objetos de AutoML Video.
  2. Haz clic en el modelo personalizado que deseas usar de la lista que se muestra.Lista de modelos personalizados de AutoML Video Intelligence en Cloud Console
  3. En la pestaña Probar y usar del modelo, haz lo siguiente:
    • En Prueba tu modelo, selecciona un archivo CSV para usar en la predicción. El archivo CSV debe proporcionar una lista de videos que deseas anotar.
    • También en Probar tu modelo, selecciona un directorio dentro de tu depósito de Cloud Storage para recibir los resultados de la anotación.

      Es posible que desees crear una carpeta específica “results” en tu depósito de Cloud Storage para almacenar los resultados de la anotación.

    • Haz clic en Obtener predicciones.
    Configura una solicitud de predicción para AutoML Video Intelligence

El proceso para obtener predicciones puede demorar un poco, según la cantidad de videos que quieras anotar.

Cuando se completa el proceso, los resultados aparecen en la página del modelo en Predicciones recientes. Para ver los resultados, haz lo siguiente:

  1. En Predicciones recientes de la columna Predictions, haz clic en Ver para la predicción que quieres ver.
  2. En Video, selecciona el nombre del video del que deseas ver los resultados.

LÍNEA DE REST Y CMD

Antes de usar cualquiera de los datos de solicitud siguientes, realiza estos reemplazos:

  • Reemplaza model-id por el ID de tu modelo. El ID es el último elemento del nombre del modelo. Por ejemplo, si el nombre de tu modelo es projects/project-number/locations/location-id/models/VOT6312181905852727296, entonces el ID de tu modelo es VOT6312181905852727296.
  • request-id: Asigna cualquier valor digital a este campo.
  • bucket-name: Reemplaza por el nombre del depósito de Cloud Storage. Por ejemplo: my-project-vcm
  • input-file: reemplaza el nombre del archivo CSV que identifica los videos que se anotarán.
  • output-storage-path: reemplaza con la ruta de acceso al depósito de Cloud Storage en el que se almacenarán el resultado de las predicciones. El seguimiento de objetos de AutoML Video crea una subcarpeta para los resultados en esta ruta de acceso con el siguiente formato: prediction-model_name-timestamp. La subcarpeta contendrá un archivo de predicción para cada video en la solicitud por lotes. Debes tener permisos de escritura para esta ruta de acceso
  • Nota:
    • project-number: Es el número de tu proyecto.
    • location-id: la región de Cloud en la que se debe realizar la anotación. Las regiones en la nube compatibles son: us-east1, us-west1, europe-west1, asia-east1. Si no se especifica ninguna región, se determinará una región en función de la ubicación del archivo de video.

Método HTTP y URL:

POST https://automl.googleapis.com/v1beta1/projects/project-number/locations/location-id/models/model-id:batchPredict

Cuerpo JSON de la solicitud:

{
  "request_id": "request-id",
  "inputConfig": {
    "gcsSource": {
      "inputUris": ["gs://bucket-name/input-file.csv"]
    }
  },
  "outputConfig": {
    "gcsDestination": {
      "outputUriPrefix": "gs://output-storage-path"
    }
  },
  "params": {
    "score_threshold": "0.0"
  }
}

Para enviar tu solicitud, elige una de estas opciones:

curl

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

curl -X POST \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
-H "Content-Type: application/json; charset=utf-8" \
-d @request.json \
https://automl.googleapis.com/v1beta1/projects/project-number/locations/location-id/models/model-id:batchPredict

PowerShell

Guarda el cuerpo de la solicitud en un archivo llamado request.json y ejecuta el siguiente comando:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method POST `
-Headers $headers `
-ContentType: "application/json; charset=utf-8" `
-InFile request.json `
-Uri "https://automl.googleapis.com/v1beta1/projects/project-number/locations/location-id/models/model-id:batchPredict" | Select-Object -Expand Content
Deberías recibir un ID de operación para tu operación de entrenamiento de modelos. En el siguiente ejemplo, se muestra una respuesta que contiene el ID de operación de entrenamiento del modelo VOT1741767155885539328.

Java

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.automl.v1beta1.BatchPredictInputConfig;
import com.google.cloud.automl.v1beta1.BatchPredictOutputConfig;
import com.google.cloud.automl.v1beta1.BatchPredictRequest;
import com.google.cloud.automl.v1beta1.BatchPredictResult;
import com.google.cloud.automl.v1beta1.GcsDestination;
import com.google.cloud.automl.v1beta1.GcsSource;
import com.google.cloud.automl.v1beta1.ModelName;
import com.google.cloud.automl.v1beta1.OperationMetadata;
import com.google.cloud.automl.v1beta1.PredictionServiceClient;
import java.io.IOException;
import java.util.concurrent.ExecutionException;

class BatchPredict {

  static void batchPredict() throws IOException, ExecutionException, InterruptedException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "YOUR_PROJECT_ID";
    String modelId = "YOUR_MODEL_ID";
    String inputUri = "gs://YOUR_BUCKET_ID/path_to_your_input_csv_or_jsonl";
    String outputUri = "gs://YOUR_BUCKET_ID/path_to_save_results/";
    batchPredict(projectId, modelId, inputUri, outputUri);
  }

  static void batchPredict(String projectId, String modelId, String inputUri, String outputUri)
      throws IOException, ExecutionException, InterruptedException {
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (PredictionServiceClient client = PredictionServiceClient.create()) {
      // Get the full path of the model.
      ModelName name = ModelName.of(projectId, "us-central1", modelId);

      // Configure the source of the file from a GCS bucket
      GcsSource gcsSource = GcsSource.newBuilder().addInputUris(inputUri).build();
      BatchPredictInputConfig inputConfig =
          BatchPredictInputConfig.newBuilder().setGcsSource(gcsSource).build();

      // Configure where to store the output in a GCS bucket
      GcsDestination gcsDestination =
          GcsDestination.newBuilder().setOutputUriPrefix(outputUri).build();
      BatchPredictOutputConfig outputConfig =
          BatchPredictOutputConfig.newBuilder().setGcsDestination(gcsDestination).build();

      // Build the request that will be sent to the API
      BatchPredictRequest request =
          BatchPredictRequest.newBuilder()
              .setName(name.toString())
              .setInputConfig(inputConfig)
              .setOutputConfig(outputConfig)
              .build();

      // Start an asynchronous request
      OperationFuture<BatchPredictResult, OperationMetadata> future =
          client.batchPredictAsync(request);

      System.out.println("Waiting for operation to complete...");
      BatchPredictResult response = future.get();
      System.out.println("Batch Prediction results saved to specified Cloud Storage bucket.");
    }
  }
}

Node.js

/**
 * TODO(developer): Uncomment these variables before running the sample.
 */
// const projectId = 'YOUR_PROJECT_ID';
// const location = 'us-central1';
// const modelId = 'YOUR_MODEL_ID';
// const inputUri = 'gs://YOUR_BUCKET_ID/path_to_your_input_csv_or_jsonl';
// const outputUri = 'gs://YOUR_BUCKET_ID/path_to_save_results/';

// Imports the Google Cloud AutoML library
const {PredictionServiceClient} = require('@google-cloud/automl').v1beta1;

// Instantiates a client
const client = new PredictionServiceClient();

async function batchPredict() {
  // Construct request
  const request = {
    name: client.modelPath(projectId, location, modelId),
    inputConfig: {
      gcsSource: {
        inputUris: [inputUri],
      },
    },
    outputConfig: {
      gcsDestination: {
        outputUriPrefix: outputUri,
      },
    },
  };

  const [operation] = await client.batchPredict(request);

  console.log('Waiting for operation to complete...');
  // Wait for operation to complete.
  const [response] = await operation.promise();
  console.log(
    `Batch Prediction results saved to Cloud Storage bucket. ${response}`
  );
}

batchPredict();

Python

from google.cloud import automl_v1beta1 as automl

def batch_predict(
    project_id="YOUR_PROJECT_ID",
    model_id="YOUR_MODEL_ID",
    input_uri="gs://YOUR_BUCKET_ID/path/to/your/input/csv_or_jsonl",
    output_uri="gs://YOUR_BUCKET_ID/path/to/save/results/",
):
    """Batch predict"""
    prediction_client = automl.PredictionServiceClient()

    # Get the full path of the model.
    model_full_id = prediction_client.model_path(
        project_id, "us-central1", model_id
    )

    gcs_source = automl.types.GcsSource(input_uris=[input_uri])

    input_config = automl.types.BatchPredictInputConfig(gcs_source=gcs_source)
    gcs_destination = automl.types.GcsDestination(output_uri_prefix=output_uri)
    output_config = automl.types.BatchPredictOutputConfig(
        gcs_destination=gcs_destination
    )
    params = {}

    response = prediction_client.batch_predict(
        model_full_id, input_config, output_config, params=params
    )

    print("Waiting for operation to complete...")
    print(
        "Batch Prediction results saved to Cloud Storage bucket. {}".format(
            response.result()
        )
    )

Obtén el estado de la operación de predicción

Puedes consultar el estado de la operación de predicción por lotes mediante los siguientes comandos curl o PowerShell.

LÍNEA DE REST Y CMD

Antes de usar cualquiera de los datos de solicitud siguientes, realiza estos reemplazos:

    • project-number: Es el número de tu proyecto.
    • location-id: Es la región de Cloud en la que se debe realizar la anotación. Las regiones en la nube compatibles son: us-east1, us-west1, europe-west1, asia-east1. Si no se especifica ninguna región, se determinará una región en función de la ubicación del archivo de video.
    • operation-id: Es el ID de la operación de larga duración creada para la solicitud y proporcionada en la respuesta cuando iniciaste la operación, por ejemplo VOT12345.....

Método HTTP y URL:

GET https://automl.googleapis.com/v1beta1/projects/project-number/locations/location-id/operations/operation-id

Para enviar tu solicitud, elige una de estas opciones:

curl

Ejecuta el siguiente comando:

curl -X GET \
-H "Authorization: Bearer "$(gcloud auth application-default print-access-token) \
https://automl.googleapis.com/v1beta1/projects/project-number/locations/location-id/operations/operation-id

PowerShell

Ejecuta el siguiente comando:

$cred = gcloud auth application-default print-access-token
$headers = @{ "Authorization" = "Bearer $cred" }

Invoke-WebRequest `
-Method GET `
-Headers $headers `
-Uri "https://automl.googleapis.com/v1beta1/projects/project-number/locations/location-id/operations/operation-id" | Select-Object -Expand Content
El operation-name es el nombre de la operación que muestra la API de seguimiento de objetos de AutoML Video Intelligence. El nombre de la operación tiene el formato projects/project-number/locations/location-id/operations/operation-id.

Cuando se completa la tarea de predicción por lotes, el resultado de la predicción se almacena en el depósito de Cloud Storage que especificaste en el comando. Hay un archivo JSON para cada segmento de video. Los archivos JSON tienen un formato similar a my-video-01.avi.json, en el que la extensión de archivo .json se agrega al nombre del archivo original.

{
  "inputUris": ["automl-video-demo-data/sample_video.avi"],
  "object_annotations": [ {
    "annotation_spec": {
      "display_name": "Cat",
      "description": "Cat"
    },
    "confidence": 0.43253016
    "frames": [ {
      "frame": {
        "time_offset": {
          "seconds": 4,
          "nanos": 960000000
        },
        "normalized_bounding_box": {
          "x_min": 0.1,
          "y_min": 0.1,
          "x_max": 0.8,
          "y_max": 0.8
        }
      }
    }, {
      "frame": {
        "time_offset": {
          "seconds": 5,
          "nanos": 960000000
        },
        "normalized_bounding_box": {
          "x_min": 0.2,
          "y_min": 0.2,
          "x_max": 0.9,
          "y_max": 0.9
        }
      }
    } ],
    "segment": {
      "start_time_offset": {
          "seconds": 4,
          "nanos": 960000000
      },
      "end_time_offset": {
          "seconds": 5,
          "nanos": 960000000
      }
    }
  } ],
  "error": {
    "details": [ ]
  }
}