使用 Azure Face 优化人脸识别方式 API
Optimized way of face recognition using Azure Face API
我需要使用天蓝色人脸实现人脸识别api。我开发了一个能够使用 .net SDK 找到相似面孔的程序。对于我的用例,我需要从网络摄像头中点击一个人的照片,并从保存在天蓝色云存储中的图像中找到匹配的面孔。现在,Azure 云存储中可能有数千张图像,在我当前的人脸识别实现中,我正在遍历所有图像(保存在 Azure 云存储中),然后将它们与网络摄像头图像进行匹配。
这里的问题是:
人脸api(由azure提供)每千次通话收费1美元。有没有一种方法可以优化搜索,这样我就不必扫描我已经为之前的搜索扫描过的面孔
public async Task<List<DetectedFaceAttributes>> FindSimiliarFacesWithAttributesFromContainer(IFaceClient client, string RECOGNITION_MODEL1, string sourceImageFileName)
{
string url = BlobBaseURL;
string sourceurl = sourceContainerURL;
var imagesInNovotraxContainer = await _blobService.GetNames();
IList<Guid?> targetFaceIds = new List<Guid?>();
var faceList = new List<DetectedFaceAttributes>();
// Detect faces from source image url.
IList<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{sourceurl}{sourceImageFileName}", RECOGNITION_MODEL1);
if (detectedFaces.Any())
{
foreach (var targetImageFileName in imagesInNovotraxContainer)
{
var faceattribute = new DetectedFaceAttributes();
// Detect faces from target image url.
var faces = await DetectFaceRecognizeWithAttributes(client, $"{url}{targetImageFileName}");
// Add detected faceId to list of GUIDs.
if (faces.Any())
{
targetFaceIds.Add(faces[0].FaceId.Value);
faceattribute.DetectedFace = faces[0];
faceattribute.ImageFileName = targetImageFileName;
faceList.Add(faceattribute);
}
}
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
IList<SimilarFace> similarResults = await client.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value, null, null, targetFaceIds);
var similiarFaceIDs = similarResults.Select(y => y.FaceId).ToList();
var returnDataTypefaceList = faceList.Where(x => similiarFaceIDs.Contains(x.DetectedFace.FaceId.Value)).ToList();
return returnDataTypefaceList;
}
else
{
throw new Exception("no face detected in captured photo ");
}
public async Task<List<DetectedFace>> DetectFaceRecognize(IFaceClient faceClient, string url, string RECOGNITION_MODEL1)
{
// Detect faces from image URL. Since only recognizing, use the recognition model 1.
IList<DetectedFace> detectedFaces = await faceClient.Face.DetectWithUrlAsync(url, recognitionModel: RECOGNITION_MODEL1);
//if (detectedFaces.Any())
//{
// Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{Path.GetFileName(url)}` with ID : {detectedFaces.First().FaceId}");
//}
return detectedFaces.ToList();
}
就调用 Face API / 你的存储("DetectFaceRecognizeWithAttributes" 背后的内容)而言,你的实现对我来说并不完全清楚。但我认为你是对的,因为你错过了一些东西,而且你的全球处理成本过高。
你应该做什么取决于你的目标:
- 是脸"identification"吗?
- 还是脸"similarity"?
两者逻辑相同,但使用的API操作不同
案例一——人脸识别
进程
全局过程如下:您将使用 "Person Group" 或 "Large Person Group"(取决于您拥有的人数)来存储关于您已经知道的面孔的数据(在你存储),你将使用这个组来 "identify" 一个新面孔。这样,您将进行“1-n”搜索,而不是像现在这样进行“1-1”搜索。
初始设置(组创建):
如果您需要个人组或大人组,请选择,以下是根据您的定价的实际限制:
- 个人组:
- 免费套餐订阅名额:1000人组。每个最多可容纳 1,000 人。
- S0层订阅名额:100万人组。每个最多可容纳10,000人。
- 大型人群:
- 最多可容纳 1,000,000 人。
- 免费套餐订阅配额:1,000 个大型团体。
- S0级订阅名额:1,000,000个大型人群。
这里我用的是Person Group来说明,但是方法是一样的
当您知道需要的那个时,使用 "Create" 操作创建它。
然后,对于每个人,您必须使用 "PersonGroup Person - Create" 创建一个 "PersonGroup Person",并使用 "PersonGroup Person - Add Face" 添加相应的面孔。完成后,您永远不需要在这些面上重新处理 "detect" 操作。
然后"run"部分
当您有要比较的新图像时:
- 使用
Detect
人脸端点检测图像中的人脸API
- 获取结果的人脸 ID
- 调用
Identify
人脸端点API尝试用你的(大)人群识别那些人脸ID
要限制调用次数,您甚至可以进行批量识别调用(1 个调用中最多 10 个 "input" 人脸 ID - 参见 doc)。
案例 2 - 人脸相似度
这里可以用一个"Face List"或者"Large Face List"来存储你已经知道的人脸,调用"Find Similar"操作的时候传递这个列表的id。 FaceList 示例:
我需要使用天蓝色人脸实现人脸识别api。我开发了一个能够使用 .net SDK 找到相似面孔的程序。对于我的用例,我需要从网络摄像头中点击一个人的照片,并从保存在天蓝色云存储中的图像中找到匹配的面孔。现在,Azure 云存储中可能有数千张图像,在我当前的人脸识别实现中,我正在遍历所有图像(保存在 Azure 云存储中),然后将它们与网络摄像头图像进行匹配。 这里的问题是: 人脸api(由azure提供)每千次通话收费1美元。有没有一种方法可以优化搜索,这样我就不必扫描我已经为之前的搜索扫描过的面孔
public async Task<List<DetectedFaceAttributes>> FindSimiliarFacesWithAttributesFromContainer(IFaceClient client, string RECOGNITION_MODEL1, string sourceImageFileName)
{
string url = BlobBaseURL;
string sourceurl = sourceContainerURL;
var imagesInNovotraxContainer = await _blobService.GetNames();
IList<Guid?> targetFaceIds = new List<Guid?>();
var faceList = new List<DetectedFaceAttributes>();
// Detect faces from source image url.
IList<DetectedFace> detectedFaces = await DetectFaceRecognize(client, $"{sourceurl}{sourceImageFileName}", RECOGNITION_MODEL1);
if (detectedFaces.Any())
{
foreach (var targetImageFileName in imagesInNovotraxContainer)
{
var faceattribute = new DetectedFaceAttributes();
// Detect faces from target image url.
var faces = await DetectFaceRecognizeWithAttributes(client, $"{url}{targetImageFileName}");
// Add detected faceId to list of GUIDs.
if (faces.Any())
{
targetFaceIds.Add(faces[0].FaceId.Value);
faceattribute.DetectedFace = faces[0];
faceattribute.ImageFileName = targetImageFileName;
faceList.Add(faceattribute);
}
}
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
IList<SimilarFace> similarResults = await client.Face.FindSimilarAsync(detectedFaces[0].FaceId.Value, null, null, targetFaceIds);
var similiarFaceIDs = similarResults.Select(y => y.FaceId).ToList();
var returnDataTypefaceList = faceList.Where(x => similiarFaceIDs.Contains(x.DetectedFace.FaceId.Value)).ToList();
return returnDataTypefaceList;
}
else
{
throw new Exception("no face detected in captured photo ");
}
public async Task<List<DetectedFace>> DetectFaceRecognize(IFaceClient faceClient, string url, string RECOGNITION_MODEL1)
{
// Detect faces from image URL. Since only recognizing, use the recognition model 1.
IList<DetectedFace> detectedFaces = await faceClient.Face.DetectWithUrlAsync(url, recognitionModel: RECOGNITION_MODEL1);
//if (detectedFaces.Any())
//{
// Console.WriteLine($"{detectedFaces.Count} face(s) detected from image `{Path.GetFileName(url)}` with ID : {detectedFaces.First().FaceId}");
//}
return detectedFaces.ToList();
}
就调用 Face API / 你的存储("DetectFaceRecognizeWithAttributes" 背后的内容)而言,你的实现对我来说并不完全清楚。但我认为你是对的,因为你错过了一些东西,而且你的全球处理成本过高。
你应该做什么取决于你的目标:
- 是脸"identification"吗?
- 还是脸"similarity"?
两者逻辑相同,但使用的API操作不同
案例一——人脸识别
进程
全局过程如下:您将使用 "Person Group" 或 "Large Person Group"(取决于您拥有的人数)来存储关于您已经知道的面孔的数据(在你存储),你将使用这个组来 "identify" 一个新面孔。这样,您将进行“1-n”搜索,而不是像现在这样进行“1-1”搜索。
初始设置(组创建):
如果您需要个人组或大人组,请选择,以下是根据您的定价的实际限制:
- 个人组:
- 免费套餐订阅名额:1000人组。每个最多可容纳 1,000 人。
- S0层订阅名额:100万人组。每个最多可容纳10,000人。
- 大型人群:
- 最多可容纳 1,000,000 人。
- 免费套餐订阅配额:1,000 个大型团体。
- S0级订阅名额:1,000,000个大型人群。
这里我用的是Person Group来说明,但是方法是一样的
当您知道需要的那个时,使用 "Create" 操作创建它。 然后,对于每个人,您必须使用 "PersonGroup Person - Create" 创建一个 "PersonGroup Person",并使用 "PersonGroup Person - Add Face" 添加相应的面孔。完成后,您永远不需要在这些面上重新处理 "detect" 操作。
然后"run"部分
当您有要比较的新图像时:
- 使用
Detect
人脸端点检测图像中的人脸API - 获取结果的人脸 ID
- 调用
Identify
人脸端点API尝试用你的(大)人群识别那些人脸ID
要限制调用次数,您甚至可以进行批量识别调用(1 个调用中最多 10 个 "input" 人脸 ID - 参见 doc)。
案例 2 - 人脸相似度
这里可以用一个"Face List"或者"Large Face List"来存储你已经知道的人脸,调用"Find Similar"操作的时候传递这个列表的id。 FaceList 示例: