forked from Azure-Samples/cognitive-services-quickstart-code
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFindSimilar.cs
More file actions
107 lines (94 loc) · 4.98 KB
/
FindSimilar.cs
File metadata and controls
107 lines (94 loc) · 4.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// <snippet_using>
using Azure;
using Azure.AI.Vision.Face;
// </snippet_using>
namespace FaceQuickstart
{
class Program
{
// <snippet_image_url>
const string IMAGE_BASE_URL = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/Face/images/";
// </snippet_image_url>
// <snippet_creds>
static readonly string SUBSCRIPTION_KEY = Environment.GetEnvironmentVariable("FACE_APIKEY") ?? "<apikey>";
static readonly string ENDPOINT = Environment.GetEnvironmentVariable("FACE_ENDPOINT") ?? "<endpoint>";
// </snippet_creds>
static void Main(string[] args)
{
// <snippet_detect_models>
FaceRecognitionModel RECOGNITION_MODEL4 = FaceRecognitionModel.Recognition04;
// </snippet_detect_models>
// <snippet_maincalls>
FaceClient client = Authenticate(ENDPOINT, SUBSCRIPTION_KEY);
FindSimilar(client, IMAGE_BASE_URL, RECOGNITION_MODEL4).Wait();
// </snippet_maincalls>
}
// <snippet_auth>
public static FaceClient Authenticate(string endpoint, string key)
{
return new FaceClient(new Uri(endpoint), new AzureKeyCredential(key));
}
// </snippet_auth>
// <snippet_face_detect_recognize>
private static async Task<List<FaceDetectionResult>> DetectFaceRecognize(FaceClient faceClient, string url, FaceRecognitionModel recognition_model)
{
// Detect faces from image URL.
Response<IReadOnlyList<FaceDetectionResult>> response = await faceClient.DetectAsync(new Uri(url), FaceDetectionModel.Detection03, recognition_model, returnFaceId: true, [FaceAttributeType.QualityForRecognition]);
IReadOnlyList<FaceDetectionResult> detectedFaces = response.Value;
List<FaceDetectionResult> sufficientQualityFaces = new List<FaceDetectionResult>();
foreach (FaceDetectionResult detectedFace in detectedFaces)
{
var faceQualityForRecognition = detectedFace.FaceAttributes.QualityForRecognition;
if (faceQualityForRecognition.HasValue && (faceQualityForRecognition.Value != QualityForRecognition.Low))
{
sufficientQualityFaces.Add(detectedFace);
}
}
Console.WriteLine($"{detectedFaces.Count} face(s) with {sufficientQualityFaces.Count} having sufficient quality for recognition detected from image `{Path.GetFileName(url)}`");
return sufficientQualityFaces;
}
// </snippet_face_detect_recognize>
public static async Task FindSimilar(FaceClient client, string base_url, FaceRecognitionModel recognition_model)
{
// <snippet_loadfaces>
Console.WriteLine("========FIND SIMILAR========");
Console.WriteLine();
List<string> targetImageFileNames = new List<string>
{
"Family1-Dad1.jpg",
"Family1-Daughter1.jpg",
"Family1-Mom1.jpg",
"Family1-Son1.jpg",
"Family2-Lady1.jpg",
"Family2-Man1.jpg",
"Family3-Lady1.jpg",
"Family3-Man1.jpg"
};
string sourceImageFileName = "findsimilar.jpg";
IList<Guid> targetFaceIds = new List<Guid>();
foreach (var targetImageFileName in targetImageFileNames)
{
// Detect faces from target image url.
var faces = await DetectFaceRecognize(client, $"{base_url}{targetImageFileName}", recognition_model);
// Add detected faceId to list of GUIDs.
targetFaceIds.Add(faces[0].FaceId.Value);
}
// Detect faces from source image url.
IList<FaceDetectionResult> detectedFaces = await DetectFaceRecognize(client, $"{base_url}{sourceImageFileName}", recognition_model);
Console.WriteLine();
// </snippet_loadfaces>
// <snippet_find_similar>
// Find a similar face(s) in the list of IDs. Comapring only the first in list for testing purposes.
Response<IReadOnlyList<FaceFindSimilarResult>> response = await client.FindSimilarAsync(detectedFaces[0].FaceId.Value, targetFaceIds);
IList<FaceFindSimilarResult> similarResults = response.Value.ToList();
// </snippet_find_similar>
// <snippet_find_similar_print>
foreach (var similarResult in similarResults)
{
Console.WriteLine($"Faces from {sourceImageFileName} & ID:{similarResult.FaceId} are similar with confidence: {similarResult.Confidence}.");
}
Console.WriteLine();
// </snippet_find_similar_print>
}
}
}