C'de uygunsuz malzemeler için video içeriğini analiz etme#

Bu makalede, yetişkinlere yönelik veya müstehcen içerik için video içeriğini taramak üzere .NET için Content Moderator SDK'sını kullanmaya başlamanıza yardımcı olacak bilgiler ve kod örnekleri sağlanır.

Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Ön koşullar

Azure kaynakları ayarlama

Content Moderator'ın video denetleme özelliği, Azure Media Services'ta (AMS) ücretsiz bir genel önizleme medya işlemcisi olarak kullanılabilir. Azure Media Services, video içeriğini depolamak ve akışa almak için özel bir Azure hizmetidir.

Azure Media Services hesabı oluşturma

AMS'ye abone olmak ve ilişkili bir Azure depolama hesabı oluşturmak için Azure Media Services hesabı oluşturma başlığı altında yer alan yönergeleri izleyin. Bu depolama hesabında yeni bir Blob depolama kapsayıcısı oluşturun.

Microsoft Entra uygulaması oluşturma

Azure portalında yeni AMS aboneliğinize gidin ve yan menüden API erişimi'ni seçin. Hizmet sorumlusuyla Azure Media Services'a Bağlan'ı seçin. REST API uç noktası alanındaki değeri not edin; buna daha sonra ihtiyacınız olacaktır.

Microsoft Entra uygulaması bölümünde Yeni Oluştur'u seçin ve yeni Microsoft Entra uygulama kaydınızı ("VideoModADApp" gibi) adlandırın. Kaydet'i seçin ve uygulama yapılandırılırken birkaç dakika bekleyin. Ardından, sayfanın Microsoft Entra uygulaması bölümünde yeni uygulama kaydınızı görmeniz gerekir.

Uygulama kaydınızı seçin ve altındaki Uygulamayı yönet düğmesine tıklayın. Uygulama Kimliği alanındaki değeri not edin; buna daha sonra ihtiyacınız olacaktır. Ayarlar> Keys'i seçin ve yeni anahtar için bir açıklama girin ("VideoModKey" gibi). Kaydet'i seçin ve yeni anahtar değerine dikkat edin. Bu dizeyi kopyalayın ve güvenli bir yere kaydedin.

Yukarıdaki işlemin daha kapsamlı bir kılavuzu için bkz . Microsoft Entra kimlik doğrulamasını kullanmaya başlama.

Bunu yaptıktan sonra video moderasyonu medya işlemcisini iki farklı şekilde kullanabilirsiniz.

Azure Media Services Gezgini'ni kullanma

Azure Media Services Gezgini, AMS için kullanıcı dostu bir ön uçtır. Bunu kullanarak AMS hesabınıza göz atın, videoları karşıya yükleyin ve Content Moderator medya işlemcisiyle içeriği tarayın. GitHub'dan indirip yükleyin veya daha fazla bilgi için Azure Media Services Gezgini blog gönderisine bakın.

Azure Media Services explorer with Content Moderator

Visual Studio projesini oluşturma

  1. Visual Studio'da yeni bir Konsol uygulaması (.NET Framework) projesi oluşturun ve bunu VideoModeration olarak adlandıracaksınız.
  2. Çözümünüzde başka projeler de varsa, tek başlangıç projesi olarak bunu seçin.
  3. Gereken NuGet paketlerini alın. Çözüm Gezgini projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin; ardından aşağıdaki paketleri bulun ve yükleyin:
    • windowsazure.mediaservices
    • windowsazure.mediaservices.extensions

Video denetim kodu ekleme

Ardından, temel bir içerik moderasyonu senaryosu uygulamak için kodu bu kılavuzdan kopyalayıp projenize yapıştıracaksınız.

Programı deyimler kullanarak güncelleştirme

Aşağıdaki using deyimlerini Program.cs dosyanızın en üstüne ekleyin.

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;

Kaynak başvurularını ayarlama

Aşağıdaki statik alanları Program.cs dosyasındaki Program sınıfına ekleyin. Bu alanlar AMS aboneliğinize bağlanmak için gerekli bilgileri içerir. Bunları yukarıdaki adımlarda yer alan değerlerle doldurun. CLIENT_ID Microsoft Entra uygulamanızın Uygulama Kimliği değeri ve CLIENT_SECRET bu uygulama için oluşturduğunuz "VideoModKey" değerinin olduğunu unutmayın.

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

Önemli

İşiniz bittiğinde anahtarları kodunuzdan kaldırmayı unutmayın ve bunları asla herkese açık olarak göndermeyin. Üretim için Azure Key Vault gibi kimlik bilgilerinizi depolamanın ve bunlara erişmenin güvenli bir yolunu kullanın. Daha fazla bilgi için Azure AI hizmetleri güvenlik makalesine bakın.

Yerel bir video dosyası kullanmak istiyorsanız (en basit olay), dosyayı projeye ekleyin ve değerinin yolunu INPUT_FILE girin (göreli yollar yürütme dizinine göredir).

Ayrıca geçerli dizinde preset.json dosyasını oluşturmanız ve bunu kullanarak bir sürüm numarası belirtmeniz gerekir. Örnek:

{
    "version": "2.0"
}

Giriş videolarını yükleme

Program sınıfının Main yöntemi bir Azure Media Bağlamı ve ardından bir Azure Depolama Bağlamı oluşturur (videolarınızın blob depolamada olması durumunda). Kalan kod, azure depolama kapsayıcısı içindeki yerel bir klasörden, blobdan veya birden çok blobdan video tarar. Diğer kod satırlarını açıklama satırı yaparak tüm seçenekleri deneyebilirsiniz.

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

Azure Media Bağlamı Oluşturma

Program sınıfına aşağıdaki yöntemi ekleyin. Bu, AMS ile iletişime izin vermek için AMS kimlik bilgilerinizi kullanır.

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

Azure Depolama Bağlamı oluşturmak için kodu ekleme

Program sınıfına aşağıdaki yöntemi ekleyin. Blob depolamanıza erişmek için depolama kimlik bilgilerinizden oluşturulan Depolama Bağlamını kullanırsınız.

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

Yerel dosyadan ve blobdan Azure Media Varlıkları oluşturmak için kodu ekleme

Content Moderator medya işlemcisi, Azure Media Services platformundaki Varlıklar üzerinde işleri çalıştırır. Bu yöntemler, Varlıkları yerel bir dosyadan veya ilişkili bir blobdan oluşturur.

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

Kapsayıcı içindeki bir video koleksiyonunu (blob olarak) taramak için kodu ekleme

// 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 Moderator İşi'ni çalıştırmak için yöntemini ekleyin

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

Yardımcı işlevler ekleme

Bu yöntemler, Content Moderator çıkış dosyasını (JSON) Azure Media Services varlığından indirir ve programın konsolda çalışma durumunu günlüğe kaydedebilmesi için denetim işinin durumunu izlemeye yardımcı olur.

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

Programı çalıştırma ve çıktıyı gözden geçirme

İçerik Moderasyonu işi tamamlandıktan sonra JSON yanıtını analiz edin. Bu öğelerden oluşur:

  • Video bilgileri özeti
  • "Parçalar" olarak çekimler
  • Adult ve Racy puanlarını temel alan "events" (reviewRecommended" (= true veya false)" bayrağıyla anahtar çerçeveler
  • start, duration, totalDuration ve timestamp "ticks" içindedir. Sayıyı saniye olarak almak için zaman ölçeğine göre bölün.

Dekont

  • adultScore belirli durumlarda cinsel olarak açık veya yetişkin olarak değerlendirilebilecek içeriğin potansiyel varlığını ve tahmin puanını temsil eder.
  • racyScore belirli durumlarda cinsel açıdan öneride bulunabilecek veya olgunlaşabilecek içeriğin potansiyel varlığını ve tahmin puanını temsil eder.
  • adultScore ve racyScore 0 ile 1 arasındadır. Puan ne kadar yüksek olursa, model o kadar yüksek bir kategorinin geçerli olabileceğini tahmin ediyordur. Bu önizleme, el ile kodlanmış sonuçlar yerine istatistiksel bir modele dayanır. Her kategorinin gereksinimlerinize nasıl uygun olduğunu belirlemek için kendi içeriğinizle test yapmanızı öneririz.
  • reviewRecommended iç puan eşiklerine bağlı olarak true veya false şeklindedir. Müşteriler bu değeri kullanıp kullanmayacağını değerlendirmeli veya içerik ilkelerine göre özel eşiklere karar vermelidir.
{
"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
        }
    ]
    ]
}
]
}

Sonraki adımlar

Bunun için Visual Studio çözümünü ve .NET için diğer Content Moderator hızlı başlangıçlarını indirin.