Análisis de contenido de vídeo para detectar material inapropiado en C#Analyze video content for objectionable material in C#

En este artículo se proporcionan información y ejemplos de código que le ayudarán a empezar a usar el SDK de Content Moderator para .NET para examinar contenido de vídeo a fin de detectar contenido para adultos o atrevido.This article provides information and code samples to help you get started using the Content Moderator SDK for .NET to scan video content for adult or racy content.

Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.If you don't have an Azure subscription, create a free account before you begin.

PrerrequisitosPrerequisites

Configuración de los recursos de AzureSet up Azure resources

La funcionalidad de moderación de vídeo de Content Moderator está disponible de forma gratuita como un procesador de multimedia (en versión preliminar pública) para Azure Media Services (AMS).The Content Moderator's video moderation capability is available as a free public preview media processor in Azure Media Services (AMS). Azure Media Services es un servicio de Azure especializado para almacenar y transmitir contenido de vídeo.Azure Media Services is a specialized Azure service for storing and streaming video content.

Creación de una cuenta de Azure Media ServicesCreate an Azure Media Services account

Para suscribirse a ASM y crear una cuenta de almacenamiento de Azure asociada, siga las instrucciones que se indican en Creación de una cuenta de Azure Media Services.Follow the instructions in Create an Azure Media Services account to subscribe to AMS and create an associated Azure storage account. En esa cuenta de almacenamiento, cree un contenedor de almacenamiento de blobs.In that storage account, create a new Blob storage container.

Creación de una aplicación de Azure Active DirectoryCreate an Azure Active Directory application

Vaya a la nueva suscripción de AMS en Azure Portal y seleccione Acceso de API en el menú lateral.Navigate to your new AMS subscription in the Azure portal and select API access from the side menu. Seleccione Connect to Azure Media Services with service principal (Conectarse a Azure Media Services con la entidad de servicio).Select Connect to Azure Media Services with service principal. Anote el valor del campo Punto de conexión de la API de REST; la necesitará más adelante.Note the value in the REST API endpoint field; you will need this later.

En la sección Aplicación de Azure AD, seleccione Crear nueva y asigne un nombre al nuevo registro de aplicación de Azure AD, por ejemplo "VideoModADApp".In the Azure AD app section, select Create New and name your new Azure AD application registration (for example, "VideoModADApp"). Haga clic en Guardar y espere unos minutos a que se configure la aplicación.Click Save and wait a few minutes while the application is configured. A continuación, verá el nuevo registro de aplicación en la sección Aplicación de Azure AD de la página.Then, you should see your new app registration under the Azure AD app section of the page.

Seleccione el registro de aplicación y haga clic en el botón Administrar aplicación que hay debajo.Select your app registration and click the Manage application button below it. Anote el valor del campo Id. de aplicación; lo necesitará más adelante.Note the value in the Application ID field; you will need this later. Seleccione Configuración > Claves y escriba una descripción para una nueva clave (por ejemplo, "VideoModKey").Select Settings > Keys, and enter a description for a new key (such as "VideoModKey"). Haga clic en Guardar y, luego, observe el nuevo valor de clave.Click Save, and then notice the new key value. Copie esta cadena y guárdela en un lugar seguro.Copy this string and save it somewhere secure.

Si desea un tutorial más detallado del proceso anterior, consulte Introducción a la autenticación de Azure AD.For a more thorough walkthrough of the above process, See Get started with Azure AD authentication.

Una vez hecho esto, puede usar el procesador de multimedia de moderación de vídeo de dos maneras diferentes.Once you've done this, you can use the video moderation media processor in two different ways.

Usar el explorador de Azure Media ServicesUse Azure Media Services Explorer

Azure Media Services Explorer es un front-end fácil de usar de AMS.The Azure Media Services Explorer is a user-friendly frontend for AMS. Úselo para examinar la cuenta de AMS, cargar vídeos y analizar el contenido con el procesador de multimedia de Content Moderator.Use it to browse your AMS account, upload videos, and scan content with the Content Moderator media processor. Descárguelo e instálelo desde GitHub, o consulte la entrada de blog de Azure Media Services Explorer para más información.Download and install it from GitHub, or see the Azure Media Services Explorer blog post for more information.

Explorador de Azure Media Services con Content Moderator

Creación del proyecto de Visual StudioCreate the Visual Studio project

  1. En Visual Studio, cree un proyecto de Aplicación de consola (.NET Framework) y asígnele el nombre VideoModeration.In Visual Studio, create a new Console app (.NET Framework) project and name it VideoModeration.
  2. Si hay otros proyectos en la solución, seleccione este como proyecto de inicio único.If there are other projects in your solution, select this one as the single startup project.
  3. Obtenga los paquetes NuGet requeridos.Get the required NuGet packages. Haga clic con el botón derecho en el proyecto en el Explorador de soluciones y seleccione Administrar paquetes NuGet; a continuación, busque e instale los siguientes paquetes:Right-click on your project in the Solution Explorer and select Manage NuGet Packages; then find and install the following packages:
    • windowsazure.mediaserviceswindowsazure.mediaservices
    • windowsazure.mediaservices.extensionswindowsazure.mediaservices.extensions

Incorporación del código de moderación de vídeoAdd video moderation code

A continuación, copiará y pegará el código de esta guía en el proyecto para implementar un escenario básico de moderación de contenido.Next, you'll copy and paste the code from this guide into your project to implement a basic content moderation scenario.

Actualizar las instrucciones using del programaUpdate the program's using statements

Agregue las siguientes instrucciones using al principio del archivo Program.cs.Add the following using statements to the top of your Program.cs file.

using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.IO;
using System.Threading;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using System.Collections.Generic;

Configuración de las referencias de recursosSet up resource references

Agregue los siguientes campos estáticos a la clase Program en Program.cs.Add the following static fields to the Program class in Program.cs. Estos campos contienen la información necesaria para conectarse a su suscripción de AMS.These fields hold the information necessary for connecting to your AMS subscription. Rellénelos con los valores que obtuvo en los pasos anteriores.Fill them in with the values you got in the steps above. Tenga en cuenta que CLIENT_ID es el valor de Id. de aplicación de la aplicación de Azure AD, y que CLIENT_SECRET es el valor de "VideoModKey" que ha creado para esa aplicación.Note that CLIENT_ID is the Application ID value of your Azure AD app, and CLIENT_SECRET is the value of the "VideoModKey" that you created for that app.

// declare constants and globals
private static CloudMediaContext _context = null;
private static CloudStorageAccount _StorageAccount = null;

// Azure Media Services (AMS) associated Storage Account, Key, and the Container that has 
// a list of Blobs to be processed.
static string STORAGE_NAME = "YOUR AMS ASSOCIATED BLOB STORAGE NAME";
static string STORAGE_KEY = "YOUR AMS ASSOCIATED BLOB STORAGE KEY";
static string STORAGE_CONTAINER_NAME = "YOUR BLOB CONTAINER FOR VIDEO FILES";

private static StorageCredentials _StorageCredentials = null;

// Azure Media Services authentication. 
private const string AZURE_AD_TENANT_NAME = "microsoft.onmicrosoft.com";
private const string CLIENT_ID = "YOUR CLIENT ID";
private const string CLIENT_SECRET = "YOUR CLIENT SECRET";

// REST API endpoint, for example "https://accountname.restv2.westcentralus.media.azure.net/API".      
private const string REST_API_ENDPOINT = "YOUR API ENDPOINT";

// Content Moderator Media Processor Nam
private const string MEDIA_PROCESSOR = "Azure Media Content Moderator";

// Input and Output files in the current directory of the executable
private const string INPUT_FILE = "VIDEO FILE NAME";
private const string OUTPUT_FOLDER = "";

// JSON settings file
private static readonly string CONTENT_MODERATOR_PRESET_FILE = "preset.json";

Si quiere usar un archivo de vídeo local (caso más sencillo), agréguelo al proyecto y escriba su ruta de acceso como el valor INPUT_FILE (las rutas de acceso relativas son relativas al directorio de ejecución).If you wish to use a local video file (simplest case), add it to the project and enter its path as the INPUT_FILE value (relative paths are relative to the execution directory).

También deberá crear el archivo preset.json en el directorio actual y usarlo para especificar un número de versión.You will also need to create the preset.json file in the current directory and use it to specify a version number. Por ejemplo:For example:

{
    "version": "2.0"
}

Carga del vídeo de entradaLoad the input video(s)

El método Main de la clase Program crea un contexto multimedia de Azure y luego un contexto de almacenamiento de Azure (en caso de que los vídeos estén en Blob Storage).The Main method of the Program class will create an Azure Media Context and then an Azure Storage Context (in case your videos are in blob storage). El código restante examina un vídeo de una carpeta local, blob o varios blobs dentro de un contenedor de almacenamiento de Azure.The remaining code scans a video from a local folder, blob, or multiple blobs within an Azure storage container. Puede probar todas las opciones si decide comentar las otras líneas de código.You can try all options by commenting out the other lines of code.

// Create Azure Media Context
CreateMediaContext();

// Create Storage Context
CreateStorageContext();

// Use a file as the input.
IAsset asset = CreateAssetfromFile();

// -- OR ---

// Or a blob as the input
// IAsset asset = CreateAssetfromBlob((CloudBlockBlob)GetBlobsList().First());

// Then submit the asset to Content Moderator
RunContentModeratorJob(asset);

//-- OR ----

// Just run the content moderator on all blobs in a list (from a Blob Container)
// RunContentModeratorJobOnBlobs();

Creación de un contexto multimedia de AzureCreate an Azure Media Context

Agregue el método siguiente a la clase Program.Add the following method to the Program class. Se usarán sus credenciales de AMS para permitir la comunicación con AMS.This uses your AMS credentials to allow communication with AMS.

// Creates a media context from azure credentials
static void CreateMediaContext()
{
    // Get Azure AD credentials
    var tokenCredentials = new AzureAdTokenCredentials(AZURE_AD_TENANT_NAME,
        new AzureAdClientSymmetricKey(CLIENT_ID, CLIENT_SECRET),
        AzureEnvironments.AzureCloudEnvironment);

    // Initialize an Azure AD token
    var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

    // Create a media context
    _context = new CloudMediaContext(new Uri(REST_API_ENDPOINT), tokenProvider);
}

Agregar el código para crear un contexto de Azure StorageAdd the code to create an Azure Storage Context

Agregue el método siguiente a la clase Program.Add the following method to the Program class. Usará el contexto de almacenamiento, creado con las credenciales de almacenamiento, para acceder al almacenamiento de blobs.You use the Storage Context, created from your storage credentials, to access your blob storage.

// Creates a storage context from the AMS associated storage name and key
static void CreateStorageContext()
{
    // Get a reference to the storage account associated with a Media Services account. 
    if (_StorageCredentials == null)
    {
        _StorageCredentials = new StorageCredentials(STORAGE_NAME, STORAGE_KEY);
    }
    _StorageAccount = new CloudStorageAccount(_StorageCredentials, false);
}

Agregar el código para crear recursos de Azure Media a partir de un archivo local y un blobAdd the code to create Azure Media Assets from local file and blob

El procesador de multimedia de Content Moderator ejecuta trabajos en la opción Recursos de la plataforma Azure Media Services.The Content Moderator media processor runs jobs on Assets within the Azure Media Services platform. Estos métodos crean los recursos de un archivo local o un blob asociado.These methods create the Assets from a local file or an associated blob.

// Creates an Azure Media Services Asset from the video file
static IAsset CreateAssetfromFile()
{
    return _context.Assets.CreateFromFile(INPUT_FILE, AssetCreationOptions.None); ;
}

// Creates an Azure Media Services asset from your blog storage
static IAsset CreateAssetfromBlob(CloudBlockBlob Blob)
{
    // Create asset from the FIRST blob in the list and return it
    return _context.Assets.CreateFromBlob(Blob, _StorageCredentials, AssetCreationOptions.None);
}

Agregar el código para examinar una colección de vídeos (como blobs) en un contenedorAdd the code to scan a collection of videos (as blobs) within a container

// Runs the Content Moderator Job on all Blobs in a given container name
static void RunContentModeratorJobOnBlobs()
{
    // Get the reference to the list of Blobs. See the following method.
    var blobList = GetBlobsList();

    // Iterate over the Blob list items or work on specific ones as needed
    foreach (var sourceBlob in blobList)
    {
        // Create an Asset
        IAsset asset = _context.Assets.CreateFromBlob((CloudBlockBlob)sourceBlob,
                            _StorageCredentials, AssetCreationOptions.None);
        asset.Update();

        // Submit to Content Moderator
        RunContentModeratorJob(asset);
    }
}

// Get all blobs in your container
static IEnumerable<IListBlobItem> GetBlobsList()
{
    // Get a reference to the Container within the Storage Account
    // that has the files (blobs) for moderation
    CloudBlobClient CloudBlobClient = _StorageAccount.CreateCloudBlobClient();
    CloudBlobContainer MediaBlobContainer = CloudBlobClient.GetContainerReference(STORAGE_CONTAINER_NAME);

    // Get the reference to the list of Blobs 
    var blobList = MediaBlobContainer.ListBlobs();
    return blobList;
}

Agregar el método para ejecutar el trabajo de Content ModeratorAdd the method to run the Content Moderator Job

// Run the Content Moderator job on the designated Asset from local file or blob storage
static void RunContentModeratorJob(IAsset asset)
{
    // Grab the presets
    string configuration = File.ReadAllText(CONTENT_MODERATOR_PRESET_FILE);

    // grab instance of Azure Media Content Moderator MP
    IMediaProcessor mp = _context.MediaProcessors.GetLatestMediaProcessorByName(MEDIA_PROCESSOR);

    // create Job with Content Moderator task
    IJob job = _context.Jobs.Create(String.Format("Content Moderator {0}",
            asset.AssetFiles.First() + "_" + Guid.NewGuid()));

    ITask contentModeratorTask = job.Tasks.AddNew("Adult and racy classifier task",
            mp, configuration,
            TaskOptions.None);
    contentModeratorTask.InputAssets.Add(asset);
    contentModeratorTask.OutputAssets.AddNew("Adult and racy classifier output",
        AssetCreationOptions.None);

    job.Submit();


    // Create progress printing and querying tasks
    Task progressPrintTask = new Task(() =>
    {
        IJob jobQuery = null;
        do
        {
            var progressContext = _context;
            jobQuery = progressContext.Jobs
            .Where(j => j.Id == job.Id)
                .First();
                Console.WriteLine(string.Format("{0}\t{1}",
                DateTime.Now,
                jobQuery.State));
                Thread.Sleep(10000);
            }
            while (jobQuery.State != JobState.Finished &&
            jobQuery.State != JobState.Error &&
            jobQuery.State != JobState.Canceled);
    });
    progressPrintTask.Start();

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

    DownloadAsset(job.OutputMediaAssets.First(), OUTPUT_FOLDER);
}

Incorporación de funciones auxiliaresAdd helper functions

Estos métodos descargan el archivo de salida (JSON) de Content Moderator del recurso de Azure Media Services, y le permiten hacer un seguimiento del estado del trabajo de moderación para que el programa pueda registrar el estado de ejecución en la consola.These methods download the Content Moderator output file (JSON) from the Azure Media Services asset, and help track the status of the moderation job so that the program can log a running status to the console.

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

// event handler for Job State
static 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 finished.");
            break;
        case JobState.Canceling:
        case JobState.Queued:
        case JobState.Scheduled:
        case JobState.Processing:
            Console.WriteLine("Please wait...\n");
            break;
        case JobState.Canceled:
            Console.WriteLine("Job is canceled.\n");
            break;
        case JobState.Error:
            Console.WriteLine("Job failed.\n");
            break;
        default:
            break;
    }
}

Ejecutar el programa y revisar la salidaRun the program and review the output

Una vez completado el trabajo de moderación de contenido, analice la respuesta JSON.After the Content Moderation job is completed, analyze the JSON response. Esta consta de estos elementos:It consists of these elements:

  • Resumen de información del vídeoVideo information summary
  • Capturas denominadas "fragmentos".Shots as "fragments"
  • Fotogramas clave denominados "eventos" con una marca reviewRecommended" (= true o false)" basada en puntuaciones de tipo Adultos e Inapropiado.Key frames as "events" with a reviewRecommended" (= true or false)" flag based on Adult and Racy scores
  • Los valores start, duration, totalDuration y timestamp están entrecomillados.start, duration, totalDuration, and timestamp are in "ticks". Divida con el valor timescale para obtener el número en segundos.Divide by timescale to get the number in seconds.

Nota

  • adultScore representa la posible presencia y la puntuación de predicción de contenido que se pueda considerar sexualmente explícito o para adultos en ciertas situaciones.adultScore represents the potential presence and prediction score of content that may be considered sexually explicit or adult in certain situations.
  • racyScore representa la posible presencia y la puntuación de predicción de contenido que se pueda considerar sexualmente insinuante o para adultos en ciertas situaciones.racyScore represents the potential presence and prediction score of content that may be considered sexually suggestive or mature in certain situations.
  • adultScore y racyScore están entre 0 y 1.adultScore and racyScore are between 0 and 1. Cuanto más alta sea la puntuación, mayor será la predicción del modelo sobre la aplicabilidad de la categoría.The higher the score, the higher the model is predicting that the category may be applicable. Esta versión preliminar usa un modelo estadístico, en lugar de resultados codificados manualmente.This preview relies on a statistical model rather than manually coded outcomes. Se recomienda realizar pruebas con contenido propio para determinar cómo se alinea cada categoría en función de sus propios requisitos.We recommend testing with your own content to determine how each category aligns to your requirements.
  • reviewRecommended es true o false según los umbrales de puntuación internos.reviewRecommended is either true or false depending on the internal score thresholds. Los clientes deben evaluar si quieren usar este valor o decidir si desean umbrales personalizados basados en sus directivas de contenido.Customers should assess whether to use this value or decide on custom thresholds based on their content policies.
{
"version": 2,
"timescale": 90000,
"offset": 0,
"framerate": 50,
"width": 1280,
"height": 720,
"totalDuration": 18696321,
"fragments": [
{
    "start": 0,
    "duration": 18000
},
{
    "start": 18000,
    "duration": 3600,
    "interval": 3600,
    "events": [
    [
        {
        "reviewRecommended": false,
        "adultScore": 0.00001,
        "racyScore": 0.03077,
        "index": 5,
        "timestamp": 18000,
        "shotIndex": 0
        }
    ]
    ]
},
{
    "start": 18386372,
    "duration": 119149,
    "interval": 119149,
    "events": [
    [
        {
        "reviewRecommended": true,
        "adultScore": 0.00000,
        "racyScore": 0.91902,
        "index": 5085,
        "timestamp": 18386372,
        "shotIndex": 62
        }
    ]
    ]
}
]
}

Pasos siguientesNext steps

Obtenga información sobre cómo generar reseñas de vídeos desde la salida de moderación.Learn how to generate video reviews from your moderation output.

Descargue la solución de Visual Studio para este y otras guías de inicio rápido de Content Moderator para .NET.Download the Visual Studio solution for this and other Content Moderator quickstarts for .NET.