public void RunRankingModels(Picture picture, Picture.Answer query) { for (int datasetIndex = 0; datasetIndex < PreprocessedDatasets.Length; datasetIndex++) { for (int rankModIndex = 0; rankModIndex < RankingModels.Count; rankModIndex++) { RunSingleRankingModel(picture, query, datasetIndex, rankModIndex); } } }
public int RunSingleRankingModel(Picture picture, Picture.Answer query, int datasetIndex, int rankModIndex) { var searchResults = RankingModels[rankModIndex].Sort(query, PreprocessedDatasets[datasetIndex]); var rank = searchResults.FindIndex(i => Path.GetFileName(i.SourceFile) == Path.GetFileName(picture.Filename)); Histograms[datasetIndex, rankModIndex, rank]++; OnOneRankingFinished(datasetIndex, rankModIndex, query, rank); return(rank); }
public override List <ImageWarehouse.Image> Sort(Picture.Answer query, ConcurrentBag <ImageWarehouse.Image> imageDataset) { var outputList = new List <ImageWarehouse.Image>(imageDataset.Count); foreach (var img in imageDataset) { outputList.Add(img); } DebugSave(outputList); return(outputList); }
public abstract List <Image> Sort(Picture.Answer query, ConcurrentBag <Image> imageDataset);
public override List <ImageWarehouse.Image> Sort(Picture.Answer Query, ConcurrentBag <ImageWarehouse.Image> imageDataset) { var results = new ConcurrentBag <(double, ImageWarehouse.Image)>(); Parallel.ForEach(imageDataset, img => { double totalDist = 0; foreach (var circle in Query.Circles) { int relativeX = (int)(circle.X / ((double)img.Width / img.PreprocessedImage.GetLength(0))); int relativeY = (int)(circle.Y / ((double)img.Height / img.PreprocessedImage.GetLength(1))); if (relativeX >= img.PreprocessedImage.GetLength(0) || relativeY >= img.PreprocessedImage.GetLength(1)) { // this happens, but why?? how could this error happen? // are the data mixed up in some way? return; } var targetPoint = targetFinder.FindTarget(circle, img); var targetColor = img.PreprocessedImage[targetPoint.X, targetPoint.Y]; var distX = relativeX - targetPoint.X; var distY = relativeY - targetPoint.Y; var lastRmDist = Distance(circle.Color, targetColor, distX, distY); totalDist += lastRmDist; } double avgDist = totalDist / Query.Circles.Length; if (double.IsNaN(avgDist)) { Console.WriteLine("nananananana"); } if (double.IsInfinity(avgDist)) { Console.WriteLine("to infinityyyy"); } results.Add((avgDist, img)); }); var orderedResults = from r in results orderby r.Item1 select r; var orderedTop100 = orderedResults.Take(100); // zkuste k tomu take vypisovat pro kazdy ranking ciselnou hodnotu H, kterou ziskate z prvnich 100 prvku serazenych vysledku(pro velkou DB) // H = -k / (sum_{ i = 1..100} ln(x_i / x_100)), kde x je distance podle ktere obrazky tridite // // pokud budeme mit tuto hodnotu pro RANK a pak pro RANK bez odebraneho kolecka, tak muzeme sledovat ve 2D, jestli tvori dobra a spatna kolecka klastry nebo ne int k = results.Count; // ?? je to správne // (sum_{ i = 1..100} ln(x_i / x_100)), kde x je distance podle ktere obrazky tridite var lastDistance = orderedTop100.Last().Item1; var valueHEnum = from r in orderedTop100 select r.Item1 == 0 || lastDistance == 0 ? 0 : Math.Log(r.Item1 / lastDistance); double valueHSum = valueHEnum.Sum(); return((from r in results orderby r.Item1 select r.Item2).ToList()); }
private void ImageWarehouse_OnOneRankingFinished(int datasetIndex, int rankModelIndex, Picture.Answer query, int rank) { if (progressBar2.IsHandleCreated) { progressBar2.BeginInvoke((MethodInvoker)(() => { progressBar2.Value++; })); } }