Documentación de la API de análisis facial

Envía una imagen y recibe un array JSON faces. Cada rostro contiene las funciones solicitadas. Una imagen válida sin rostros detectados devuelve un array vacío.

Haz tu primera solicitud

Usa tu token API y una imagen local. Estos ejemplos solicitan solo los cuadros de los rostros para comprobar la integración con cualquier imagen compatible.

Inicia sesión para ver tu token en los ejemplos. Si no, sustituye TOKEN por el token de tu panel.

cURL

curl --request POST 'https://www.rosto.io/api/v1/features' \
  --header 'Authorization: Bearer TOKEN' \
  --form 'features=bounds' \
  --form 'image=@photo.jpg'

Python 3

import requests

with open("photo.jpg", "rb") as image_file:
    response = requests.post(
        "https://www.rosto.io/api/v1/features",
        headers={"Authorization": "Bearer TOKEN"},
        data={"features": "bounds"},
        files={"image": image_file},
        timeout=90,
    )
response.raise_for_status()
print(response.json())

Ruby

require 'json'
require 'faraday'

connection = Faraday.new('https://www.rosto.io') do |http|
  http.request :multipart
  http.adapter Faraday.default_adapter
end
response = connection.post('/api/v1/features') do |request|
  request.headers['Authorization'] = 'Bearer TOKEN'
  request.body = {
    features: 'bounds',
    image: Faraday::UploadIO.new('photo.jpg', 'image/jpeg')
  }
end
puts JSON.parse(response.body)

Entiende la respuesta

Esta respuesta ilustrativa contiene un rostro detectado. Las coordenadas y predicciones dependen de la imagen; los valores de ejemplo no garantizan resultados.

{
  "faces": [
    {"bounds": {"left": 35, "top": 77, "right": 221, "bottom": 263}}
  ]
}

Envía una URL pública de imagen

En lugar de subir un archivo, envía url con una imagen HTTPS pública. Se rechazan las direcciones de red privada y las imágenes no compatibles.

curl --request POST 'https://www.rosto.io/api/v1/features' \
  --header 'Authorization: Bearer TOKEN' \
  --data-urlencode 'features=bounds,landmarks' \
  --data-urlencode 'url=https://example.com/photo.jpg'

Elige las funciones

Envía nombres separados por comas en un formulario, o un array features en JSON. Omite features para solicitarlas todas. Pedir solo lo necesario reduce el procesamiento.

bounds · Detección de rostros

Localiza rostros y obtén sus cuadros delimitadores.

{
  "faces": [
    {
      "bounds": {
        "left": 35,
        "top": 77,
        "right": 221,
        "bottom": 263
      }
    }
  ]
}

landmarks · Puntos faciales

Obtén puntos de contorno de ojos, nariz, boca y mandíbula.

{
  "faces": [
    {
      "landmarks": {
        "left_eye_center": {
          "x": 160,
          "y": 132
        },
        "right_eye_center": {
          "x": 99,
          "y": 132
        },
        "mouth_center": {
          "x": 129,
          "y": 203
        }
      }
    }
  ]
}

age · Estimación de edad

Obtén la estimación de edad del modelo para cada rostro.

{
  "faces": [
    {
      "age": 20
    }
  ]
}

gender · Presentación visual

Las clases heredadas man/woman describen la presentación visual, no la identidad de género.

{
  "faces": [
    {
      "gender": {
        "value": "man",
        "probability": 0.84,
        "classes": {
          "man": 0.84,
          "woman": 0.16
        }
      }
    }
  ]
}

emotion · Puntuaciones de expresión

Obtén las puntuaciones del modelo para siete categorías de expresión facial.

{
  "faces": [
    {
      "emotion": {
        "value": "neutral",
        "probability": 0.71,
        "classes": {
          "angry": 0.08,
          "disgust": 0.0,
          "fear": 0.02,
          "happy": 0.02,
          "neutral": 0.71,
          "sad": 0.16,
          "surprise": 0.0
        }
      }
    }
  ]
}

ethnicity · Puntuaciones de clases heredadas

El campo ethnicity devuelve las puntuaciones de clases del modelo existente.

{
  "faces": [
    {
      "ethnicity": {
        "value": "white",
        "probability": 0.9,
        "classes": {
          "asian": 0.03,
          "black": 0.02,
          "indian": 0.05,
          "white": 0.9
        }
      }
    }
  ]
}

glasses · Detección de gafas

Distingue gafas, gafas de natación y ausencia de gafas.

{
  "faces": [
    {
      "glasses": {
        "value": "not-using-glasses",
        "probability": 0.95,
        "classes": {
          "not-using-glasses": 0.95,
          "using-glasses": 0.04,
          "swimming-goggles": 0.01
        }
      }
    }
  ]
}

smile · Detección de sonrisa

Obtén una predicción de sonrisa y su probabilidad.

{
  "faces": [
    {
      "smile": {
        "is_smiling": false,
        "probability": 0.2
      }
    }
  ]
}

hair · Segmentación del cabello

Obtén los contornos del cabello y su color dominante.

{
  "faces": [
    {
      "hair": {
        "polygons": [
          [
            {
              "x": 40,
              "y": 30
            },
            {
              "x": 75,
              "y": 10
            },
            {
              "x": 110,
              "y": 35
            }
          ]
        ],
        "color": {
          "name": "black",
          "hex": "#131218"
        }
      }
    }
  ]
}

pose · Orientación de la cabeza

Mide los ángulos de giro, inclinación lateral e inclinación vertical.

{
  "faces": [
    {
      "pose": {
        "x_roll": -5,
        "y_pitch": -5,
        "z_yaw": 6
      }
    }
  ]
}

quality · Calidad de imagen

Comprueba el desenfoque y la exposición de una imagen.

{
  "faces": [
    {
      "blur": {
        "is_blurry": false
      },
      "exposure": {
        "level": "balanced"
      }
    }
  ]
}

Los resultados de los modelos son estimaciones. Las clases forman parte del contrato heredado de la API y no establecen la identidad de una persona.

Formatos, límites y errores

Se admiten imágenes JPEG, PNG, WebP y BMP de hasta 4 MiB. Las solicitudes JSON pueden incluir una imagen en base64. Usa tu token; la demo anónima tiene sus propios límites.

Estado HTTPSignificado
200Análisis correcto. Una imagen válida puede no contener rostros.
400Imagen, selección de funciones o URL no válida. Consulta el mensaje JSON.
401Token API ausente o no válido.
429Límite mensual o frecuencia de solicitudes superado. Consulta las cabeceras.
502 / 503 / 504Servicio temporalmente no disponible. Inténtalo más tarde.

Las solicitudes correctas cuentan una vez, incluso sin rostros detectados. Los errores no cuentan. Los límites mensuales se reinician en UTC; X-Quota-Limit, X-Quota-Remaining y X-Quota-Reset describen la cuota actual.