public void CalcInference(int idx) { if (token.IsCancellationRequested) { return; } string sample_name = files[idx]; NN_Inferencer inference_obj = new NN_Inferencer(model_path, sample_name); float[] result = inference_obj.forward(); int res_class = 0; float res_score = -10000; double e = Math.E; double sum_exp = 0; for (int j = 0; j < result.Length; j++) { sum_exp += Math.Pow(e, result[j]); if (result[j] > res_score) { res_score = result[j]; res_class = j; } } float res_prob = (float)(Math.Pow(e, res_score) / sum_exp); waitHandler.WaitOne(); { all_results.results[res_class].Add(sample_name); all_results.count[res_class].Count += 1; if (!all_results.classes.Contains(res_class)) { all_results.classes.Add(res_class); } string[] split_sample_name = sample_name.Split('\\'); string suffix = split_sample_name[split_sample_name.Length - 1]; images_with_classes img_obj = new images_with_classes(res_class, sample_name, res_prob, suffix); all_results.images_with_classes.Add(img_obj); using (UserContext db = new UserContext()) { db.images_with_classes.Add(img_obj); db.SaveChanges(); } } waitHandler.Set(); }
public void Recognize() { Inferencer inferencer = new Inferencer(dir_path, model_path, token, all_results, waitHandler); int num_files = new DirectoryInfo(dir_path).GetFiles().Length; var po = new ParallelOptions { CancellationToken = token }; var tasks = new Task[num_files]; try { for (int i = 0; i < num_files; i++) { tasks[i] = Task.Factory.StartNew(pi => { bool in_db = false; int idx = (int)pi; byte[] img_cur; using (UserContext db = new UserContext()) { string[] split_str_cur = inferencer.files[idx].Split('\\'); string suffix_cur = split_str_cur[split_str_cur.Length - 1]; var querry_result = db.images_with_classes.Where(p => p.suffix == suffix_cur); if (querry_result.Count() != 0) { string img_cur_name = inferencer.files[idx]; img_cur = LoadJpg(img_cur_name); foreach (var item in querry_result.ToList()) { var item_img = db.images_with_names.Find(item.file_name).image; if (item_img.SequenceEqual(img_cur)) { in_db = true; var res_class = item.res_class; var prob = item.prob; waitHandler.WaitOne(); { all_results.results[res_class].Add(item.file_name); all_results.count[res_class].Count += 1; if (!all_results.classes.Contains(res_class)) { all_results.classes.Add(res_class); } string[] split_sample_name = item.file_name.Split('\\'); string suffix = split_sample_name[split_sample_name.Length - 1]; images_with_classes img_obj = new images_with_classes(res_class, item.file_name, prob, suffix); all_results.images_with_classes.Add(img_obj); } waitHandler.Set(); break; } } } } if (!in_db) { inferencer.CalcInference(idx); using (UserContext db = new UserContext()) { db.images_with_names.Add(new images_with_names(inferencer.files[idx], LoadJpg(inferencer.files[idx]))); db.SaveChanges(); } } }, i); } } catch (OperationCanceledException ex) { Console.WriteLine("Операция прервана"); } finally { Task.WaitAll(tasks); cancelTokenSource.Dispose(); } }