你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

指定人脸检测模型

本指南介绍如何为 Azure AI 人脸服务指定人脸检测模型。

人脸服务使用机器学习模型对图像中的人脸执行运算。 我们将会根据客户反馈以及研究成果不断改进模型的准确度,并作为模型更新交付改进结果。 开发人员可以指定想要使用的人脸检测模型版本;他们可以选择最适合其用例的模型。

请继续了解如何在特定的人脸操作中指定人脸检测模型。 每当人脸服务将人脸图像转换为其他某种形式的数据时,就会使用人脸检测。

如果你不确定是否要切换到最新的模型,请跳转到评估不同的模型部分来评估新模型,并使用当前数据集比较结果。

必备条件

你应该熟悉 AI 人脸检测的概念。 如果你不熟悉,请参阅人脸检测的概念指南或操作指南:

评估不同的模型

不同的人脸检测模型已针对不同的任务进行优化。 有关差异概述,请参阅下表。

模型 说明 性能说明 特征点
detection_01 所有人脸检测操作的默认选项。 未针对小尺寸人脸、侧视人脸或模糊人脸进行优化。 如果在检测调用中指定了人脸特征点,则返回这些特征点。
detection_02 已于 2019 年 5 月发布,可以选择性地在所有人脸检测操作中使用。 已针对小尺寸人脸、侧视人脸或模糊人脸提高了准确度。 不返回人脸特征点。
detection_03 已于 2021 年 2 月发布,可以选择性地在所有人脸检测操作中使用。 进一步提升了准确度,包括针对人脸较小(64x64 像素)和人脸方向发生了转动等情况。 如果在检测调用中指定了人脸特征点,则返回这些特征点。

属性是一组功能,如果在检测调用中指定,则可以选择性地检测它们:

模型 accessories blur exposure 眼镜 headPose 掩码 noise occlusion qualityForRecognition
detection_01 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️(对于 recognition_03 或 04)
detection_02
detection_03 ✔️ ✔️ ✔️ ✔️ ✔️ ✔️ ✔️(对于 recognition_03 或 04)

比较检测模型性能的最佳方式是针对示例数据集使用这些模型。 我们建议使用每个检测模型针对各种图像(尤其是许多人脸的图像,或者难以辨认的人脸的图像)调用 Detect API。 请注意每个模型返回的人脸数。

使用指定的模型检测人脸

人脸检测可以查找人脸的边界框位置,并识别其视觉特征点。 它会提取人脸的特征并存储这些特征,以便稍后在识别操作中使用。

使用 Detect API 时,可以使用 detectionModel 参数分配模型版本。 可用值有:

  • detection_01
  • detection_02
  • detection_03

Detect REST API 的请求 URL 如下所示:

https://westus.api.cognitive.microsoft.com/face/v1.0/detect?detectionModel={detectionModel}&recognitionModel={recognitionModel}&returnFaceId={returnFaceId}&returnFaceAttributes={returnFaceAttributes}&returnFaceLandmarks={returnFaceLandmarks}&returnRecognitionModel={returnRecognitionModel}&faceIdTimeToLive={faceIdTimeToLive}

如果使用客户端库,则可以通过传入一个相应的字符串来分配 detectionModel 的值。 如果不分配该值,则 API 使用默认模型版本 (detection_01)。 请查看适用于 .NET 客户端库的以下代码示例。

string imageUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/detection1.jpg";
var response = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false, returnFaceLandmarks: false);
var faces = response.Value;

使用指定的模型将人脸添加到 Person

人脸服务可以从图像中提取人脸数据,并通过 Add Person Group Person Face API 将其与 Person 对象关联。 在此 API 调用中,可以像在 Detect 中一样指定检测模型。

请参阅以下 .NET 代码示例。

// Create a PersonGroup and add a person with face detected by "detection_03" model
string personGroupId = "mypersongroupid";
using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["name"] = "My Person Group Name", ["recognitionModel"] = "recognition_04" }))))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    await httpClient.PutAsync($"{ENDPOINT}/face/v1.0/persongroups/{personGroupId}", content);
}

string? personId = null;
using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["name"] = "My Person Name" }))))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    using (var response = await httpClient.PostAsync($"{ENDPOINT}/face/v1.0/persongroups/{personGroupId}/persons", content))
    {
        string contentString = await response.Content.ReadAsStringAsync();
        personId = (string?)(JsonConvert.DeserializeObject<Dictionary<string, object>>(contentString)?["personId"]);
    }
}

string imageUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/detection1.jpg";
using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["url"] = imageUrl }))))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    await httpClient.PostAsync($"{ENDPOINT}/face/v1.0/persongroups/{personGroupId}/persons/{personId}/persistedfaces?detectionModel=detection_03", content);
}

此代码将创建 ID 为 mypersongroupidPersonGroup,并将一个 Person 对象添加到其中。 然后,它使用 detection_03 模型将一个 Face 对象添加到此 Person 对象。 如果未指定 detectionModel 参数,则 API 使用默认模型 detection_01

注意

无需对 Person 对象中的所有人脸使用相同的检测模型,并且在检测新人脸时,无需使用相同的检测模型来与 Person 对象进行比较(例如,在 Identify From Person Group API 中)。

使用指定的模型将人脸添加到 FaceList

将人脸添加到现有的 FaceList 对象时,也可以指定检测模型。 请参阅以下 .NET 代码示例。

using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["name"] = "My face collection", ["recognitionModel"] = "recognition_04" }))))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    await httpClient.PutAsync($"{ENDPOINT}/face/v1.0/facelists/{faceListId}", content);
}

string imageUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/detection1.jpg";
using (var content = new ByteArrayContent(Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(new Dictionary<string, object> { ["url"] = imageUrl }))))
{
    content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    await httpClient.PostAsync($"{ENDPOINT}/face/v1.0/facelists/{faceListId}/persistedfaces?detectionModel=detection_03", content);
}

此代码将创建名为 My face collectionFaceList,并使用 detection_03 模型将一个 Face 对象添加到其中。 如果未指定 detectionModel 参数,则 API 使用默认模型 detection_01

注意

无需对 FaceList 对象中的所有人脸使用相同的检测模型,并且在检测新人脸时,无需使用相同的检测模型来与 FaceList 对象进行比较

后续步骤

本文已介绍如何指定要与不同人脸 API 配合使用的检测模型。 接下来,按照快速入门开始使用人脸检测和分析。