Share via


Llamar a la API Image Analysis 4.0

Este artículo muestra cómo llamar a la API Image Analysis 4.0 para devolver información sobre las características visuales de cualquier imagen. También muestra cómo analizar la información devuelta.

Requisitos previos

En esta guía se asume que ha seguido los pasos mencionados en la página de inicio rápido. Esto significa:

  • Ha creado un recurso de Computer Vision y se ha obtenido una clave y una dirección URL del punto de conexión.
  • Tiene instalado el paquete SDK adecuado y dispone de una aplicación de inicio rápido en ejecución. Puede modificar esta aplicación de inicio rápido según los ejemplos de código aquí.

Creación y autenticación del cliente

Para autenticarse en el servicio Image Analysis, necesitará una clave de Computer Vision y una dirección URL del punto de conexión. En esta guía se asume que ha definido las variables de entorno VISION_KEY y VISION_ENDPOINT con la clave y el punto de conexión.

Sugerencia

No incluya la clave directamente en el código ni la exponga nunca públicamente. Consulte el artículo de Seguridad de los servicios de Azure AI para ver más opciones de autenticación, como Azure Key Vault.

Empiece por crear un objeto ImageAnalysisClient. Por ejemplo:

string endpoint = Environment.GetEnvironmentVariable("VISION_ENDPOINT");
string key = Environment.GetEnvironmentVariable("VISION_KEY");

// Create an Image Analysis client.
ImageAnalysisClient client = new ImageAnalysisClient(
    new Uri(endpoint),
    new AzureKeyCredential(key));

Seleccione la imagen que se vaya a analizar

Puede seleccionar una imagen proporcionando una dirección URL de imagen accesible públicamente o pasando datos binarios al SDK. Consulte Requisitos de imagen para conocer los formatos de imagen admitidos.

URL de imagen

Cree un objeto URI para la imagen que desea analizar.

Uri imageURL = new Uri("https://aka.ms/azsdk/image-analysis/sample.jpg");

Búfer de imágenes

Como alternativa, puede pasar los datos de imagen al SDK a través de un objeto BinaryData. Por ejemplo, lea desde un archivo de imagen local que quiera analizar.

using FileStream stream = new FileStream("sample.jpg", FileMode.Open);
BinaryData imageData = BinaryData.FromStream(stream);

Selección de características visuales

La API Image Analysis 4.0 proporciona acceso a todas las características de análisis de imágenes del servicio. Elija qué operaciones realizar en función de su propio caso de uso. Consulte la información general para obtener una descripción de cada característica. En el ejemplo de esta sección se agregan todas las características visuales disponibles, pero para un uso práctico es probable que necesite menos.

Importante

Las funciones visuales Captions y DenseCaptions solo son compatibles en las siguientes regiones de Azure: Este de EE. UU., Centro de Francia, Centro de Corea del Sur, Norte de Europa, Sudeste de Asia, Oeste de Europa y Oeste de EE. UU.

VisualFeatures visualFeatures =
    VisualFeatures.Caption |
    VisualFeatures.DenseCaptions |
    VisualFeatures.Objects |
    VisualFeatures.Read |
    VisualFeatures.Tags |
    VisualFeatures.People |
    VisualFeatures.SmartCrops;

Seleccionar opciones de análisis

Use un objeto ImageAnalysisOptions para especificar varias opciones para la llamada API de Analyze.

  • Idioma: se puede especificar el idioma de los datos devueltos. El idioma es opcional y el valor predeterminado es inglés. Consulte Compatibilidad con el idioma para obtener una lista de los códigos de idioma admitidos y qué características visuales se admiten para cada idioma.
  • Subtítulos neutros en cuanto al género si va a extraer subtítulos o subtítulos densos (mediante VisualFeatures.Caption o VisualFeatures.DenseCaptions), puede solicitar subtítulos neutros en cuanto al género. Los subtítulos neutros en cuanto al género son opcionales, y el valor predeterminado es de subtítulos con género. Por ejemplo, en inglés, al seleccionar subtítulos neutros en cuanto al género, los términos como mujer u hombre se reemplazarían por persona y, niño o niña, se reemplazarían por menor.
  • Relación de aspecto de recorte: una relación de aspecto se calcula dividiendo el ancho del recorte de destino por el alto. Los valores admitidos van de 0,75 a 1,8 (ambos admitidos). Establecer esta propiedad solo es relevante cuando se seleccionó visualFeatures.SmartCrops como parte de la lista de características visuales. Si selecciona VisualFeatures.SmartCrops pero no especifica las relaciones de aspecto, el servicio devolverá una sugerencia de recorte con una relación de aspecto que vea adecuada. En este caso, la relación de aspecto está entre 0,5 y 2,0 (ambos incluidos).
ImageAnalysisOptions options = new ImageAnalysisOptions { 
    GenderNeutralCaption = true,
    Language = "en",
    SmartCropsAspectRatios = new float[] { 0.9F, 1.33F }};

Llamada a Analyze API

En esta sección se muestra cómo realizar una llamada de análisis al servicio.

Llame al método Analyze en el objeto ImageAnalysisClient, tal y como se muestra aquí. La llamada es sincrónica y se bloqueará hasta que el servicio devuelva los resultados o se produzca un error. Como alternativa, puede llamar al método AnalyzeAsync sin bloqueo.

Use los objetos de entrada creados en las secciones anteriores. Para analizar desde un búfer de imágenes en lugar de una dirección URL, reemplace imageURL en la llamada de método por la variable imageData.

ImageAnalysisResult result = client.Analyze(
    imageURL,
    visualFeatures,
    options);

Obtención de resultados a partir del servicio

En el código siguiente se muestra cómo analizar los resultados de las distintas operaciones de Analyze.

Console.WriteLine("Image analysis results:");

// Print caption results to the console
Console.WriteLine(" Caption:");
Console.WriteLine($"   '{result.Caption.Text}', Confidence {result.Caption.Confidence:F4}");

// Print dense caption results to the console
Console.WriteLine(" Dense Captions:");
foreach (DenseCaption denseCaption in result.DenseCaptions.Values)
{
    Console.WriteLine($"   '{denseCaption.Text}', Confidence {denseCaption.Confidence:F4}, Bounding box {denseCaption.BoundingBox}");
}

// Print object detection results to the console
Console.WriteLine(" Objects:");
foreach (DetectedObject detectedObject in result.Objects.Values)
{
    Console.WriteLine($"   '{detectedObject.Tags.First().Name}', Bounding box {detectedObject.BoundingBox.ToString()}");
}

// Print text (OCR) analysis results to the console
Console.WriteLine(" Read:");
foreach (DetectedTextBlock block in result.Read.Blocks)
    foreach (DetectedTextLine line in block.Lines)
    {
        Console.WriteLine($"   Line: '{line.Text}', Bounding Polygon: [{string.Join(" ", line.BoundingPolygon)}]");
        foreach (DetectedTextWord word in line.Words)
        {
            Console.WriteLine($"     Word: '{word.Text}', Confidence {word.Confidence.ToString("#.####")}, Bounding Polygon: [{string.Join(" ", word.BoundingPolygon)}]");
        }
    }

// Print tags results to the console
Console.WriteLine(" Tags:");
foreach (DetectedTag tag in result.Tags.Values)
{
    Console.WriteLine($"   '{tag.Name}', Confidence {tag.Confidence:F4}");
}

// Print people detection results to the console
Console.WriteLine(" People:");
foreach (DetectedPerson person in result.People.Values)
{
    Console.WriteLine($"   Person: Bounding box {person.BoundingBox.ToString()}, Confidence {person.Confidence:F4}");
}

// Print smart-crops analysis results to the console
Console.WriteLine(" SmartCrops:");
foreach (CropRegion cropRegion in result.SmartCrops.Values)
{
    Console.WriteLine($"   Aspect ratio: {cropRegion.AspectRatio}, Bounding box: {cropRegion.BoundingBox}");
}

// Print metadata
Console.WriteLine(" Metadata:");
Console.WriteLine($"   Model: {result.ModelVersion}");
Console.WriteLine($"   Image width: {result.Metadata.Width}");
Console.WriteLine($"   Image hight: {result.Metadata.Height}");

Solución de problemas

Control de excepciones

Al interactuar con Análisis de imágenes mediante el SDK de .NET, cualquier respuesta del servicio que no tenga un código de estado (correcto) 200 produce una excepción. Por ejemplo, si se intenta analizar una imagen que no es accesible debido a una dirección URL rota, se devuelve un estado 400, que indica una solicitud incorrecta, y se produce la excepción correspondiente.

En el siguiente fragmento, los errores se controlan correctamente al detectar la excepción y mostrar información adicional sobre el error.

var imageUrl = new Uri("https://some-host-name.com/non-existing-image.jpg");

try
{
    var result = client.Analyze(imageUrl, VisualFeatures.Caption);
}
catch (RequestFailedException e)
{
    if (e.Status != 200)
    {
        Console.WriteLine("Error analyzing image.");
        Console.WriteLine($"HTTP status code {e.Status}: {e.Message}");
    }
    else
    {
        throw;
    }
}

Puede obtener más información sobre cómo habilitar el registro del SDK aquí.

Requisitos previos

En esta guía se asume que ha seguido correctamente los pasos mencionados en el inicio rápido. Esto significa:

  • Ha creado un recurso de Computer Vision y se ha obtenido una clave y una dirección URL del punto de conexión.
  • Tiene instalado el paquete SDK adecuado y dispone de una aplicación de inicio rápido en ejecución. Puede modificar esta aplicación de inicio rápido según los ejemplos de código aquí.

Creación y autenticación del cliente

Para autenticarse en el servicio Image Analysis, necesitará una clave de Computer Vision y una dirección URL del punto de conexión. En esta guía se asume que ha definido las variables de entorno VISION_KEY y VISION_ENDPOINT con la clave y el punto de conexión.

Sugerencia

No incluya la clave directamente en el código ni la exponga nunca públicamente. Consulte el artículo de Seguridad de los servicios de Azure AI para ver más opciones de autenticación, como Azure Key Vault.

Empiece por crear un objeto ImageAnalysisClient mediante uno de los constructores. Por ejemplo:

client = ImageAnalysisClient(
    endpoint=endpoint,
    credential=AzureKeyCredential(key)
)

Seleccione la imagen que se vaya a analizar

Puede seleccionar una imagen proporcionando una dirección URL de imagen accesible públicamente o leyendo datos de imagen en el búfer de entrada del SDK. Consulte Requisitos de imagen para conocer los formatos de imagen admitidos.

URL de imagen

Puede utilizar al siguiente dirección URL de imagen de ejemplo.

# Define image URL
image_url = "https://learn.microsoft.com/azure/ai-services/computer-vision/media/quickstarts/presentation.png"

Búfer de imágenes

Como alternativa, puede pasar la imagen como objeto bytes. Por ejemplo, lea desde un archivo de imagen local que quiera analizar.

# Load image to analyze into a 'bytes' object
with open("sample.jpg", "rb") as f:
    image_data = f.read()

Selección de características visuales

La API Image Analysis 4.0 proporciona acceso a todas las características de análisis de imágenes del servicio. Elija qué operaciones realizar en función de su propio caso de uso. Consulte la información general para obtener una descripción de cada característica. En el ejemplo de esta sección se agregan todas las características visuales disponibles, pero para un uso práctico es probable que necesite menos.

visual_features =[
        VisualFeatures.TAGS,
        VisualFeatures.OBJECTS,
        VisualFeatures.CAPTION,
        VisualFeatures.DENSE_CAPTIONS,
        VisualFeatures.READ,
        VisualFeatures.SMART_CROPS,
        VisualFeatures.PEOPLE,
    ]

Llamar al método analyze_from_url con opciones

El código siguiente llama al método analyze_from_url en el cliente con las características que seleccionó anteriormente y opciones adicionales, definidas a continuación. Para analizar desde un búfer de imágenes en lugar de una dirección URL, llame al método analyze en su lugar, con image_data=image_data como primer argumento.

# Analyze all visual features from an image stream. This will be a synchronously (blocking) call.
result = client.analyze_from_url(
    image_url=image_url,
    visual_features=visual_features,
    smart_crops_aspect_ratios=[0.9, 1.33],
    gender_neutral_caption=True,
    language="en"
)

Seleccionar las relaciones de aspecto de recorte inteligente

Una relación de aspecto se calcula dividiendo el ancho del recorte de destino por el alto. Los valores admitidos van de 0,75 a 1,8 (ambos admitidos). Establecer esta propiedad solo es relevante cuando se seleccionó VisualFeatures.SMART_CROPS como parte de la lista de características visuales. Si selecciona VisualFeatures.SMART_CROPS pero no especifica las relaciones de aspecto, el servicio devolverá una sugerencia de recorte con una relación de aspecto que vea adecuada. En este caso, la relación de aspecto está entre 0,5 y 2,0 (ambos incluidos).

Selección de subtítulos neutros en cuanto al género

Si va a extraer subtítulos o subtítulos densos (mediante VisualFeatures.CAPTION o VisualFeatures.DENSE_CAPTIONS), puede solicitar subtítulos neutros en cuanto al género. Los subtítulos neutros en cuanto al género son opcionales, y el valor predeterminado es de subtítulos con género. Por ejemplo, en inglés, al seleccionar subtítulos neutros en cuanto al género, los términos como mujer u hombre se reemplazarían por persona y, niño o niña, se reemplazarían por menor.

Especificación de idiomas

Se puede especificar el idioma de los datos devueltos. El idioma es opcional y el valor predeterminado es inglés. Consulte Compatibilidad con el idioma para obtener una lista de los códigos de idioma admitidos y qué características visuales se admiten para cada idioma.

Obtención de resultados a partir del servicio

En el código siguiente se muestra cómo analizar los resultados de las operaciones de analyze_from_url o analyze.

# Print all analysis results to the console
print("Image analysis results:")

if result.caption is not None:
    print(" Caption:")
    print(f"   '{result.caption.text}', Confidence {result.caption.confidence:.4f}")

if result.dense_captions is not None:
    print(" Dense Captions:")
    for caption in result.dense_captions.list:
        print(f"   '{caption.text}', {caption.bounding_box}, Confidence: {caption.confidence:.4f}")

if result.read is not None:
    print(" Read:")
    for line in result.read.blocks[0].lines:
        print(f"   Line: '{line.text}', Bounding box {line.bounding_polygon}")
        for word in line.words:
            print(f"     Word: '{word.text}', Bounding polygon {word.bounding_polygon}, Confidence {word.confidence:.4f}")

if result.tags is not None:
    print(" Tags:")
    for tag in result.tags.list:
        print(f"   '{tag.name}', Confidence {tag.confidence:.4f}")

if result.objects is not None:
    print(" Objects:")
    for object in result.objects.list:
        print(f"   '{object.tags[0].name}', {object.bounding_box}, Confidence: {object.tags[0].confidence:.4f}")

if result.people is not None:
    print(" People:")
    for person in result.people.list:
        print(f"   {person.bounding_box}, Confidence {person.confidence:.4f}")

if result.smart_crops is not None:
    print(" Smart Cropping:")
    for smart_crop in result.smart_crops.list:
        print(f"   Aspect ratio {smart_crop.aspect_ratio}: Smart crop {smart_crop.bounding_box}")

print(f" Image height: {result.metadata.height}")
print(f" Image width: {result.metadata.width}")
print(f" Model version: {result.model_version}")

Solución de problemas

Excepciones

Los métodos analyze generan una excepción HttpResponseError para una respuesta de código de estado HTTP no correcta del servicio. El status_code de la excepción es el código de estado de respuesta HTTP. El error.message de la excepción contiene un mensaje detallado que le permite diagnosticar el problema:

try:
    result = client.analyze( ... )
except HttpResponseError as e:
    print(f"Status code: {e.status_code}")
    print(f"Reason: {e.reason}")
    print(f"Message: {e.error.message}")

Por ejemplo, cuando se proporciona una clave de autenticación incorrecta:

Status code: 401
Reason: PermissionDenied
Message: Access denied due to invalid subscription key or wrong API endpoint. Make sure to provide a valid key for an active subscription and use a correct regional API endpoint for your resource.

O cuando se proporciona una dirección URL de imagen que no existe o no es accesible:

Status code: 400
Reason: Bad Request
Message: The provided image url is not accessible.

Registro

El cliente usa la biblioteca de registro de Python estándar. El SDK registra los detalles de solicitud y respuesta HTTP, lo que puede resultar útil para solucionar problemas. Para iniciar sesión en stdout, agregue lo siguiente:

import sys
import logging

# Acquire the logger for this client library. Use 'azure' to affect both
# 'azure.core` and `azure.ai.vision.imageanalysis' libraries.
logger = logging.getLogger("azure")

# Set the desired logging level. logging.INFO or logging.DEBUG are good options.
logger.setLevel(logging.INFO)

# Direct logging output to stdout (the default):
handler = logging.StreamHandler(stream=sys.stdout)
# Or direct logging output to a file:
# handler = logging.FileHandler(filename = 'sample.log')
logger.addHandler(handler)

# Optional: change the default logging format. Here we add a timestamp.
formatter = logging.Formatter("%(asctime)s:%(levelname)s:%(name)s:%(message)s")
handler.setFormatter(formatter)

De forma predeterminada, los registros redactan los valores de las cadenas de consulta de dirección URL, los valores de algunos encabezados de solicitud y respuesta HTTP (incluidos Ocp-Apim-Subscription-Key, que contienen la clave) y las cargas de solicitud y respuesta. Para crear registros sin redacción, establezca el argumento logging_enable = True del método al crear ImageAnalysisClient o al llamar a analyze en el cliente.

# Create an Image Analysis client with none redacted log
client = ImageAnalysisClient(
    endpoint=endpoint,
    credential=AzureKeyCredential(key),
    logging_enable=True
)

Los registros no redactados se generan solo para el nivel de registro logging.DEBUG. Asegúrese de proteger los registros no redactados para no comprometer la seguridad. Para obtener más información, consulte Configurar registro en las bibliotecas de Azure para Python

Requisitos previos

En esta guía se asume que ha seguido los pasos descritos en la página de inicio rápido. Esto significa:

  • Ha creado un recurso de Computer Vision y se ha obtenido una clave y una dirección URL del punto de conexión.
  • Tiene instalado el paquete SDK adecuado y dispone de una aplicación de inicio rápido en ejecución. Puede modificar esta aplicación de inicio rápido según los ejemplos de código aquí.

Creación y autenticación del cliente

Para autenticarse con el servicio Análisis de imágenes, necesitará una clave de Computer Vision y una dirección URL del punto de conexión. En esta guía se asume que ha definido las variables de entorno VISION_KEY y VISION_ENDPOINT con la clave y el punto de conexión.

Sugerencia

No incluya la clave directamente en el código ni la exponga nunca públicamente. Consulte el artículo de Seguridad de los servicios de Azure AI para ver más opciones de autenticación, como Azure Key Vault.

Empiece por crear un objeto ImageAnalysisClient. Por ejemplo:

String endpoint = System.getenv("VISION_ENDPOINT");
String key = System.getenv("VISION_KEY");

if (endpoint == null || key == null) {
    System.out.println("Missing environment variable 'VISION_ENDPOINT' or 'VISION_KEY'.");
    System.out.println("Set them before running this sample.");
    System.exit(1);
}

// Create a synchronous Image Analysis client.
ImageAnalysisClient client = new ImageAnalysisClientBuilder()
    .endpoint(endpoint)
    .credential(new KeyCredential(key))
    .buildClient();

Seleccione la imagen que se vaya a analizar

Puede seleccionar una imagen proporcionando una dirección URL de imagen accesible públicamente o leyendo datos de imagen en el búfer de entrada del SDK. Consulte Requisitos de imagen para conocer los formatos de imagen admitidos.

URL de imagen

Cree una cadena de imageUrl para contener la dirección URL accesible públicamente de la imagen que desea analizar.

String imageUrl = "https://learn.microsoft.com/azure/ai-services/computer-vision/media/quickstarts/presentation.png";

Búfer de imágenes

Como alternativa, puede pasar la imagen como búfer de memoria mediante un objeto BinaryData. Por ejemplo, lea desde un archivo de imagen local que quiera analizar.

BinaryData imageData = BinaryData.fromFile(new File("sample.png").toPath());

Selección de características visuales

La API Image Analysis 4.0 proporciona acceso a todas las características de análisis de imágenes del servicio. Elija qué operaciones realizar en función de su propio caso de uso. Consulte la información general para obtener una descripción de cada característica. En el ejemplo de esta sección se agregan todas las características visuales disponibles, pero para un uso práctico es probable que necesite menos.

Importante

Las funciones visuales Captions y DenseCaptions solo son compatibles en las siguientes regiones de Azure: Este de EE. UU., Centro de Francia, Centro de Corea del Sur, Norte de Europa, Sudeste de Asia, Oeste de Europa y Oeste de EE. UU.

// visualFeatures: Select one or more visual features to analyze.
List<VisualFeatures> visualFeatures = Arrays.asList(
            VisualFeatures.SMART_CROPS,
            VisualFeatures.CAPTION,
            VisualFeatures.DENSE_CAPTIONS,
            VisualFeatures.OBJECTS,
            VisualFeatures.PEOPLE,
            VisualFeatures.READ,
            VisualFeatures.TAGS);

Seleccionar opciones de análisis

Use un objeto ImageAnalysisOptions para especificar varias opciones para la llamada API de Analyze.

  • Idioma: se puede especificar el idioma de los datos devueltos. El idioma es opcional y el valor predeterminado es inglés. Consulte Compatibilidad con el idioma para obtener una lista de los códigos de idioma admitidos y qué características visuales se admiten para cada idioma.
  • Subtítulos neutros en cuanto al género si va a extraer subtítulos o subtítulos densos (mediante VisualFeatures.CAPTION o VisualFeatures.DENSE_CAPTIONS), puede solicitar subtítulos neutros en cuanto al género. Los subtítulos neutros en cuanto al género son opcionales, y el valor predeterminado es de subtítulos con género. Por ejemplo, en inglés, al seleccionar subtítulos neutros en cuanto al género, los términos como mujer u hombre se reemplazarían por persona y, niño o niña, se reemplazarían por menor.
  • Relación de aspecto de recorte: una relación de aspecto se calcula dividiendo el ancho del recorte de destino por el alto. Los valores admitidos van de 0,75 a 1,8 (ambos admitidos). Establecer esta propiedad solo es relevante cuando se seleccionó VisualFeatures.SMART_CROPS como parte de la lista de características visuales. Si selecciona VisualFeatures.SMART_CROPS pero no especifica las relaciones de aspecto, el servicio devolverá una sugerencia de recorte con una relación de aspecto que vea adecuada. En este caso, la relación de aspecto está entre 0,5 y 2,0 (ambos incluidos).
// Specify analysis options (or set `options` to null for defaults)
ImageAnalysisOptions options = new ImageAnalysisOptions()
    .setLanguage("en")
    .setGenderNeutralCaption(true)
    .setSmartCropsAspectRatios(Arrays.asList(0.9, 1.33, 1.78));

Llamada al método analyzeFromUrl

En esta sección se muestra cómo realizar una llamada de análisis al servicio.

Llame al método analyzeFromUrl en el objeto ImageAnalysisClient, como se muestra aquí. La llamada es sincrónica y se bloqueará hasta que el servicio devuelva los resultados o se produzca un error. Como alternativa, puede usar un objeto ImageAnalysisAsyncClient en su lugar y llamar a su método analyzeFromUrl que no está bloqueando.

Para analizar desde un búfer de imágenes en lugar de una dirección URL, llame al método analyze en su lugar y pase el imageData como primer argumento.

try {
    // Analyze all visual features from an image URL. This is a synchronous (blocking) call.
    ImageAnalysisResult result = client.analyzeFromUrl(
        imageUrl,
        visualFeatures,
        options);

    printAnalysisResults(result);

} catch (HttpResponseException e) {
    System.out.println("Exception: " + e.getClass().getSimpleName());
    System.out.println("Status code: " + e.getResponse().getStatusCode());
    System.out.println("Message: " + e.getMessage());
} catch (Exception e) {
    System.out.println("Message: " + e.getMessage());
}

Obtención de resultados a partir del servicio

En el código siguiente se muestra cómo analizar los resultados de las operaciones analyzeFromUrl y analyze.

// Print all analysis results to the console
public static void printAnalysisResults(ImageAnalysisResult result) {

    System.out.println("Image analysis results:");

    if (result.getCaption() != null) {
        System.out.println(" Caption:");
        System.out.println("   \"" + result.getCaption().getText() + "\", Confidence "
            + String.format("%.4f", result.getCaption().getConfidence()));
    }

    if (result.getDenseCaptions() != null) {
        System.out.println(" Dense Captions:");
        for (DenseCaption denseCaption : result.getDenseCaptions().getValues()) {
            System.out.println("   \"" + denseCaption.getText() + "\", Bounding box "
                + denseCaption.getBoundingBox() + ", Confidence " + String.format("%.4f", denseCaption.getConfidence()));
        }
    }

    if (result.getRead() != null) {
        System.out.println(" Read:");
        for (DetectedTextLine line : result.getRead().getBlocks().get(0).getLines()) {
            System.out.println("   Line: '" + line.getText()
                + "', Bounding polygon " + line.getBoundingPolygon());
            for (DetectedTextWord word : line.getWords()) {
                System.out.println("     Word: '" + word.getText()
                    + "', Bounding polygon " + word.getBoundingPolygon()
                    + ", Confidence " + String.format("%.4f", word.getConfidence()));
            }
        }
    }

    if (result.getTags() != null) {
        System.out.println(" Tags:");
        for (DetectedTag tag : result.getTags().getValues()) {
            System.out.println("   \"" + tag.getName() + "\", Confidence " + String.format("%.4f", tag.getConfidence()));
        }
    }

    if (result.getObjects() != null) {
        System.out.println(" Objects:");
        for (DetectedObject detectedObject : result.getObjects().getValues()) {
            System.out.println("   \"" + detectedObject.getTags().get(0).getName() + "\", Bounding box "
                + detectedObject.getBoundingBox() + ", Confidence " + String.format("%.4f", detectedObject.getTags().get(0).getConfidence()));
        }
    }

    if (result.getPeople() != null) {
        System.out.println(" People:");
        for (DetectedPerson person : result.getPeople().getValues()) {
            System.out.println("   Bounding box "
                + person.getBoundingBox() + ", Confidence " + String.format("%.4f", person.getConfidence()));
        }
    }

    if (result.getSmartCrops() != null) {
        System.out.println(" Crop Suggestions:");
        for (CropRegion cropRegion : result.getSmartCrops().getValues()) {
            System.out.println("   Aspect ratio "
                + cropRegion.getAspectRatio() + ": Bounding box " + cropRegion.getBoundingBox());
        }
    }

    System.out.println(" Image height = " + result.getMetadata().getHeight());
    System.out.println(" Image width = " + result.getMetadata().getWidth());
    System.out.println(" Model version = " + result.getModelVersion());
}

Solución de problemas

Excepciones

Los métodos analyze inician HttpResponseException cuando el servicio responde con un código de estado HTTP no correcto. El getResponse().getStatusCode() de la excepción contiene el código de estado de respuesta HTTP. El getMessage() de la excepción contiene un mensaje detallado que le permite diagnosticar el problema:

try {
    ImageAnalysisResult result = client.analyze(...)
} catch (HttpResponseException e) {
    System.out.println("Exception: " + e.getClass().getSimpleName());
    System.out.println("Status code: " + e.getResponse().getStatusCode());
    System.out.println("Message: " + e.getMessage());
} catch (Exception e) {
    System.out.println("Message: " + e.getMessage());
}

Por ejemplo, cuando se proporciona una clave de autenticación incorrecta:

Exception: ClientAuthenticationException
Status code: 401
Message: Status code 401, "{"error":{"code":"401","message":"Access denied due to invalid subscription key or wrong API endpoint. Make sure to provide a valid key for an active subscription and use a correct regional API endpoint for your resource."}}"

O cuando se proporciona una imagen en un formato que no se reconoce:

Exception: HttpResponseException
Status code: 400
Message: Status code 400, "{"error":{"code":"InvalidRequest","message":"Image format is not valid.","innererror":{"code":"InvalidImageFormat","message":"Input data is not a valid image."}}}"

Habilitar el registro de solicitud y respuesta HTTP

Revisar la solicitud HTTP enviada o la respuesta recibida a través de la conexión al servicio Análisis de imágenes puede resultar útil para solucionar problemas. La biblioteca cliente de Análisis de imágenes admite un marco de registro de consola integrado con fines de depuración temporal. También admite un registro más avanzado mediante la interfaz SLF4J. Para obtener información detallada, consulte Usar el registro en el SDK de Azure para Java.

En las secciones siguientes se describe cómo habilitar el registro de consola mediante el marco integrado.

Estableciendo variables de entorno

Puede habilitar el registro de consola de la solicitud y respuesta HTTP para toda la aplicación estableciendo las dos variables de entorno siguientes. Este cambio afecta a todos los clientes de Azure que admiten el registro de solicitud y respuesta HTTP.

  • Establezca la variable de entorno AZURE_LOG_LEVEL en debug
  • Establezca la variable de entorno AZURE_HTTP_LOG_DETAIL_LEVEL en uno de los siguientes valores:
Value Nivel de registro
none El registro de solicitud/respuesta HTTP está deshabilitado
basic Registra solo direcciones URL, métodos HTTP y el tiempo para finalizar la solicitud.
headers Registra todo en BÁSICO, además de todos los encabezados de solicitud y respuesta.
body Registra todo en BÁSICO, además de todo el cuerpo de solicitud y respuesta.
body_and_headers Registra todo en ENCABEZADOS y CUERPO.

Estableciendo httpLogOptions

Para habilitar el registro de consola de la solicitud y respuesta HTTP de un solo cliente

  • Establezca la variable de entorno AZURE_LOG_LEVEL en debug
  • Agregue una llamada a httpLogOptions al compilar el ImageAnalysisClient:
ImageAnalysisClient client = new ImageAnalysisClientBuilder()
    .endpoint(endpoint)
    .credential(new KeyCredential(key))
    .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS))
    .buildClient();

La enumeración HttpLogDetailLevel define los niveles de registro admitidos.

De forma predeterminada, al registrar, se redactan determinados valores de encabezado HTTP y parámetros de consulta. Es posible invalidar este valor predeterminado especificando qué encabezados y parámetros de consulta son seguros para registrar:

ImageAnalysisClient client = new ImageAnalysisClientBuilder()
    .endpoint(endpoint)
    .credential(new KeyCredential(key))
    .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)
        .addAllowedHeaderName("safe-to-log-header-name")
        .addAllowedQueryParamName("safe-to-log-query-parameter-name"))
    .buildClient();

Por ejemplo, para obtener un registro completo no redactado de la solicitud HTTP, aplique lo siguiente:

    .httpLogOptions(new HttpLogOptions().setLogLevel(HttpLogDetailLevel.BODY_AND_HEADERS)
        .addAllowedHeaderName("Ocp-Apim-Subscription-Key")
        .addAllowedQueryParamName("features")
        .addAllowedQueryParamName("language")
        .addAllowedQueryParamName("gender-neutral-caption")
        .addAllowedQueryParamName("smartcrops-aspect-ratios")
        .addAllowedQueryParamName("model-version"))

Agregue más a lo anterior para obtener una respuesta HTTP no redactada. Al compartir un registro no redactado, asegúrese de que no contiene secretos como la clave de suscripción.

Requisitos previos

En esta guía se asume que ha seguido correctamente los pasos mencionados en el inicio rápido. Esto significa:

  • Ha creado un recurso de Computer Vision y se ha obtenido una clave y una dirección URL del punto de conexión.
  • Tiene instalado el paquete SDK adecuado y dispone de una aplicación de inicio rápido en ejecución. Puede modificar esta aplicación de inicio rápido según los ejemplos de código aquí.

Creación y autenticación del cliente

Para autenticarse en el servicio Image Analysis, necesitará una clave de Computer Vision y una dirección URL del punto de conexión. En esta guía se asume que ha definido las variables de entorno VISION_KEY y VISION_ENDPOINT con la clave y el punto de conexión.

Sugerencia

No incluya la clave directamente en el código ni la exponga nunca públicamente. Consulte el artículo de Seguridad de los servicios de Azure AI para ver más opciones de autenticación, como Azure Key Vault.

Empiece por crear un objeto ImageAnalysisClient. Por ejemplo:

// Load the .env file if it exists
require("dotenv").config();

const endpoint = process.env['VISION_ENDPOINT'] || '<your_endpoint>';
const key = process.env['VISION_KEY'] || '<your_key>';

const credential = new AzureKeyCredential(key);
const client = createClient(endpoint, credential);

Seleccione la imagen que se vaya a analizar

Puede seleccionar una imagen proporcionando una dirección URL de imagen accesible públicamente o leyendo datos de imagen en el búfer de entrada del SDK. Consulte Requisitos de imagen para conocer los formatos de imagen admitidos.

URL de imagen

Puede utilizar al siguiente dirección URL de imagen de ejemplo.

const imageUrl = 'https://learn.microsoft.com/azure/ai-services/computer-vision/media/quickstarts/presentation.png';

Búfer de imágenes

Como alternativa, puede pasar la imagen como una matriz de datos. Por ejemplo, lea desde un archivo de imagen local que quiera analizar.

const imagePath = '../sample.jpg';
const imageData = fs.readFileSync(imagePath);

Selección de características visuales

La API Image Analysis 4.0 proporciona acceso a todas las características de análisis de imágenes del servicio. Elija qué operaciones realizar en función de su propio caso de uso. Consulte la información general para obtener una descripción de cada característica. En el ejemplo de esta sección se agregan todas las características visuales disponibles, pero para un uso práctico es probable que necesite menos.

const features = [
  'Caption',
  'DenseCaptions',
  'Objects',
  'People',
  'Read',
  'SmartCrops',
  'Tags'
];

Llamar a la API Analyze con opciones

El código siguiente llama a la API Analyze con las características que seleccionó anteriormente y opciones adicionales, definidas a continuación. Para analizar desde un búfer de imágenes en lugar de una dirección URL, reemplace imageURL en la llamada de método por imageData.

const result = await client.path('/imageanalysis:analyze').post({
  body: {
      url: imageUrl
  },
  queryParameters: {
      features: features,
      'language': 'en',
      'gender-neutral-captions': 'true',
      'smartCrops-aspect-ratios': [0.9, 1.33]
  },
  contentType: 'application/json'
});

Seleccionar las relaciones de aspecto de recorte inteligente

Una relación de aspecto se calcula dividiendo el ancho del recorte de destino por el alto. Los valores admitidos van de 0,75 a 1,8 (ambos admitidos). Establecer esta propiedad solo es relevante cuando se seleccionó visualFeatures.SmartCrops como parte de la lista de características visuales. Si selecciona VisualFeatures.SmartCrops pero no especifica las relaciones de aspecto, el servicio devolverá una sugerencia de recorte con una relación de aspecto que vea adecuada. En este caso, la relación de aspecto está entre 0,5 y 2,0 (ambos incluidos).

Selección de subtítulos neutros en cuanto al género

Si va a extraer subtítulos o subtítulos densos (mediante VisualFeatures.Caption o VisualFeatures.DenseCaptions), puede solicitar subtítulos neutros en cuanto al género. Los subtítulos neutros en cuanto al género son opcionales, y el valor predeterminado es de subtítulos con género. Por ejemplo, en inglés, al seleccionar subtítulos neutros en cuanto al género, los términos como mujer u hombre se reemplazarían por persona y, niño o niña, se reemplazarían por menor.

Especificación de idiomas

Se puede especificar el idioma de los datos devueltos. El idioma es opcional y el valor predeterminado es inglés. Consulte Compatibilidad con el idioma para obtener una lista de los códigos de idioma admitidos y qué características visuales se admiten para cada idioma.

Obtención de resultados a partir del servicio

En el código siguiente se muestra cómo analizar los resultados de las distintas operaciones de Analyze.

const iaResult = result.body;

console.log(`Model Version: ${iaResult.modelVersion}`);
console.log(`Image Metadata: ${JSON.stringify(iaResult.metadata)}`);
if (iaResult.captionResult) {
  console.log(`Caption: ${iaResult.captionResult.text} (confidence: ${iaResult.captionResult.confidence})`);
}
if (iaResult.denseCaptionsResult) {
  iaResult.denseCaptionsResult.values.forEach(denseCaption => console.log(`Dense Caption: ${JSON.stringify(denseCaption)}`));
}
if (iaResult.objectsResult) {
  iaResult.objectsResult.values.forEach(object => console.log(`Object: ${JSON.stringify(object)}`));
}
if (iaResult.peopleResult) {
  iaResult.peopleResult.values.forEach(person => console.log(`Person: ${JSON.stringify(person)}`));
}
if (iaResult.readResult) {
  iaResult.readResult.blocks.forEach(block => console.log(`Text Block: ${JSON.stringify(block)}`));
}
if (iaResult.smartCropsResult) {
  iaResult.smartCropsResult.values.forEach(smartCrop => console.log(`Smart Crop: ${JSON.stringify(smartCrop)}`));
}
if (iaResult.tagsResult) {
  iaResult.tagsResult.values.forEach(tag => console.log(`Tag: ${JSON.stringify(tag)}`));
}

Solución de problemas

Registro

La habilitación del registro puede ayudar a descubrir información útil sobre los errores. Para ver un registro de solicitudes y respuestas HTTP, establezca la variable de entorno AZURE_LOG_LEVEL en info. Como alternativa, el registro se puede habilitar en tiempo de ejecución llamando a setLogLevel en @azure/logger:

const { setLogLevel } = require("@azure/logger");

setLogLevel("info");

Para obtener instrucciones más detalladas sobre cómo habilitar los registros, consulte los documentos del paquete @azure/logger.

Requisitos previos

En esta guía se asume que ha seguido correctamente los pasos mencionados en la página de inicio rápido. Esto significa:

  • Ha creado un recurso de Computer Vision y se ha obtenido una clave y una dirección URL del punto de conexión.
  • Ha realizado correctamente una curl.exellamada al servicio (o ha utilizado una herramienta alternativa). La llamada curl.exe se modifica en función de los ejemplos aquí.

Autenticación en el servicio

Para autenticarse en el servicio Image Analysis, necesitará una clave de Computer Vision y una dirección URL del punto de conexión.

Sugerencia

No incluya la clave directamente en el código ni la exponga nunca públicamente. Consulte el artículo de Seguridad de los servicios de Azure AI para ver más opciones de autenticación, como Azure Key Vault.

En el ejemplo del SDK se asume que ha definido las variables de entorno VISION_KEY y VISION_ENDPOINT con la clave y el punto de conexión.

La autenticación se realiza agregando el encabezado de solicitud HTTP Ocp-Apim-Subscription-Key y estableciéndolo en la clave de visión. La llamada se realiza a la dirección URL <endpoint>/computervision/imageanalysis:analyze?api-version=2024-02-01, donde <endpoint> es la dirección URL única del punto de conexión de Computer Vision. Agregue cadenas de consulta basadas en las opciones de análisis.

Seleccione la imagen que se vaya a analizar

El código de esta guía usa imágenes remotas referenciadas por URL. Es posible que desee probar diferentes imágenes por su cuenta para ver toda la capacidad de las funciones de análisis de imágenes.

Al analizar una imagen remota, se especifica la URL de la imagen formateando el cuerpo de la petición de la siguiente manera: {"url":"https://learn.microsoft.com/azure/cognitive-services/computer-vision/images/windows-kitchen.jpg"}. El Content-Type debería ser application/json.

Para analizar una imagen local, se ponen los datos binarios de la imagen en el cuerpo de la petición HTTP. El Content-Type debería ser application/octet-stream o multipart/form-data.

Seleccionar opciones de análisis

Seleccionar características visuales cuando se usa el modelo estándar

La API Image Analysis 4.0 proporciona acceso a todas las características de análisis de imágenes del servicio. Elija qué operaciones realizar en función de su propio caso de uso. Consulte la información general para obtener una descripción de cada característica. En el ejemplo de esta sección se agregan todas las características visuales disponibles, pero para un uso práctico es probable que necesite menos.

Las funciones visuales “Captions” y “DenseCaptions” solo son compatibles en las siguientes regiones de Azure: Este de EE. UU., Centro de Francia, Centro de Corea del Sur, Norte de Europa, Sudeste de Asia, Oeste de Europa y Oeste de EE. UU.

Nota

La API de REST usa los términos Recortes inteligentes y Relaciones de aspecto de los recortes inteligentes. El SDK usa los términos Sugerencias de recorte y Relaciones de aspecto de recorte. Ambos se refieren a la misma operación de servicio. De forma similar, la API REST usa el término Read para detectar texto en la imagen mediante reconocimiento óptico de caracteres (OCR), mientras que el SDK usa el término Text para la misma operación.

Puede especificar qué funciones quiere usar mediante la configuración de los parámetros de consulta de la URL de la API Image Analysis 4.0. Un parámetro puede tener varios valores, que se separan por comas.

Parámetro URL Value Descripción
features read Lee el texto visible en la imagen y lo genera como datos JSON estructurados.
features caption Describe el contenido de la imagen con una oración completa en los idiomas que se admiten.
features denseCaptions Genera subtítulos detallados para hasta 10 regiones destacadas de la imagen.
features smartCrops Busca las coordenadas del rectángulo que recortarán la imagen con la relación de aspecto deseada mientras conserva el área de interés.
features objects Detecta varios objetos en una imagen, incluida la ubicación aproximada. El argumento Objects solo está disponible en inglés.
features tags Etiqueta la imagen con una lista detallada de palabras relacionadas con el contenido de la imagen.
features people Detecta las personas que aparecen en imágenes, incluidas las ubicaciones aproximadas.

Una URL rellenada tiene el siguiente aspecto:

<endpoint>/computervision/imageanalysis:analyze?api-version=2024-02-01&features=tags,read,caption,denseCaptions,smartCrops,objects,people

Establezca el nombre del modelo cuando use un modelo personalizado

También puede realizar análisis de imágenes con un modelo entrenado personalizado. Para crear y entrenar un modelo, consulte Creación de un modelo personalizado de Image Analysis (versión preliminar). Después de entrenar el modelo, todo lo que necesita es el nombre del modelo. No es necesario especificar las características visuales si se usa un modelo personalizado.

Para usar un modelo personalizado, no use el parámetro de consulta de características. En su lugar, establezca el parámetro model-name al nombre del modelo, tal y como se muestra aquí. Reemplace MyCustomModelName por el nombre del modelo personalizado.

<endpoint>/computervision/imageanalysis:analyze?api-version=2023-02-01&model-name=MyCustomModelName

Especificación de idiomas

Se puede especificar el idioma de los datos devueltos. El idioma es opcional y el valor predeterminado es inglés. Consulte Compatibilidad con el idioma para obtener una lista de los códigos de idioma admitidos y qué características visuales se admiten para cada idioma.

La opción de lenguaje solo se aplica cuando usa el modelo estándar.

El siguiente parámetro de consulta de la dirección URL especifica el idioma. El valor predeterminado es en.

Parámetro URL Value Descripción
language en Inglés
language es Español
language ja Japonés
language pt Portugués
language zh Chino simplificado

Una URL rellenada tiene el siguiente aspecto:

<endpoint>/computervision/imageanalysis:analyze?api-version=2024-02-01&features=caption&language=en

Selección de subtítulos neutros en cuanto al género

Si está extrayendo subtítulos o subtítulos densos, puede solicitar subtítulos neutros en cuanto al género. Los subtítulos neutros en cuanto al género son opcionales, y el valor predeterminado es de subtítulos con género. Por ejemplo, en inglés, al seleccionar subtítulos neutros en cuanto al género, los términos como mujer u hombre se reemplazarían por persona y, niño o niña, se reemplazarían por menor.

La opción de subtítulos de género neutral solo se aplica cuando está usando el modelo estándar.

Agregue la cadena de consulta opcional gender-neutral-caption con los valores true o false (valor predeterminado).

Una URL rellenada tiene el siguiente aspecto:

<endpoint>/computervision/imageanalysis:analyze?api-version=2024-02-01&features=caption&gender-neutral-caption=true

Seleccionar las relaciones de aspecto de recorte inteligente

Una relación de aspecto se calcula dividiendo el ancho del recorte de destino por el alto. Los valores admitidos van de 0,75 a 1,8 (ambos admitidos). Establecer esta propiedad solo es relevante cuando se seleccionó visualFeatures.SmartCrops como parte de la lista de características visuales. Si selecciona VisualFeatures.SmartCrops pero no especifica las relaciones de aspecto, el servicio devolverá una sugerencia de recorte con una relación de aspecto que vea adecuada. En este caso, la relación de aspecto está entre 0,5 y 2,0 (ambos incluidos).

Las relaciones de aspecto de recorte inteligente solo se aplican cuando se usa el modelo estándar.

Agregue la cadena de consulta opcional smartcrops-aspect-ratios, con una o varias relaciones de aspecto separadas por una coma.

Una URL rellenada tiene el siguiente aspecto:

<endpoint>/computervision/imageanalysis:analyze?api-version=2024-02-01&features=smartCrops&smartcrops-aspect-ratios=0.8,1.2

Obtención de resultados a partir del servicio

Obtención de resultados con el modelo estándar

En esta sección, se muestra cómo realizar llamadas de análisis al servicio mediante el modelo estándar y obtener los resultados.

El servicio devuelve una respuesta HTTP 200y el cuerpo contiene los datos devueltos en forma de cadena JSON. El texto siguiente es un ejemplo de una respuesta JSON.

{
    "modelVersion": "string",
    "captionResult": {
      "text": "string",
      "confidence": 0.0
    },
    "denseCaptionsResult": {
      "values": [
        {
          "text": "string",
          "confidence": 0.0,
          "boundingBox": {
            "x": 0,
            "y": 0,
            "w": 0,
            "h": 0
          }
        }
      ]
    },
    "metadata": {
      "width": 0,
      "height": 0
    },
    "tagsResult": {
      "values": [
        {
          "name": "string",
          "confidence": 0.0
        }
      ]
    },
    "objectsResult": {
      "values": [
        {
          "id": "string",
          "boundingBox": {
            "x": 0,
            "y": 0,
            "w": 0,
            "h": 0
          },
          "tags": [
            {
              "name": "string",
              "confidence": 0.0
            }
          ]
        }
      ]
    },
    "readResult": {
      "blocks": [
        {
          "lines": [
            {
              "text": "string",
              "boundingPolygon": [
                {
                  "x": 0,
                  "y": 0
                },
                {
                    "x": 0,
                    "y": 0
                },
                {
                    "x": 0,
                    "y": 0
                },
                {
                    "x": 0,
                    "y": 0
                }
              ],
              "words": [
                {
                  "text": "string",
                  "boundingPolygon": [
                    {
                        "x": 0,
                        "y": 0
                    },
                    {
                        "x": 0,
                        "y": 0
                    },
                    {
                        "x": 0,
                        "y": 0
                    },
                    {
                        "x": 0,
                        "y": 0
                    }
                  ],
                  "confidence": 0.0
                }
              ]
            }
          ]
        }
      ]
    },
    "smartCropsResult": {
      "values": [
        {
          "aspectRatio": 0.0,
          "boundingBox": {
            "x": 0,
            "y": 0,
            "w": 0,
            "h": 0
          }
        }
      ]
    },
    "peopleResult": {
      "values": [
        {
          "boundingBox": {
            "x": 0,
            "y": 0,
            "w": 0,
            "h": 0
          },
          "confidence": 0.0
        }
      ]
    }
  }

Códigos de error

En caso de error, la respuesta del servicio Image Analysis contendrá una carga JSON que incluye un código de error y un mensaje de error. También puede incluir otros detalles en forma de código de error interno y mensaje. Por ejemplo:

{
    "error":
    {
        "code": "InvalidRequest",
        "message": "Analyze query is invalid.",
        "innererror":
        {
            "code": "NotSupportedVisualFeature",
            "message": "Specified feature type is not valid"
        }
    }
}

A continuación, se muestra una lista de errores comunes y sus causas. Los elementos de lista se presentan en el siguiente formato:

  • Código de respuesta HTTP
    • Código de error y mensaje en la respuesta JSON
      • [Opcional] Código de error interno y mensaje en la respuesta JSON

Lista de errores comunes:

  • 400 Bad Request
    • InvalidRequest - Image URL is badly formatted or not accessible. Asegúrese de que la dirección URL de la imagen sea válida y accesible públicamente.
    • InvalidRequest - The image size is not allowed to be zero or larger than 20971520 bytes. Reduzca el tamaño de la imagen comprimiéndola o redimensionándola y vuelva a enviar la solicitud.
    • InvalidRequest - The feature 'Caption' is not supported in this region. Esta característica solo se admite en determinadas regiones de Azure. Consulte Requisitos previos de inicio rápido para obtener la lista de regiones de Azure admitidas.
    • InvalidRequest - The provided image content type ... is not supported. El encabezado HTTP Content-Type de la solicitud no es un tipo permitido:
      • Para una dirección URL de imagen, Content-Type debería ser application/json
      • En el caso de los datos de imagen binarios, Content-Type debería ser application/octet-stream o multipart/form-data
    • InvalidRequest - Either 'features' or 'model-name' needs to be specified in the query parameter.
    • InvalidRequest - Image format is not valid
      • InvalidImageFormat - Image format is not valid. Consulte la sección Requisitos de imagen para conocer los formatos de imagen admitidos.
    • InvalidRequest - Analyze query is invalid
      • NotSupportedVisualFeature - Specified feature type is not valid. Asegúrese de que la cadena de consulta de características tenga un valor válido.
      • NotSupportedLanguage - The input language is not supported. Asegúrese de que la cadena de consulta de lenguaje tenga un valor válido para la característica visual seleccionada, en función de la tabla siguiente.
      • BadArgument - 'smartcrops-aspect-ratios' aspect ratio is not in allowed range [0.75 to 1.8]
  • 401 PermissionDenied
    • 401 - Access denied due to invalid subscription key or wrong API endpoint. Make sure to provide a valid key for an active subscription and use a correct regional API endpoint for your resource.
  • 404 Resource Not Found
    • 404 - Resource not found. El servicio no pudo encontrar el modelo personalizado en función del nombre proporcionado por la cadena de consulta model-name.

Pasos siguientes