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)); }
public PresenterCBIR(CBRView view, PhotoSketchCBIR cbr) { View = view; CBR = cbr; Init(); }