Offuscare i volti con Analisi Servizi multimediali di AzureRedact faces with Azure Media Analytics

PanoramicaOverview

Azure Media Redactor è un processore di contenuti multimediali di Analisi Servizi multimediali di Azure che offre funzionalità scalabili di offuscamento dei volti nel cloud.Azure Media Redactor is an Azure Media Analytics media processor (MP) that offers scalable face redaction in the cloud. L'offuscamento dei volti consente di modificare un video per sfocare i volti di persone selezionate.Face redaction enables you to modify your video in order to blur faces of selected individuals. Può essere opportuno usare tale servizio in scenari di pubblica sicurezza e notizie giornalistiche.You may want to use the face redaction service in public safety and news media scenarios. Offuscare manualmente alcuni minuti di filmato contenenti più volti può richiedere ore, ma con questo servizio il processo di offuscamento dei volti richiederà pochi semplici passaggi.A few minutes of footage that contains multiple faces can take hours to redact manually, but with this service the face redaction process will require just a few simple steps. Per altre informazioni, vedere questo blog.For more information, see this blog.

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

Modalità per l'offuscamento dei voltiFace redaction modes

La funzionalità di offuscamento dei volti rileva i volti in ogni fotogramma del video e monitora l'oggetto volto avanti e indietro nel tempo in modo da consentire la sfocatura della stessa persona anche da altre angolazioni.Facial redaction works by detecting faces in every frame of video and tracking the face object both forwards and backwards in time, so that the same individual can be blurred from other angles as well. Il processo di offuscamento automatizzato è molto complesso e non sempre produce al 100% l'output desiderato. Per tale motivo, Analisi Servizi multimediali offre alcuni modi per modificare l'output finale.The automated redaction process is very complex and does not always produce 100% of desired output, for this reason Media Analytics provides you with a couple of ways to modify the final output.

In aggiunta a una modalità interamente automatica, esiste un flusso di lavoro in due passaggi che consente di selezionare/deselezionare i volti trovati tramite un elenco di ID.In addition to a fully automatic mode, there is a two-pass workflow which allows the selection/de-selection of found faces via a list of IDs. Per apportare modifiche arbitrarie per singolo fotogramma, inoltre, il processore di contenuti multimediali usa un file di metadati in formato JSON.Also, to make arbitrary per frame adjustments the MP uses a metadata file in JSON format. Il flusso di lavoro è suddiviso nelle modalità analisi e offuscamento.This workflow is split into Analyze and Redact modes. È possibile combinare le due modalità in un singolo passaggio che esegue entrambe le attività in un unico processo. Questa modalità è detta combinata.You can combine the two modes in a single pass that runs both tasks in one job; this mode is called Combined.

Modalità combinataCombined mode

Questa modalità produce automaticamente un file mp4 offuscato senza alcun input manuale.This will produce a redacted mp4 automatically without any manual input.

FaseStage File NameFile Name NoteNotes
Asset di inputInput asset foo.barfoo.bar Video in formato WMV, MOV o MP4Video in WMV, MOV, or MP4 format
Configurazione di inputInput config Set di impostazioni di configurazione del processoJob configuration preset {'version':'1.0', 'options': {'mode':'combined'}}{'version':'1.0', 'options': {'mode':'combined'}}
Asset di outputOutput asset foo_redacted.mp4foo_redacted.mp4 Video con sfocatura applicataVideo with blurring applied

Esempio di input:Input example:

Guardare il videoview this video

Esempio di output:Output example:

Guardare il videoview this video

Modalità analisiAnalyze mode

Nel flusso di lavoro in due passaggi, il passaggio dell' analisi usa un input video e produce un file JSON di posizioni di volti e immagini jpg di ogni volto rilevato.The analyze pass of the two-pass workflow takes a video input and produces a JSON file of face locations, and jpg images of each detected face.

FaseStage File NameFile Name NoteNotes
Asset di inputInput asset foo.barfoo.bar Video in formato WMV, MPV o MP4Video in WMV, MPV, or MP4 format
Configurazione di inputInput config Set di impostazioni di configurazione del processoJob configuration preset {'version':'1.0', 'options': {'mode':'analyze'}}{'version':'1.0', 'options': {'mode':'analyze'}}
Asset di outputOutput asset foo_annotations.jsonfoo_annotations.json Dati di annotazione delle posizioni dei volti in formato JSON,Annotation data of face locations in JSON format. modificabili dall'utente per modificare i rettangoli di selezione della sfocatura.This can be edited by the user to modify the blurring bounding boxes. Vedere l'esempio di seguito.See sample below.
Asset di outputOutput asset foo_thumb%06d.jpg [foo_thumb000001.jpg, foo_thumb000002.jpg]foo_thumb%06d.jpg [foo_thumb000001.jpg, foo_thumb000002.jpg] File jpg ritagliato di ogni volto rilevato, in cui il numero indica l'ID etichetta del voltoA cropped jpg of each detected face, where the number indicates the labelId of the face

Esempio di output:Output example:

{
  "version": 1,
  "timescale": 24000,
  "offset": 0,
  "framerate": 23.976,
  "width": 1280,
  "height": 720,
  "fragments": [
    {
      "start": 0,
      "duration": 48048,
      "interval": 1001,
      "events": [
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [],
        [
          {
            "index": 13,
            "id": 1138,
            "x": 0.29537,
            "y": -0.18987,
            "width": 0.36239,
            "height": 0.80335
          },
          {
            "index": 13,
            "id": 2028,
            "x": 0.60427,
            "y": 0.16098,
            "width": 0.26958,
            "height": 0.57943
          }
        ],

… truncated

Modalità offuscamentoRedact mode

Il secondo passaggio del flusso di lavoro usa un numero superiore di input che devono essere combinati in un singolo asset.The second pass of the workflow takes a larger number of inputs that must be combined into a single asset.

Gli input includono un elenco di ID da sfocare, il video originale e il file JSON delle annotazioni.This includes a list of IDs to blur, the original video, and the annotations JSON. Questa modalità usa le annotazioni per applicare la sfocatura nel video di input.This mode uses the annotations to apply blurring on the input video.

L'output del passaggio dell'analisi non include il video originale.The output from the Analyze pass does not include the original video. Il video deve essere caricato nell'asset di input per l'attività della modalità offuscamento ed essere selezionato come file primario.The video needs to be uploaded into the input asset for the Redact mode task and selected as the primary file.

FaseStage File NameFile Name NoteNotes
Asset di inputInput asset foo.barfoo.bar Video in formato WMV, MPV o MP4.Video in WMV, MPV, or MP4 format. Stesso video del passaggio 1.Same video as in step 1.
Asset di inputInput asset foo_annotations.jsonfoo_annotations.json File di metadati delle annotazioni della prima fase, con modifiche facoltative.annotations metadata file from phase one, with optional modifications.
Asset di inputInput asset foo_IDList.txt (facoltativo)foo_IDList.txt (Optional) Elenco facoltativo separato da caratteri di nuova riga di ID volto da offuscare.Optional new line separated list of face IDs to redact. Se viene lasciato vuoto, vengono sfocati tutti i volti.If left blank, this blurs all faces.
Configurazione di inputInput config Set di impostazioni di configurazione del processoJob configuration preset {'version':'1.0', 'options': {'mode':'redact'}}{'version':'1.0', 'options': {'mode':'redact'}}
Asset di outputOutput asset foo_redacted.mp4foo_redacted.mp4 Video con sfocatura applicata in base alle annotazioni.Video with blurring applied based on annotations

Output di esempioExample output

Questo output viene ottenuto da un elenco di ID con un ID selezionato.This is the output from an IDList with one ID selected.

Guardare il videoview this video

Esempio foo_IDList.txtExample foo_IDList.txt

 1
 2
 3

Tipi di sfocatureBlur types

Nella modalità Combined o Redact sono disponibili 5 modalità di sfocatura diverse tra cui scegliere tramite la configurazione di input JSON: Low, Med, High, Box e Black.In the Combined or Redact mode, there are 5 different blur modes you can choose from via the JSON input configuration: Low, Med, High, Box, and Black. Per impostazione predefinita, viene usata Med.By default Med is used.

Di seguito sono riportati alcuni esempi dei tipi di sfocature.You can find samples of the blur types below.

JSON di esempio:Example JSON:

{'version':'1.0', 'options': {'Mode': 'Combined', 'BlurType': 'High'}}

BassoLow

Basso

MedMed

Med

AltoHigh

Alto

BoxBox

Box

NeroBlack

Nero

Elementi del file di output JSONElements of the output JSON file

Il processore di contenuti multimediali per l'offuscamento offre funzionalità di rilevamento della posizione e monitoraggio dei volti ad alta precisione che possono rilevare fino a 64 volti umani in un fotogramma video.The Redaction MP provides high precision face location detection and tracking that can detect up to 64 human faces in a video frame. Le riprese anteriori producono risultati ottimali, mentre profili e volti di piccole dimensioni (inferiori o uguali a 24x24 pixel) presentano alcune problematiche.Frontal faces provide the best results, while side faces and small faces (less than or equal to 24x24 pixels) are challenging.

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.

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 offuscamento dei volti in base a un file di configurazione contenente il set di impostazioni JSON seguente.Create a job with a face redaction task based on a configuration file that contains the following json preset.

     {'version':'1.0', 'options': {'mode':'combined'}}
    
  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 FaceRedaction
{
    class Program
    {
    // Read values from the App.config file.
    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 FaceRedaction job.
        var asset = RunFaceRedactionJob(@"C:\supportFiles\FaceRedaction\SomeFootage.mp4",
                    @"C:\supportFiles\FaceRedaction\config.json");

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

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

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

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

        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 Redaction 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 Redaction 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;
        }
    }
    }
}

Passaggi successiviNext steps

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