Skip to content

Commit 67e2048

Browse files
Merge pull request #369 from der3318/new-face-quickstart-code-samples
New Face Quickstart Code Samples for C# Python JavaScript
2 parents 6e938bb + abdbdbb commit 67e2048

5 files changed

Lines changed: 865 additions & 0 deletions

File tree

dotnet/Face/Detect.cs

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
using System.Drawing;
2+
3+
using Azure;
4+
using Azure.AI.Vision.Face;
5+
6+
namespace FaceQuickstart
7+
{
8+
class Program
9+
{
10+
static string SUBSCRIPTION_KEY = "PASTE_YOUR_FACE_SUBSCRIPTION_KEY_HERE";
11+
static string ENDPOINT = "PASTE_YOUR_FACE_ENDPOINT_HERE";
12+
13+
async static void Quickstart()
14+
{
15+
FaceClient faceClient = new FaceClient(new Uri(ENDPOINT), new AzureKeyCredential(SUBSCRIPTION_KEY));
16+
17+
var imageUrl = "https://raw.githubusercontent.com/Azure-Samples/cognitive-services-sample-data-files/master/ComputerVision/Images/faces.jpg";
18+
19+
// <basic1>
20+
var response = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false);
21+
IReadOnlyList<FaceDetectionResult> faces = response.Value;
22+
// </basic1>
23+
24+
// <basic2>
25+
foreach (var face in faces)
26+
{
27+
string id = face.FaceId.ToString();
28+
FaceRectangle rect = face.FaceRectangle;
29+
}
30+
// </basic2>
31+
32+
// <landmarks1>
33+
// Note DetectionModel.Detection02 cannot be used with returnFaceLandmarks.
34+
var response2 = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false, returnFaceLandmarks: true);
35+
IReadOnlyList<FaceDetectionResult> faces2 = response2.Value;
36+
// </landmarks1>
37+
38+
// <landmarks2>
39+
foreach (var face in faces2)
40+
{
41+
var landmarks = face.FaceLandmarks;
42+
43+
double noseX = landmarks.NoseTip.X;
44+
double noseY = landmarks.NoseTip.Y;
45+
46+
double leftPupilX = landmarks.PupilLeft.X;
47+
double leftPupilY = landmarks.PupilLeft.Y;
48+
49+
double rightPupilX = landmarks.PupilRight.X;
50+
double rightPupilY = landmarks.PupilRight.Y;
51+
// </landmarks2>
52+
53+
// <direction>
54+
var upperLipBottom = landmarks.UpperLipBottom;
55+
var underLipTop = landmarks.UnderLipTop;
56+
57+
var centerOfMouth = new Point(
58+
(int)((upperLipBottom.X + underLipTop.X) / 2),
59+
(int)((upperLipBottom.Y + underLipTop.Y) / 2));
60+
61+
var eyeLeftInner = landmarks.EyeLeftInner;
62+
var eyeRightInner = landmarks.EyeRightInner;
63+
64+
var centerOfTwoEyes = new Point(
65+
(int)((eyeLeftInner.X + eyeRightInner.X) / 2),
66+
(int)((eyeLeftInner.Y + eyeRightInner.Y) / 2));
67+
68+
var faceDirectionVectorX = centerOfTwoEyes.X - centerOfMouth.X;
69+
var faceDirectionVectorY = centerOfTwoEyes.Y - centerOfMouth.Y;
70+
}
71+
// </direction>
72+
73+
// <attributes1>
74+
var requiredFaceAttributes = new FaceAttributeType[] {
75+
FaceAttributeType.Detection03.Blur,
76+
FaceAttributeType.Detection03.HeadPose,
77+
FaceAttributeType.Detection03.Mask,
78+
FaceAttributeType.Recognition04.QualityForRecognition
79+
};
80+
// Note DetectionModel.Detection02 cannot be used with returnFaceAttributes.
81+
var response3 = await faceClient.DetectAsync(new Uri(imageUrl), FaceDetectionModel.Detection03, FaceRecognitionModel.Recognition04, returnFaceId: false, returnFaceAttributes: requiredFaceAttributes);
82+
IReadOnlyList<FaceDetectionResult> faces3 = response3.Value;
83+
// </attributes1>
84+
85+
// <attributes2>
86+
foreach (var face in faces3)
87+
{
88+
var attributes = face.FaceAttributes;
89+
var blur = attributes.Blur;
90+
var headPose = attributes.HeadPose;
91+
var mask = attributes.Mask;
92+
var qualityForRecognition = attributes.QualityForRecognition;
93+
}
94+
// </attributes2>
95+
}
96+
97+
static void Main(string[] args)
98+
{
99+
Quickstart();
100+
Console.WriteLine("Press any key to exit.");
101+
Console.ReadKey();
102+
}
103+
}
104+
}

dotnet/Face/FindSimilar.cs

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

0 commit comments

Comments
 (0)