Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        private (Image, double) FindMostSimilarImage(IList <double> embedding)
        {
            if (!this.db.Images.Any())
            {
                return(null, double.MaxValue);
            }

            var mostSimilar = this.db
                              .Images
                              .Include(i => i.Embeddings)
                              .ThenInclude(e => e.Values)
                              .Include(i => i.Persons)
                              .ThenInclude(pi => pi.Person)
                              .ToList()
                              .OrderBy(i =>
                                       i.Embeddings.Max(e => this.EucledianDistance(embedding, e)))
                              .First();

            return(mostSimilar, mostSimilar.Embeddings.Max(e => this.EucledianDistance(embedding, e)));
        }