クイック スタート:Face REST API と C# を使用して画像から顔を検出するQuickstart: Detect faces in an image using the Face REST API and C#

このクイック スタートでは、Azure Face REST API と C# を使用して、画像から人の顔を検出します。In this quickstart, you will use the Azure Face REST API with C# to detect human faces in an image.

Azure サブスクリプションをお持ちでない場合は、開始する前に 無料アカウント を作成してください。If you don't have an Azure subscription, create a free account before you begin.

前提条件Prerequisites

Visual Studio プロジェクトの作成Create the Visual Studio project

  1. Visual Studio で、新しいコンソール アプリ (.NET Framework) プロジェクトを作成し、FaceDetection という名前を付けます。In Visual Studio, create a new Console app (.NET Framework) project and name it FaceDetection.
  2. ソリューションに他のプロジェクトがある場合は、これを単一のスタートアップ プロジェクトとして選択します。If there are other projects in your solution, select this one as the single startup project.

顔検出コードを追加するAdd face detection code

新しいプロジェクトの Program.cs ファイルを開きます。Open the new project's Program.cs file. 画像を読み込んで顔を検出するために必要なコードをここに追加します。Here, you will add the code needed to load images and detect faces.

名前空間を含めるInclude namespaces

Program.cs ファイルの先頭に次の using ステートメントを追加します。Add the following using statements to the top of your Program.cs file.

using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;

必須フィールドを追加するAdd essential fields

次のフィールドを含む Program クラスを追加します。Add the Program class containing the following fields. このデータによって、Face サービスへの接続方法と入力データの取得場所が指定されます。This data specifies how to connect to the Face service and where to get the input data. subscriptionKey フィールドは、実際のサブスクリプション キーの値で更新する必要があります。また uriBase 文字列も、お使いのリソースのエンドポイント文字列を含むように、必要に応じて変更してください。You'll need to update the subscriptionKey field with the value of your subscription key, and you may need to change the uriBase string so that it contains your resource endpoint string.

注意

2019 年 7 月 1 日より後に作成された新しいリソースには、カスタム サブドメイン名が使用されます。New resources created after July 1, 2019, will use custom subdomain names. リージョンのエンドポイントの詳細および全一覧については、「Cognitive Services のカスタム サブドメイン名」を参照してください。For more information and a complete list of regional endpoints, see Custom subdomain names for Cognitive Services.

namespace DetectFace
{
    class Program
    {

        // Replace <Subscription Key> with your valid subscription key.
        const string subscriptionKey = "<Subscription Key>";
        
        // replace <myresourcename> with the string found in your endpoint URL
        const string uriBase =
            "https://<myresourcename>.cognitive.microsoft.com/face/v1.0/detect";

画像の入力を受け取るReceive image input

Program クラスの Main メソッドに次のコードを追加します。Add the following code to the Main method of the Program class. このコードによって、画像の URL を入力するようユーザーに要求するプロンプトがコンソールに出力されます。This code writes a prompt to the console asking the user to enter an image URL. さらに、もう 1 つのメソッド MakeAnalysisRequest を呼び出して、指定された場所にある画像を処理します。Then it calls another method, MakeAnalysisRequest, to process the image at that location.

        static void Main(string[] args)
        {

            // Get the path and filename to process from the user.
            Console.WriteLine("Detect faces:");
            Console.Write(
                "Enter the path to an image with faces that you wish to analyze: ");
            string imageFilePath = Console.ReadLine();

            if (File.Exists(imageFilePath))
            {
                try
                {
                    MakeAnalysisRequest(imageFilePath);
                    Console.WriteLine("\nWait a moment for the results to appear.\n");
                }
                catch (Exception e)
                {
                    Console.WriteLine("\n" + e.Message + "\nPress Enter to exit...\n");
                }
            }
            else
            {
                Console.WriteLine("\nInvalid file path.\nPress Enter to exit...\n");
            }
            Console.ReadLine();
        }

顔検出 REST API を呼び出すCall the face detection REST API

Program クラスに次のメソッドを追加します。Add the following method to the Program class. これは、リモートの画像から顔情報を検出する Face API の REST 呼び出しを構築するものです (取得する顔属性は requestParameters 文字列で指定します)。It constructs a REST call to the Face API to detect face information in the remote image (the requestParameters string specifies which face attributes to retrieve). 出力データは、JSON 文字列に書き込まれます。Then it writes the output data to a JSON string.

各ヘルパー メソッドは、以降の手順で定義します。You will define the helper methods in the following steps.

        // Gets the analysis of the specified image by using the Face REST API.
        static async void MakeAnalysisRequest(string imageFilePath)
        {
            HttpClient client = new HttpClient();

            // Request headers.
            client.DefaultRequestHeaders.Add(
                "Ocp-Apim-Subscription-Key", subscriptionKey);

            // Request parameters. A third optional parameter is "details".
            string requestParameters = "returnFaceId=true&returnFaceLandmarks=false" +
                "&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses," +
                "emotion,hair,makeup,occlusion,accessories,blur,exposure,noise";

            // Assemble the URI for the REST API Call.
            string uri = uriBase + "?" + requestParameters;

            HttpResponseMessage response;

            // Request body. Posts a locally stored JPEG image.
            byte[] byteData = GetImageAsByteArray(imageFilePath);

            using (ByteArrayContent content = new ByteArrayContent(byteData))
            {
                // This example uses content type "application/octet-stream".
                // The other content types you can use are "application/json"
                // and "multipart/form-data".
                content.Headers.ContentType =
                    new MediaTypeHeaderValue("application/octet-stream");

                // Execute the REST API call.
                response = await client.PostAsync(uri, content);

                // Get the JSON response.
                string contentString = await response.Content.ReadAsStringAsync();

                // Display the JSON response.
                Console.WriteLine("\nResponse:\n");
                Console.WriteLine(JsonPrettyPrint(contentString));
                Console.WriteLine("\nPress Enter to exit...");
            }
        }

入力画像データを処理するProcess the input image data

Program クラスに次のメソッドを追加します。Add the following method to the Program class. このメソッドでは、指定された URL にある画像をバイト配列に変換します。This method converts the image at the specified URL into a byte array.

        // Returns the contents of the specified file as a byte array.
        static byte[] GetImageAsByteArray(string imageFilePath)
        {
            using (FileStream fileStream =
                new FileStream(imageFilePath, FileMode.Open, FileAccess.Read))
            {
                BinaryReader binaryReader = new BinaryReader(fileStream);
                return binaryReader.ReadBytes((int)fileStream.Length);
            }
        }

JSON 応答を解析しますParse the JSON response

Program クラスに次のメソッドを追加します。Add the following method to the Program class. このメソッドでは、JSON 入力を読みやすく書式設定します。This method formats the JSON input to be more easily readable. アプリからは、この文字列データをコンソールに書き込むことになります。Your app will write this string data to the console. その後、クラスと名前空間を閉じることができます。You can then close the class and namespace.

        // Formats the given JSON string by adding line breaks and indents.
        static string JsonPrettyPrint(string json)
        {
            if (string.IsNullOrEmpty(json))
                return string.Empty;

            json = json.Replace(Environment.NewLine, "").Replace("\t", "");

            StringBuilder sb = new StringBuilder();
            bool quote = false;
            bool ignore = false;
            int offset = 0;
            int indentLength = 3;

            foreach (char ch in json)
            {
                switch (ch)
                {
                    case '"':
                        if (!ignore) quote = !quote;
                        break;
                    case '\'':
                        if (quote) ignore = !ignore;
                        break;
                }

                if (quote)
                    sb.Append(ch);
                else
                {
                    switch (ch)
                    {
                        case '{':
                        case '[':
                            sb.Append(ch);
                            sb.Append(Environment.NewLine);
                            sb.Append(new string(' ', ++offset * indentLength));
                            break;
                        case '}':
                        case ']':
                            sb.Append(Environment.NewLine);
                            sb.Append(new string(' ', --offset * indentLength));
                            sb.Append(ch);
                            break;
                        case ',':
                            sb.Append(ch);
                            sb.Append(Environment.NewLine);
                            sb.Append(new string(' ', offset * indentLength));
                            break;
                        case ':':
                            sb.Append(ch);
                            sb.Append(' ');
                            break;
                        default:
                            if (ch != ' ') sb.Append(ch);
                            break;
                    }
                }
            }

            return sb.ToString().Trim();
        }
    }
}

アプリの実行Run the app

実行に成功した場合、応答として顔データが、読みやすい JSON 形式で表示されます。A successful response will display Face data in easily readable JSON format. 例:For example:

[
   {
      "faceId": "f7eda569-4603-44b4-8add-cd73c6dec644",
      "faceRectangle": {
         "top": 131,
         "left": 177,
         "width": 162,
         "height": 162
      },
      "faceAttributes": {
         "smile": 0.0,
         "headPose": {
            "pitch": 0.0,
            "roll": 0.1,
            "yaw": -32.9
         },
         "gender": "female",
         "age": 22.9,
         "facialHair": {
            "moustache": 0.0,
            "beard": 0.0,
            "sideburns": 0.0
         },
         "glasses": "NoGlasses",
         "emotion": {
            "anger": 0.0,
            "contempt": 0.0,
            "disgust": 0.0,
            "fear": 0.0,
            "happiness": 0.0,
            "neutral": 0.986,
            "sadness": 0.009,
            "surprise": 0.005
         },
         "blur": {
            "blurLevel": "low",
            "value": 0.06
         },
         "exposure": {
            "exposureLevel": "goodExposure",
            "value": 0.67
         },
         "noise": {
            "noiseLevel": "low",
            "value": 0.0
         },
         "makeup": {
            "eyeMakeup": true,
            "lipMakeup": true
         },
         "accessories": [

         ],
         "occlusion": {
            "foreheadOccluded": false,
            "eyeOccluded": false,
            "mouthOccluded": false
         },
         "hair": {
            "bald": 0.0,
            "invisible": false,
            "hairColor": [
               {
                  "color": "brown",
                  "confidence": 1.0
               },
               {
                  "color": "black",
                  "confidence": 0.87
               },
               {
                  "color": "other",
                  "confidence": 0.51
               },
               {
                  "color": "blond",
                  "confidence": 0.08
               },
               {
                  "color": "red",
                  "confidence": 0.08
               },
               {
                  "color": "gray",
                  "confidence": 0.02
               }
            ]
         }
      }
   }
]

次の手順Next steps

このクイック スタートでは、REST 呼び出しと Azure Face API を使って画像から顔を検出し、その属性を返す単純な .NET コンソール アプリケーションを作成しました。In this quickstart, you created a simple .NET console application that uses REST calls with the Azure Face API to detect faces in an image and return their attributes. この後は、サポートされているシナリオについて、Face API のリファレンス ドキュメントでさらに理解を深めましょう。Next, explore the Face API reference documentation to learn more about the supported scenarios.