Azure Media Analytics の Content Moderator を発表

執筆者: Greg Clark (Senior Program Manager, Content Moderator and PhotoDNA Cloud Service)

このポストは、4 月 21 日に投稿された Announcing Content Moderator on Azure Media Analytics の翻訳です。

 

: 以下のブログ記事は、Azure Media Analytics のコンポーネントについて説明したものです。詳細については、Azure Media Analytics の概要に関する記事 (英語) を参照してください。

ユーザーによって作成されるコンテンツの量が爆発的に増えるにつれて、企業では、ユーザーに配信するコンテンツの監視を強めることが重要になっています。企業がこれまでコンテンツを監視するには、モデレーターとなる人員を雇ったり、またはあまり良くない方法ですが、ユーザーからポリシー違反のコンテンツが報告されることに頼ったりしていました。しかし、どちらの方法でもそれなりのコストがかかります。モデレーターを雇う場合はコンテンツ量が増えるに従って金銭的なコストが増しますし、ユーザーからの報告を待つ場合はブランド力の低下や顧客の信頼喪失につながる恐れがあります。

そこで、この問題を解決するのが、Content Moderator (英語) サービスです。Content Moderator ではコンテキストに応じて独自のルールやポリシーのセットを適用し、問題を含む可能性のある画像やテキストのコンテンツを自動的に検出できます。

先日マイクロソフトは新機能の Content Moderator Media Processor のプライベート プレビューを提供開始し、ビデオ モデレーションに拡張したことを発表しました (英語)。このメディア プロセッサの初期機能として Adult Classifier が提供され、さらに近日中に予定されている次回の更新では最初の分類子が提供されます。この新機能では、ビデオの監視を自動化し、ビデオ ファイル内のアダルト コンテンツをプロアクティブに検出することができるため、モデレーション作業に要するコストを大幅に削減できます。さらに、この種の情報を早期に発見できることから、意思決定の精度が向上し、より安全なエクスペリエンスをユーザーに提供できます。

Content Moderator Media Processor のプライベート プレビューにぜひサインアップしてお試しください。

使用を開始するには

プライベート プレビューにサインアップすると、REST API/SDKAzure Media Services Explorer (英語) を使用して Content Moderator のテクノロジを簡単に Web ページやアプリに統合できます。

次に示す C# のサンプル プログラムは、最初の Content Moderator ジョブをセットアップするものです。このコードでは Azure Media Services C# SDK (英語)SDK 拡張機能 (英語) の両方が必要です (NuGet (英語) から入手可能)。

サンプル プログラム

 using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.IO;
using System.Threading;

namespace ContentModeratorAmsSample
{
    class Program
    {
        // 定数およびグローバル変数を宣言
        private static CloudMediaContext _context = null;
        private static readonly string _accountName = { ACCOUNT_NAME };
        private static readonly string _accountKey = { ACCOUNT_KEY };
        private const string _mpName = "Azure Media Content Moderator";
        private static readonly string _inputFile = { INPUT_FILE_PATH };
        private static readonly string _outputFolder = { OUTPUT_FOLDER_PATH };
        
        // サーバーのビデオをスケールダウンする場合は true、そうでない場合は false 
        // ビデオをスケールダウンするとパフォーマンスは向上するがスコア付けに影響する可能性がある
        private const bool _moderatorConfiguration = false;

        static void Main(string[] args)
        {
            _context = new CloudMediaContext(_accountName, _accountKey);
            RunContentModeratorJob(_inputFile, _outputFolder, _moderatorConfiguration);
        }

        static void RunContentModeratorJob(string inputFilePath, string output, bool scaleVideo)
        {
            // 入力ファイルでアセットを作成
            IAsset asset = _context.Assets.CreateFromFile(inputFilePath, AssetCreationOptions.None);
            
            // Azure Media Content Moderator MP のインスタンスを取得
            IMediaProcessor mp = _context.MediaProcessors.GetLatestMediaProcessorByName(_mpName);

            //  Content Moderator タスクでジョブを作成
            IJob job = _context.Jobs.Create(String.Format("Content Moderator {0}", 
                Path.GetFileName(inputFilePath) + "_" + Guid.NewGuid()));

            ITask contentModeratorTask = job.Tasks.AddNew("Adult classifier task",
                mp,
                scaleVideo ? "sdv=true" : "sdv=false",
                TaskOptions.None);
            contentModeratorTask.InputAssets.Add(asset);
            contentModeratorTask.OutputAssets.AddNew("Adult classifier output",
            AssetCreationOptions.None);

            job.Submit();

            // 進捗状況の表示タスクとクエリ タスクを作成
            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 == 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);
        }

        static void DownloadAsset(IAsset asset, string outputDirectory)
        {
            foreach (IAssetFile file in asset.AssetFiles)
            {
                file.Download(Path.Combine(outputDirectory, file.Name));
            }
        }

        // ジョブの状態のイベント ハンドラー
        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;
            }
        }
    }
}

出力される XML

InputFileName: Azure Media Services の入力アセットとして保存するときのファイル名。

FileSize: 入力ファイルのバイト数。

AdultClassifierValue: 分類子のスコア。このスコアは 0 ~ 1.0 の範囲で示され、0 の場合は最もアダルト コンテンツの可能性が低く、1.0 の場合は最も可能性が高いことを表しています。

TimeTakenMs: サーバーの分類子の実行時間。

Resized: サイズ変更処理の実行の有無を示すフラグ。

 <ClassifierResult>
      <InputFileName>test.mp4</InputFileName>
      <FileSize>6365770</FileSize>
      <AdultClassifierValue>0.21175046251105303</AdultClassifierValue>
      <TimeTakenMs>7642</TimeTakenMs>
      <Resized>true</Resized
</ClassifierResult>

Content Moderator Media Processor および Media Analytics の最新情報については、Azure Media Services ブログ (英語) をご確認ください。

Media Analytics 製品についてご不明な点がありましたら、お気軽にメール (amsanalytics@microsoft.com) でお問い合わせください。