Rilevare i movimenti con Analisi servizi multimediali di AzureDetect Motions with Azure Media Analytics

PanoramicaOverview

Il processore di contenuti multimediali Rilevatore multimediale di movimento Azure consente di identificare in modo efficace le sezioni interessanti all'interno di un video altrimenti lungo e privo di eventi.The Azure Media Motion Detector media processor (MP) enables you to efficiently identify sections of interest within an otherwise long and uneventful video. Il rilevamento di movimento può essere usato nei filmati statici della videocamera per individuare le sezioni del video in cui si verificano movimenti.Motion detection can be used on static camera footage to identify sections of the video where motion occurs. Viene generato un file JSON contenente i metadati con i timestamp e l'area di delimitazione in cui si è verificato l'evento.It generates a JSON file containing a metadata with timestamps and the bounding region where the event occurred.

Questa tecnologia, destinata alle trasmissioni video di sicurezza, è in grado di classificare i movimenti in eventi rilevanti e falsi positivi, ad esempio variazioni di luminosità e delle ombre.Targeted towards security video feeds, this technology is able to categorize motion into relevant events and false positives such as shadows and lighting changes. In questo modo è possibile generare avvisi di sicurezza dalle trasmissioni della videocamera senza che venga segnalata una serie infinita di eventi irrilevanti e al contempo estrarre i momenti di interesse da video di sorveglianza estremamente lunghi.This allows you to generate security alerts from camera feeds without being spammed with endless irrelevant events, while being able to extract moments of interest from extremely long surveillance videos.

Attualmente il processore multimediale Rilevatore multimediale di movimento Azure è disponibile in Anteprima.The Azure Media Motion Detector MP is currently in Preview.

Questo argomento illustra dettagliatamente il Azure Media Motion Detector e spiega come usare questa funzionalità con Media Services .NET SDKThis topic gives details about Azure Media Motion Detector and shows how to use it with Media Services SDK for .NET

File di input di Rilevatore di movimentoMotion 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.

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

Quando si crea un'attività con Azure Media Motion Detectorè necessario specificare un set di impostazioni di configurazione.When creating a task with Azure Media Motion Detector, you must specify a configuration preset.

ParametriParameters

È possibile usare i parametri seguenti:You can use the following parameters:

NomeName OpzioniOptions DescrizioneDescription DefaultDefault
sensitivityLevelsensitivityLevel Stringa:'low', 'medium', 'high'String:'low', 'medium', 'high' Imposta il livello di sensibilità per la segnalazione dei movimenti.Sets the sensitivity level at which motions is reported. Modificare per ridurre il numero di falsi positivi.Adjust this to adjust amount of false positives. 'medium''medium'
frameSamplingValueframeSamplingValue Intero positivoPositive integer Imposta la frequenza di esecuzione dell'algoritmo.Sets the frequency at which algorithm runs. 1 indica a ogni fotogramma, 2 a un fotogramma su due e così via.1 equals every frame, 2 means every 2nd frame, and so on. 11
detectLightChangedetectLightChange Booleano: 'true', 'false'Boolean:'true', 'false' Indica se vengono segnalate le variazioni di luce nei risultatiSets whether light changes are reported in the results 'False''False'
mergeTimeThresholdmergeTimeThreshold Xs-time: Hh:mm:ssXs-time: Hh:mm:ss
Esempio: 00:00:03Example: 00:00:03
Specifica l'intervallo di tempo tra eventi di movimento in cui 2 eventi verranno combinati e segnalati come 1 evento.Specifies the time window between motion events where 2 events will be combined and reported as 1. 00:00:0000:00:00
detectionZonesdetectionZones Matrice di zone di rilevamento:An array of detection zones:
- La zona di rilevamento è una matrice di 3 o più punti- Detection Zone is an array of 3 or more points
- Il punto è una coordinata x e y da 0 a 1.- Point is a x and y coordinate from 0 to 1.
Descrive l'elenco delle zone di rilevamento poligonali da usare.Describes the list of polygonal detection zones to be used.
I risultati verranno visualizzati con le zone come ID, dove la prima è 'id':0Results will be reported with the zones as an ID, with the first one being 'id':0
Singola zona che copre l'intero fotogramma.Single zone which covers the entire frame.

Esempio di JSONJSON example

{
  "version": "1.0",
  "options": {
    "sensitivityLevel": "medium",
    "frameSamplingValue": 1,
    "detectLightChange": "False",
    "mergeTimeThreshold":
    "00:00:02",
    "detectionZones": [
      [
        {"x": 0, "y": 0},
        {"x": 0.5, "y": 0},
        {"x": 0, "y": 1}
       ],
      [
        {"x": 0.3, "y": 0.3},
        {"x": 0.55, "y": 0.3},
        {"x": 0.8, "y": 0.3},
        {"x": 0.8, "y": 0.55},
        {"x": 0.8, "y": 0.8},
        {"x": 0.55, "y": 0.8},
        {"x": 0.3, "y": 0.8},
        {"x": 0.3, "y": 0.55}
      ]
    ]
  }
}

File di output di Rilevatore di movimentoMotion Detector output files

Un processo di rilevamento del movimento restituirà un file JSON nell'asset di output che descrive gli avvisi di movimento e le relative categorie all'interno del video.A motion detection job will return a JSON file in the output asset which describes the motion alerts, and their categories, within the video. Il file conterrà informazioni sull'ora e sulla durata dei movimenti rilevati nel video.The file will contain information about the time and duration of motion detected in the video.

L'API Rilevatore di movimento fornisce indicatori se sono presenti oggetti in movimento in un video con sfondo fisso, ad esempio un video di sorveglianza.The Motion Detector API provides indicators once there are objects in motion in a fixed background video (e.g. a surveillance video). Rilevatore di movimento è in grado di ridurre i falsi allarmi, ad esempio variazioni di luminosità e di ombreggiatura.The Motion Detector is trained to reduce false alarms, such as lighting and shadow changes. Le limitazioni correnti degli algoritmi includono video con visione notturna, oggetti semi-trasparenti e oggetti di piccole dimensioni.Current limitations of the algorithms include night vision videos, semi-transparent objects, and small objects.

Elementi del file di output JSONElements of the output JSON file

Nota

Nella versione più recente, il formato di output JSON è stato modificato e può rappresentare una modifica di rilievo per alcuni clienti.In the latest release, the Output JSON format has changed and may represent a breaking change for some customers.

La tabella seguente illustra gli elementi del file di output JSON.The following table describes elements of the output JSON file.

ElementoElement DescrizioneDescription
VersioneVersion Indica la versione dell'API Video.This refers to the version of the Video API. La versione corrente è 2.The current version is 2.
Scala cronologicaTimescale "Scatti" al secondo del video."Ticks" per second of the video.
OffsetOffset Differenza di orario dei timestamp in "scatti".The time offset for timestamps in "ticks". 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.
Frequenza fotogrammiFramerate Fotogrammi al secondo del video.Frames per second of the video.
Larghezza, altezzaWidth, Height Indica la larghezza e l'altezza del video in pixel.Refers to the width and height of the video in pixels.
IniziaStart Il timestamp di inizio in "scatti".The start timestamp in "ticks".
DurataDuration La lunghezza dell'evento in "scatti".The length of the event, in "ticks".
IntervalInterval L'intervallo di ogni voce dell'evento in "scatti".The interval of each entry in the event, in "ticks".
EventiEvents Ogni frammento di evento contiene i movimenti rilevati nella durata specificata.Each event fragment contains the motion detected within that time duration.
TipoType Nella versione corrente questo valore è sempre "2" per il movimento generico.In the current version, this is always ‘2’ for generic motion. Questa etichetta offre alle API Video la flessibilità necessaria per classificare i movimenti nelle versioni future.This label gives Video APIs the flexibility to categorize motion in future versions.
RegionIDRegionID Come spiegato in precedenza, in questa versione questo valore è sempre 0.As explained above, this will always be 0 in this version. Questa etichetta offre alle API Video la flessibilità necessaria per individuare i movimenti in varie aree nelle versioni future.This label gives Video API the flexibility to find motion in various regions in future versions.
RegioniRegions Si riferisce all'area del video in cui si presta particolare attenzione al movimento.Refers to the area in your video where you care about motion.

-"id" rappresenta l'area: in questa versione ne è presente una sola, ID 0.-"id" represents the region area – in this version there is only one, ID 0.
-"type" rappresenta la forma dell'area importante per il movimento.-"type" represents the shape of the region you care about for motion. Sono attualmente supportati "rectangle" e "polygon".Currently, "rectangle" and "polygon" are supported.
Se è stato specificato "rectangle", le dimensioni dell'area saranno X, Y, larghezza e altezza.If you specified "rectangle", the region has dimensions in X, Y, Width, and Height. Le coordinate X e Y rappresentano le coordinate XY in alto a sinistra nell'area in una scala normalizzata da 0,0 a 1,0.The X and Y coordinates represent the upper left hand XY coordinates of the region in a normalized scale of 0.0 to 1.0. La larghezza e l'altezza rappresentano le dimensioni dell'area in una scala normalizzata da 0,0 a 1,0.The width and height represent the size of the region in a normalized scale of 0.0 to 1.0. Nella versione corrente, X, Y, larghezza e altezza sono sempre 0, 0 e 1, 1.In the current version, X, Y, Width, and Height are always fixed at 0, 0 and 1, 1.
Se è stato specificato "polygon", le dimensioni dell'area saranno in punti.If you specified "polygon", the region has dimensions in points.
FrammentiFragments 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). Un frammento privo di eventi significa che non è stato rilevato alcun movimento in corrispondenza dell'ora di inizio e della durata.A fragment with no events means that no motion was detected during that start time and duration.
Parentesi quadre []Brackets [] Ogni parentesi rappresenta un intervallo nell'evento.Each bracket represents one interval in the event. Le parentesi vuote in un intervallo indicano che è non stato rilevato alcun movimento.Empty brackets for that interval means that no motion was detected.
locationslocations Questa nuova voce nell'elenco degli eventi indica le posizioni in cui si è verificato il movimento.This new entry under events lists the location where the motion occurred. È un dato più specifico delle zone di rilevamento.This is more specific than the detection zones.

Di seguito è riportato un esempio di output JSONThe following is a JSON output example

{
  "version": 2,
  "timescale": 23976,
  "offset": 0,
  "framerate": 24,
  "width": 1280,
  "height": 720,
  "regions": [
    {
      "id": 0,
      "type": "polygon",
      "points": [{'x': 0, 'y': 0},
        {'x': 0.5, 'y': 0},
        {'x': 0, 'y': 1}]
    }
  ],
  "fragments": [
    {
      "start": 0,
      "duration": 226765
    },
    {
      "start": 226765,
      "duration": 47952,
      "interval": 999,
      "events": [
        [
          {
            "type": 2,
            "typeName": "motion",
            "locations": [
              {
                "x": 0.004184,
                "y": 0.007463,
                "width": 0.991667,
                "height": 0.985185
              }
            ],
            "regionId": 0
          }
        ],

…

LimitazioniLimitations

  • I formati video di input supportati includono MP4, MOV e WMV.The supported input video formats include MP4, MOV, and WMV.
  • Il rilevamento di movimento è ottimizzato per i video a sfondo fisso.Motion Detection is optimized for stationary background videos. L'algoritmo mira alla riduzione dei falsi allarmi, ad esempio le variazioni di luce e ombra.The algorithm focuses on reducing false alarms, such as lighting changes, and shadows.
  • È possibile che alcuni movimenti non vengano rilevati per problemi tecnici, ad esempio video con visione notturna, oggetti semi-trasparenti e oggetti di piccole dimensioni.Some motion may not be detected due to technical challenges; e.g. night vision videos, semi-transparent objects, and small objects.

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 movimento video in base al file di configurazione che contiene il set di impostazioni JSON seguente.Create a job with a video motion detection task based on a configuration file that contains the following json preset.

     {
       "Version": "1.0",
       "Options": {
         "SensitivityLevel": "medium",
         "FrameSamplingValue": 1,
         "DetectLightChange": "False",
         "MergeTimeThreshold":
         "00:00:02",
         "DetectionZones": [
           [
             {"x": 0, "y": 0},
             {"x": 0.5, "y": 0},
             {"x": 0, "y": 1}
            ],
           [
             {"x": 0.3, "y": 0.3},
             {"x": 0.55, "y": 0.3},
             {"x": 0.8, "y": 0.3},
             {"x": 0.8, "y": 0.55},
             {"x": 0.8, "y": 0.8},
             {"x": 0.55, "y": 0.8},
             {"x": 0.3, "y": 0.8},
             {"x": 0.3, "y": 0.55}
           ]
         ]
       }
     }
    
  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 VideoMotionDetection
{
    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 VideoMotionDetection job.
            var asset = RunVideoMotionDetectionJob(@"C:\supportFiles\VideoMotionDetection\BigBuckBunny.mp4",
                                        @"C:\supportFiles\VideoMotionDetection\config.json");

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

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

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

            // Get a reference to Azure Media Motion Detector.
            string MediaProcessorName = "Azure Media Motion 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 Video Motion 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 Video Motion 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:

Blog di Azure Media Motion DetectorAzure Media Services Motion Detector blog

Panoramica di Analisi servizi multimediali di AzureAzure Media Services Analytics Overview

Demo di Analisi servizi multimediali di AzureAzure Media Analytics demos