快速入门:使用 REST API 和 Java 检测图像中的人脸

在本快速入门中,请使用 Azure 人脸 REST API 和 Java 检测图像中的人脸。

如果没有 Azure 订阅,请在开始前创建一个试用帐户

先决条件

  • 人脸 API 订阅密钥。 可以按照创建认知服务帐户中的说明订阅人脸 API 服务并获取密钥。
  • 任何所选的 Java IDE。

创建 Java 项目

在 IDE 中创建新的命令行 Java 应用,并使用 main 方法添加 Main 类。 然后,将以下全局库从 Maven 存储库下载到项目的 lib 目录:

  • org.apache.httpcomponents:httpclient:4.5.6
  • org.apache.httpcomponents:httpcore:4.4.10
  • org.json:json:20170516
  • commons-logging:commons-logging:1.1.2

添加人脸检测代码

打开项目的 main 类。 在这里,请添加加载图像和检测人脸所需的代码。

导入程序包

将下列 import 语句添加到文件顶部。

// 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.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONObject;

添加必要的字段

将以下字段添加到 Main 类。 该数据指定如何连接到人脸服务,以及在何处获取输入数据。 需使用订阅密钥的值更新 subscriptionKey 字段,并且可能需要更改 uriBase 字符串,使之包含正确的区域标识符(如需包含所有区域终结点的列表,请参阅人脸 API 文档)。 可能还需要将 imageWithFaces 值设置为一个路径,使之指向另一图像文件。

faceAttributes 字段只是一个列表,包含特定类型的属性。 它将指定要检索的有关已检测人脸的信息。

// Replace <Subscription Key> with your valid subscription key.
private static final String subscriptionKey = "<Subscription Key>";

private static final String uriBase = "https://api.cognitive.azure.cn/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

将以下方法添加到 main 方法。 它构造一个针对人脸 API 的 REST 调用,以便检测远程图像(faceAttributes 字符串指定要检索的人脸属性)中的人脸信息。 然后,它将输出数据写入到 JSON 字符串。

HttpClient httpclient = HttpClientBuilder.create().build();

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 响应

直接在以前的代码下添加以下块,以便将返回的 JSON 数据转换成更加易于读取的格式,然后再将其输出到控制台。 最后,关闭 try-catch 块。

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

运行应用程序

编译并运行代码。 成功的响应会以易于读取的 JSON 格式在控制台窗口中显示人脸数据。 例如:

[{
  "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"
}]

后续步骤

在本快速入门中,你创建了一个简单的 Java 控制台应用程序,该应用程序可以将 REST 调用与 Azure 人脸 API 配合使用,以便检测图像中的人脸并返回其属性。 接下来,请了解如何在 Android 应用程序中更充分地使用此功能。