Analizowanie zawartości wideo pod kątem niepożądanego materiału w języku C#
Ten artykuł zawiera informacje i przykłady kodu ułatwiające rozpoczęcie korzystania z zestawu SDK usługi Content Moderator dla platformy .NET w celu skanowania zawartości wideo pod kątem zawartości dla dorosłych lub zawartości erotycznej.
Jeśli nie masz subskrypcji platformy Azure, przed rozpoczęciem utwórz bezpłatne konto.
Wymagania wstępne
- Dowolna wersja programu Visual Studio 2015 lub 2017
Konfigurowanie zasobów platformy Azure
Funkcja moderowania wideo usługi Content Moderator jest dostępna jako bezpłatny procesor multimediów w publicznej wersji zapoznawczej w usłudze Azure Media Services (AMS). Azure Media Services to wyspecjalizowana usługa platformy Azure do przechowywania i przesyłania strumieniowego zawartości wideo.
Tworzenie konta usługi Azure Media Services
Postępuj zgodnie z instrukcjami w temacie Tworzenie konta usługi Azure Media Services, aby subskrybować usługę AMS i utworzyć skojarzone konto usługi Azure Storage. Na tym koncie magazynu utwórz nowy kontener usługi Blob Storage.
Tworzenie aplikacji Firmy Microsoft Entra
Przejdź do nowej subskrypcji usługi AMS w witrynie Azure Portal i wybierz pozycję Dostęp do interfejsu API z menu bocznego. Wybierz pozycję Połącz z usługą Azure Media Services przy użyciu jednostki usługi. Zanotuj wartość w polu Punkt końcowy interfejsu API REST. Będzie to potrzebne później.
W sekcji Aplikacja Microsoft Entra wybierz pozycję Utwórz nową i nadaj nowej rejestracji aplikacji Entra firmy Microsoft (na przykład "VideoModADApp"). Wybierz pozycję Zapisz i poczekaj kilka minut, gdy aplikacja jest skonfigurowana. Następnie powinna zostać wyświetlona nowa rejestracja aplikacji w sekcji aplikacji Microsoft Entra na stronie.
Wybierz rejestrację aplikacji i kliknij przycisk Zarządzaj aplikacją poniżej. Zanotuj wartość w polu Identyfikator aplikacji. Będzie to potrzebne później. Wybierz pozycję Klucze ustawień>i wprowadź opis nowego klucza (na przykład "VideoModKey"). Wybierz pozycję Zapisz, a następnie zwróć uwagę na nową wartość klucza. Skopiuj ten ciąg i zapisz go w bezpiecznym miejscu.
Aby uzyskać bardziej szczegółowy przewodnik po powyższym procesie, zobacz Wprowadzenie do uwierzytelniania firmy Microsoft Entra.
Po wykonaniu tej czynności można użyć procesora multimediów moderowania wideo na dwa różne sposoby.
Korzystanie z eksploratora usługi Azure Media Services
Azure Media Services Explorer to przyjazny dla użytkownika fronton dla usługi AMS. Służy do przeglądania konta usługi AMS, przekazywania klipów wideo i skanowania zawartości za pomocą procesora multimediów usługi Content Moderator. Pobierz i zainstaluj go z usługi GitHub lub zobacz wpis w blogu Azure Media Services Explorer, aby uzyskać więcej informacji.
Tworzenie projektu programu Visual Studio
- W programie Visual Studio utwórz nowy projekt Aplikacja konsolowa (.NET Framework) i nadaj mu nazwę VideoModeration.
- Jeśli w rozwiązaniu istnieją inne projekty, wybierz ten projekt jako pojedynczy projekt startowy.
- Pobierz wymagane pakiety NuGet. Kliknij prawym przyciskiem myszy projekt w Eksplorator rozwiązań i wybierz pozycję Zarządzaj pakietami NuGet, a następnie znajdź i zainstaluj następujące pakiety:
- windowsazure.mediaservices
- windowsazure.mediaservices.extensions
Dodawanie kodu moderowania wideo
Następnie skopiujesz kod z tego przewodnika i wkleisz go do projektu, aby zaimplementować podstawowy scenariusz moderowania zawartości.
Aktualizowanie programu za pomocą instrukcji
Dodaj następujące instrukcje using
na początku pliku Program.cs.
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;
Konfigurowanie odwołań do zasobów
Dodaj następujące pola statyczne do klasy Program w pliku Program.cs. Te pola zawierają informacje niezbędne do nawiązania połączenia z subskrypcją usługi AMS. Wypełnij je wartościami podanymi w powyższych krokach. Należy pamiętać, że CLIENT_ID
jest to wartość Identyfikator aplikacji firmy Microsoft Entra i CLIENT_SECRET
jest wartością "VideoModKey", która została utworzona dla tej aplikacji.
// 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";
Ważne
Pamiętaj, aby usunąć klucze z kodu po zakończeniu i nigdy nie publikować ich publicznie. W przypadku środowiska produkcyjnego użyj bezpiecznego sposobu przechowywania i uzyskiwania dostępu do poświadczeń, takich jak usługa Azure Key Vault. Aby uzyskać więcej informacji, zobacz artykuł Dotyczący zabezpieczeń usług Azure AI.
Jeśli chcesz użyć lokalnego pliku wideo (najprostszy przypadek), dodaj go do projektu i wprowadź jego ścieżkę jako INPUT_FILE
wartość (ścieżki względne są względne względem katalogu wykonawczego).
Należy również utworzyć plik preset.json w bieżącym katalogu i użyć go do określenia numeru wersji. Na przykład:
{
"version": "2.0"
}
Ładowanie wejściowych wideo
Metoda Main klasy Program utworzy kontekst usługi Azure Media, a następnie kontekst usługi Azure Storage (na wypadek, gdy filmy wideo znajdują się w magazynie obiektów blob). Pozostały kod skanuje wideo z folderu lokalnego, obiektu blob lub wielu obiektów blob w kontenerze usługi Azure Storage. Możesz wypróbować wszystkie opcje, komentując inne wiersze kodu.
// 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();
Tworzenie kontekstu multimediów platformy Azure
Dodaj następującą metodę do klasy Program. Używa to poświadczeń usługi AMS do zezwalania na komunikację z usługą 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);
}
Dodawanie kodu w celu utworzenia kontekstu usługi Azure Storage
Dodaj następującą metodę do klasy Program. Kontekst magazynu utworzony na podstawie poświadczeń magazynu służy do uzyskiwania dostępu do magazynu obiektów blob.
// 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);
}
Dodawanie kodu w celu utworzenia zasobów usługi Azure Media z pliku lokalnego i obiektu blob
Procesor multimediów usługi Content Moderator uruchamia zadania na zasobach na platformie Azure Media Services. Te metody tworzą zasoby na podstawie pliku lokalnego lub skojarzonego obiektu 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);
}
Dodawanie kodu w celu skanowania kolekcji filmów wideo (jako obiektów blob) w kontenerze
// 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;
}
Dodawanie metody w celu uruchomienia zadania usługi 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);
}
Dodawanie funkcji pomocnika
Te metody pobierają plik wyjściowy usługi Content Moderator (JSON) z zasobu usługi Azure Media Services i pomagają śledzić stan zadania moderowania, aby program mógł rejestrować stan działania w konsoli.
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;
}
}
Uruchamianie programu i przeglądanie danych wyjściowych
Po zakończeniu zadania moderowania zawartości przeanalizuj odpowiedź JSON. Składa się z następujących elementów:
- Podsumowanie informacji wideo
- Zdjęcia jako "fragmenty"
- Kluczowe ramki jako "zdarzenia" z recenzjąRecommended" (= prawda lub fałsz)" flaga na podstawie wyników dla dorosłych i racy
- start, duration, totalDuration i timestamp są w "znacznikach". Podziel według skali czasu, aby uzyskać liczbę w sekundach.
Uwaga
adultScore
reprezentuje potencjalną obecność i wynik przewidywania treści, które mogą być uznawane za treści o charakterze seksualnym lub dorosłym w niektórych sytuacjach.racyScore
reprezentuje potencjalną obecność i wynik przewidywania treści, które mogą być uważane za sugestywne lub dojrzałe seksualnie w niektórych sytuacjach.adultScore
iracyScore
mają od 0 do 1. Im wyższy wynik, tym wyższy model przewiduje, że kategoria może mieć zastosowanie. Ta wersja zapoznawcza opiera się na modelu statystycznym, a nie na ręcznie zakodowanych wynikach. Zalecamy testowanie z własną zawartością, aby określić, jak każda kategoria jest zgodna z wymaganiami.reviewRecommended
ma wartość true lub false w zależności od wewnętrznych progów oceny. Klienci powinni ocenić, czy używać tej wartości, czy zdecydować o progach niestandardowych na podstawie ich zasad zawartości.
{
"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
}
]
]
}
]
}
Następne kroki
Pobierz rozwiązanie programu Visual Studio dla tego i innych przewodników Szybki start usługi Content Moderator dla platformy .NET.