static void Main() { Console.WriteLine("FaceONNX: Race and age classification"); var files = Directory.GetFiles(@"..\..\..\images"); var path = @"..\..\..\results"; Directory.CreateDirectory(path); _faceDetectorLight = new FaceDetectorLight(); _faceLandmarksExtractor = new FaceLandmarksExtractor(); _faceRaceClassifier = new FaceRaceClassifier(); _faceAgeClassifier = new FaceAgeClassifier(); var painter = new Painter() { PointPen = new Pen(Color.Yellow, 4), Transparency = 0, TextFont = new Font("Arial", 24) }; Console.WriteLine($"Processing {files.Length} images"); foreach (var file in files) { using var bitmap = new Bitmap(file); var filename = Path.GetFileName(file); var faces = _faceDetectorLight.Forward(bitmap); int i = 1; Console.WriteLine($"Image: [{filename}] --> detected [{faces.Length}] faces"); foreach (var face in faces) { Console.Write($"\t[Face #{i++}]: "); var labels = GetRaceAndAge(bitmap, face); var paintData = new PaintData() { Rectangle = face, Labels = labels }; painter.Draw(bitmap, paintData); } bitmap.Save(Path.Combine(path, filename)); } _faceDetectorLight.Dispose(); _faceLandmarksExtractor.Dispose(); _faceRaceClassifier.Dispose(); _faceAgeClassifier.Dispose(); Console.WriteLine("Done."); Console.ReadKey(); }
static float[] GetEmbedding(Bitmap image) { var faces = _faceDetectorLight.Forward(image); using var cropped = Imaging.Crop(image, faces.First()); var points = _faceLandmarksExtractor.Forward(cropped); using var aligned = FaceLandmarksExtractor.Align(cropped, points); return(_faceEmbedder.Forward(aligned)); }
static string[] GetEmotionAndBeauty(Bitmap image, Rectangle face) { using var cropped = Imaging.Crop(image, face); var points = _faceLandmarksExtractor.Forward(cropped); using var aligned = FaceLandmarksExtractor.Align(cropped, points); var emotion = _faceEmotionClassifier.Forward(aligned); var emotionLabel = FaceEmotionClassifier.Labels[emotion.Argmax()]; var beauty = _faceBautyClassifier.Forward(aligned); var beautyLabel = $"{Math.Round(2 * beauty.Max(), 1)}/10.0"; Console.WriteLine($"--> classified as [{emotionLabel}] emotion and [{beautyLabel}] beauty"); return(new string[] { emotionLabel, beautyLabel }); }
static string[] GetRaceAndAge(Bitmap image, Rectangle face) { using var cropped = Imaging.Crop(image, face); var points = _faceLandmarksExtractor.Forward(cropped); using var aligned = FaceLandmarksExtractor.Align(cropped, points); var race = _faceRaceClassifier.Forward(aligned); var raceLabel = FaceRaceClassifier.Labels[race.Argmax()]; var age = _faceAgeClassifier.Forward(aligned); var ageLabel = FaceAgeClassifier.Labels[age.Argmax()]; Console.WriteLine($"--> classified as [{raceLabel}] race and [{ageLabel}] age"); return(new string[] { raceLabel, ageLabel }); }
static void Main() { Console.WriteLine("FaceONNX: Face landmarks extraction"); var files = Directory.GetFiles(@"..\..\..\images"); var path = @"..\..\..\results"; Directory.CreateDirectory(path); using var faceDetector = new FaceDetector(); using var faceLandmarksExtractor = new FaceLandmarksExtractor(); var painter = new Painter() { PointPen = new Pen(Color.Yellow, 4), Transparency = 0, }; Console.WriteLine($"Processing {files.Length} images"); foreach (var file in files) { using var bitmap = new Bitmap(file); var filename = Path.GetFileName(file); var faces = faceDetector.Forward(bitmap); Console.WriteLine($"Image: [{filename}] --> detected [{faces.Length}] faces"); foreach (var face in faces) { var points = faceLandmarksExtractor.Forward(bitmap, face); foreach (var point in points) { var paintData = new PaintData() { Points = point, Title = string.Empty, }; painter.Draw(bitmap, paintData); bitmap.Save(Path.Combine(path, filename)); } } } Console.WriteLine("Done."); Console.ReadKey(); }
static void Main() { Console.WriteLine("FaceONNX: Face embeddings classification"); var fits = Directory.GetFiles(@"..\..\..\images\fit"); _faceDetectorLight = new FaceDetectorLight(); _faceLandmarksExtractor = new FaceLandmarksExtractor(); _faceEmbedder = new FaceEmbedder(); var embeddings = new Embeddings(); foreach (var fit in fits) { using var bitmap = new Bitmap(fit); var embedding = GetEmbedding(bitmap); var name = Path.GetFileNameWithoutExtension(fit); embeddings.Add(embedding, name); } Console.WriteLine($"Embeddings count: {embeddings.Count}"); var scores = Directory.GetFiles(@"..\..\..\images\score"); Console.WriteLine($"Processing {scores.Length} images"); foreach (var score in scores) { using var bitmap = new Bitmap(score); var embedding = GetEmbedding(bitmap); var proto = embeddings.FromSimilarity(embedding); var label = proto.Item1; var similarity = proto.Item2; var filename = Path.GetFileName(score); Console.WriteLine($"Image: [{filename}] --> classified as [{label}] with similarity [{similarity}]"); } _faceDetectorLight.Dispose(); _faceLandmarksExtractor.Dispose(); _faceEmbedder.Dispose(); Console.WriteLine("Done."); Console.ReadKey(); }
static void Main() { Console.WriteLine("FaceONNX: Emotion and beauty estimation"); var files = Directory.GetFiles(@"..\..\..\images"); var path = @"..\..\..\results"; Directory.CreateDirectory(path); _faceDetectorLight = new FaceDetectorLight(); _faceLandmarksExtractor = new FaceLandmarksExtractor(); _faceEmotionClassifier = new FaceEmotionClassifier(); _faceBautyClassifier = new FaceBautyClassifier(); Console.WriteLine($"Processing {files.Length} images"); foreach (var file in files) { using var bitmap = new Bitmap(file); var filename = Path.GetFileName(file); var faces = _faceDetectorLight.Forward(bitmap); int i = 1; Console.WriteLine($"Image: [{filename}] --> detected [{faces.Length}] faces"); foreach (var face in faces) { Console.Write($"\t[Face #{i++}]: "); var labels = GetEmotionAndBeauty(bitmap, face); } } _faceDetectorLight.Dispose(); _faceLandmarksExtractor.Dispose(); _faceEmotionClassifier.Dispose(); _faceBautyClassifier.Dispose(); Console.WriteLine("Done."); Console.ReadKey(); }