Rilevare volti ed emozioni con Analisi servizi multimediali di AzureDetect Face and Emotion with Azure Media Analytics

OverviewOverview

Il processore di contenuti multimediali Rilevamento multimediale volti di Azure consente di contare, monitorare i movimenti e persino di valutare la partecipazione e le reazioni del pubblico in base alle espressioni del volto.The Azure Media Face Detector media processor (MP) enables you to count, track movements, and even gauge audience participation and reaction via facial expressions. Questo servizio contiene due funzionalità:This service contains two features:

  • Rilevamento voltiFace detection

    Il Rilevamento volti rileva e monitora i volti umani all'interno di un video.Face detection finds and tracks human faces within a video. È possibile rilevare e monitorare diversi volti mentre le persone si muovono; i metadati relativi a ora e luogo vengono restituiti in un file JSON.Multiple faces can be detected and subsequently be tracked as they move around, with the time and location metadata returned in a JSON file. Durante il monitoraggio, il sistema tenterà di assegnare sempre lo stesso ID al volto mentre la persona si muove sullo schermo, anche se è nascosta o se esce brevemente dall'inquadratura.During tracking, it will attempt to give a consistent ID to the same face while the person is moving around on screen, even if they are obstructed or briefly leave the frame.

    Nota

    Questo servizio non esegue il riconoscimento facciale.This service does not perform facial recognition. Se una persona esce dall'inquadratura o viene nascosta troppo a lungo, al suo ritorno le verrà assegnato un nuovo ID.An individual who leaves the frame or becomes obstructed for too long will be given a new ID when they return.

  • Rilevamento emozioniEmotion detection

    Il Rilevamento emozioni è un componente facoltativo del Processore multimediale di rilevamento volti che restituisce un'analisi di vari attributi emotivi dei volti rilevati, inclusi la felicità, la paura, la tristezza, la rabbia e altre emozioni.Emotion Detection is an optional component of the Face Detection Media Processor that returns analysis on multiple emotional attributes from the faces detected, including happiness, sadness, fear, anger, and more.

Attualmente il processore multimediale Rilevamento multimediale volti di Azure è disponibile in Anteprima.The Azure Media Face Detector MP is currently in Preview.

Questo argomento contiene informazioni dettagliate su Azure Media Face Detector e illustra come usare questa funzionalità con Media Services .NET SDK.This topic gives details about Azure Media Face Detector and shows how to use it with Media Services SDK for .NET.

File di input di Rilevamento voltiFace Detector input files

File video.Video files. Attualmente sono supportati i formati seguenti: MP4, MOV e WMV.Currently, the following formats are supported: MP4, MOV, and WMV.

File di output di Rilevamento voltiFace Detector output files

L'API per il rilevamento e monitoraggio volti offre il rilevamento e il monitoraggio volti ad alta precisione ed è in grado di rilevare fino a 64 volti umani in un video.The face detection and tracking API provides high precision face location detection and tracking that can detect up to 64 human faces in a video. Le riprese anteriori producono i risultati migliori, mentre i profili e i volti piccoli (inferiori o uguali a 24x24 pixel) non garantiscono altrettanta precisione.Frontal faces provide the best results, while side faces and small faces (less than or equal to 24x24 pixels) might not be as accurate.

I volti rilevati e monitorati vengono restituiti con coordinate (sinistra, superiore, larghezza e altezza) indicanti la posizione dei volti nell'immagine in pixel e un codice ID del volto che indica il monitoraggio della persona.The detected and tracked faces are returned with coordinates (left, top, width, and height) indicating the location of faces in the image in pixels, as well as a face ID number indicating the tracking of that individual. I codici ID del volto sono soggetti a ripristino quando le riprese non sono frontali o sono sovrapposte nel fotogramma, causando l'assegnazione di diversi ID alla stessa persona.Face ID numbers are prone to reset under circumstances when the frontal face is lost or overlapped in the frame, resulting in some individuals getting assigned multiple IDs.

Elementi del file di output JSONElements of the output JSON file

Il processo genera un file di output JSON che contiene i metadati sui volti rilevati e monitorati.The job produces a JSON output file that contains metadata about detected and tracked faces. I metadati includono coordinate che indicano la posizione dei volti e un numero di ID volto che indica il monitoraggio della persona specifica.The metadata includes coordinates indicating the location of faces, as well as a face ID number indicating the tracking of that individual. I codici ID del volto sono soggetti a ripristino quando le riprese non sono frontali o sono sovrapposte nel fotogramma, causando l'assegnazione di diversi ID alla stessa persona.Face ID numbers are prone to reset under circumstances when the frontal face is lost or overlapped in the frame, resulting in some individuals getting assigned multiple IDs.

L'output JSON include gli attributi seguenti:The output JSON includes the following attributes:

ElementoElement DescrizioneDescription
versionversion Indica la versione dell'API Video.This refers to the version of the Video API.
indexindex Solo per Azure Media Redactor. Definisce l'indice dei fotogrammi dell'evento corrente.(Applies to Azure Media Redactor only) defines the frame index of the current event.
timescaletimescale "Scatti" al secondo del video."Ticks" per second of the video.
offsetoffset Differenza di orario dei timestamp.This is the time offset for timestamps. Nella versione 1.0 delle API Video, questo valore è sempre 0.In version 1.0 of Video APIs, this will always be 0. Negli scenari futuri supportati questo valore potrebbe cambiare.In future scenarios we support, this value may change.
framerateframerate Fotogrammi al secondo del video.Frames per second of the video.
fragmentsfragments I metadati sono suddivisi in segmenti diversi, detti frammenti.The metadata is chunked up into different segments called fragments. Ogni frammento contiene un inizio, una durata, un numero di intervallo e uno o più eventi.Each fragment contains a start, duration, interval number, and event(s).
startstart L'ora di inizio del primo evento in "scatti".The start time of the first event in ‘ticks’.
durationduration La lunghezza del frammento in "scatti".The length of the fragment, in “ticks”.
intervalinterval L'intervallo di ogni voce di evento all'interno del frammento in "scatti".The interval of each event entry within the fragment, in “ticks”.
eventievents Ogni evento contiene i volti rilevati e monitorati nel periodo specificato.Each event contains the faces detected and tracked within that time duration. È una matrice di eventi.It is an array of array of events. La matrice esterna rappresenta un intervallo di tempo.The outer array represents one interval of time. La matrice interna è costituita da 0 o più eventi che si sono verificati in un determinato momento.The inner array consists of 0 or more events that happened at that point in time. Le parentesi quadre vuote [] indicano che non sono stati rilevati volti.An empty bracket [] means no faces were detected.
idid L'ID del volto monitorato.The ID of the face that is being tracked. Questo numero potrebbe cambiare inavvertitamente se un volto non viene rilevato.This number may inadvertently change if a face becomes undetected. Una determinata persona dovrebbe avere lo stesso ID in tutto il video, ma non è possibile garantire sempre lo stesso ID a causa delle limitazioni nell'algoritmo di rilevamento (occlusione e così via)A given individual should have the same ID throughout the overall video, but this cannot be guaranteed due to limitations in the detection algorithm (occlusion, etc.)
x, yx, y Le coordinate X e Y in alto a sinistra del riquadro del contorno del volto in una scala normalizzata da 0,0 a 1,0.The upper left X and Y coordinates of the face bounding box in a normalized scale of 0.0 to 1.0.
Le coordinate X e Y si riferiscono sempre all'orientamento orizzontale, pertanto se il video è in formato verticale o se è capovolto, nel caso di iOS, sarà necessario trasporre le coordinate di conseguenza.-X and Y coordinates are relative to landscape always, so if you have a portrait video (or upside-down, in the case of iOS), you'll have to transpose the coordinates accordingly.
width, heightwidth, height La larghezza e altezza del riquadro del contorno del volto in una scala normalizzata da 0,0 a 1,0.The width and height of the face bounding box in a normalized scale of 0.0 to 1.0.
facesDetectedfacesDetected Questo valore viene riportato alla fine dei risultati del file JSON e riepiloga il numero di volti rilevati dall'algoritmo durante il video.This is found at the end of the JSON results and summarizes the number of faces that the algorithm detected during the video. Poiché gli ID possono essere reimpostati inavvertitamente se un volto non viene rilevato, ad esempio quando il volto esce dall'inquadratura o la persona si volta, questo numero potrebbe non corrispondere sempre al vero numero di volti del video.Because the IDs can be reset inadvertently if a face becomes undetected (e.g. face goes off screen, looks away), this number may not always equal the true number of faces in the video.

Il rilevatore di volti usa tecniche di frammentazione, che consentono di suddividere i metadati in blocchi basati sul tempo e di scaricare solo gli elementi necessari, e di segmentazione, che consentono di suddividere gli eventi se diventano troppo grandi.Face Detector uses techniques of fragmentation (where the metadata can be broken up in time-based chunks and you can download only what you need), and segmentation (where the events are broken up in case they get too large). Alcuni semplici calcoli consentono di trasformare i dati.Some simple calculations can help you transform the data. Se ad esempio un evento è iniziato in corrispondenza di 6300 (scatti), con una scala cronologica di 2997 (scatti al secondo) e una frequenza di fotogrammi di 29,97 (fotogrammi al secondo):For example, if an event started at 6300 (ticks), with a timescale of 2997 (ticks/sec) and framerate of 29.97 (frames/sec), then:

  • Inizio/Scala cronologica = 2,1 secondiStart/Timescale = 2.1 seconds
  • Secondi x frequenza di fotogrammi = 63 fotogrammiSeconds x Framerate = 63 frames

Esempio di input e output di rilevamento voltiFace detection input and output example

Video di inputInput video

Video di inputInput Video

Configurazione delle attività (set di impostazioni)Task configuration (preset)

Quando si crea un'attività con Rilevamento multimediale volti di Azure, è necessario specificare un set di impostazioni di configurazione.When creating a task with Azure Media Face Detector, you must specify a configuration preset. Il set di impostazioni di configurazione seguente serve unicamente per il rilevamento volti.The following configuration preset is just for face detection.

{
  "version":"1.0",
  "options":{
      "TrackingMode": "Fast"
  }
}

Descrizioni degli attributiAttribute descriptions

Nome attributoAttribute name DescrizioneDescription
ModeMode Fast: velocità di elaborazione elevata, ma meno accurata (impostazione predefinita).Fast - fast processing speed, but less accurate (default).

Output JSONJSON output

L'esempio seguente di output JSON è stato troncato.The following example of JSON output was truncated.

{
"version": 1,
"timescale": 30000,
"offset": 0,
"framerate": 29.97,
"width": 1280,
"height": 720,
"fragments": [
    {
    "start": 0,
    "duration": 60060
    },
    {
    "start": 60060,
    "duration": 60060,
    "interval": 1001,
    "events": [
        [
        {
            "id": 0,
            "x": 0.519531,
            "y": 0.180556,
            "width": 0.0867188,
            "height": 0.154167
        }
        ],
        [
        {
            "id": 0,
            "x": 0.517969,
            "y": 0.181944,
            "width": 0.0867188,
            "height": 0.154167
        }
        ],
        [
        {
            "id": 0,
            "x": 0.517187,
            "y": 0.183333,
            "width": 0.0851562,
            "height": 0.151389
        }
        ],

    . . . 

Esempio di input e output di Rilevamento emozioniEmotion detection input and output example

Video di inputInput video

Video di inputInput Video

Configurazione delle attività (set di impostazioni)Task configuration (preset)

Quando si crea un'attività con Rilevamento multimediale volti di Azure, è necessario specificare un set di impostazioni di configurazione.When creating a task with Azure Media Face Detector, you must specify a configuration preset. Il set di impostazioni di configurazione seguente specifica la creazione del file JSON in base al Rilevamento emozioni.The following configuration preset specifies to create JSON based on the emotion detection.

{
  "version": "1.0",
  "options": {
    "aggregateEmotionWindowMs": "987",
    "mode": "aggregateEmotion",
    "aggregateEmotionIntervalMs": "342"
  }
}

Descrizioni degli attributiAttribute descriptions

Nome attributoAttribute name DescrizioneDescription
ModeMode Faces: solo rilevamento viso.Faces: Only face detection.
PerFaceEmotion: restituisce un'emozione in modo indipendente per ogni rilevamento viso.PerFaceEmotion: Return emotion independently for each face detection.
AggregateEmotion: restituzione dei valori medi delle emozioni per tutti i volti nel fotogramma.AggregateEmotion: Return average emotion values for all faces in frame.
AggregateEmotionWindowMsAggregateEmotionWindowMs Va usato se è selezionata la modalità AggregateEmotion.Use if AggregateEmotion mode selected. Specifica la lunghezza del video usato per produrre ogni risultato aggregato, in millisecondi.Specifies the length of video used to produce each aggregate result, in milliseconds.
AggregateEmotionIntervalMsAggregateEmotionIntervalMs Va usato se è selezionata la modalità AggregateEmotion.Use if AggregateEmotion mode selected. Specifica con quale frequenza produrre risultati aggregati.Specifies with what frequency to produce aggregate results.

Impostazioni predefinite degli aggregatiAggregate defaults

Di seguito sono specificati i valori consigliati per la finestra di aggregazione e le impostazioni di intervallo.Below are recommended values for the aggregate window and interval settings. Il valore di AggregateEmotionWindowMs non deve essere maggiore del valore di AggregateEmotionIntervalMs.AggregateEmotionWindowMs should be longer than AggregateEmotionIntervalMs.

Impostazioni predefiniteDefaults(s) Max(s)Max(s) Min(s)Min(s)
AggregateEmotionWindowMsAggregateEmotionWindowMs 0,50.5 22 0,250.25
AggregateEmotionIntervalMsAggregateEmotionIntervalMs 0,50.5 11 0,250.25

Output JSONJSON output

Output JSON per l'emozione aggregata (troncato):JSON output for aggregate emotion (truncated):

{
 "version": 1,
 "timescale": 30000,
 "offset": 0,
 "framerate": 29.97,
 "width": 1280,
 "height": 720,
 "fragments": [
   {
     "start": 0,
     "duration": 60060,
     "interval": 15015,
     "events": [
       [
         {
           "windowFaceDistribution": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           },
           "windowMeanScores": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           }
         }
       ],
       [
         {
           "windowFaceDistribution": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           },
           "windowMeanScores": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           }
         }
       ],
       [
         {
           "windowFaceDistribution": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           },
           "windowMeanScores": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           }
         }
       ],
       [
         {
           "windowFaceDistribution": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           },
           "windowMeanScores": {
             "neutral": 0,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           }
         }
       ]
     ]
   },
   {
     "start": 60060,
     "duration": 60060,
     "interval": 15015,
     "events": [
       [
         {
           "windowFaceDistribution": {
             "neutral": 1,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,
             "contempt": 0
           },
           "windowMeanScores": {
             "neutral": 0.688541,
             "happiness": 0.0586323,
             "surprise": 0.227184,
             "sadness": 0.00945675,
             "anger": 0.00592107,
             "disgust": 0.00154993,
             "fear": 0.00450447,
             "contempt": 0.0042109
           }
         }
       ],
       [
         {
           "windowFaceDistribution": {
             "neutral": 1,
             "happiness": 0,
             "surprise": 0,
             "sadness": 0,
             "anger": 0,
             "disgust": 0,
             "fear": 0,

LimitazioniLimitations

  • I formati video di input supportati includono MP4, MOV e WMV.The supported input video formats include MP4, MOV, and WMV.
  • L'intervallo delle dimensioni rilevabili del volto è da 24x24 a 2048x2048 pixel.The detectable face size range is 24x24 to 2048x2048 pixels. I volti al di fuori di questo intervallo non vengono rilevati.The faces out of this range will not be detected.
  • Il numero massimo di volti restituiti per ogni video è 64.For each video, the maximum number of faces returned is 64.
  • È possibile che alcuni volti non vengano rilevati per problemi tecnici, ad esempio angoli del volto molto grandi (durante le pose) e grandi occlusioni.Some faces may not be detected due to technical challenges; e.g. very large face angles (head-pose), and large occlusion. Le riprese frontali e quasi frontali producono i risultati migliori.Frontal and near-frontal faces have the best results.

Codice di esempio .NET.NET sample code

Il programma seguente illustra come:The following program shows how to:

  1. Creare un asset e caricare un file multimediale nell'asset.Create an asset and upload a media file into the asset.
  2. Creare un processo con un'attività di rilevamento viso in base al file di configurazione che contiene il set di impostazioni JSON seguente.Create a job with a face detection task based on a configuration file that contains the following json preset.

     {
         "version": "1.0"
     }
    
  3. Scaricare i file JSON di output.Download the output JSON files.

Creare e configurare un progetto di Visual StudioCreate and configure a Visual Studio project

Configurare l'ambiente di sviluppo e popolare il file app.config con le informazioni di connessione, come descritto in Sviluppo di applicazioni di Servizi multimediali con .NET.Set up your development environment and populate the app.config file with connection information, as described in Media Services development with .NET.

EsempioExample

using System;
using System.Configuration;
using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.Threading;
using System.Threading.Tasks;

namespace FaceDetection
{
    class Program
    {
        private static readonly string _AADTenantDomain =
                  ConfigurationManager.AppSettings["AADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
                  ConfigurationManager.AppSettings["MediaServiceRESTAPIEndpoint"];

        // Field for service context.
        private static CloudMediaContext _context = null;

        static void Main(string[] args)
        {
            var tokenCredentials = new AzureAdTokenCredentials(_AADTenantDomain, AzureEnvironments.AzureCloudEnvironment);
            var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);

            // Run the FaceDetection job.
            var asset = RunFaceDetectionJob(@"C:\supportFiles\FaceDetection\BigBuckBunny.mp4",
                                        @"C:\supportFiles\FaceDetection\config.json");

            // Download the job output asset.
            DownloadAsset(asset, @"C:\supportFiles\FaceDetection\Output");
        }

        static IAsset RunFaceDetectionJob(string inputMediaFilePath, string configurationFile)
        {
            // Create an asset and upload the input media file to storage.
            IAsset asset = CreateAssetAndUploadSingleFile(inputMediaFilePath,
                "My Face Detection Input Asset",
                AssetCreationOptions.None);

            // Declare a new job.
            IJob job = _context.Jobs.Create("My Face Detection Job");

            // Get a reference to Azure Media Face Detector.
            string MediaProcessorName = "Azure Media Face Detector";

            var processor = GetLatestMediaProcessorByName(MediaProcessorName);

            // Read configuration from the specified file.
            string configuration = File.ReadAllText(configurationFile);

            // Create a task with the encoding details, using a string preset.
            ITask task = job.Tasks.AddNew("My Face Detection Task",
                processor,
                configuration,
                TaskOptions.None);

            // Specify the input asset.
            task.InputAssets.Add(asset);

            // Add an output asset to contain the results of the job.
            task.OutputAssets.AddNew("My Face Detectoion Output Asset", AssetCreationOptions.None);

            // Use the following event handler to check job progress.  
            job.StateChanged += new EventHandler<JobStateChangedEventArgs>(StateChanged);

            // Launch the job.
            job.Submit();

            // Check job execution and wait for job to finish.
            Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);

            progressJobTask.Wait();

            // If job state is Error, the event handling
            // method for job progress should log errors.  Here we check
            // for error state and exit if needed.
            if (job.State == JobState.Error)
            {
                ErrorDetail error = job.Tasks.First().ErrorDetails.First();
                Console.WriteLine(string.Format("Error: {0}. {1}",
                                                error.Code,
                                                error.Message));
                return null;
            }

            return job.OutputMediaAssets[0];
        }

        static IAsset CreateAssetAndUploadSingleFile(string filePath, string assetName, AssetCreationOptions options)
        {
            IAsset asset = _context.Assets.Create(assetName, options);

            var assetFile = asset.AssetFiles.Create(Path.GetFileName(filePath));
            assetFile.Upload(filePath);

            return asset;
        }

        static void DownloadAsset(IAsset asset, string outputDirectory)
        {
            foreach (IAssetFile file in asset.AssetFiles)
            {
                file.Download(Path.Combine(outputDirectory, file.Name));
            }
        }

        static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
        {
            var processor = _context.MediaProcessors
                .Where(p => p.Name == mediaProcessorName)
                .ToList()
                .OrderBy(p => new Version(p.Version))
                .LastOrDefault();

            if (processor == null)
                throw new ArgumentException(string.Format("Unknown media processor",
                                                           mediaProcessorName));

            return processor;
        }

        static private void StateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job state changed event:");
            Console.WriteLine("  Previous state: " + e.PreviousState);
            Console.WriteLine("  Current state: " + e.CurrentState);

            switch (e.CurrentState)
            {
                case JobState.Finished:
                    Console.WriteLine();
                    Console.WriteLine("Job is finished.");
                    Console.WriteLine();
                    break;
                case JobState.Canceling:
                case JobState.Queued:
                case JobState.Scheduled:
                case JobState.Processing:
                    Console.WriteLine("Please wait...\n");
                    break;
                case JobState.Canceled:
                case JobState.Error:
                    // Cast sender as a job.
                    IJob job = (IJob)sender;
                    // Display or log error details as needed.
                    // LogJobStop(job.Id);
                    break;
                default:
                    break;
            }
        }
    }
}

Percorsi di apprendimento di Servizi multimedialiMedia Services learning paths

Altre informazioni sui percorsi di apprendimento di Servizi multimediali di Azure:Read about the Azure Media Services learning paths:

Fornire commenti e suggerimentiProvide feedback

Usare il forum di suggerimenti degli utenti per fornire commenti e suggerimenti su come migliorare Servizi multimediali di Azure.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. È anche possibile passare direttamente a una delle categorie seguenti:You also can go directly to one of the following categories:

Panoramica di Analisi servizi multimediali di AzureAzure Media Services Analytics Overview

Demo di Analisi servizi multimediali di AzureAzure Media Analytics demos