public RecognitionInfo ProcessImage(string img_path) { var input = PreprocessImage(img_path); var inputs = new List <NamedOnnxValue> { NamedOnnxValue.CreateFromTensor(Session.InputMetadata.Keys.First(), input) }; var Results = Session.Run(inputs); // Получаем 10 выходов и считаем для них softmax var output = Results.First().AsEnumerable <float>().ToArray(); var sum = output.Sum(x => (float)Math.Exp(x)); var softmax = output.Select(x => (float)Math.Exp(x) / sum); RecognitionInfo tmp = new RecognitionInfo(img_path, ClassLabels[softmax.ToList().IndexOf(softmax.Max())], softmax.Max()); lock (recognitionLibraryContext) { Blob resBlob = new Blob { Image = tmp.Image }; recognitionLibraryContext.Add(new RecognitionImage { Path = tmp.Path, Confidence = tmp.Confidence, Statistic = 0, ImageDetails = resBlob, Label = int.Parse(tmp.Class) }); recognitionLibraryContext.Blobs.Add(resBlob); recognitionLibraryContext.SaveChanges(); } return(tmp); }
public ConcurrentQueue <RecognitionInfo> MakePrediction(string path) //should check dbcontext { MessageToUser?.Invoke(this, "If you want to stop recognition press ctrl + C"); CancellationToken token = cancel.Token; try { IEnumerable <string> images; ParallelOptions po = new ParallelOptions(); po.CancellationToken = token; po.MaxDegreeOfParallelism = Environment.ProcessorCount; if (path == "") // Если пользователь передал пустую директорию, меняем на дефолтную директори проекта с тестовыми изображениями { MessageToUser?.Invoke(this, "You haven't set the path. Changed to embedded directory with images"); images = from file in Directory.GetFiles(DefaultImageDir) where file.Contains(".jpg") || file.Contains(".jpeg") || file.Contains(".png") select file; } images = from file in Directory.GetFiles(path) // пустой путь - throw exception where file.Contains(".jpg") || file.Contains(".jpeg") || file.Contains(".png") select file; if (images.Count() == 0) // Если пользователь передал пустую директорию, меняем на дефолтную директори проекта с тестовыми изображениями { MessageToUser?.Invoke(this, "Your directory is empty. Change to embedded directory with images"); images = from file in Directory.GetFiles(DefaultImageDir) where file.Contains(".jpg") || file.Contains(".jpeg") || file.Contains(".png") select file; } List <string> paths = new List <string>(); lock (recognitionLibraryContext) { foreach (var image in images) { RecognitionInfo temp = new RecognitionInfo(image, "", 0); var sameimage = recognitionLibraryContext.FindOne(temp); if (sameimage != null) { sameimage.Statistic++; recognitionLibraryContext.SaveChanges(); } else { paths.Add(image); } } } var tasks = Parallel.ForEach <string>(paths, po, img => { CQ.Enqueue(ProcessImage(img)); //Thread.Sleep(1000); OutputResult?.Invoke(this, CQ); }); } catch (OperationCanceledException) { MessageToUser?.Invoke(this, "-----------------Interrupted-----------------"); Trace.WriteLine("-----------------Interrupted-----------------"); } catch (Exception e) when(e is ArgumentException || e is IOException) { Trace.WriteLine(e.Message); }; return(CQ); }