빠른 시작: Face REST API 및 C#을 사용하여 이미지에서 얼굴 감지Quickstart: Detect faces in an image using the Face REST API and C#

이 빠른 시작에서는 이미지에서 사람 얼굴을 감지하기 위해 C#과 함께 Azure Face REST API를 사용합니다.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 following fields to the Program class. 이 데이터는 Face 서비스에 연결하는 방법과 입력 데이터를 가져올 위치를 지정합니다.This data specifies how to connect to the Face service and where to get the input data. subscriptionKey 필드를 구독 키의 값으로 업데이트해야 하며 올바른 지역 식별자가 포함되도록 uriBase 문자열을 변경해야 할 수도 있습니다(모든 지역 엔드포인트 목록에 대해서는 Face API 설명서 참조).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 the correct region identifier (see the Face API docs for a list of all region endpoints).

// Replace <Subscription Key> with your valid subscription key.
const string subscriptionKey = "<Subscription Key>";

// NOTE: You must use the same region in your REST call as you used to
// obtain your subscription keys. For example, if you obtained your
// subscription keys from westus, replace "westcentralus" in the URL
// below with "westus".
//
// Free trial subscription keys are generated in the "westus" region.
// If you use a free trial subscription key, you shouldn't need to change
// this region.
const string uriBase =
    "https://westcentralus.api.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 writes a prompt to the console asking the user to enter an image URL. 그런 다음, 다른 메서드인 MakeAnalysisRequest를 호출하여 해당 위치에서 이미지를 처리합니다.Then it calls another method, MakeAnalysisRequest, to process the image at that location.

// 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 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 formats the JSON input to be more easily readable. 앱이 이 문자열 데이터를 콘솔에 씁니다.Your app will write this string data to the console.

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

이 빠른 시작에서는 Azure Face API와 함께 REST 호출을 사용하여 이미지의 얼굴을 감지하고 해당 특성을 반환하는 간단한 .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.