Analýza problematických materiálů ve videu v jazyce C

Tento článek obsahuje informace a ukázky kódu, které vám pomůžou začít používat sadu Content Moderator SDK pro .NET ke skenování obsahu videa z obsahu pro dospělé nebo nečistých obsahů.

Pokud ještě nemáte předplatné Azure, vytvořte si napřed bezplatný účet.

Požadavky

Nastavení prostředků Azure

Funkce Content Moderator moderování videa je k dispozici jako bezplatný procesor médií ve verzi Public Preview v Azure Media Services (AMS). Azure Media Services je specializovaná služba Azure pro ukládání a streamování video obsahu.

Vytvoření účtu Azure Media Services

Postupujte podle pokynů v tématu Vytvoření účtu Azure Media Services a přihlaste se k odběru AMS a vytvořte přidružený účet úložiště Azure. V tomto účtu úložiště vytvořte nový kontejner úložiště objektů blob.

Vytvoření Azure Active Directory aplikace

Přejděte do nového předplatného AMS v Azure Portal a v postranní nabídce vyberte Přístup přes rozhraní API. Výběrem Připojení se Azure Media Services s objektem služby. Poznamenejte si hodnotu v REST API koncového bodu. Budete ho potřebovat později.

V části Aplikace Azure AD vyberte Vytvořit nový a pojmnostete novou registraci aplikace Azure AD (například VideoModADApp). Klikněte na Uložit a počkejte několik minut, než bude aplikace nakonfigurovaná. Pak by se nová registrace aplikace měla zobrazit v části stránky Aplikace Azure AD.

Vyberte registraci aplikace a klikněte na tlačítko Spravovat aplikaci pod ní. Poznamenejte si hodnotu v poli ID aplikace. Budete ho potřebovat později. Vyberte Nastavení Klíče a zadejte popis nového klíče > (například VideoModKey). Klikněte na Uložit a všimněte si nové hodnoty klíče. Zkopírujte tento řetězec a uložte ho někam bezpečně.

Podrobnější postup najdete v tématu Začínáme s ověřováním Azure AD.

Jakmile to budete mít, můžete procesor médií pro moderování videa použít dvěma různými způsoby.

Použití Azure Media Services Exploreru

Průzkumník Azure Media Services je uživatelsky přívětivý front-end pro AMS. Můžete ho použít k procházení účtu AMS, nahrávání videí a skenování obsahu pomocí Content Moderator médií. Stáhněte si ho a nainstalujte GitHubnebo se podívejte na blogový příspěvek Azure Media Services Exploreru, který obsahuje další informace.

Azure Media Services Explorer s Content Moderator

Vytvoření projektu sady Visual Studio

  1. V Visual Studio vytvořte nový projekt Konzolová aplikace (.NET Framework) a pojmnováte ho VideoModeration.
  2. Pokud vaše řešení obsahuje i jiné projekty, vyberte tento projekt jako jediný spouštěný projekt.
  3. Získejte požadované balíčky NuGet. Klikněte pravým tlačítkem na svůj projekt v Průzkumníku řešení a vyberte Spravovat balíčky NuGet. Potom vyhledejte a nainstalujte následující balíčky:
    • windowsazure.mediaservices
    • windowsazure.mediaservices.extensions

Přidání kódu moderování videa

Dále zkopírováním kódu z této příručky a jeho vložením do svého projektu implementujete základní scénář moderování obsahu.

Aktualizace příkazů using programu

Na začátek souboru Program.cs přidejte následující příkazy using.

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;

Nastavení odkazů na prostředky

Do třídy Program v souboru Program.cs přidejte následující statická pole. V těchto polích jsou informace potřebné pro připojení k vašemu předplatnému AMS. Vyplňte je hodnotami, které jste získali v krocích výše. Všimněte si, že je hodnota ID aplikace azure AD a hodnota CLIENT_ID CLIENT_SECRET "VideoModKey", kterou jste pro aplikaci vytvořili.

// 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";

Pokud chcete použít místní videosoubor (nejjednodušší případ), přidejte ho do projektu a zadejte jeho cestu jako hodnotu (relativní cesty jsou relativní vzhledem k INPUT_FILE adresáři spuštění).

Budete také muset v aktuálním adresáři vytvořit soubor preset.json a použít ho k zadání čísla verze. Například:

{
    "version": "2.0"
}

Načtení vstupních videí

Metoda Main třídy Program vytvoří kontext služby Azure Media a pak Azure Storage kontextu (v případě, že jsou vaše videa v úložišti objektů blob). Zbývající kód prohledá video z místní složky, objektu blob nebo několika objektů blob v kontejneru úložiště Azure. Všechny možnosti můžete vyzkoušet komentováním ostatních řádků kódu.

// 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();

Vytvoření kontextu médií Azure

Do třídy Program přidejte následující metodu. To používá vaše přihlašovací údaje AMS k umožnění komunikace s 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);
}

Přidání kódu pro vytvoření Azure Storage kontextu

Do třídy Program přidejte následující metodu. Pro přístup k Storage objektů blob použijete kontext úložiště vytvořený z vašich přihlašovacích údajů k úložišti.

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

Přidání kódu pro vytvoření mediálních prostředků Azure z místního souboru a objektu blob

Procesor Content Moderator médií spouští úlohy na prostředcích v rámci Azure Media Services platformy. Tyto metody vytvářejí prostředky z místního souboru nebo přidruženého objektu 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);
}

Přidání kódu pro kontrolu kolekce videí (jako objektů blob) v kontejneru

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

Přidejte metodu pro spuštění úlohy Content Moderator.

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

Přidání pomocých funkcí

Tyto metody stáhnou výstupní soubor Content Moderator (JSON) z assetu Azure Media Services a pomůžou sledovat stav úlohy moderování, aby program mohl protokolovat stav spuštění do konzoly.

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

Spuštění programu a kontrola výstupu

Po dokončení úlohy Content Moderation analyzujte odpověď JSON. Skládá se z těchto prvků:

  • Souhrn informací o videu
  • Snímky jako fragmenty
  • Klíčové snímky jako "události" s příznakem reviewRecommended (= true nebo false)" na základě skóre pro dospělé a racy
  • start, duration, totalDuration a timestamp jsou v "ticks". Pokud chcete získat počet v sekundách, vydělte časovým měřítkem.

Poznámka

  • adultScore představuje potenciální přítomnost obsahu a skóre predikce, které lze v určitých situacích považovat za sexuálně explicitní nebo pro dospělé.
  • racyScore představuje potenciální přítomnost a skóre predikce obsahu, který lze v určitých situacích považovat za sexuálně supresivní nebo vyspělý.
  • adultScore a racyScore jsou v rozmezí 0 až 1. Čím vyšší je skóre, tím vyšší model předpovídá, že kategorie může být použitelná. Tato verze Preview spoléhá na statistický model, nikoli na ručně kódované výsledky. Doporučujeme testovat s vlastním obsahem, abyste zjistili, jak jednotlivé kategorie splňují vaše požadavky.
  • reviewRecommended hodnota je true nebo false v závislosti na prahových hodnotách interního skóre. Zákazníci by měli posoudit, jestli tuto hodnotu použít, nebo rozhodnout o vlastních prahových hodnotách na základě zásad jejich obsahu.
{
"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
        }
    ]
    ]
}
]
}

Další kroky

Naučte se generovat recenze videa z výstupu moderování.

Stáhněte si Visual Studio tohoto a dalších rychlých Content Moderator pro .NET.