Inicio rápido: Uso de la biblioteca cliente de Face
Comience a usar el reconocimiento facial con la biblioteca cliente de Face para .NET. Siga estos pasos para instalar el paquete y probar el código de ejemplo para realizar tareas básicas. El servicio Face le proporciona acceso a algoritmos avanzados para detectar y reconocer rostros humanas en imágenes.
Use la biblioteca cliente de Face para .NET para:
Documentación de referencia | Código fuente de la biblioteca | Paquete (NuGet) | Ejemplos
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- El IDE de Visual Studio o la versión actual de .NET Core.
- La cuenta de Azure debe tener asignado un rol de colaborador de Cognitive Services a fin de que pueda aceptar los términos de IA responsable y crear un recurso. Póngase en contacto con el administrador para asignar este rol a su cuenta.
- Una vez que tenga la suscripción de Azure, cree un recurso de Face en Azure Portal para obtener la clave y el punto de conexión. Una vez que se implemente, haga clic en Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Face API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
- Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
Instalación
Creación de una aplicación de C#
En Visual Studio, cree una aplicación de .NET Core.
Instalación de la biblioteca cliente
Después de crear un proyecto, instale la biblioteca cliente; para ello, haga clic con el botón derecho en la solución del proyecto en el Explorador de soluciones y seleccione Administrar paquetes NuGet. En el administrador de paquetes que se abre, seleccione Examinar Incluir versión preliminar y busque Microsoft.Azure.CognitiveServices.Vision.Face. Seleccione la versión 2.7.0-preview.1 e Instalar.
Sugerencia
¿Desea ver todo el archivo de código de inicio rápido de una vez? Puede encontrarlo en GitHub, que contiene los ejemplos de código de este inicio rápido.
En el directorio del proyecto, abra el archivo program.cs y agregue lo siguiente mediante directivas using:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Azure.CognitiveServices.Vision.Face;
using Microsoft.Azure.CognitiveServices.Vision.Face.Models;
En la clase Program de la aplicación, cree variables para el punto de conexión y la clave del recurso.
Importante
Vaya a Azure Portal. Si el recurso de Face que ha creado en la sección Requisitos previos se ha implementado correctamente, haga clic en el botón Ir al recurso en Pasos siguientes. Puede encontrar su clave y punto de conexión en la página de clave y punto de conexión del recurso, en Administración de recursos.
Recuerde quitar la clave del código cuando haya terminado y no hacerla nunca pública. En el caso de producción, considere la posibilidad de usar alguna forma segura de almacenar las credenciales, y acceder a ellas. Para más información, consulte el artículo sobre la seguridad de Cognitive Services.
// From your Face subscription in the Azure portal, get your subscription key and endpoint.
const string SUBSCRIPTION_KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE";
const string ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE";
En el método Main de la aplicación, agregue llamadas para los métodos que se usan en este inicio rápido. Las implementará más adelante.
// Authenticate.
IFaceClient client = Authenticate(ENDPOINT, SUBSCRIPTION_KEY);
// Detect - get features from faces.
DetectFaceExtract(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Find Similar - find a similar face from a list of faces.
FindSimilar(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Verify - compare two images if the same person or not.
Verify(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Identify - recognize a face(s) in a person group (a person group is created in this example).
IdentifyInPersonGroup(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// LargePersonGroup - create, then get data.
LargePersonGroup(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// Group faces - automatically group similar faces.
Group(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// FaceList - create a face list, then get data
Modelo de objetos
Las siguientes clases e interfaces controlan algunas de las características principales de la biblioteca cliente de .NET para Face:
| Nombre | Descripción |
|---|---|
| FaceClient | Esta clase representa la autorización para usar el servicio Face, se necesita para que Face funcione correctamente. Cree una instancia de ella con la información de suscripción y úsela para generar instancias de otras clases. |
| FaceOperations | Esta clase controla las tareas básicas de detección y reconocimiento que puede realizar con las caras humanas. |
| DetectedFace | Esta clase representa todos los datos que se detectaron de una única cara en una imagen. Puede usarla para recuperar información detallada sobre la cara. |
| FaceListOperations | Esta clase administra las construcciones FaceList almacenadas en la nube, que almacenan a su vez un conjunto ordenado de caras. |
| PersonGroupPersonExtensions | Esta clase administra las construcciones Person almacenadas en la nube, que almacenan a su vez un conjunto de caras que pertenecen a una sola persona. |
| PersonGroupOperations | Esta clase administra las construcciones PersonGroup almacenadas en la nube, que almacenan a su vez un conjunto de objetos Person ordenados. |
Ejemplos de código
En estos fragmentos de código se muestra cómo realizar las siguientes tareas con la biblioteca cliente de Face para .NET:
- Autenticar el cliente
- Detección y análisis de caras
- Identificación de una cara
- Búsqueda de caras similares
Autenticar el cliente
En un nuevo método, cree una instancia de un cliente con la clave y el punto de conexión. Cree un objeto ApiKeyServiceClientCredentials con la clave y úselo con el punto de conexión para crear un objeto FaceClient .
/*
* AUTHENTICATE
* Uses subscription key and region to create a client.
*/
public static IFaceClient Authenticate(string endpoint, string key)
{
return new FaceClient(new ApiKeyServiceClientCredentials(key)) { Endpoint = endpoint };
}
Declaración de campos auxiliares
Los siguientes campos son necesarios para algunas de las operaciones de Face que agregará más adelante. En la raíz de la clase Program, defina la siguiente cadena de dirección URL. Esta dirección URL señala a una carpeta de imágenes de ejemplo.
// Used for all examples.
// URL for the images.
const string IMAGE_BASE_URL = "https://csdx.blob.core.windows.net/resources/Face/Images/";
En el método Main, defina cadenas que apunten a los diferentes tipos de modelos de reconocimiento. Más adelante, podrá especificar qué modelo de reconocimiento desea usar para la detección de caras. Consulte Especificación de un modelo de reconocimiento para información sobre estas opciones.
// Recognition model 4 was released in 2021 February.
// It is recommended since its accuracy is improved
// on faces wearing masks compared with model 3,
// and its overall accuracy is improved compared
// with models 1 and 2.
const string RECOGNITION_MODEL4 = RecognitionModel.Recognition04;
Detección y análisis de caras
La detección de caras es necesaria como primer paso en todos los demás escenarios. En esta sección se muestra cómo devolver los datos de atributos de cara adicionales. Si solo desea detectar caras para la identificación o comprobación de caras, vaya a las secciones posteriores.
Obtención de los objetos faciales detectados
Cree un método para detectar caras. El método DetectFaceExtract procesa tres de las imágenes en la dirección URL especificada y crea una lista de objetos DetectedFace en la memoria del programa. La lista de valores FaceAttributeType especifica qué rasgos se van a extraer.
/*
* DETECT FACES
* Detects features from faces and IDs them.
*/
public static async Task DetectFaceExtract(IFaceClient client, string url, string recognitionModel)
{
Console.WriteLine("========DETECT FACES========");
Console.WriteLine();
// Create a list of images
List<string> imageFileNames = new List<string>
{
"detection1.jpg", // single female with glasses
// "detection2.jpg", // (optional: single man)
// "detection3.jpg", // (optional: single male construction worker)
// "detection4.jpg", // (optional: 3 people at cafe, 1 is blurred)
"detection5.jpg", // family, woman child man
"detection6.jpg" // elderly couple, male female
};
foreach (var imageFileName in imageFileNames)
{
IList<DetectedFace> detectedFaces;
// Detect faces with all attributes from image url.
detectedFaces = await client.Face.DetectWithUrlAsync($"{url}{imageFileName}",
returnFaceAttributes: new List<FaceAttributeType> { FaceAttributeType.Accessories, FaceAttributeType.Age,
FaceAttributeType.Blur, FaceAttributeType.Emotion, FaceAttributeType.Exposure, FaceAttributeType.FacialHair,
FaceAttributeType.Gender, FaceAttributeType.Glasses, FaceAttributeType.Hair, FaceAttributeType.HeadPose,
FaceAttributeType.Makeup, FaceAttributeType.Noise, FaceAttributeType.Occlusion, FaceAttributeType.Smile },
// We specify detection model 1 because we are retrieving attributes.
detectionModel: DetectionModel.Detection01,
recognitionModel: recognitionModel);
Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{imageFileName}`.");
Sugerencia
También puede detectar caras en una imagen local. Consulte los métodos IFaceOperations, como DetectWithStreamAsync.
Visualización de los datos faciales detectados
El resto del método DetectFaceExtract analiza e imprime los datos de atributo para cada una de las caras detectadas. Cada atributo debe especificarse por separado en la llamada API de detección de caras original (en la lista FaceAttributeType ). En el código siguiente se procesan todos los atributos, pero probablemente solo tendrá que usar uno o algunos.
// Parse and print all attributes of each detected face.
foreach (var face in detectedFaces)
{
Console.WriteLine($"Face attributes for {imageFileName}:");
// Get bounding box of the faces
Console.WriteLine($"Rectangle(Left/Top/Width/Height) : {face.FaceRectangle.Left} {face.FaceRectangle.Top} {face.FaceRectangle.Width} {face.FaceRectangle.Height}");
// Get accessories of the faces
List<Accessory> accessoriesList = (List<Accessory>)face.FaceAttributes.Accessories;
int count = face.FaceAttributes.Accessories.Count;
string accessory; string[] accessoryArray = new string[count];
if (count == 0) { accessory = "NoAccessories"; }
else
{
for (int i = 0; i < count; ++i) { accessoryArray[i] = accessoriesList[i].Type.ToString(); }
accessory = string.Join(",", accessoryArray);
}
Console.WriteLine($"Accessories : {accessory}");
// Get face other attributes
Console.WriteLine($"Age : {face.FaceAttributes.Age}");
Console.WriteLine($"Blur : {face.FaceAttributes.Blur.BlurLevel}");
// Get emotion on the face
string emotionType = string.Empty;
double emotionValue = 0.0;
Emotion emotion = face.FaceAttributes.Emotion;
if (emotion.Anger > emotionValue) { emotionValue = emotion.Anger; emotionType = "Anger"; }
if (emotion.Contempt > emotionValue) { emotionValue = emotion.Contempt; emotionType = "Contempt"; }
if (emotion.Disgust > emotionValue) { emotionValue = emotion.Disgust; emotionType = "Disgust"; }
if (emotion.Fear > emotionValue) { emotionValue = emotion.Fear; emotionType = "Fear"; }
if (emotion.Happiness > emotionValue) { emotionValue = emotion.Happiness; emotionType = "Happiness"; }
if (emotion.Neutral > emotionValue) { emotionValue = emotion.Neutral; emotionType = "Neutral"; }
if (emotion.Sadness > emotionValue) { emotionValue = emotion.Sadness; emotionType = "Sadness"; }
if (emotion.Surprise > emotionValue) { emotionType = "Surprise"; }
Console.WriteLine($"Emotion : {emotionType}");
// Get more face attributes
Console.WriteLine($"Exposure : {face.FaceAttributes.Exposure.ExposureLevel}");
Console.WriteLine($"FacialHair : {string.Format("{0}", face.FaceAttributes.FacialHair.Moustache + face.FaceAttributes.FacialHair.Beard + face.FaceAttributes.FacialHair.Sideburns > 0 ? "Yes" : "No")}");
Console.WriteLine($"Gender : {face.FaceAttributes.Gender}");
Console.WriteLine($"Glasses : {face.FaceAttributes.Glasses}");
// Get hair color
Hair hair = face.FaceAttributes.Hair;
string color = null;
if (hair.HairColor.Count == 0) { if (hair.Invisible) { color = "Invisible"; } else { color = "Bald"; } }
HairColorType returnColor = HairColorType.Unknown;
double maxConfidence = 0.0f;
foreach (HairColor hairColor in hair.HairColor)
{
if (hairColor.Confidence <= maxConfidence) { continue; }
maxConfidence = hairColor.Confidence; returnColor = hairColor.Color; color = returnColor.ToString();
}
Console.WriteLine($"Hair : {color}");
// Get more attributes
Console.WriteLine($"HeadPose : {string.Format("Pitch: {0}, Roll: {1}, Yaw: {2}", Math.Round(face.FaceAttributes.HeadPose.Pitch, 2), Math.Round(face.FaceAttributes.HeadPose.Roll, 2), Math.Round(face.FaceAttributes.HeadPose.Yaw, 2))}");
Console.WriteLine($"Makeup : {string.Format("{0}", (face.FaceAttributes.Makeup.EyeMakeup || face.FaceAttributes.Makeup.LipMakeup) ? "Yes" : "No")}");
Console.WriteLine($"Noise : {face.FaceAttributes.Noise.NoiseLevel}");
Console.WriteLine($"Occlusion : {string.Format("EyeOccluded: {0}", face.FaceAttributes.Occlusion.EyeOccluded ? "Yes" : "No")} " +
$" {string.Format("ForeheadOccluded: {0}", face.FaceAttributes.Occlusion.ForeheadOccluded ? "Yes" : "No")} {string.Format("MouthOccluded: {0}", face.FaceAttributes.Occlusion.MouthOccluded ? "Yes" : "No")}");
Console.WriteLine($"Smile : {face.FaceAttributes.Smile}");
Console.WriteLine();
}
}
}
Identificar una cara
La operación de identificación toma una imagen de una persona (o de varias) y busca el objeto de persona almacenado asociado a cada una de las caras de la imagen (búsqueda de reconocimiento facial). Compara cada cara detectada con un objeto PersonGroup, una base de datos con distintos objetos Person cuyos rasgos faciales se conocen. Para realizar la operación de identificación, primero debe crear y entrenar un objeto PersonGroup.
Creación de un elemento PersonGroup
En el siguiente código se crea un objeto PersonGroup con seis objetos Person distintos. Asocia cada objeto Person con un conjunto de imágenes de ejemplo y lo entrena para reconocer a cada persona por sus rasgos faciales. Los objetos Person y PersonGroup se utilizan en las operaciones de comprobación, identificación y agrupación.
Declare una variable de cadena en la raíz de la clase para representar el identificador del objeto PersonGroup que va a crear.
static string personGroupId = Guid.NewGuid().ToString();
En el método nuevo, agregue el siguiente código. Este método llevará a cabo la operación de identificación. El primer bloque de código asocia los nombres de las personas con sus imágenes de ejemplo.
public static async Task IdentifyInPersonGroup(IFaceClient client, string url, string recognitionModel)
{
Console.WriteLine("========IDENTIFY FACES========");
Console.WriteLine();
// Create a dictionary for all your images, grouping similar ones under the same key.
Dictionary<string, string[]> personDictionary =
new Dictionary<string, string[]>
{ { "Family1-Dad", new[] { "Family1-Dad1.jpg", "Family1-Dad2.jpg" } },
{ "Family1-Mom", new[] { "Family1-Mom1.jpg", "Family1-Mom2.jpg" } },
{ "Family1-Son", new[] { "Family1-Son1.jpg", "Family1-Son2.jpg" } },
{ "Family1-Daughter", new[] { "Family1-Daughter1.jpg", "Family1-Daughter2.jpg" } },
{ "Family2-Lady", new[] { "Family2-Lady1.jpg", "Family2-Lady2.jpg" } },
{ "Family2-Man", new[] { "Family2-Man1.jpg", "Family2-Man2.jpg" } }
};
// A group photo that includes some of the persons you seek to identify from your dictionary.
string sourceImageFileName = "identification1.jpg";
Tenga en cuenta que este código define una variable sourceImageFileName. Esta variable corresponde a la imagen de origen: la imagen que contiene los usuarios que se deben identificar.
A continuación, agregue el código siguiente para crear un objeto Person para cada persona del diccionario y agregar los datos de la imagen a partir de las imágenes adecuadas. Cada objeto Person se asocia con el mismo objeto PersonGroup mediante su cadena de identificador único. Recuerde pasar las variables client, url y RECOGNITION_MODEL1 en este método.
// Create a person group.
Console.WriteLine($"Create a person group ({personGroupId}).");
await client.PersonGroup.CreateAsync(personGroupId, personGroupId, recognitionModel: recognitionModel);
// The similar faces will be grouped into a single person group person.
foreach (var groupedFace in personDictionary.Keys)
{
// Limit TPS
await Task.Delay(250);
Person person = await client.PersonGroupPerson.CreateAsync(personGroupId: personGroupId, name: groupedFace);
Console.WriteLine($"Create a person group person '{groupedFace}'.");
// Add face to the person group person.
foreach (var similarImage in personDictionary[groupedFace])
{
Console.WriteLine($"Add face to the person group person({groupedFace}) from image `{similarImage}`");
PersistedFace face = await client.PersonGroupPerson.AddFaceFromUrlAsync(personGroupId, person.PersonId,
$"{url}{similarImage}", similarImage);
}
}
Sugerencia
También puede crear una clase PersonGroup a partir de imágenes locales. Consulte los métodos IPersonGroupPerson, como AddFaceFromStreamAsync.
Entrenamiento del elemento PersonGroup
Una vez que haya extraído los datos faciales de las imágenes y los haya ordenado en objetos Person diferentes, debe entrenar el objeto PersonGroup para identificar las características visuales asociadas a cada uno de sus objetos Person. El siguiente código llama al método train asincrónico, sondea los resultados e imprime el estado en la consola.
// Start to train the person group.
Console.WriteLine();
Console.WriteLine($"Train person group {personGroupId}.");
await client.PersonGroup.TrainAsync(personGroupId);
// Wait until the training is completed.
while (true)
{
await Task.Delay(1000);
var trainingStatus = await client.PersonGroup.GetTrainingStatusAsync(personGroupId);
Console.WriteLine($"Training status: {trainingStatus.Status}.");
if (trainingStatus.Status == TrainingStatusType.Succeeded) { break; }
}
Console.WriteLine();
Sugerencia
API Face se ejecuta en un conjunto de modelos precompilados que son estáticos por naturaleza (el rendimiento del modelo no empeorará ni mejorará si se ejecuta el servicio). Los resultados que genera el modelo pueden cambiar si Microsoft actualiza su back-end sin migrar a una versión de modelo completamente nueva. Para aprovechar las ventajas de una versión más reciente de un modelo, puede volver a entrenar PersonGroup, pero especifique el modelo más reciente como parámetro con las mismas imágenes de inscripción.
Este grupo de objetos Person y sus objetos Person asociados ya están listos para usarse en las operaciones de comprobación, identificación o agrupación.
Identificación de caras
El siguiente código toma la imagen de origen y crea una lista de todas las caras detectadas en ella. Estas son las caras que se identificarán en el objeto PersonGroup.
List<Guid> sourceFaceIds = new List<Guid>();
// Detect faces from source image url.
List<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{url}{sourceImageFileName}", recognitionModel);
// Add detected faceId to sourceFaceIds.
foreach (var detectedFace in detectedFaces) { sourceFaceIds.Add(detectedFace.FaceId.Value); }
El siguiente fragmento de código llama a la operación IdentifyAsync e imprime los resultados en la consola. En este caso, el servicio intenta hacer coincidir cada una de las caras de la imagen de origen con un objeto Person del objeto PersonGroup dado. Esta acción cierra el método de identificación.
// Identify the faces in a person group.
var identifyResults = await client.Face.IdentifyAsync(sourceFaceIds, personGroupId);
foreach (var identifyResult in identifyResults)
{
Person person = await client.PersonGroupPerson.GetAsync(personGroupId, identifyResult.Candidates[0].PersonId);
Console.WriteLine($"Person '{person.Name}' is identified for face in: {sourceImageFileName} - {identifyResult.FaceId}," +
$" confidence: {identifyResult.Candidates[0].Confidence}.");
}
Console.WriteLine();
}
Búsqueda de caras similares
El siguiente código toma una sola cara detectada (origen) y busca en un conjunto de otras caras (destino) para encontrar coincidencias (búsqueda de cara por imagen). Cuando la encuentra, imprime el identificador de la cara coincidente en la consola.
Detección de caras para la comparación
En primer lugar, defina un segundo método de detección de caras. Debe detectar las caras en las imágenes para poder compararlas y este método de detección está optimizado para las operaciones de comparación. No extrae los atributos de cara detallados como en la sección anterior y usa un modelo de reconocimiento diferente.
private static async Task<List<DetectedFace>> DetectFaceRecognize(IFaceClient faceClient, string url, string recognition_model)
{
// Detect faces from image URL. Since only recognizing, use the recognition model 1.
// We use detection model 3 because we are not retrieving attributes.
IList<DetectedFace> detectedFaces = await faceClient.Face.DetectWithUrlAsync(url, recognitionModel: recognition_model, detectionModel: DetectionModel.Detection03);
Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{Path.GetFileName(url)}`");
return detectedFaces.ToList();
}
Búsqueda de coincidencias
El método siguiente detecta caras en un conjunto de imágenes de destino y en una sola imagen de origen. Después, los compara y busca todas las imágenes de destino que son similares a la imagen de origen.
/*
* FIND SIMILAR
* This example will take an image and find a similar one to it in another image.
*/
public static async Task FindSimilar(IFaceClient client, string url, string recognition_model)
{
Console.WriteLine("========FIND SIMILAR========");
Console.WriteLine();
List<string> targetImageFileNames = new List<string>
{
"Family1-Dad1.jpg",
"Family1-Daughter1.jpg",
"Family1-Mom1.jpg",
"Family1-Son1.jpg",
"Family2-Lady1.jpg",
"Family2-Man1.jpg",
"Family3-Lady1.jpg",
"Family3-Man1.jpg"
};
string sourceImageFileName = "findsimilar.jpg";
IList<Guid?> targetFaceIds = new List<Guid?>();
foreach (var targetImageFileName in targetImageFileNames)
{
// Detect faces from target image url.
var faces = await DetectFaceRecognize(client, $"{url}{targetImageFileName}", recognition_model);
// Add detected faceId to list of GUIDs.
targetFaceIds.Add(faces[0].FaceId.Value);
}
// Detect faces from source image url.
IList<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{url}{sourceImageFileName}", recognition_model);
Console.WriteLine();
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
IList<SimilarFace> similarResults = await client.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value, null, null, targetFaceIds);
Impresión de las coincidencias
El siguiente código imprime los detalles coincidentes en la consola:
foreach (var similarResult in similarResults)
{
Console.WriteLine($"Faces from {sourceImageFileName} & ID:{similarResult.FaceId} are similar with confidence: {similarResult.Confidence}.");
}
Console.WriteLine();
Ejecutar la aplicación
Ejecute la aplicación haciendo clic en el botón Depurar en la parte superior de la ventana del IDE.
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él.
Si ha creado un objeto PersonGroup en este inicio rápido y desea eliminarlo, ejecute el siguiente código en el programa:
// At end, delete person groups in both regions (since testing only)
Console.WriteLine("========DELETE PERSON GROUP========");
Console.WriteLine();
DeletePersonGroup(client, personGroupId).Wait();
Reemplace el método de eliminación por el código siguiente:
/*
* DELETE PERSON GROUP
* After this entire example is executed, delete the person group in your Azure account,
* otherwise you cannot recreate one with the same name (if running example repeatedly).
*/
public static async Task DeletePersonGroup(IFaceClient client, String personGroupId)
{
await client.PersonGroup.DeleteAsync(personGroupId);
Console.WriteLine($"Deleted the person group {personGroupId}.");
}
Pasos siguientes
En este inicio rápido, ha aprendido a usar la biblioteca cliente de Face para .NET para realizar tareas básicas de reconocimiento facial. A continuación, obtenga información sobre los diferentes modelos de detección de caras y cómo especificar el modelo adecuado para su caso de uso.
- ¿Qué es el servicio Face?
- El código fuente de este ejemplo está disponible en GitHub.
Comience a usar el reconocimiento facial con la biblioteca cliente de Face para Go. Siga estos pasos para instalar el paquete y probar el código de ejemplo para realizar tareas básicas. El servicio Face le proporciona acceso a algoritmos avanzados para detectar y reconocer rostros humanas en imágenes.
Use la biblioteca cliente del servicio Face para Go para la:
- Detección y análisis de caras
- Identificación de una cara
- Comprobación de caras
- Búsqueda de caras similares
Documentación de referencia | Código fuente de la biblioteca | Descarga de SDK
Requisitos previos
- La versión más reciente de Go.
- Una suscripción a Azure: cree una cuenta gratuita
- La cuenta de Azure debe tener asignado un rol de colaborador de Cognitive Services a fin de que pueda aceptar los términos de IA responsable y crear un recurso. Póngase en contacto con el administrador para asignar este rol a su cuenta.
- Una vez que tenga la suscripción de Azure, cree un recurso de Face en Azure Portal para obtener la clave y el punto de conexión. Una vez que se implemente, haga clic en Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Face API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
- Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
- Después de obtener una clave y un punto de conexión, crear variables de entorno para la clave y el punto de conexión, denominados
FACE_SUBSCRIPTION_KEYyFACE_ENDPOINT, respectivamente.
Instalación
Creación de un directorio del proyecto de Go
En una ventana de consola (cmd, PowerShell, Terminal, Bash), cree una nueva área de trabajo para el proyecto de Go llamado my-app y vaya hasta ella.
mkdir -p my-app/{src, bin, pkg}
cd my-app
El área de trabajo contendrá tres carpetas:
- src: este directorio contendrá código fuente y paquetes. Todos los paquetes instalados con el comando
go getse encontrarán en esta carpeta. - pkg: este directorio contendrá objetos de paquete de Go compilados. Todos estos archivos tienen la extensión
.a. - bin: este directorio contendrá los archivos ejecutables binarios que se crean al ejecutar
go install.
Sugerencia
Para más información sobre la estructura de un área de trabajo de Go, consulte la documentación del lenguaje Go. En esta guía se incluye información para establecer $GOPATH y $GOROOT.
Instalación de la biblioteca cliente para Go
Instale a continuación la biblioteca cliente para Go:
go get -u github.com/Azure/azure-sdk-for-go/tree/master/services/cognitiveservices/v1.0/face
O, si usa dep, dentro de su repositorio ejecute:
dep ensure -add https://github.com/Azure/azure-sdk-for-go/tree/master/services/cognitiveservices/v1.0/face
Creación de una aplicación de Go
A continuación, cree un archivo en el directorio src denominado sample-app.go:
cd src
touch sample-app.go
Abra sample-app.go en el entorno de desarrollo integrado o editor de texto que prefiera. A continuación, agregue el nombre del paquete e importe las siguientes bibliotecas:
package main
import (
"encoding/json"
"container/list"
"context"
"fmt"
"github.com/Azure/azure-sdk-for-go/services/cognitiveservices/v1.0/face"
"github.com/Azure/go-autorest/autorest"
"github.com/satori/go.uuid"
"io"
"io/ioutil"
"log"
"os"
"path"
"strconv"
"strings"
"time"
)
A continuación, empezará a agregar código para llevar a cabo distintas operaciones del servicio Face.
Modelo de objetos
Las siguientes clases e interfaces controlan algunas de las características principales de la biblioteca cliente de Go para Face.
| Nombre | Descripción |
|---|---|
| BaseClient | Esta clase representa la autorización para usar el servicio Face, se necesita para que Face funcione correctamente. Cree una instancia de ella con la información de suscripción y úsela para generar instancias de otras clases. |
| Cliente | Esta clase controla las tareas básicas de detección y reconocimiento que puede realizar con las caras humanas. |
| DetectedFace | Esta clase representa todos los datos que se detectaron de una única cara en una imagen. Puede usarla para recuperar información detallada sobre la cara. |
| ListClient | Esta clase administra las construcciones FaceList almacenadas en la nube, que almacenan a su vez un conjunto ordenado de caras. |
| PersonGroupPersonClient | Esta clase administra las construcciones Person almacenadas en la nube, que almacenan a su vez un conjunto de caras que pertenecen a una sola persona. |
| PersonGroupClient | Esta clase administra las construcciones PersonGroup almacenadas en la nube, que almacenan a su vez un conjunto de objetos Person ordenados. |
| SnapshotClient | Esta clase administra la funcionalidad de instantáneas. Puede usarla para guardar temporalmente todos los datos de caras en la nube y migrar los datos a una nueva suscripción de Azure. |
Ejemplos de código
En estos ejemplos de código se muestra cómo realizar tareas básicas con la biblioteca cliente del servicio Face para Go:
- Autenticar el cliente
- Detección y análisis de caras
- Identificación de una cara
- Comprobación de caras
- Búsqueda de caras similares
Autenticar el cliente
Nota
En este inicio rápido se da por supuesto que ha creado variables de entorno para la clave y el punto de conexión de Face, denominadas FACE_SUBSCRIPTION_KEY y FACE_ENDPOINT respectivamente.
Cree una función main y agréguele el código siguiente para crear una instancia de un cliente con su punto de conexión y clave. Puede crear un objeto CognitiveServicesAuthorizer con la clave y usarlo con el punto de conexión para crear un objeto Client . Este código también crea instancias de un objeto de contexto, lo cual es necesario para la creación de objetos de cliente. También define una ubicación remota en la que se encuentran algunas de las imágenes de ejemplo de este inicio rápido.
func main() {
// A global context for use in all samples
faceContext := context.Background()
// Base url for the Verify and Large Face List examples
const imageBaseURL = "https://csdx.blob.core.windows.net/resources/Face/Images/"
/*
Authenticate
*/
subscriptionKey := "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE"
endpoint := "PASTE_YOUR_FACE_ENDPOINT_HERE"
// Client used for Detect Faces, Find Similar, and Verify examples.
client := face.NewClient(endpoint)
client.Authorizer = autorest.NewCognitiveServicesAuthorizer(subscriptionKey)
/*
END - Authenticate
*/
Detección y análisis de caras
La detección de caras es necesaria como primer paso del análisis de caras y la verificación de identidad. En esta sección se muestra cómo devolver los datos de atributos de cara adicionales. Si solo desea detectar caras para la identificación o comprobación de caras, vaya a las secciones posteriores.
Agregue el siguiente código al método main. Este código define una imagen de ejemplo remota y especifica qué características faciales se van a extraer de la imagen. También especifica el modelo de inteligencia artificial que se va a usar para extraer datos de las caras detectadas. Consulte Especificación de un modelo de reconocimiento para información sobre estas opciones. Por último, el método DetectWithURL realiza la operación de detección de caras en la imagen y guarda los resultados en la memoria del programa.
// Detect a face in an image that contains a single face
singleFaceImageURL := "https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg"
singleImageURL := face.ImageURL { URL: &singleFaceImageURL }
singleImageName := path.Base(singleFaceImageURL)
// Array types chosen for the attributes of Face
attributes := []face.AttributeType {"age", "emotion", "gender"}
returnFaceID := true
returnRecognitionModel := false
returnFaceLandmarks := false
// API call to detect faces in single-faced image, using recognition model 4
// We specify detection model 1 because we are retrieving attributes.
detectSingleFaces, dErr := client.DetectWithURL(faceContext, singleImageURL, &returnFaceID, &returnFaceLandmarks, attributes, face.Recognition04, &returnRecognitionModel, face.Detection01)
if dErr != nil { log.Fatal(dErr) }
// Dereference *[]DetectedFace, in order to loop through it.
dFaces := *detectSingleFaces.Value
Sugerencia
También puede detectar caras en una imagen local. Consulte los métodos Client, como DetectWithStream.
Visualización de los datos faciales detectados
El siguiente bloque de código toma el primer elemento de la matriz de objetos DetectedFace e imprime sus atributos en la consola. Si usó una imagen con varias caras, debe iterar la matriz en su lugar.
fmt.Println("Detected face in (" + singleImageName + ") with ID(s): ")
fmt.Println(dFaces[0].FaceID)
fmt.Println()
// Find/display the age and gender attributes
for _, dFace := range dFaces {
fmt.Println("Face attributes:")
fmt.Printf(" Age: %.0f", *dFace.FaceAttributes.Age)
fmt.Println("\n Gender: " + dFace.FaceAttributes.Gender)
}
// Get/display the emotion attribute
emotionStruct := *dFaces[0].FaceAttributes.Emotion
// Convert struct to a map
var emotionMap map[string]float64
result, _ := json.Marshal(emotionStruct)
json.Unmarshal(result, &emotionMap)
// Find the emotion with the highest score (confidence level). Range is 0.0 - 1.0.
var highest float64
emotion := ""
dScore := -1.0
for name, value := range emotionMap{
if (value > highest) {
emotion, dScore = name, value
highest = value
}
}
fmt.Println(" Emotion: " + emotion + " (score: " + strconv.FormatFloat(dScore, 'f', 3, 64) + ")")
Identificar una cara
La operación de identificación toma una imagen de una persona (o de varias) y busca la identidad de cada una de las caras de la imagen (búsqueda de reconocimiento facial). Compara cada cara detectada con un objeto PersonGroup, una base de datos con distintos objetos Person cuyos rasgos faciales se conocen.
Obtención de imágenes de persona
Para seguir en este escenario, debe guardar las siguientes imágenes en el directorio raíz del proyecto: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
Este grupo de imágenes contiene tres conjuntos de imágenes de caras simples correspondientes a tres personas distintas. El código definirá tres objetos PersonGroup Person y los asociará con archivos de imagen que comienzan por woman, man y child.
Creación de un elemento PersonGroup
Una vez que haya descargado las imágenes, agregue el código siguiente en la parte inferior del método main. Este código autentica un objeto PersonGroupClient y, a continuación, lo usa para definir un nuevo objeto PersonGroup.
// Get working directory
root, rootErr := os.Getwd()
if rootErr != nil { log.Fatal(rootErr) }
// Full path to images folder
imagePathRoot := path.Join(root+"\\images\\")
// Authenticate - Need a special person group client for your person group
personGroupClient := face.NewPersonGroupClient(endpoint)
personGroupClient.Authorizer = autorest.NewCognitiveServicesAuthorizer(subscriptionKey)
// Create the Person Group
// Create an empty Person Group. Person Group ID must be lower case, alphanumeric, and/or with '-', '_'.
personGroupID := "unique-person-group"
fmt.Println("Person group ID: " + personGroupID)
metadata := face.MetaDataContract { Name: &personGroupID }
// Create the person group
personGroupClient.Create(faceContext, personGroupID, metadata)
Creación de un objeto PersonGroup Persons
El siguiente bloque de código autentica un PersonGroupPersonClient y lo usa para definir tres nuevos objetos PersonGroup Person. Cada uno de estos objetos representa una sola persona en el conjunto de imágenes.
// Authenticate - Need a special person group person client for your person group person
personGroupPersonClient := face.NewPersonGroupPersonClient(endpoint)
personGroupPersonClient.Authorizer = autorest.NewCognitiveServicesAuthorizer(subscriptionKey)
// Create each person group person for each group of images (woman, man, child)
// Define woman friend
w := "Woman"
nameWoman := face.NameAndUserDataContract { Name: &w }
// Returns a Person type
womanPerson, wErr := personGroupPersonClient.Create(faceContext, personGroupID, nameWoman)
if wErr != nil { log.Fatal(wErr) }
fmt.Print("Woman person ID: ")
fmt.Println(womanPerson.PersonID)
// Define man friend
m := "Man"
nameMan := face.NameAndUserDataContract { Name: &m }
// Returns a Person type
manPerson, wErr := personGroupPersonClient.Create(faceContext, personGroupID, nameMan)
if wErr != nil { log.Fatal(wErr) }
fmt.Print("Man person ID: ")
fmt.Println(manPerson.PersonID)
// Define child friend
ch := "Child"
nameChild := face.NameAndUserDataContract { Name: &ch }
// Returns a Person type
childPerson, wErr := personGroupPersonClient.Create(faceContext, personGroupID, nameChild)
if wErr != nil { log.Fatal(wErr) }
fmt.Print("Child person ID: ")
fmt.Println(childPerson.PersonID)
Asignación de caras a los objetos Person
El siguiente código ordena las imágenes por su prefijo, detecta caras y las asigna a cada objeto PersonGroup Person respectivo en función del nombre de archivo de la imagen.
// Detect faces and register to correct person
// Lists to hold all their person images
womanImages := list.New()
manImages := list.New()
childImages := list.New()
// Collect the local images for each person, add them to their own person group person
images, fErr := ioutil.ReadDir(imagePathRoot)
if fErr != nil { log.Fatal(fErr)}
for _, f := range images {
path:= (imagePathRoot+f.Name())
if strings.HasPrefix(f.Name(), "w") {
var wfile io.ReadCloser
wfile, err:= os.Open(path)
if err != nil { log.Fatal(err) }
womanImages.PushBack(wfile)
personGroupPersonClient.AddFaceFromStream(faceContext, personGroupID, *womanPerson.PersonID, wfile, "", nil, face.Detection03)
}
if strings.HasPrefix(f.Name(), "m") {
var mfile io.ReadCloser
mfile, err:= os.Open(path)
if err != nil { log.Fatal(err) }
manImages.PushBack(mfile)
personGroupPersonClient.AddFaceFromStream(faceContext, personGroupID, *manPerson.PersonID, mfile, "", nil, face.Detection03)
}
if strings.HasPrefix(f.Name(), "ch") {
var chfile io.ReadCloser
chfile, err:= os.Open(path)
if err != nil { log.Fatal(err) }
childImages.PushBack(chfile)
personGroupPersonClient.AddFaceFromStream(faceContext, personGroupID, *childPerson.PersonID, chfile, "", nil, face.Detection03)
}
}
Sugerencia
También puede crear una clase PersonGroup a partir de imágenes remotas referenciadas por una dirección URL. Consulte los métodos PersonGroupPersonClient, como AddFaceFromURL.
Entrenamiento del elemento PersonGroup
Una vez asignadas las caras, entrene el objeto PersonGroup para que identifique las características visuales asociadas con cada uno de sus objetos Person. El siguiente código llama al método train asincrónico, sondea el resultado e imprime el estado en la consola.
// Train the person group
personGroupClient.Train(faceContext, personGroupID)
// Wait for it to succeed in training
for {
trainingStatus, tErr := personGroupClient.GetTrainingStatus(faceContext, personGroupID)
if tErr != nil { log.Fatal(tErr) }
if trainingStatus.Status == "succeeded" {
fmt.Println("Training status:", trainingStatus.Status)
break
}
time.Sleep(2)
}
Sugerencia
API Face se ejecuta en un conjunto de modelos precompilados que son estáticos por naturaleza (el rendimiento del modelo no empeorará ni mejorará si se ejecuta el servicio). Los resultados que genera el modelo pueden cambiar si Microsoft actualiza su back-end sin migrar a una versión de modelo completamente nueva. Para aprovechar las ventajas de una versión más reciente de un modelo, puede volver a entrenar PersonGroup, pero especifique el modelo más reciente como un parámetro con las mismas imágenes de inscripción.
Obtención de una imagen de prueba
El siguiente código busca en la raíz del proyecto una imagen test-image-person-group.jpg y la carga en la memoria del programa. Puede encontrar esta imagen en el mismo repositorio que las imágenes usadas para crear el objeto PersonGroup: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
personGroupTestImageName := "test-image-person-group.jpg"
// Use image path root from the one created in person group
personGroupTestImagePath := imagePathRoot
var personGroupTestImage io.ReadCloser
// Returns a ReaderCloser
personGroupTestImage, identErr:= os.Open(personGroupTestImagePath+personGroupTestImageName)
if identErr != nil { log.Fatal(identErr) }
Detección de caras de origen en la imagen de prueba
El siguiente bloque de código realiza la detección de caras normal en la imagen de prueba para recuperar todas las caras y guardarlas en una matriz.
// Detect faces in group test image, using recognition model 1 (default)
returnIdentifyFaceID := true
// Returns a ListDetectedFaces
// Recognition04 is not compatible.
// We specify detection model 3 because we are not retrieving attributes.
detectedTestImageFaces, dErr := client.DetectWithStream(faceContext, personGroupTestImage, &returnIdentifyFaceID, nil, nil, face.Recognition01, nil, face.Detection03)
if dErr != nil { log.Fatal(dErr) }
// Make list of face IDs from the detection.
length := len(*detectedTestImageFaces.Value)
testImageFaceIDs := make([]uuid.UUID, length)
// ListDetectedFace is a struct with a Value property that returns a *[]DetectedFace
for i, f := range *detectedTestImageFaces.Value {
testImageFaceIDs[i] = *f.FaceID
}
Identificación de caras de la imagen de origen
El método Identify toma la matriz de caras detectadas y las compara con el grupo PersonGroup proporcionado (que se definió y entrenó en la sección anterior). Si puede hacer coincidir una cara detectada con un objeto Person del grupo, guarda el resultado.
// Identify the faces in the test image with everyone in the person group as a query
identifyRequestBody := face.IdentifyRequest { FaceIds: &testImageFaceIDs, PersonGroupID: &personGroupID }
identifiedFaces, err := client.Identify(faceContext, identifyRequestBody)
if err != nil { log.Fatal(err) }
Este código imprime los resultados detallados de las coincidencias en la consola.
// Get the result which person(s) were identified
iFaces := *identifiedFaces.Value
for _, person := range iFaces {
fmt.Println("Person for face ID: " )
fmt.Print(person.FaceID)
fmt.Println(" is identified in " + personGroupTestImageName + ".")
}
Comprobar caras
La operación Verificar toma dos identificadores de caras o un objeto Person, y determina si pertenecen a la misma persona. La verificación se puede usar para comprobar de nuevo la coincidencia de caras devuelta por la operación de identificación.
En el código siguiente se detectan caras en dos imágenes de origen y, a continuación, se compara cada una con una cara detectada a partir de una imagen de destino.
Obtención de imágenes de prueba
Los siguientes bloques de código declaran variables que apuntarán a las imágenes de origen y de destino para la operación de comprobación.
// Create a slice list to hold the target photos of the same person
targetImageFileNames := make([]string, 2)
targetImageFileNames[0] = "Family1-Dad1.jpg"
targetImageFileNames[1] = "Family1-Dad2.jpg"
// The source photos contain this person, maybe
sourceImageFileName1 := "Family1-Dad3.jpg"
sourceImageFileName2 := "Family1-Son1.jpg"
Detectar caras para la comprobación
El código siguiente detecta caras en las imágenes de origen y de destino y las guarda en variables.
// DetectWithURL parameters
urlSource1 := imageBaseURL + sourceImageFileName1
urlSource2 := imageBaseURL + sourceImageFileName2
url1 := face.ImageURL { URL: &urlSource1 }
url2 := face.ImageURL { URL: &urlSource2 }
returnFaceIDVerify := true
returnFaceLandmarksVerify := false
returnRecognitionModelVerify := false
// Detect face(s) from source image 1, returns a ListDetectedFace struct
// We specify detection model 3 because we are not retrieving attributes.
detectedVerifyFaces1, dErrV1 := client.DetectWithURL(faceContext, url1 , &returnFaceIDVerify, &returnFaceLandmarksVerify, nil, face.Recognition04, &returnRecognitionModelVerify, face.Detection03)
if dErrV1 != nil { log.Fatal(dErrV1) }
// Dereference the result, before getting the ID
dVFaceIds1 := *detectedVerifyFaces1.Value
// Get ID of the detected face
imageSource1Id := dVFaceIds1[0].FaceID
fmt.Println(fmt.Sprintf("%v face(s) detected from image: %v", len(dVFaceIds1), sourceImageFileName1))
// Detect face(s) from source image 2, returns a ListDetectedFace struct
// We specify detection model 3 because we are not retrieving attributes.
detectedVerifyFaces2, dErrV2 := client.DetectWithURL(faceContext, url2 , &returnFaceIDVerify, &returnFaceLandmarksVerify, nil, face.Recognition04, &returnRecognitionModelVerify, face.Detection03)
if dErrV2 != nil { log.Fatal(dErrV2) }
// Dereference the result, before getting the ID
dVFaceIds2 := *detectedVerifyFaces2.Value
// Get ID of the detected face
imageSource2Id := dVFaceIds2[0].FaceID
fmt.Println(fmt.Sprintf("%v face(s) detected from image: %v", len(dVFaceIds2), sourceImageFileName2))
// Detect faces from each target image url in list. DetectWithURL returns a VerifyResult with Value of list[DetectedFaces]
// Empty slice list for the target face IDs (UUIDs)
var detectedVerifyFacesIds [2]uuid.UUID
for i, imageFileName := range targetImageFileNames {
urlSource := imageBaseURL + imageFileName
url := face.ImageURL { URL: &urlSource}
// We specify detection model 3 because we are not retrieving attributes.
detectedVerifyFaces, dErrV := client.DetectWithURL(faceContext, url, &returnFaceIDVerify, &returnFaceLandmarksVerify, nil, face.Recognition04, &returnRecognitionModelVerify, face.Detection03)
if dErrV != nil { log.Fatal(dErrV) }
// Dereference *[]DetectedFace from Value in order to loop through it.
dVFaces := *detectedVerifyFaces.Value
// Add the returned face's face ID
detectedVerifyFacesIds[i] = *dVFaces[0].FaceID
fmt.Println(fmt.Sprintf("%v face(s) detected from image: %v", len(dVFaces), imageFileName))
}
Obtención de los resultados de la comprobación
El código siguiente compara cada una de las imágenes de origen con la imagen de destino e imprime un mensaje que indica si pertenecen a la misma persona.
// Verification example for faces of the same person. The higher the confidence, the more identical the faces in the images are.
// Since target faces are the same person, in this example, we can use the 1st ID in the detectedVerifyFacesIds list to compare.
verifyRequestBody1 := face.VerifyFaceToFaceRequest{ FaceID1: imageSource1Id, FaceID2: &detectedVerifyFacesIds[0] }
verifyResultSame, vErrSame := client.VerifyFaceToFace(faceContext, verifyRequestBody1)
if vErrSame != nil { log.Fatal(vErrSame) }
fmt.Println()
// Check if the faces are from the same person.
if (*verifyResultSame.IsIdentical) {
fmt.Println(fmt.Sprintf("Faces from %v & %v are of the same person, with confidence %v",
sourceImageFileName1, targetImageFileNames[0], strconv.FormatFloat(*verifyResultSame.Confidence, 'f', 3, 64)))
} else {
// Low confidence means they are more differant than same.
fmt.Println(fmt.Sprintf("Faces from %v & %v are of a different person, with confidence %v",
sourceImageFileName1, targetImageFileNames[0], strconv.FormatFloat(*verifyResultSame.Confidence, 'f', 3, 64)))
}
// Verification example for faces of different persons.
// Since target faces are same person, in this example, we can use the 1st ID in the detectedVerifyFacesIds list to compare.
verifyRequestBody2 := face.VerifyFaceToFaceRequest{ FaceID1: imageSource2Id, FaceID2: &detectedVerifyFacesIds[0] }
verifyResultDiff, vErrDiff := client.VerifyFaceToFace(faceContext, verifyRequestBody2)
if vErrDiff != nil { log.Fatal(vErrDiff) }
// Check if the faces are from the same person.
if (*verifyResultDiff.IsIdentical) {
fmt.Println(fmt.Sprintf("Faces from %v & %v are of the same person, with confidence %v",
sourceImageFileName2, targetImageFileNames[0], strconv.FormatFloat(*verifyResultDiff.Confidence, 'f', 3, 64)))
} else {
// Low confidence means they are more differant than same.
fmt.Println(fmt.Sprintf("Faces from %v & %v are of a different person, with confidence %v",
sourceImageFileName2, targetImageFileNames[0], strconv.FormatFloat(*verifyResultDiff.Confidence, 'f', 3, 64)))
}
Búsqueda de caras similares
El siguiente código toma una sola cara detectada (origen) y busca en un conjunto de otras caras (destino) para encontrar coincidencias (búsqueda de cara por imagen). Cuando la encuentra, imprime el identificador de la cara coincidente en la consola.
Detección de caras para la comparación
En primer lugar, guarde una referencia a la cara que detectó en la sección Detect and analyze (Detectar y analizar). Esta cara será el origen.
// Select an ID in single-faced image for comparison to faces detected in group image. Used in Find Similar.
firstImageFaceID := dFaces[0].FaceID
A continuación, escriba el código siguiente para detectar un conjunto de caras en una imagen diferente. Estas caras serán el destino.
// Detect the faces in an image that contains multiple faces
groupImageURL := "http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg"
groupImageName := path.Base(groupImageURL)
groupImage := face.ImageURL { URL: &groupImageURL }
// API call to detect faces in group image, using recognition model 4. This returns a ListDetectedFace struct.
// We specify detection model 3 because we are not retrieving attributes.
detectedGroupFaces, dgErr := client.DetectWithURL(faceContext, groupImage, &returnFaceID, &returnFaceLandmarks, nil, face.Recognition04, &returnRecognitionModel, face.Detection03)
if dgErr != nil { log.Fatal(dgErr) }
fmt.Println()
// Detect faces in the group image.
// Dereference *[]DetectedFace, in order to loop through it.
dFaces2 := *detectedGroupFaces.Value
// Make slice list of UUIDs
faceIDs := make([]uuid.UUID, len(dFaces2))
fmt.Print("Detected faces in (" + groupImageName + ") with ID(s):\n")
for i, face := range dFaces2 {
faceIDs[i] = *face.FaceID // Dereference DetectedFace.FaceID
fmt.Println(*face.FaceID)
}
Búsqueda de coincidencias
En el código siguiente se usa el método FindSimilar para buscar todas las caras de destino que coinciden con la cara de origen.
// Add single-faced image ID to struct
findSimilarBody := face.FindSimilarRequest { FaceID: firstImageFaceID, FaceIds: &faceIDs }
// Get the list of similar faces found in the group image of previously detected faces
listSimilarFaces, sErr := client.FindSimilar(faceContext, findSimilarBody)
if sErr != nil { log.Fatal(sErr) }
// The *[]SimilarFace
simFaces := *listSimilarFaces.Value
Impresión de las coincidencias
El siguiente código imprime los detalles coincidentes en la consola.
// Print the details of the similar faces detected
fmt.Print("Similar faces found in (" + groupImageName + ") with ID(s):\n")
var sScore float64
for _, face := range simFaces {
fmt.Println(face.FaceID)
// Confidence of the found face with range 0.0 to 1.0.
sScore = *face.Confidence
fmt.Println("The similarity confidence: ", strconv.FormatFloat(sScore, 'f', 3, 64))
}
Ejecución de la aplicación
Ejecute la aplicación de reconocimiento facial desde el directorio de la aplicación con el comando go run <app-name>.
go run sample-app.go
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él.
Si ha creado un objeto PersonGroup en este inicio rápido y desea eliminarlo, llame al método Delete .
Pasos siguientes
En este inicio rápido, ha aprendido a usar la biblioteca cliente de Face para Go para realizar tareas básicas de reconocimiento facial. A continuación, obtenga información sobre los diferentes modelos de detección de caras y cómo especificar el modelo adecuado para su caso de uso.
- ¿Qué es el servicio Face?
- El código fuente de este ejemplo está disponible en GitHub.
Inicio rápido: Biblioteca cliente de Face para JavaScript
Comience a usar el reconocimiento facial con la biblioteca cliente de Face para JavaScript. Siga estos pasos para instalar el paquete y probar el código de ejemplo para realizar tareas básicas. El servicio Face le proporciona acceso a algoritmos avanzados para detectar y reconocer rostros humanas en imágenes.
La biblioteca cliente de Face para JavaScript se usa para realizar las siguientes operaciones:
Documentación de referencia | Código fuente de la biblioteca | Paquete (npm) | Ejemplos
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- La versión más reciente de Node.js.
- La cuenta de Azure debe tener asignado un rol de colaborador de Cognitive Services a fin de que pueda aceptar los términos de IA responsable y crear un recurso. Póngase en contacto con el administrador para asignar este rol a su cuenta.
- Una vez que tenga la suscripción de Azure, cree un recurso de Face en Azure Portal para obtener la clave y el punto de conexión. Una vez que se implemente, haga clic en Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Face API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
- Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
Instalación
Creación de una aplicación Node.js
En una ventana de la consola (como cmd, PowerShell o Bash), cree un directorio para la aplicación y vaya a él.
mkdir myapp && cd myapp
Ejecute el comando npm init para crear una aplicación de nodo con un archivo package.json.
npm init
Instalación de la biblioteca cliente
Instale los paquetes ms-rest-azure y azure-cognitiveservices-face de NPM:
npm install @azure/cognitiveservices-face @azure/ms-rest-js
el archivo package.json de la aplicación se actualizará con las dependencias.
Cree un archivo llamado index.js e importe las bibliotecas siguientes:
Sugerencia
¿Desea ver todo el archivo de código de inicio rápido de una vez? Puede encontrarlo en GitHub, que contiene los ejemplos de código de este inicio rápido.
const msRest = require("@azure/ms-rest-js");
const Face = require("@azure/cognitiveservices-face");
const uuid = require("uuid/v4");
Cree variables para el punto de conexión y la clave de Azure del recurso.
Importante
Vaya a Azure Portal. Si el recurso de Face que ha creado en la sección Requisitos previos se ha implementado correctamente, haga clic en el botón Ir al recurso en Pasos siguientes. Puede encontrar su clave y punto de conexión en la página de clave y punto de conexión del recurso, en Administración de recursos.
Recuerde quitar la clave del código cuando haya terminado y no hacerla nunca pública. En el caso de producción, considere la posibilidad de usar alguna forma segura de almacenar las credenciales, y acceder a ellas. Para más información, consulte el artículo sobre la seguridad de Cognitive Services.
key = "<paste-your-face-key-here>"
endpoint = "<paste-your-face-endpoint-here>"
Modelo de objetos
Las siguientes clases e interfaces controlan algunas de las características principales de la biblioteca cliente de .NET para Face:
| Nombre | Descripción |
|---|---|
| FaceClient | Esta clase representa la autorización para usar el servicio Face, se necesita para que Face funcione correctamente. Cree una instancia de ella con la información de suscripción y úsela para generar instancias de otras clases. |
| Face | Esta clase controla las tareas básicas de detección y reconocimiento que puede realizar con las caras humanas. |
| DetectedFace | Esta clase representa todos los datos que se detectaron de una única cara en una imagen. Puede usarla para recuperar información detallada sobre la cara. |
| FaceList | Esta clase administra las construcciones FaceList almacenadas en la nube, que almacenan a su vez un conjunto ordenado de caras. |
| PersonGroupPerson | Esta clase administra las construcciones Person almacenadas en la nube, que almacenan a su vez un conjunto de caras que pertenecen a una sola persona. |
| PersonGroup | Esta clase administra las construcciones PersonGroup almacenadas en la nube, que almacenan a su vez un conjunto de objetos Person ordenados. |
Ejemplos de código
En estos fragmentos de código se muestra cómo realizar las siguientes tareas con la biblioteca cliente de Face para .NET:
- Autenticar el cliente
- Detección y análisis de caras
- Identificación de una cara
- Búsqueda de caras similares
Sugerencia
¿Desea ver todo el archivo de código de inicio rápido de una vez? Puede encontrarlo en GitHub, que contiene los ejemplos de código de este inicio rápido.
Autenticar el cliente
Cree una instancia de un cliente con la clave y el punto de conexión. Cree un objeto ApiKeyCredentials con la clave y úselo con el punto de conexión para crear un objeto FaceClient .
const credentials = new msRest.ApiKeyCredentials({ inHeader: { 'Ocp-Apim-Subscription-Key': key } });
const client = new Face.FaceClient(credentials, endpoint);
Declaración de valores globales y funciones del asistente
Los siguientes valores globales son necesarios para algunas de las operaciones de Face que agregará más adelante.
La dirección URL señala a una carpeta de imágenes de ejemplo. El UUID actuará como nombre y como identificador de los objetos PersonGroup que va a crear.
const image_base_url = "https://csdx.blob.core.windows.net/resources/Face/Images/";
const person_group_id = uuid();
Usará la siguiente función para esperar a que se complete el entrenamiento de PersonGroup.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
Detección y análisis de caras
La detección de caras es necesaria como primer paso del análisis de caras y la verificación de identidad. En esta sección se muestra cómo devolver los datos de atributos de cara adicionales. Si solo desea detectar caras para la identificación o comprobación de caras, vaya a las secciones posteriores.
Obtención de los objetos faciales detectados
Cree un método para detectar caras. El método DetectFaceExtract procesa tres de las imágenes en la dirección URL especificada y crea una lista de objetos DetectedFace en la memoria del programa. La lista de valores FaceAttributeType especifica qué rasgos se van a extraer.
Luego, el método DetectFaceExtract analiza e imprime los datos de atributo de cada una de las caras detectadas. Cada atributo debe especificarse por separado en la llamada API de detección de caras original (en la lista FaceAttributeType ). En el código siguiente se procesan todos los atributos, pero probablemente solo tendrá que usar uno o algunos.
async function DetectFaceExtract() {
console.log("========DETECT FACES========");
console.log();
// Create a list of images
const image_file_names = [
"detection1.jpg", // single female with glasses
// "detection2.jpg", // (optional: single man)
// "detection3.jpg", // (optional: single male construction worker)
// "detection4.jpg", // (optional: 3 people at cafe, 1 is blurred)
"detection5.jpg", // family, woman child man
"detection6.jpg" // elderly couple, male female
];
// NOTE await does not work properly in for, forEach, and while loops. Use Array.map and Promise.all instead.
await Promise.all (image_file_names.map (async function (image_file_name) {
let detected_faces = await client.face.detectWithUrl(image_base_url + image_file_name,
{
returnFaceAttributes: ["Accessories","Age","Blur","Emotion","Exposure","FacialHair","Gender","Glasses","Hair","HeadPose","Makeup","Noise","Occlusion","Smile"],
// We specify detection model 1 because we are retrieving attributes.
detectionModel: "detection_01"
});
console.log (detected_faces.length + " face(s) detected from image " + image_file_name + ".");
console.log("Face attributes for face(s) in " + image_file_name + ":");
// Parse and print all attributes of each detected face.
detected_faces.forEach (async function (face) {
// Get the bounding box of the face
console.log("Bounding box:\n Left: " + face.faceRectangle.left + "\n Top: " + face.faceRectangle.top + "\n Width: " + face.faceRectangle.width + "\n Height: " + face.faceRectangle.height);
// Get the accessories of the face
let accessories = face.faceAttributes.accessories.join();
if (0 === accessories.length) {
console.log ("No accessories detected.");
}
else {
console.log ("Accessories: " + accessories);
}
// Get face other attributes
console.log("Age: " + face.faceAttributes.age);
console.log("Blur: " + face.faceAttributes.blur.blurLevel);
// Get emotion on the face
let emotions = "";
let emotion_threshold = 0.0;
if (face.faceAttributes.emotion.anger > emotion_threshold) { emotions += "anger, "; }
if (face.faceAttributes.emotion.contempt > emotion_threshold) { emotions += "contempt, "; }
if (face.faceAttributes.emotion.disgust > emotion_threshold) { emotions += "disgust, "; }
if (face.faceAttributes.emotion.fear > emotion_threshold) { emotions += "fear, "; }
if (face.faceAttributes.emotion.happiness > emotion_threshold) { emotions += "happiness, "; }
if (face.faceAttributes.emotion.neutral > emotion_threshold) { emotions += "neutral, "; }
if (face.faceAttributes.emotion.sadness > emotion_threshold) { emotions += "sadness, "; }
if (face.faceAttributes.emotion.surprise > emotion_threshold) { emotions += "surprise, "; }
if (emotions.length > 0) {
console.log ("Emotions: " + emotions.slice (0, -2));
}
else {
console.log ("No emotions detected.");
}
// Get more face attributes
console.log("Exposure: " + face.faceAttributes.exposure.exposureLevel);
if (face.faceAttributes.facialHair.moustache + face.faceAttributes.facialHair.beard + face.faceAttributes.facialHair.sideburns > 0) {
console.log("FacialHair: Yes");
}
else {
console.log("FacialHair: No");
}
console.log("Gender: " + face.faceAttributes.gender);
console.log("Glasses: " + face.faceAttributes.glasses);
// Get hair color
var color = "";
if (face.faceAttributes.hair.hairColor.length === 0) {
if (face.faceAttributes.hair.invisible) { color = "Invisible"; } else { color = "Bald"; }
}
else {
color = "Unknown";
var highest_confidence = 0.0;
face.faceAttributes.hair.hairColor.forEach (function (hair_color) {
if (hair_color.confidence > highest_confidence) {
highest_confidence = hair_color.confidence;
color = hair_color.color;
}
});
}
console.log("Hair: " + color);
// Get more attributes
console.log("Head pose:");
console.log(" Pitch: " + face.faceAttributes.headPose.pitch);
console.log(" Roll: " + face.faceAttributes.headPose.roll);
console.log(" Yaw: " + face.faceAttributes.headPose.yaw);
console.log("Makeup: " + ((face.faceAttributes.makeup.eyeMakeup || face.faceAttributes.makeup.lipMakeup) ? "Yes" : "No"));
console.log("Noise: " + face.faceAttributes.noise.noiseLevel);
console.log("Occlusion:");
console.log(" Eye occluded: " + (face.faceAttributes.occlusion.eyeOccluded ? "Yes" : "No"));
console.log(" Forehead occluded: " + (face.faceAttributes.occlusion.foreheadOccluded ? "Yes" : "No"));
console.log(" Mouth occluded: " + (face.faceAttributes.occlusion.mouthOccluded ? "Yes" : "No"));
console.log("Smile: " + face.faceAttributes.smile);
console.log();
});
}));
}
Sugerencia
También puede detectar caras en una imagen local. Consulte los métodos de Face, como DetectWithStream.
Identificar una cara
La operación de identificación toma una imagen de una persona (o de varias) y busca el objeto de persona almacenado asociado a cada una de las caras de la imagen (búsqueda de reconocimiento facial). Compara cada cara detectada con un objeto PersonGroup, una base de datos con distintos objetos Person cuyos rasgos faciales se conocen. Para poder realizar la operación Identify, primero es preciso crear y entrenar un objeto PersonGroup.
Incorporación de caras a PersonGroup
Cree la siguiente función para agregar caras a PersonGroup.
async function AddFacesToPersonGroup(person_dictionary, person_group_id) {
console.log ("Adding faces to person group...");
// The similar faces will be grouped into a single person group person.
await Promise.all (Object.keys(person_dictionary).map (async function (key) {
const value = person_dictionary[key];
// Wait briefly so we do not exceed rate limits.
await sleep (1000);
let person = await client.personGroupPerson.create(person_group_id, { name : key });
console.log("Create a person group person: " + key + ".");
// Add faces to the person group person.
await Promise.all (value.map (async function (similar_image) {
console.log("Add face to the person group person: (" + key + ") from image: " + similar_image + ".");
await client.personGroupPerson.addFaceFromUrl(person_group_id, person.personId, image_base_url + similar_image);
}));
}));
console.log ("Done adding faces to person group.");
}
Espera para el entrenamiento de PersonGroup
Cree la siguiente función del asistente para esperar a que PersonGroup termine el entrenamiento.
async function WaitForPersonGroupTraining(person_group_id) {
// Wait so we do not exceed rate limits.
console.log ("Waiting 10 seconds...");
await sleep (10000);
let result = await client.personGroup.getTrainingStatus(person_group_id);
console.log("Training status: " + result.status + ".");
if (result.status !== "succeeded") {
await WaitForPersonGroupTraining(person_group_id);
}
}
Creación de un elemento PersonGroup
El código siguiente:
- Crea un objeto PersonGroup
- Agrega caras al objeto PersonGroup mediante una llamada a
AddFacesToPersonGroupque se ha definido previamente. - Entrena el objeto PersonGroup.
- Identifica las caras del objeto PersonGroup.
El objeto PersonGroup y sus objetos Person asociados ya están listos para usarse en las operaciones de comprobación, identificación o agrupación.
async function IdentifyInPersonGroup() {
console.log("========IDENTIFY FACES========");
console.log();
// Create a dictionary for all your images, grouping similar ones under the same key.
const person_dictionary = {
"Family1-Dad" : ["Family1-Dad1.jpg", "Family1-Dad2.jpg"],
"Family1-Mom" : ["Family1-Mom1.jpg", "Family1-Mom2.jpg"],
"Family1-Son" : ["Family1-Son1.jpg", "Family1-Son2.jpg"],
"Family1-Daughter" : ["Family1-Daughter1.jpg", "Family1-Daughter2.jpg"],
"Family2-Lady" : ["Family2-Lady1.jpg", "Family2-Lady2.jpg"],
"Family2-Man" : ["Family2-Man1.jpg", "Family2-Man2.jpg"]
};
// A group photo that includes some of the persons you seek to identify from your dictionary.
let source_image_file_name = "identification1.jpg";
// Create a person group.
console.log("Creating a person group with ID: " + person_group_id);
await client.personGroup.create(person_group_id, { name : person_group_id, recognitionModel : "recognition_04" });
await AddFacesToPersonGroup(person_dictionary, person_group_id);
// Start to train the person group.
console.log();
console.log("Training person group: " + person_group_id + ".");
await client.personGroup.train(person_group_id);
await WaitForPersonGroupTraining(person_group_id);
console.log();
// Detect faces from source image url.
let face_ids = (await DetectFaceRecognize(image_base_url + source_image_file_name)).map (face => face.faceId);
// Identify the faces in a person group.
let results = await client.face.identify(face_ids, { personGroupId : person_group_id});
await Promise.all (results.map (async function (result) {
let person = await client.personGroupPerson.get(person_group_id, result.candidates[0].personId);
console.log("Person: " + person.name + " is identified for face in: " + source_image_file_name + " with ID: " + result.faceId + ". Confidence: " + result.candidates[0].confidence + ".");
}));
console.log();
}
Sugerencia
También puede crear una clase PersonGroup a partir de imágenes locales. Consulte los métodos IPersonGroupPerson, como AddFaceFromStream.
Búsqueda de caras similares
El siguiente código toma una sola cara detectada (origen) y busca en un conjunto de otras caras (destino) para encontrar coincidencias (búsqueda de cara por imagen). Cuando la encuentra, imprime el identificador de la cara coincidente en la consola.
Detección de caras para la comparación
En primer lugar, defina un segundo método de detección de caras. Debe detectar las caras en las imágenes para poder compararlas y este método de detección está optimizado para las operaciones de comparación. No extrae los atributos de cara detallados como en la sección anterior y usa un modelo de reconocimiento diferente.
async function DetectFaceRecognize(url) {
// Detect faces from image URL. Since only recognizing, use the recognition model 4.
// We use detection model 3 because we are not retrieving attributes.
let detected_faces = await client.face.detectWithUrl(url,
{
detectionModel: "detection_03",
recognitionModel: "recognition_04"
});
return detected_faces;
}
Búsqueda de coincidencias
El método siguiente detecta caras en un conjunto de imágenes de destino y en una sola imagen de origen. Después, los compara y busca todas las imágenes de destino que son similares a la imagen de origen. Por último, imprime los detalles coincidentes en la consola.
async function FindSimilar() {
console.log("========FIND SIMILAR========");
console.log();
const source_image_file_name = "findsimilar.jpg";
const target_image_file_names = [
"Family1-Dad1.jpg",
"Family1-Daughter1.jpg",
"Family1-Mom1.jpg",
"Family1-Son1.jpg",
"Family2-Lady1.jpg",
"Family2-Man1.jpg",
"Family3-Lady1.jpg",
"Family3-Man1.jpg"
];
let target_face_ids = (await Promise.all (target_image_file_names.map (async function (target_image_file_name) {
// Detect faces from target image url.
var faces = await DetectFaceRecognize(image_base_url + target_image_file_name);
console.log(faces.length + " face(s) detected from image: " + target_image_file_name + ".");
return faces.map (function (face) { return face.faceId });;
}))).flat();
// Detect faces from source image url.
let detected_faces = await DetectFaceRecognize(image_base_url + source_image_file_name);
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
let results = await client.face.findSimilar(detected_faces[0].faceId, { faceIds : target_face_ids });
results.forEach (function (result) {
console.log("Faces from: " + source_image_file_name + " and ID: " + result.faceId + " are similar with confidence: " + result.confidence + ".");
});
console.log();
}
Método Main
Por último, cree la función main y llámela.
async function main() {
await DetectFaceExtract();
await FindSimilar();
await IdentifyInPersonGroup();
console.log ("Done.");
}
main();
Ejecución de la aplicación
Ejecute la aplicación con el comando node en el archivo de inicio rápido.
node index.js
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él.
Pasos siguientes
En este inicio rápido, ha aprendido a usar la biblioteca cliente de Face para JavaScript para realizar tareas básicas de reconocimiento facial. A continuación, obtenga información sobre los diferentes modelos de detección de caras y cómo especificar el modelo adecuado para su caso de uso.
- ¿Qué es el servicio Face?
- El código fuente de este ejemplo está disponible en GitHub.
Comience a usar el reconocimiento facial con la biblioteca cliente de Face para Python. Siga estos pasos para instalar el paquete y probar el código de ejemplo para realizar tareas básicas. El servicio Face le proporciona acceso a algoritmos avanzados para detectar y reconocer rostros humanas en imágenes.
Use la biblioteca cliente de Face para Python para:
- Detección y análisis de caras
- Identificación de una cara
- Comprobación de caras
- Búsqueda de caras similares
Documentación de referencia | Código fuente de la biblioteca | Paquete (PiPy) | Ejemplos
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- Python 3.x
- La instalación de Python debe incluir pip. Puede comprobar si tiene pip instalado mediante la ejecución de
pip --versionen la línea de comandos. Para obtener pip, instale la versión más reciente de Python.
- La instalación de Python debe incluir pip. Puede comprobar si tiene pip instalado mediante la ejecución de
- La cuenta de Azure debe tener asignado un rol de colaborador de Cognitive Services a fin de que pueda aceptar los términos de IA responsable y crear un recurso. Póngase en contacto con el administrador para asignar este rol a su cuenta.
- Una vez que tenga la suscripción de Azure, cree un recurso de Face en Azure Portal para obtener la clave y el punto de conexión. Una vez que se implemente, haga clic en Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Face API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
- Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
Instalación
Instalación de la biblioteca cliente
Después de instalar Python, puede instalar la biblioteca cliente con:
pip install --upgrade azure-cognitiveservices-vision-face
Creación de una nueva aplicación de Python
Cree un nuevo script de Python, por ejemplo, —quickstart-file.py. Ábralo en el editor o el IDE que prefiera e importe las siguientes bibliotecas.
import asyncio
import io
import glob
import os
import sys
import time
import uuid
import requests
from urllib.parse import urlparse
from io import BytesIO
# To install this module, run:
# python -m pip install Pillow
from PIL import Image, ImageDraw
from azure.cognitiveservices.vision.face import FaceClient
from msrest.authentication import CognitiveServicesCredentials
from azure.cognitiveservices.vision.face.models import TrainingStatusType, Person
Sugerencia
¿Desea ver todo el archivo de código de inicio rápido de una vez? Puede encontrarlo en GitHub, que contiene los ejemplos de código de este inicio rápido.
A continuación, cree variables para el punto de conexión y la clave de Azure del recurso.
# This key will serve all examples in this document.
KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE"
# This endpoint will be used in all examples in this quickstart.
ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE"
Importante
Vaya a Azure Portal. Si el recurso de Face que ha creado en la sección Requisitos previos se ha implementado correctamente, haga clic en el botón Ir al recurso en Pasos siguientes. Puede encontrar su clave y punto de conexión en la página de clave y punto de conexión del recurso, en Administración de recursos.
Recuerde quitar la clave del código cuando haya terminado y no hacerla nunca pública. En el caso de producción, considere la posibilidad de usar alguna forma segura de almacenar las credenciales, y acceder a ellas. Por ejemplo, Azure Key Vault.
Modelo de objetos
Las siguientes clases e interfaces controlan algunas de las características principales de la biblioteca cliente de Python para Face.
| Nombre | Descripción |
|---|---|
| FaceClient | Esta clase representa la autorización para usar el servicio Face, se necesita para que Face funcione correctamente. Cree una instancia de ella con la información de suscripción y úsela para generar instancias de otras clases. |
| FaceOperations | Esta clase controla las tareas básicas de detección y reconocimiento que puede realizar con las caras humanas. |
| DetectedFace | Esta clase representa todos los datos que se detectaron de una única cara en una imagen. Puede usarla para recuperar información detallada sobre la cara. |
| FaceListOperations | Esta clase administra las construcciones FaceList almacenadas en la nube, que almacenan a su vez un conjunto ordenado de caras. |
| PersonGroupPersonOperations | Esta clase administra las construcciones Person almacenadas en la nube, que almacenan a su vez un conjunto de caras que pertenecen a una sola persona. |
| PersonGroupOperations | Esta clase administra las construcciones PersonGroup almacenadas en la nube, que almacenan a su vez un conjunto de objetos Person ordenados. |
| ShapshotOperations | Esta clase administra la funcionalidad de instantáneas; puede usarla para guardar temporalmente todos los datos de caras en la nube y migrar los datos a una nueva suscripción de Azure. |
Ejemplos de código
En estos fragmentos de código se muestra cómo realizar las siguientes tareas con la biblioteca cliente de Face para Python:
- Autenticar el cliente
- Detección y análisis de caras
- Identificación de una cara
- Comprobación de caras
- Búsqueda de caras similares
Autenticar el cliente
Cree una instancia de un cliente con la clave y el punto de conexión. Cree un objeto CognitiveServicesCredentials con la clave y úselo con el punto de conexión para crear un objeto FaceClient.
# Create an authenticated FaceClient.
face_client = FaceClient(ENDPOINT, CognitiveServicesCredentials(KEY))
Detección y análisis de caras
La detección de caras es necesaria para el análisis de caras y la verificación de identidad. En esta sección se muestra cómo devolver los datos de atributos de cara adicionales. Si solo desea detectar caras para la identificación o comprobación de caras, vaya a las secciones posteriores.
El siguiente código detecta una cara en una imagen remota. Imprime el identificador de la cara detectada en la consola y también lo almacena en la memoria del programa. A continuación, detecta las caras en una imagen con varias personas e imprime también sus identificadores en la consola. Al cambiar los parámetros en el método detect_with_url, puede devolver información diferente con cada objeto DetectedFace.
# Detect a face in an image that contains a single face
single_face_image_url = 'https://www.biography.com/.image/t_share/MTQ1MzAyNzYzOTgxNTE0NTEz/john-f-kennedy---mini-biography.jpg'
single_image_name = os.path.basename(single_face_image_url)
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
raise Exception('No face detected from image {}'.format(single_image_name))
# Display the detected face ID in the first single-face image.
# Face IDs are used for comparison to faces (their IDs) detected in other images.
print('Detected face ID from', single_image_name, ':')
for face in detected_faces: print (face.face_id)
print()
# Save this ID for use in Find Similar
first_image_face_ID = detected_faces[0].face_id
Sugerencia
También puede detectar caras en una imagen local. Consulte los métodos FaceOperations, como detect_with_stream.
Visualización de caras y marcos
En el código siguiente se genera la imagen especificada en la pantalla y se dibujan rectángulos alrededor de las caras mediante la propiedad DetectedFace.faceRectangle.
# Detect a face in an image that contains a single face
single_face_image_url = 'https://raw.githubusercontent.com/Microsoft/Cognitive-Face-Windows/master/Data/detection1.jpg'
single_image_name = os.path.basename(single_face_image_url)
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(url=single_face_image_url, detection_model='detection_03')
if not detected_faces:
raise Exception('No face detected from image {}'.format(single_image_name))
# Convert width height to a point in a rectangle
def getRectangle(faceDictionary):
rect = faceDictionary.face_rectangle
left = rect.left
top = rect.top
right = left + rect.width
bottom = top + rect.height
return ((left, top), (right, bottom))
def drawFaceRectangles() :
# Download the image from the url
response = requests.get(single_face_image_url)
img = Image.open(BytesIO(response.content))
# For each face returned use the face rectangle and draw a red box.
print('Drawing rectangle around face... see popup for results.')
draw = ImageDraw.Draw(img)
for face in detected_faces:
draw.rectangle(getRectangle(face), outline='red')
# Display the image in the default image browser.
img.show()
# Uncomment this to show the face rectangles.
# drawFaceRectangles()

Identificar una cara
La operación de identificación toma una imagen de una persona (o de varias) y busca la identidad de cada una de las caras de la imagen (búsqueda de reconocimiento facial). Compara cada cara detectada con un objeto PersonGroup, una base de datos con distintos objetos Person cuyos rasgos faciales se conocen.
Creación de un elemento PersonGroup
En el siguiente código se crea un objeto PersonGroup con tres objetos Person distintos. Asocia cada Person con un conjunto de imágenes de ejemplo y entrena para reconocer a cada persona.
Para seguir en este escenario, debe guardar las siguientes imágenes en el directorio raíz del proyecto: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
Este grupo de imágenes contiene tres conjuntos de imágenes de caras correspondientes a tres personas distintas. El código definirá tres objetos Person y los asociará con archivos de imagen que comienzan por woman, man y child.
Una vez configuradas las imágenes, defina una etiqueta en la parte superior del script para el objeto PersonGroup que va a crear.
# Used in the Person Group Operations and Delete Person Group examples.
# You can call list_person_groups to print a list of preexisting PersonGroups.
# SOURCE_PERSON_GROUP_ID should be all lowercase and alphanumeric. For example, 'mygroupname' (dashes are OK).
PERSON_GROUP_ID = str(uuid.uuid4()) # assign a random ID (or name it anything)
# Used for the Delete Person Group example.
TARGET_PERSON_GROUP_ID = str(uuid.uuid4()) # assign a random ID (or name it anything)
Después, agregue el siguiente código al final del script. Este código crea un objeto PersonGroup y tres objetos Person.
'''
Create the PersonGroup
'''
# Create empty Person Group. Person Group ID must be lower case, alphanumeric, and/or with '-', '_'.
print('Person group:', PERSON_GROUP_ID)
face_client.person_group.create(person_group_id=PERSON_GROUP_ID, name=PERSON_GROUP_ID)
# Define woman friend
woman = face_client.person_group_person.create(PERSON_GROUP_ID, "Woman")
# Define man friend
man = face_client.person_group_person.create(PERSON_GROUP_ID, "Man")
# Define child friend
child = face_client.person_group_person.create(PERSON_GROUP_ID, "Child")
Asignación de caras a los objetos Person
El siguiente código ordenal las imágenes por su prefijo, y detecta caras y las asigna a cada objeto Person.
'''
Detect faces and register to correct person
'''
# Find all jpeg images of friends in working directory
woman_images = [file for file in glob.glob('*.jpg') if file.startswith("w")]
man_images = [file for file in glob.glob('*.jpg') if file.startswith("m")]
child_images = [file for file in glob.glob('*.jpg') if file.startswith("ch")]
# Add to a woman person
for image in woman_images:
w = open(image, 'r+b')
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, woman.person_id, w)
# Add to a man person
for image in man_images:
m = open(image, 'r+b')
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, man.person_id, m)
# Add to a child person
for image in child_images:
ch = open(image, 'r+b')
face_client.person_group_person.add_face_from_stream(PERSON_GROUP_ID, child.person_id, ch)
Sugerencia
También puede crear una clase PersonGroup a partir de imágenes remotas referenciadas por una dirección URL. Consulte los métodos PersonGroupPersonOperations, como add_face_from_url.
Entrenamiento del elemento PersonGroup
Una vez asignadas las caras, debe entrenar el objeto PersonGroup para que identifique las características visuales asociadas con cada uno de sus objetos Person. El siguiente código llama al método train asincrónico, sondea el resultado e imprime el estado en la consola.
'''
Train PersonGroup
'''
print()
print('Training the person group...')
# Train the person group
face_client.person_group.train(PERSON_GROUP_ID)
while (True):
training_status = face_client.person_group.get_training_status(PERSON_GROUP_ID)
print("Training status: {}.".format(training_status.status))
print()
if (training_status.status is TrainingStatusType.succeeded):
break
elif (training_status.status is TrainingStatusType.failed):
face_client.person_group.delete(person_group_id=PERSON_GROUP_ID)
sys.exit('Training the person group has failed.')
time.sleep(5)
Sugerencia
API Face se ejecuta en un conjunto de modelos precompilados que son estáticos por naturaleza (el rendimiento del modelo no empeorará ni mejorará si se ejecuta el servicio). Los resultados que genera el modelo pueden cambiar si Microsoft actualiza su back-end sin migrar a una versión de modelo completamente nueva. Para aprovechar las ventajas de una versión más reciente de un modelo, puede volver a entrenar PersonGroup, pero especifique el modelo más reciente como un parámetro con las mismas imágenes de inscripción.
Obtención de una imagen de prueba
El siguiente código busca en la raíz del proyecto una imagen test-image-person-group.jpg y detecta las caras de la imagen. Puede encontrar esta imagen con las que se usan para la administración de PersonGroup: https://github.com/Azure-Samples/cognitive-services-sample-data-files/tree/master/Face/images.
'''
Identify a face against a defined PersonGroup
'''
# Group image for testing against
test_image_array = glob.glob('test-image-person-group.jpg')
image = open(test_image_array[0], 'r+b')
print('Pausing for 60 seconds to avoid triggering rate limit on free account...')
time.sleep (60)
# Detect faces
face_ids = []
# We use detection model 3 to get better performance.
faces = face_client.face.detect_with_stream(image, detection_model='detection_03')
for face in faces:
face_ids.append(face.face_id)
Salida de ID de cara identificados
El método identify toma una matriz de caras detectadas y las compara con un objeto PersonGroup. Si puede hacer coincidir una cara detectada con un objeto Person, guarda el resultado. Este código imprime los resultados detallados de las coincidencias en la consola.
# Identify faces
results = face_client.face.identify(face_ids, PERSON_GROUP_ID)
print('Identifying faces in {}'.format(os.path.basename(image.name)))
if not results:
print('No person identified in the person group for faces from {}.'.format(os.path.basename(image.name)))
for person in results:
if len(person.candidates) > 0:
print('Person for face ID {} is identified in {} with a confidence of {}.'.format(person.face_id, os.path.basename(image.name), person.candidates[0].confidence)) # Get topmost confidence score
else:
print('No person identified for face ID {} in {}.'.format(person.face_id, os.path.basename(image.name)))
Comprobar caras
La operación Verificar toma dos identificadores de caras o un objeto Person, y determina si pertenecen a la misma persona. La verificación se puede usar para comprobar de nuevo la coincidencia de caras devuelta por la operación de identificación.
En el código siguiente se detectan caras en dos imágenes de origen y, a continuación, se comprueban con una cara detectada a partir de una imagen de destino.
Obtención de imágenes de prueba
Los siguientes bloques de código declaran variables que apuntarán a las imágenes de origen y de destino para la operación de comprobación.
# Base url for the Verify and Facelist/Large Facelist operations
IMAGE_BASE_URL = 'https://csdx.blob.core.windows.net/resources/Face/Images/'
# Create a list to hold the target photos of the same person
target_image_file_names = ['Family1-Dad1.jpg', 'Family1-Dad2.jpg']
# The source photos contain this person
source_image_file_name1 = 'Family1-Dad3.jpg'
source_image_file_name2 = 'Family1-Son1.jpg'
Detectar caras para la comprobación
El código siguiente detecta caras en las imágenes de origen y de destino y las guarda en variables.
# Detect face(s) from source image 1, returns a list[DetectedFaces]
# We use detection model 3 to get better performance.
detected_faces1 = face_client.face.detect_with_url(IMAGE_BASE_URL + source_image_file_name1, detection_model='detection_03')
# Add the returned face's face ID
source_image1_id = detected_faces1[0].face_id
print('{} face(s) detected from image {}.'.format(len(detected_faces1), source_image_file_name1))
# Detect face(s) from source image 2, returns a list[DetectedFaces]
detected_faces2 = face_client.face.detect_with_url(IMAGE_BASE_URL + source_image_file_name2, detection_model='detection_03')
# Add the returned face's face ID
source_image2_id = detected_faces2[0].face_id
print('{} face(s) detected from image {}.'.format(len(detected_faces2), source_image_file_name2))
# List for the target face IDs (uuids)
detected_faces_ids = []
# Detect faces from target image url list, returns a list[DetectedFaces]
for image_file_name in target_image_file_names:
# We use detection model 3 to get better performance.
detected_faces = face_client.face.detect_with_url(IMAGE_BASE_URL + image_file_name, detection_model='detection_03')
# Add the returned face's face ID
detected_faces_ids.append(detected_faces[0].face_id)
print('{} face(s) detected from image {}.'.format(len(detected_faces), image_file_name))
Obtención de los resultados de la comprobación
El código siguiente compara cada una de las imágenes de origen con la imagen de destino e imprime un mensaje que indica si pertenecen a la misma persona.
# Verification example for faces of the same person. The higher the confidence, the more identical the faces in the images are.
# Since target faces are the same person, in this example, we can use the 1st ID in the detected_faces_ids list to compare.
verify_result_same = face_client.face.verify_face_to_face(source_image1_id, detected_faces_ids[0])
print('Faces from {} & {} are of the same person, with confidence: {}'
.format(source_image_file_name1, target_image_file_names[0], verify_result_same.confidence)
if verify_result_same.is_identical
else 'Faces from {} & {} are of a different person, with confidence: {}'
.format(source_image_file_name1, target_image_file_names[0], verify_result_same.confidence))
# Verification example for faces of different persons.
# Since target faces are same person, in this example, we can use the 1st ID in the detected_faces_ids list to compare.
verify_result_diff = face_client.face.verify_face_to_face(source_image2_id, detected_faces_ids[0])
print('Faces from {} & {} are of the same person, with confidence: {}'
.format(source_image_file_name2, target_image_file_names[0], verify_result_diff.confidence)
if verify_result_diff.is_identical
else 'Faces from {} & {} are of a different person, with confidence: {}'
.format(source_image_file_name2, target_image_file_names[0], verify_result_diff.confidence))
Búsqueda de caras similares
El siguiente código toma una sola cara detectada (origen) y busca en un conjunto de otras caras (destino) para encontrar coincidencias (búsqueda de cara por imagen). Cuando la encuentra, imprime el identificador de la cara coincidente en la consola.
Búsqueda de coincidencias
En primer lugar, ejecute el código de la sección anterior (Detección y análisis de caras) para guardar una referencia a una sola cara. A continuación, ejecute el siguiente código para obtener referencias a varias caras de una imagen de grupo.
# Detect the faces in an image that contains multiple faces
# Each detected face gets assigned a new ID
multi_face_image_url = "http://www.historyplace.com/kennedy/president-family-portrait-closeup.jpg"
multi_image_name = os.path.basename(multi_face_image_url)
# We use detection model 3 to get better performance.
detected_faces2 = face_client.face.detect_with_url(url=multi_face_image_url, detection_model='detection_03')
Agregue el siguiente bloque de código para buscar las instancias de la primera cara del grupo. Consulte el método find_similar para aprender a modificar este comportamiento.
# Search through faces detected in group image for the single face from first image.
# First, create a list of the face IDs found in the second image.
second_image_face_IDs = list(map(lambda x: x.face_id, detected_faces2))
# Next, find similar face IDs like the one detected in the first image.
similar_faces = face_client.face.find_similar(face_id=first_image_face_ID, face_ids=second_image_face_IDs)
if not similar_faces:
print('No similar faces found in', multi_image_name, '.')
Impresión de las coincidencias
Use el siguiente código para imprimir los detalles coincidentes en la consola.
# Print the details of the similar faces detected
else:
print('Similar faces found in', multi_image_name + ':')
for face in similar_faces:
first_image_face_ID = face.face_id
# The similar face IDs of the single face image and the group image do not need to match,
# they are only used for identification purposes in each image.
# The similar faces are matched using the Cognitive Services algorithm in find_similar().
face_info = next(x for x in detected_faces2 if x.face_id == first_image_face_ID)
if face_info:
print(' Face ID: ', first_image_face_ID)
print(' Face rectangle:')
print(' Left: ', str(face_info.face_rectangle.left))
print(' Top: ', str(face_info.face_rectangle.top))
print(' Width: ', str(face_info.face_rectangle.width))
print(' Height: ', str(face_info.face_rectangle.height))
Ejecución de la aplicación
Ejecute la aplicación de reconocimiento facial desde el directorio de la aplicación con el comando python.
python quickstart-file.py
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él.
Si ha creado un objeto PersonGroup en este inicio rápido y desea eliminarlo, ejecute el siguiente código en el script:
# Delete the main person group.
face_client.person_group.delete(person_group_id=PERSON_GROUP_ID)
print("Deleted the person group {} from the source location.".format(PERSON_GROUP_ID))
print()
Pasos siguientes
En este inicio rápido, ha aprendido a usar la biblioteca cliente de Face para Python para realizar tareas básicas de reconocimiento facial. A continuación, obtenga información sobre los diferentes modelos de detección de caras y cómo especificar el modelo adecuado para su caso de uso.
- ¿Qué es el servicio Face?
- El código fuente de este ejemplo está disponible en GitHub.
Comience a usar el reconocimiento facial mediante Face REST API. El servicio Face le proporciona acceso a algoritmos avanzados para detectar y reconocer rostros humanas en imágenes.
Use Face REST API para:
Nota
Este inicio rápido usa comandos de cURL para llamar a la API REST. También puede llamar a la API REST mediante un lenguaje de programación. Consulte los ejemplos de GitHub para obtener ejemplos en C#, Python, Java, JavaScript y Go.
Requisitos previos
- Una suscripción a Azure: cree una cuenta gratuita
- La cuenta de Azure debe tener asignado un rol de colaborador de Cognitive Services a fin de que pueda aceptar los términos de IA responsable y crear un recurso. Póngase en contacto con el administrador para asignar este rol a su cuenta.
- Una vez que tenga la suscripción de Azure, cree un recurso de Face en Azure Portal para obtener la clave y el punto de conexión. Una vez que se implemente, haga clic en Ir al recurso.
- Necesitará la clave y el punto de conexión del recurso que cree para conectar la aplicación a Face API. En una sección posterior de este mismo inicio rápido pegará la clave y el punto de conexión en el código siguiente.
- Puede usar el plan de tarifa gratis (
F0) para probar el servicio y actualizarlo más adelante a un plan de pago para producción.
- PowerShell versión 6.0, o superior, o una aplicación de la línea de comandos similar.
Detección y análisis de caras
Utilizará un comando como el siguiente para llamar a la API Face y obtener los datos de los atributos de las caras de una imagen. En primer lugar, copie el código en un editor de texto; deberá realizar cambios en ciertas partes del comando antes de su ejecución.
curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}"
Se han realizado los siguientes cambios:
- Asigne
Ocp-Apim-Subscription-Keya la clave de suscripción de Face válida. - Cambie la primera parte de la dirección URL de la consulta para que coincida con el punto de conexión que corresponde a la clave de suscripción.
Nota
Los nuevos recursos creados después del 1 de julio de 2019 usarán nombres de subdominio personalizados. Para más información y para obtener una lista completa de los puntos de conexión regionales, consulte Nombres de subdominios personalizados para Cognitive Services.
- También puede cambiar la dirección URL en el cuerpo de la solicitud para que apunte a una imagen diferente.
Una vez realizados los cambios, abra un símbolo del sistema y escriba el nuevo comando.
Examen de los resultados
Debería ver la información de la cara mostrada como datos JSON en la ventana de la consola. Por ejemplo:
[
{
"faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f",
"faceRectangle": {
"top": 131,
"left": 177,
"width": 162,
"height": 162
}
}
]
Obtención de los atributos de la cara
Para extraer los atributos de la cara, llame de nuevo a Detect API, pero establezca detectionModel en detection_01. Agregue también el parámetro de consulta returnFaceAttributes. El comando debería tener un aspecto similar al siguiente. Como antes, inserte la clave de suscripción y el punto de conexión de Face.
curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_01&returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}"
Examen de los resultados
La información facial devuelta ahora incluye atributos de cara. Por ejemplo:
[
{
"faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f",
"faceRectangle": {
"top": 131,
"left": 177,
"width": 162,
"height": 162
},
"faceAttributes": {
"smile": 0,
"headPose": {
"pitch": 0,
"roll": 0.1,
"yaw": -32.9
},
"gender": "female",
"age": 22.9,
"facialHair": {
"moustache": 0,
"beard": 0,
"sideburns": 0
},
"glasses": "NoGlasses",
"emotion": {
"anger": 0,
"contempt": 0,
"disgust": 0,
"fear": 0,
"happiness": 0,
"neutral": 0.986,
"sadness": 0.009,
"surprise": 0.005
},
"blur": {
"blurLevel": "low",
"value": 0.06
},
"exposure": {
"exposureLevel": "goodExposure",
"value": 0.67
},
"noise": {
"noiseLevel": "low",
"value": 0
},
"makeup": {
"eyeMakeup": true,
"lipMakeup": true
},
"accessories": [],
"occlusion": {
"foreheadOccluded": false,
"eyeOccluded": false,
"mouthOccluded": false
},
"hair": {
"bald": 0,
"invisible": false,
"hairColor": [
{
"color": "brown",
"confidence": 1
},
{
"color": "black",
"confidence": 0.87
},
{
"color": "other",
"confidence": 0.51
},
{
"color": "blond",
"confidence": 0.08
},
{
"color": "red",
"confidence": 0.08
},
{
"color": "gray",
"confidence": 0.02
}
]
}
}
}
]
Búsqueda de caras similares
Esta operación toma una sola cara detectada (origen) y busca en un conjunto de otras caras (destino) para encontrar coincidencias (búsqueda de cara por imagen). Cuando la encuentra, imprime el identificador de la cara coincidente en la consola.
Detección de caras para la comparación
En primer lugar, debe detectar caras en imágenes para poder compararlas. Ejecute este comando al igual que lo hizo en la sección Detect and analyze (Detectar y analizar). Este método de detección está optimizado para las operaciones de comparación. No extrae los atributos de cara detallados como en la sección anterior y usa un modelo de detección diferente.
curl -H "Ocp-Apim-Subscription-Key: TODO_INSERT_YOUR_FACE_SUBSCRIPTION_KEY_HERE" "TODO_INSERT_YOUR_FACE_ENDPOINT_HERE/face/v1.0/detect?detectionModel=detection_03&returnFaceId=true&returnFaceLandmarks=false" -H "Content-Type: application/json" --data-ascii "{\"url\":\"https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Dad1.jpg\"}"
Busque el valor "faceId" en la respuesta JSON y guárdelo en una ubicación temporal. A continuación, llame de nuevo al comando anterior para estas direcciones URL de imágenes y guarde también sus identificadores de caras. Usará estos identificadores como grupo de destino de caras en el que buscar una cara similar.
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Daughter1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Mom1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family1-Son1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Lady1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family2-Man1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Lady1.jpg
https://csdx.blob.core.windows.net/resources/Face/Images/Family3-Man1.jpg
Por último, detecte una única cara de origen, que será la que use para la búsqueda de coincidencias, y guarde su identificador. Guarde este identificador aparte del resto.
https://csdx.blob.core.windows.net/resources/Face/Images/findsimilar.jpg
Búsqueda de coincidencias
Copie el comando siguiente en un editor de texto.
curl -v -X POST "https://westus.api.cognitive.microsoft.com/face/v1.0/findsimilars" -H "Content-Type: application/json" -H "Ocp-Apim-Subscription-Key: {subscription key}" --data-ascii "{body}"
A continuación, realice los siguientes cambios:
- Asigne
Ocp-Apim-Subscription-Keya la clave de suscripción de Face válida. - Cambie la primera parte de la dirección URL de la consulta para que coincida con el punto de conexión que corresponde a la clave de suscripción.
Utilice el siguiente contenido JSON para el valor body:
{
"faceId": "",
"faceIds": [],
"maxNumOfCandidatesReturned": 10,
"mode": "matchPerson"
}
- Use el identificador de la cara de origen para
"faceId". - Pegue los otros identificadores de caras como términos de la matriz
"faceIds".
Examen de los resultados
Recibirá una respuesta JSON que muestra los identificadores de las caras que coinciden con la cara de la consulta.
[
{
"persistedFaceId" : "015839fb-fbd9-4f79-ace9-7675fc2f1dd9",
"confidence" : 0.82
},
...
]
Limpieza de recursos
Si quiere limpiar y eliminar una suscripción a Cognitive Services, puede eliminar el recurso o grupo de recursos. Al eliminar el grupo de recursos, también se elimina cualquier otro recurso que esté asociado a él.
Pasos siguientes
En este inicio rápido, ha aprendido a usar la biblioteca cliente de Face REST API para realizar tareas básicas de reconocimiento facial. A continuación, obtenga información sobre los diferentes modelos de detección de caras y cómo especificar el modelo adecuado para su caso de uso.