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

이 빠른 시작에서는 이미지에서 사람 얼굴을 감지하기 위해 Java와 함께 Azure Face REST API를 사용합니다.In this quickstart, you will use the Azure Face REST API with Java to detect human faces in an image.

Azure 구독이 아직 없는 경우 시작하기 전에 체험 계정을 만듭니다.If you don't have an Azure subscription, create a free account before you begin.

필수 조건Prerequisites

Java 프로젝트 만들기Create the Java project

IDE에서 새 명령줄 Java 앱을 만들고 main 메서드와 함께 Main 클래스를 추가합니다.Create a new command line Java app in your IDE and add a Main class with a main method. 다음 글로벌 라이브러리를 Maven 리포지토리에서 프로젝트의 lib 디렉터리로 다운로드합니다.Then, download the following global libraries from the Maven Repository to the lib directory of your project:

  • org.apache.httpcomponents:httpclient:4.2.4
  • org.json:json:20170516

얼굴 감지 코드 추가Add face detection code

프로젝트의 기본 클래스를 엽니다.Open the main class of your project. 여기에 이미지를 로드하고 얼굴을 감지하는 데 필요한 코드를 추가합니다.Here, you will add the code needed to load images and detect faces.

패키지 가져오기Import packages

파일 맨 위에 다음 import 문을 추가합니다.Add the following import statements to the top of the file.

// This sample uses Apache HttpComponents:
// http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/
// https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/

import java.net.URI;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

필수 필드 추가Add essential fields

Main 클래스에 다음 필드를 추가합니다.Add the following fields to the Main 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). imageWithFaces 값을 다른 이미지 파일을 가리키는 경로로 설정할 수도 있습니다.You may also wish to set the imageWithFaces value to a path that points to a different image file.

faceAttributes 필드는 단순히 특정 유형의 특성 목록입니다.The faceAttributes field is simply a list of certain types of attributes. 감지된 얼굴에 대해 검색할 정보를 지정합니다.It will specify which information to retrieve about the detected faces.

// Replace <Subscription Key> with your valid subscription key.
private static final 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.
private static final String uriBase =
    "https://westcentralus.api.cognitive.microsoft.com/face/v1.0/detect";

private static final String imageWithFaces =
    "{\"url\":\"https://upload.wikimedia.org/wikipedia/commons/c/c3/RH_Louise_Lillian_Gish.jpg\"}";

private static final String faceAttributes =
    "age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise";

얼굴 감지 REST API 호출Call the face detection REST API

main 메서드에 다음 메서드를 추가합니다.Add the following method to the main method. Face API에 대한 REST 호출을 구성하여 원격 이미지의 얼굴 정보를 감지합니다(검색할 얼굴 특성을 지정하는 faceAttributes 문자열).It constructs a REST call to the Face API to detect face information in the remote image (the faceAttributes string specifies which face attributes to retrieve). 그런 다음, 출력 데이터를 JSON 문자열에 기록합니다.Then it writes the output data to a JSON string.

HttpClient httpclient = new DefaultHttpClient();

try
{
    URIBuilder builder = new URIBuilder(uriBase);

    // Request parameters. All of them are optional.
    builder.setParameter("returnFaceId", "true");
    builder.setParameter("returnFaceLandmarks", "false");
    builder.setParameter("returnFaceAttributes", faceAttributes);

    // Prepare the URI for the REST API call.
    URI uri = builder.build();
    HttpPost request = new HttpPost(uri);

    // Request headers.
    request.setHeader("Content-Type", "application/json");
    request.setHeader("Ocp-Apim-Subscription-Key", subscriptionKey);

    // Request body.
    StringEntity reqEntity = new StringEntity(imageWithFaces);
    request.setEntity(reqEntity);

    // Execute the REST API call and get the response entity.
    HttpResponse response = httpclient.execute(request);
    HttpEntity entity = response.getEntity();

JSON 응답 구문 분석Parse the JSON response

이전 코드 바로 아래에 다음 블록을 추가합니다. 그러면 반환된 JSON 데이터가 콘솔에 인쇄되기 전에 보다 쉽게 읽을 수 있는 형식으로 변환합니다.Directly below the previous code, add the following block, which converts the returned JSON data into a more easily readable format before printing it to the console. 마지막으로, try-catch 블록을 닫습니다.Finally, close out the try-catch block.

    if (entity != null)
    {
        // Format and display the JSON response.
        System.out.println("REST Response:\n");

        String jsonString = EntityUtils.toString(entity).trim();
        if (jsonString.charAt(0) == '[') {
            JSONArray jsonArray = new JSONArray(jsonString);
            System.out.println(jsonArray.toString(2));
        }
        else if (jsonString.charAt(0) == '{') {
            JSONObject jsonObject = new JSONObject(jsonString);
            System.out.println(jsonObject.toString(2));
        } else {
            System.out.println(jsonString);
        }
    }
}
catch (Exception e)
{
    // Display error message.
    System.out.println(e.getMessage());
}

앱 실행Run the app

코드를 컴파일하고 실행합니다.Compile the code and run it. 성공적인 응답은 얼굴 데이터를 쉽게 읽을 수 있는 JSON 형식으로 콘솔 창에서 표시합니다.A successful response will display Face data in easily readable JSON format in the console window. 예: For example:

[{
  "faceRectangle": {
    "top": 131,
    "left": 177,
    "width": 162,
    "height": 162
  },
  "faceAttributes": {
    "makeup": {
      "eyeMakeup": true,
      "lipMakeup": true
    },
    "facialHair": {
      "sideburns": 0,
      "beard": 0,
      "moustache": 0
    },
    "gender": "female",
    "accessories": [],
    "blur": {
      "blurLevel": "low",
      "value": 0.06
    },
    "headPose": {
      "roll": 0.1,
      "pitch": 0,
      "yaw": -32.9
    },
    "smile": 0,
    "glasses": "NoGlasses",
    "hair": {
      "bald": 0,
      "invisible": false,
      "hairColor": [
        {
          "color": "brown",
          "confidence": 1
        },
        {
          "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
        }
      ]
    },
    "emotion": {
      "contempt": 0,
      "surprise": 0.005,
      "happiness": 0,
      "neutral": 0.986,
      "sadness": 0.009,
      "disgust": 0,
      "anger": 0,
      "fear": 0
    },
    "exposure": {
      "value": 0.67,
      "exposureLevel": "goodExposure"
    },
    "occlusion": {
      "eyeOccluded": false,
      "mouthOccluded": false,
      "foreheadOccluded": false
    },
    "noise": {
      "noiseLevel": "low",
      "value": 0
    },
    "age": 22.9
  },
  "faceId": "49d55c17-e018-4a42-ba7b-8cbbdfae7c6f"
}]

다음 단계Next steps

이 빠른 시작에서는 Azure Face API와 함께 REST 호출을 사용하여 이미지의 얼굴을 감지하고 해당 특성을 반환하는 간단한 Java 콘솔 애플리케이션을 만들었습니다.In this quickstart, you created a simple Java console application that uses REST calls with the Azure Face API to detect faces in an image and return their attributes. 다음으로, Android 애플리케이션에서 이 기능을 사용하여 더 많은 작업을 수행하는 방법에 대해 알아봅니다.Next, learn how to do more with this functionality in an Android application.