Analýza obsahu videa o problematickém materiálu 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 kontrole obsahu videa pro dospělé nebo nevhodný obsah.

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

Předpoklady

Nastavení prostředků Azure

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

Vytvoření účtu Azure Media Services

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

Vytvoření aplikace Microsoft Entra

Na webu Azure Portal přejděte k novému předplatnému AMS a v boční nabídce vyberte přístup k rozhraní API. Vyberte Připojení do Azure Media Services s instančním objektem. Poznamenejte si hodnotu v poli koncového bodu rozhraní REST API. Budete ji potřebovat později.

V části Aplikace Microsoft Entra vyberte Vytvořit nový a pojmenujte novou registraci aplikace Microsoft Entra (například VideoModADApp). Vyberte Uložit a počkejte několik minut, než je aplikace nakonfigurovaná. Pak byste měli vidět registraci nové aplikace v části aplikace Microsoft Entra na stránce.

Vyberte registraci aplikace a klikněte pod ní na tlačítko Spravovat aplikaci . Poznamenejte si hodnotu v poli ID aplikace. Budete ji potřebovat později. Vyberte Nastavení> Klíče a zadejte popis nového klíče (například VideoModKey). Vyberte 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ší návod k výše uvedenému procesu najdete v tématu Začínáme s ověřováním Microsoft Entra.

Jakmile to uděláte, můžete použít procesor moderování videa dvěma různými způsoby.

Použití Průzkumníka služby Azure Media Services

Azure Media Services Explorer 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í procesoru médií Content Moderatoru. Stáhněte si ho a nainstalujte z GitHubu nebo si ho můžete stáhnout a nainstalovat v blogovém příspěvku Azure Media Services Exploreru, kde najdete další informace.

Azure Media Services explorer with Content Moderator

Vytvoření projektu sady Visual Studio

  1. V sadě Visual Studio vytvořte nový projekt konzolové aplikace (.NET Framework) a pojmenujte 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 projekt v Průzkumník řešení a vyberte Spravovat balíčky NuGet a 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. Tato pole obsahují informace potřebné pro připojení k vašemu předplatnému AMS. Vyplňte je hodnotami, které jste získali v předchozích krocích. Všimněte si, že CLIENT_ID hodnota ID aplikace Microsoft Entra je CLIENT_SECRET hodnota "VideoModKey", kterou jste pro tuto 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";

Důležité

Nezapomeňte klíče z kódu odebrat, až budete hotovi, a nikdy je veřejně neposílejte. V produkčním prostředí použijte bezpečný způsob ukládání přihlašovacích údajů a přístupu k vašim přihlašovacím údajům, jako je Azure Key Vault. Další informace najdete v článku zabezpečení služeb Azure AI.

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

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

{
    "version": "2.0"
}

Načtení vstupních videí

Metoda Main třídy Program vytvoří kontext Azure Media a pak kontext služby Azure Storage (v případě, že se vaše videa nacházejí 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 zakomentová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 azure Media

Do třídy Program přidejte následující metodu. To používá vaše přihlašovací údaje AMS k povolení 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í kontextu služby Azure Storage

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

// 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í prostředků Azure Media z místního souboru a objektu blob

Procesor médií Content Moderator spouští úlohy na prostředcích v rámci platformy Azure Media Services. 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 prohledávání kolekce videí (jako objektů blob) v rámci 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řidání metody pro spuštění úlohy Content Moderatoru

// 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í pomocných funkcí

Tyto metody stáhnou výstupní soubor Content Moderatoru (JSON) z prostředku služby Azure Media Services a pomáhají sledovat stav úlohy moderování, aby program mohl do konzoly protokolovat spuštěný stav.

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 moderování obsahu 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é aracy
  • start, duration, totalDuration a timestamp are in "ticks". Vydělte časovým měřítkem, abyste získali číslo v sekundách.

Poznámka:

  • adultScore představuje potenciální skóre přítomnosti a predikce obsahu, který může být v určitých situacích považován za sexuálně explicitní nebo dospělý.
  • racyScore představuje potenciální skóre přítomnosti a predikce obsahu, který se může v určitých situacích považovat za sexuálně sugestivní nebo vyspělou.
  • adultScore a racyScore jsou mezi 0 a 1. Čím vyšší je skóre, tím vyšší model predikuje, že kategorie může být použitelná. Tato verze Preview spoléhá na statistický model, nikoli na ručně zakódované výsledky. Doporučujeme testovat s vlastním obsahem, abyste zjistili, jak jednotlivé kategorie odpovídají vašim požadavkům.
  • reviewRecommended 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 se rozhodnout o vlastních prahových hodnotách na základě zásad 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

Stáhněte si řešení sady Visual Studio pro tento a další rychlé starty Content Moderatoru pro .NET.