public Rank <PhotoMetadata, double>[] ComputeComponentRanks(string sketchPath, Gender gender) { var sketchFeature = featureExtractor.ExtractFaceFeatures(sketchPath); var ranks = new Rank <PhotoMetadata, double> [6]; Task.WaitAll( Task.Run(() => ranks[0] = MakeComponentRank(Database.FeaturesHair(gender), sketchFeature.Hair)), Task.Run(() => ranks[1] = MakeComponentRank(Database.FeaturesEyebrows(gender), sketchFeature.Eyebrows)), Task.Run(() => ranks[2] = MakeComponentRank(Database.FeaturesEyes(gender), sketchFeature.Eyes)), Task.Run(() => ranks[3] = MakeComponentRank(Database.FeaturesNose(gender), sketchFeature.Nose)), Task.Run(() => ranks[4] = MakeComponentRank(Database.FeaturesMouth(gender), sketchFeature.Mouth)), Task.Run(() => ranks[5] = Rank.FromMetric(Database.FeaturesShape(gender), sketchFeature.Shape, SHAPE_METRIC).NormalizeScore(ScoreNormalization.Tanh)) ); return(ranks); }
public static FaceFeaturesDB ExtractFeaturesDB(PhotoSketchFeatureExtractor extractor, List <PhotoMetadata> photos, bool savedb = true) { var dbName = string.Format("features-{0}.csv", DateTimeOffset.Now.ToUnixTimeMilliseconds()); var db = new FaceFeaturesDB(); Parallel.ForEach(photos, photo => { try { var feature = extractor.ExtractFaceFeatures(photo.AbsolutePath); db.AddPhotoFeatures(photo, feature); } catch (ArgumentException) { } }); if (savedb) { db.Dump(dbName); Console.WriteLine("Features db saved on: {0}", dbName); } return(db); }
public TaskExtractGalleryFeatures(PhotoSketchFeatureExtractor extractor, string galleryPath) { WorkerReportsProgress = true; DoWork += (s, e) => { var db = new FaceFeaturesDB(); var photos = PhotoMetadataCsv.FromCSV(galleryPath).ToList(); var totalPhotos = photos.Count; var currentProgress = 0; Parallel.ForEach(photos, photo => { try { var feature = extractor.ExtractFaceFeatures(photo.AbsolutePath); db.AddPhotoFeatures(photo, feature); } catch (ArgumentException) { } Interlocked.Increment(ref currentProgress); ReportProgress((int)(currentProgress / (float)totalPhotos * 100)); }); e.Result = db; }; }