Анализ содержимого видео для выявления нежелательного содержимого в C#Analyze video content for objectionable material in C#

В этой статье содержатся сведения и примеры кода, которые помогут вам приступить к работе с пакетом SDK Content Moderator для .NET для сканирования содержимого на выявление видео для взрослых или непристойного характера.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.

Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начинать работу.If you don't have an Azure subscription, create a free account before you begin.

Предварительные требованияPrerequisites

Настройка ресурсов AzureSet up Azure resources

Возможности Content Moderator по обработке видео доступны в виде бесплатной общедоступной предварительной версии обработчика мультимедиа, предоставляемого в Службах мультимедиа Azure (AMS).The Content Moderator's video moderation capability is available as a free public preview media processor in Azure Media Services (AMS). Службы мультимедиа Azure — это специализированные службы Azure для хранения и потоковой передачи содержимого видео.Azure Media Services is a specialized Azure service for storing and streaming video content.

Создание учетной записи служб мультимедиа AzureCreate an Azure Media Services account

Следуйте инструкциям в статье Создание учетной записи служб мультимедиа Azure с помощью портала Azure, чтобы подписаться на AMS и создать связанную учетную запись хранения Azure.Follow the instructions in Create an Azure Media Services account to subscribe to AMS and create an associated Azure storage account. В этой учетной записи хранения создайте контейнер хранилища BLOB-объектов.In that storage account, create a new Blob storage container.

Создание приложения Azure Active DirectoryCreate an Azure Active Directory application

Перейдите в новую подписку AMS на портале Azure и из бокового меню выберите Доступ через API.Navigate to your new AMS subscription in the Azure portal and select API access from the side menu. Выберите Connect to Azure Media Services with service principal (Подключение к Службам мультимедиа Azure с помощью субъекта-службы).Select Connect to Azure Media Services with service principal. Обратите внимание на значение в поле Конечная точка REST API. Оно потребуется позже.Note the value in the REST API endpoint field; you will need this later.

В разделе Приложение Azure AD выберите Создать и присвойте имя новой регистрации приложения Azure AD (например, VideoModADApp).In the Azure AD app section, select Create New and name your new Azure AD application registration (for example, "VideoModADApp"). Щелкните Сохранить и подождите несколько минут, пока приложение не будет настроено.Click Save and wait a few minutes while the application is configured. Затем вы должны увидеть свою новую регистрацию приложения на странице в разделе Приложение Azure AD.Then, you should see your new app registration under the Azure AD app section of the page.

Выберите регистрацию приложения и нажмите кнопку Управление приложением под ней.Select your app registration and click the Manage application button below it. Обратите внимание на значение в поле Идентификатор приложения. Оно потребуется позже.Note the value in the Application ID field; you will need this later. Выберитеключи настройки > и введите описание для нового ключа (например, "VideoModKey").Select Settings > Keys, and enter a description for a new key (such as "VideoModKey"). Щелкните Сохранить, а затем обратите внимание на новое значение ключа.Click Save, and then notice the new key value. Скопируйте эту строку и сохраните ее в надежном месте.Copy this string and save it somewhere secure.

Более подробный обзор описанного выше процесса см. в статье Приступая к работе с аутентификацией Azure AD с помощью портала Azure.For a more thorough walkthrough of the above process, See Get started with Azure AD authentication.

Сделав это, можно использовать обработчик мультимедиа для модерации видео двумя разными способами.Once you've done this, you can use the video moderation media processor in two different ways.

Использование обозревателя Служб мультимедиа AzureUse Azure Media Services Explorer

Обозреватель Служб мультимедиа Azure имеет понятный для пользователя интерфейс для AMS.The Azure Media Services Explorer is a user-friendly frontend for AMS. Используйте его для просмотра своей учетной записи AMS, передачи видео и сканирования содержимого с помощью обработчика мультимедиа Content Moderator.Use it to browse your AMS account, upload videos, and scan content with the Content Moderator media processor. Загрузите и установите его из GitHub или ознакомьтесь с записью блога о Azure Media Services Explorer для получения дополнительной информации.Download and install it from GitHub, or see the Azure Media Services Explorer blog post for more information.

Обозреватель Служб мультимедиа Azure с Content Moderator

Создание проекта Visual StudioCreate the Visual Studio project

  1. В Visual Studio создайте проект Консольное приложение (.NET Framework) и назовите его VideoModeration.In Visual Studio, create a new Console app (.NET Framework) project and name it VideoModeration.
  2. При наличии других проектов в решении выберите этот в качестве единого запускаемого проекта.If there are other projects in your solution, select this one as the single startup project.
  3. Получите необходимые пакеты NuGet.Get the required NuGet packages. Щелкните проект правой кнопкой мыши в обозревателе решений и выберите Управление пакетами NuGet, затем найдите и установите следующие пакеты:Right-click on your project in the Solution Explorer and select Manage NuGet Packages; then find and install the following packages:
    • windowsazure.mediaservices;windowsazure.mediaservices
    • windowsazure.mediaservices.extensions.windowsazure.mediaservices.extensions

Добавление кода модерации видеоAdd video moderation code

Затем скопируйте и вставьте код из этого руководства в проект, чтобы реализовать основной сценарий модерации содержимого.Next, you'll copy and paste the code from this guide into your project to implement a basic content moderation scenario.

Обновление инструкций using в программеUpdate the program's using statements

Добавьте следующие инструкции using в начало файла 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;

Настройка ссылок на ресурсыSet up resource references

Добавьте следующие статические поля в класс Программы в Program.cs.Add the following static fields to the Program class in Program.cs. Эти поля содержат информацию, необходимую для подключения к вашей подписке AMS.These fields hold the information necessary for connecting to your AMS subscription. Заполните их значениями, полученными ранее.Fill them in with the values you got in the steps above. Обратите внимание, что CLIENT_ID является значением идентификатора вашего приложения Azure AD, а CLIENT_SECRET — значением созданного для этого приложения ключа VideoModKey.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";

Если вы хотите использовать локальный видеофайл (простейший случай), добавьте его в проект и введите его путь как значение INPUT_FILE (относительные пути относятся к каталогу выполнения).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).

Вам также необходимо создать файл preset.json в текущем каталоге и использовать его для указания номера версии.You will also need to create the preset.json file in the current directory and use it to specify a version number. Пример:For example:

{
    "version": "2.0"
}

Загрузка входных видеоLoad the input video(s)

Метод Main класса Program создаст контекст мультимедиа Azure, а затем контекст службы хранилища Azure (если видео находятся в хранилище BLOB-объектов).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). Остальная часть кода позволяет проверить видео из локальной папки или одного либо нескольких больших двоичных объектов в контейнере хранилища Azure.The remaining code scans a video from a local folder, blob, or multiple blobs within an Azure storage container. Закомментировав разные строки кода, вы можете попробовать все варианты поочередно.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();

Создание контекста мультимедиа AzureCreate an Azure Media Context

Добавьте следующий метод в класс Program.Add the following method to the Program class. Он использует ваши учетные данные AMS, чтобы разрешить обмен данными с 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);
}

Добавление кода для создания контекста хранилища AzureAdd the code to create an Azure Storage Context

Добавьте следующий метод в класс Program.Add the following method to the Program class. Контекст хранилища, созданный на основе учетных данных хранилища, позволяет получить доступ к хранилищу BLOB-объектов.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);
}

Добавление кода для создания ресурсов мультимедиа Azure из локального файла и (или) хранилища BLOB-объектовAdd the code to create Azure Media Assets from local file and blob

Обработчик мультимедиа Content Moderator запускает задания для ресурсов на платформе Служб мультимедиа Azure.The Content Moderator media processor runs jobs on Assets within the Azure Media Services platform. С помощью этих методов создаются ресурсы из локального файла или связанного BLOB-объекта.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);
}

Добавление в контейнер кода для проверки коллекции видео (сохраненной в виде больших двоичных объектов)Add 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;
}

Добавление метода для выполнения задания 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);
}

Добавление вспомогательных функцийAdd helper functions

Эти методы позволяют скачать выходной файл Content Moderator в формате JSON из ресурса Служб мультимедиа Azure и отслеживать состояние задания модерации, чтобы программа могла регистрировать в консоли эти сведения о состоянии.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;
    }
}

Запуск программы и просмотр выходных данныхRun the program and review the output

Когда задание модерации содержимого будет выполнено, изучите полученный ответ в формате JSON.After the Content Moderation job is completed, analyze the JSON response. Он состоит из следующих элементов:It consists of these elements:

  • сводка по видео;Video information summary
  • видеоролики, обозначенные как "fragments";Shots as "fragments"
  • ключевые кадры, обозначенные как "events" с флагом необходимости проверки "reviewRecommended" (принимает значение true или false), который присваивается на основе оценок Asult и Racy;Key frames as "events" with a reviewRecommended" (= true or false)" flag based on Adult and Racy scores
  • значения start (начало), duration (длительность), totalDuration (общая длительность) и timestamp (метка времени), выраженные в тактах.start, duration, totalDuration, and timestamp are in "ticks". Чтобы получить значение в секундах, поделите величину в тактах на значение timescale (шкала времени).Divide by timescale to get the number in seconds.

Примечание

  • adultScore обозначает потенциальное наличие и прогнозируемую оценку содержимого, которое в определенных обстоятельствах может считаться порнографическим или предназначенным только для взрослых.adultScore represents the potential presence and prediction score of content that may be considered sexually explicit or adult in certain situations.
  • racyScore обозначает потенциальное наличие и прогнозируемую оценку содержимого, которое в определенных обстоятельствах может считаться сексуально окрашенными или не предназначенным для детей.racyScore represents the potential presence and prediction score of content that may be considered sexually suggestive or mature in certain situations.
  • Оценки adultScore и racyScore принимают значения от 0 до 1.adultScore and racyScore are between 0 and 1. Чем выше оценка, тем более подходящей модель считает соответствующую категорию.The higher the score, the higher the model is predicting that the category may be applicable. Эта предварительная версия использует статистическую модель прогнозирования, а не оценки, кодированные вручную.This preview relies on a statistical model rather than manually coded outcomes. Корпорация Майкрософт рекомендует протестировать ее на своих данных, чтобы проверить применимость анализа по каждой категории.We recommend testing with your own content to determine how each category aligns to your requirements.
  • reviewRecommended принимает значения true или false в зависимости от внутренних порогов оценки.reviewRecommended is either true or false depending on the internal score thresholds. Клиенты могут на выбор использовать значения по умолчанию или настраивать собственные пороги в соответствии с действующими политиками.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
        }
    ]
    ]
}
]
}

Дальнейшие действияNext steps

Узнайте, как создавать обзоры видео на основе выходных данных модерации.Learn how to generate video reviews from your moderation output.

Добавьте в обзоры видео модерацию расшифровки.Add transcript moderation to your video reviews.

Ознакомьтесь с подробным руководством по созданию полного решения для модерации видео и расшифровки.Check out the detailed tutorial on how to build a complete video and transcript moderation solution.

Скачайте решение Visual Studio для работы с этим и другими краткими руководствами по Content Moderator для .NET.Download the Visual Studio solution for this and other Content Moderator quickstarts for .NET.