你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
降低延迟并提高性能
本指南介绍如何在使用人脸服务时降低网络延迟并提高服务性能。 应用程序的速度和性能会影响最终用户(例如注册和使用人脸识别系统的人员)的体验。
缓解延迟
使用人脸服务时你可能会遇到延迟。 延迟是指系统通过网络通信时发生的任何类型的延迟。 通常情况下,延迟的可能原因包括:
- 每个数据包从源传输到目标时必须通过的物理距离过长。
- 传输介质出现问题。
- 传输路径中的路由器或交换机出现错误。
- 防病毒应用程序、防火墙和其他安全机制检查数据包需要一定的时间。
- 客户端或服务器应用程序中出现故障。
本部分介绍如何减少造成 Azure AI 人脸服务延迟的各种成因。
注意
Azure AI 服务不提供与延迟有关的任何服务级别协议 (SLA)。
为人脸资源选择适当的区域
网络延迟是信息从源(应用程序)到目标(Azure 资源)所需的时间,深受发出请求的应用程序与响应这些请求的 Azure 服务器之间的地理距离的影响。 例如,如果人脸资源位于 EastUS
位置,则纽约用户响应时间更快,亚洲用户体验到的延迟更长。
建议选择最靠近用户的区域,以最大程度地减少延迟。 如果你的用户分布在世界各地,请考虑在不同的区域中创建多个资源,并将请求路由到离客户最近的区域。 或者,可以选择一个靠近所有客户的地理中心的区域。
将 Azure Blob 存储用于远程 URL
人脸服务提供两种方法来上传图像进行处理:直接在请求中上传图像的原始字节数据,或提供远程图像的 URL。 无论使用哪种方法,人脸服务都需要从其源位置下载图像。 如果从人脸服务到客户端或远程服务器的连接缓慢或质量较差,则会影响请求的响应时间。 如果存在延迟问题,请考虑将映像存储在 Azure Blob 存储中,并在请求中传递映像 URL。 有关更多关于实现的详细信息,请参阅“将映像存储在 Azure 高级 Blob 存储中”。 示例 API 调用:
var url = "https://<storage_account_name>.blob.core.windows.net/<container_name>/<file_name>";
var response = await faceClient.DetectAsync(new Uri(url), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false);
var faces = response.Value;
请务必使用与人脸资源位于同一区域中的存储帐户。 这将减少人脸服务和存储帐户之间连接的延迟。
使用最佳文件大小
如果使用的图像文件很大,它将以两种方式影响人脸服务的响应时间:
- 上传文件需要更多时间。
- 服务需要花费更多时间(与文件大小成正比)来处理文件。
准确性与网络速度之间的权衡
输入图像的质量会影响人脸服务的准确性和延迟。 质量较低的图像可能会导致错误的结果。 质量较高的图像可能会产生更精确的解释。 但是,由于图像文件大小较大,质量更高的图像也会增加网络延迟。 服务需要更多时间才能从客户端接收和处理整个文件,所用时间与文件大小成正比。 超过一定级别后,进一步的质量增强不会显著提高准确性。
若要在准确性和速度之间实现最佳平衡,请按照这些提示优化输入数据。
其他文件大小提示
请注意以下额外提示:
- 对于人脸检测,使用检测模型
FaceDetectionModel.Detection01
时,减小图像文件大小会提高处理速度。 如果使用检测模型FaceDetectionModel.Detection02
,则只有当图像文件小于 1920x1080 像素时,减小图像文件大小才会提高处理速度。 - 对于人脸识别,如果图像小于 200x200 像素,则减少人脸大小只会提高速度。
- 人员检测方法的性能还取决于图像中有多少人脸。 对于每个图像,人脸服务最多可以返回 100 张人脸。 人脸将根据人脸矩形大小按从大到小的顺序排序。
尽可能并行调用 API
如果你需要调用多个 API,请考虑并行调用这些方法(如果你的应用程序设计允许这样做)。 例如,如果需要检测两个图像中的人脸来执行人脸比较,则可以在异步任务中调用它们:
string url1 = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/detection1.jpg";
string url2 = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/detection2.jpg";
var response1 = client.DetectAsync(new Uri(url1), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false);
var response2 = client.DetectAsync(new Uri(url2), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false);
Task.WaitAll(new Task<Response<IReadOnlyList<FaceDetectionResult>>>[] { response1, response2 });
IEnumerable<FaceDetectionResult> results = response1.Result.Value.Concat(response2.Result.Value);
平滑处理峰值流量
人脸服务的性能可能会受到流量高峰的影响,这可能会导致限制,吞吐量降低和延迟升高。 建议逐步增加 API 调用的频率,避免立即重试。 例如,如果你有 3000 张照片用于执行面部检测,请不要同时发送 3000 个请求。 取而代之,请在 5 分钟内按顺序发送 3000 个请求(即每秒约 10 个请求),以使流量更加稳定一致。 如果要缩短完成时间,请逐渐增加每秒调用数,以使流量平滑增加。 如果遇到任何错误,请参阅“有效处理错误”来处理响应。
有效处理错误
由于各种原因,人脸 API 调用上可能会出现错误 429
和 503
。 应用程序必须始终为处理这些错误做好准备。 以下是一些建议:
HTTP 错误代码 | 说明 | 建议 |
---|---|---|
429 |
限制 | 并发调用可能会遇到速率限制。 应降低调用频率,并使用指数退避重试。 避免立即重试,并避免同时重新发送大量请求。 如果要增加限制,请参阅配额指南的“请求增加”部分。 |
503 |
服务不可用 | 服务可能正忙,无法立即响应请求。 应采用类似于错误 429 的策略的退避策略。 |
确保可靠性和支持
以下是确保应用程序拥有可靠性和高度支持的其他提示:
- 生成一个唯一的 GUID 作为
client-request-id
HTTP 请求标头,并随每个请求一起发送该 GUID。 这有助于在需要报告 Microsoft 的问题时,让 Microsoft 更轻松地调查任何错误。- 始终记录遇到意外响应时收到的
client-request-id
和响应。 如果需要任何帮助,请向 Microsoft 支持部门提供此信息,以及问题发生时的 Azure 资源 ID 和时间段。
- 始终记录遇到意外响应时收到的
- 在将应用程序发布到生产环境之前进行试点测试。 确保应用程序可以正确有效地处理错误。
后续步骤
本指南介绍在使用人脸服务时如何提高性能。 接下来,按照教程设置一个工作软件解决方案,该解决方案结合了服务器端和客户端逻辑,以便对用户进行人脸活体检测。