private static List <double[][]> CMCPerComponent(PhotoSketchCBIR cbr, List <PhotoMetadata> sketches)
        {
            // matrix of accuracies for each component: hair, eyebrows, eye, nose, mouth and shape
            var accuraciesNoGender   = new double[6][];
            var accuraciesWithGender = new double[6][];

            foreach (var sketch in sketches)
            {
                try
                {
                    var ranksNoGender   = cbr.ComputeComponentRanks(sketch.AbsolutePath, Gender.UNKNOWN);
                    var ranksWithGender = cbr.ComputeComponentRanks(sketch.AbsolutePath, sketch.Gender);
                    for (int i = 0; i < RANKS.Length; i++)
                    {
                        for (int j = 0; j < 6; i++)
                        {
                            accuraciesNoGender[j][i]   += ranksNoGender[j].Take(RANKS[i]).Any(t => t.Item1.Id == sketch.Id) ? 1 : 0;
                            accuraciesWithGender[j][i] += ranksWithGender[j].Take(RANKS[i]).Any(t => t.Item1.Id == sketch.Id) ? 1 : 0;
                        }
                    }
                }
                catch (ArgumentException e) { }
            }
            return(new List <double[][]> {
                accuraciesNoGender.Select(values => values.Select(v => v / sketches.Count * 100d).ToArray()).ToArray(),
                accuraciesWithGender.Select(values => values.Select(v => v / sketches.Count * 100d).ToArray()).ToArray()
            });
        }
        // execute a test for eveluate the performance of cbr using the best features fusion
        private static void TestBestCBR(PhotoSketchCBIR cbir, List <PhotoMetadata> sketches)
        {
            cbir.SearchFusionStrategy = new WeightedSum(1, 1, 1, 0, 1, 1); // hair, eyebrows, eyes, mouth and shape

            var accuraciesNoGender   = CreateRecognitionCMC(cbir, sketches, false);
            var accuraciesWithGender = CreateRecognitionCMC(cbir, sketches, true);

            SerializeRecognitionCMC(string.Format("rank_best_cbr.csv"), accuraciesNoGender, accuraciesWithGender);
        }
        // execute the test that creates CMC for each component
        private static void TestSingleComponents(PhotoSketchCBIR cbir, List <PhotoMetadata> sketches)
        {
            var ranks = CMCPerComponent(cbir, sketches);
            var accuraciesNoGender   = ranks[0];
            var accuraciesWithGender = ranks[1];

            // for each component
            for (int i = 0; i < 6; i++)
            {
                SerializeRecognitionCMC(string.Format("rank_performance_{0}.csv", i),
                                        accuraciesNoGender[i],
                                        accuraciesWithGender[i]);
            }
        }
        protected TaskSearchSketch(PhotoSketchCBIR cbr, string sketchPath, Gender gender, int rankSize)
        {
            Func <Tuple <PhotoMetadata, double>, string> formatLabel = t =>
                                                                       string.Format("Id: {0}, Gender: {1}, Score: {2}", t.Item1.Id, t.Item1.Gender, t.Item2);

            DoWork += (s, e) =>
            {
                // background work compute a search
                var rank   = cbr.Search(sketchPath, gender, rankSize);
                var images = rank.Select(r => r.Item1.AbsolutePath).ToArray();
                var labels = rank.Select(formatLabel).ToArray();
                e.Result = Tuple.Create(images, labels);
            };

            RunWorkerCompleted += (s, e) => OnSearchCompleted.Invoke(this, e.Result as Tuple <string[], string[]>);
        }
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            var featureBlockParams = Params.GetComponentBlockParams();
            var boundingBoxParams  = Params.GetComponentBoundingBoxParams();
            var referenceShape     = Params.GetReferenceShape();
            var componentExtractor = ComponentAlignerFactory.FromReferenceShape(boundingBoxParams, referenceShape);

            var cbr        = new PhotoSketchCBIR(PhotoSketchFeatureExtractorFactory.Default(componentExtractor, featureBlockParams));
            var view       = new FormDashboardCBIR();
            var controller = new PresenterCBIR(view, cbr);

            Application.Run(view);
        }
        static void Main()
        {
            var photos   = PhotoMetadataCsv.FromCSV(GALLERY_CSV).ToList();
            var sketches = PhotoMetadataCsv.FromCSV(SKETCHS_CSV).ToList();

            var extractor = TestUtils.GetPhotoSketchFeatureExtractor(Params.GetReferenceShape());
            // extract or load from dumped db
            //var db = ExtractFeaturesDB(extractor, true);
            var db   = FaceFeaturesDB.CreateFromDump(DUMPED_DB);
            var cbir = new PhotoSketchCBIR(extractor)
            {
                Database = db
            };

            TestSingleComponents(cbir, sketches);
            TestDifferentFusion(cbir, sketches);
            TestBestCBR(cbir, sketches);
        }
        private static double[] CreateRecognitionCMC(PhotoSketchCBIR cbr, List <PhotoMetadata> sketches, bool filterGender = true)
        {
            var maxRank = RANKS.Max();

            var accuracies = new double[RANKS.Length];

            sketches.ForEach(sketch =>
            {
                try
                {
                    var ranks = cbr.Search(sketch.AbsolutePath, filterGender ? sketch.Gender : Gender.UNKNOWN, maxRank);
                    for (int i = 0; i < RANKS.Length; i++)
                    {
                        accuracies[i] += ranks.Take(RANKS[i]).Any(t => t.Item1.Id == sketch.Id) ? 1 : 0;
                    }
                }
                catch (Exception) { }
            });

            return(accuracies.Select(v => v / sketches.Count * 100d).ToArray());
        }
        // execute the test that creates CMC combining the most discriminative components
        private static void TestDifferentFusion(PhotoSketchCBIR cbir, List <PhotoMetadata> sketches)
        {
            var bestFusions = new double[5][]
            {
                new double[] { 0, 1, 1, 0, 0, 0 }, // eyebrows and eyes
                new double[] { 0, 1, 1, 0, 1, 0 }, // eyebrows, eyes and mouth
                new double[] { 0, 1, 1, 0, 1, 1 }, // eyebrows, eyes, mouth and shape
                new double[] { 1, 1, 1, 0, 1, 1 }, // hair, eyebrows, eyes, mouth and shape
                new double[] { 1, 1, 1, 1, 1, 1 }  // all components
            };

            for (int f = 0; f < bestFusions.Length; f++)
            {
                cbir.SearchFusionStrategy = new WeightedSum(bestFusions[f]);
                var cmcData       = CreateRecognitionCMC(cbir, sketches, false);
                var cmcDataGender = CreateRecognitionCMC(cbir, sketches, true);

                SerializeRecognitionCMC(string.Format("rank_performance_fusion_{0}.csv", f),
                                        cmcData,
                                        cmcDataGender);
            }
        }
 public static TaskSearchSketch NewSearch(PhotoSketchCBIR cbr, string sketchPath, Gender gender, int rankSize)
 {
     return(new TaskSearchSketch(cbr, sketchPath, gender, rankSize));
 }
Example #10
0
 public PresenterCBIR(CBRView view, PhotoSketchCBIR cbr)
 {
     View = view;
     CBR  = cbr;
     Init();
 }