Пример #1
0
        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();
        }
Пример #2
0
        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();
            }
        }