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.
Požadavky
- Libovolná edice sady Visual Studio 2015 nebo 2017
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řipojit ke službě Azure Media Services pomocí instančního objektu. 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 Klíče nastavení>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.
Vytvoření projektu sady Visual Studio
- V sadě Visual Studio vytvořte nový projekt konzolové aplikace (.NET Framework) a pojmenujte ho VideoModeration.
- Pokud vaše řešení obsahuje i jiné projekty, vyberte tento projekt jako jediný spouštěný projekt.
- 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
aracyScore
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.