예제 #1
0
        public void CheckOne()
        {
            ANeuralNetwork network = new ANeuralNetwork();

            network.Load("..\\..\\..\\..\\savedData.txt");
            var sampleDirs  = Directory.GetDirectories("..\\..\\..\\..\\Data\\TestData\\").ToList();
            int fCount      = Directory.GetFiles("..\\..\\..\\..\\Data\\GroundData\\", "*.png", SearchOption.AllDirectories).Length;
            var poliManager = new PolynomialManager();

            poliManager.InitBasis(15, 100);
            double count = 0;

            foreach (var dir in sampleDirs)
            {
                var files = Directory.GetFiles(dir, "*.png", SearchOption.TopDirectoryOnly).ToList();
                var index = new Random().Next(files.Count);
                var file  = files[index];
                var value = Convert.ToInt32(new StreamReader(dir + "\\" + "value.txt").ReadToEnd());

                ++count;
                ComplexMoments tmpMoments;
                ProcessOneImage(file, poliManager, 100, out tmpMoments);
                CvInvoke.Imshow(dir, tmpMoments.Real);
                var tmpInput = tmpMoments.ToListOfDouble();

                var output         = network.Predict(tmpInput);
                var predictedValue = Convert.ToInt32(output.IndexOf(output.Max()));

                Console.WriteLine(predictedValue);
                CvInvoke.WaitKey();
            }
        }
예제 #2
0
        static void Main(string[] args)
        {
            string key;

            do
            {
                Console.WriteLine("===Enter next values to do something:===");
                Console.WriteLine("  '1' - to generate data.");
                Console.WriteLine("  '2' - to train network.");
                Console.WriteLine("  '3' - to check recognizing precision.");
                Console.WriteLine("  '4' - to recognize single image.");
                Console.WriteLine("  'exit' - to close the application.");
                Console.WriteLine();
                key = Console.ReadLine();
                var pm = new ProcessMoments();
                if (key == "1")
                {
                    var poliManager = new PolynomialManager();
                    var pd          = new ProcessData();
                    poliManager.InitBasis(15, 100);
                    pd.DistributeData("..\\..\\..\\..\\Data\\LabeledData\\", "..\\..\\..\\..\\Data\\GroundData\\", "..\\..\\..\\..\\Data\\TestData\\", 50);
                    var dictionary = pm.GenerateMoments("..\\..\\..\\..\\Data\\GroundData\\", 100, poliManager);
                    pd.SaveMoments("..\\..\\..\\..\\Moments.yaml", dictionary);
                }
                else if (key == "2")
                {
                    var pd      = new ProcessData();
                    var tmpDict = new SortedDictionary <string, List <ComplexMoments> >();
                    pd.ReadMoments("..\\..\\..\\..\\Moments.yaml", tmpDict);
                    var layers = new List <uint> {
                        225, 160, 60, 25, 9
                    };
                    pm.Train(layers, tmpDict, 100000, 0.4, 0.01);
                }
                else if (key == "3")
                {
                    pm.Check();
                }
                else if (key == "4")
                {
                    pm.CheckOne();
                }
            } while (key != "exit");
        }
예제 #3
0
        public void ProcessOneImage(string imagePath, PolynomialManager polyManager, int diameter, out ComplexMoments res)
        {
            var image = CvInvoke.Imread(imagePath, ImreadModes.Grayscale);

            if (image.IsEmpty)
            {
                throw new Exception("Empty image");
            }

            CvInvoke.Threshold(image, image, 127, 255, ThresholdType.BinaryInv);
            var blobs = polyManager.DetectBlobs(image);

            if (blobs.Count != 1)
            {
                throw new Exception("Incorrect input data. More then one blob.");
            }

            var nblobs = polyManager.NormalizeBlobs(blobs, diameter);

            res = polyManager.Decompose(nblobs[0]);
        }
예제 #4
0
        public void Check()
        {
            ANeuralNetwork network = new ANeuralNetwork();

            network.Load("..\\..\\..\\..\\savedData.txt");
            var    sampleDirs  = Directory.GetDirectories("..\\..\\..\\..\\Data\\TestData\\").ToList();
            int    fCount      = Directory.GetFiles("..\\..\\..\\..\\Data\\GroundData\\", "*.png", SearchOption.AllDirectories).Length;
            double precision   = 0;
            var    poliManager = new PolynomialManager();

            poliManager.InitBasis(15, 100);
            double count     = 0;
            double trueCount = 0;

            foreach (var dir in sampleDirs)
            {
                var files = Directory.GetFiles(dir, "*.png", SearchOption.TopDirectoryOnly).ToList();
                var value = Convert.ToInt32(new StreamReader(dir + "\\" + "value.txt").ReadToEnd());

                foreach (var file in files)
                {
                    ++count;
                    ComplexMoments tmpMoments;
                    ProcessOneImage(file, poliManager, 100, out tmpMoments);
                    var tmpInput = tmpMoments.ToListOfDouble();

                    var output         = network.Predict(tmpInput);
                    var predictedValue = Convert.ToInt32(output.IndexOf(output.Max()));
                    if (predictedValue == value)
                    {
                        //++trueCount;
                        precision += Convert.ToDouble(100 / (double)fCount);
                    }
                }

                Console.WriteLine("Точность " + precision + "%");
                //Console.WriteLine("Точность " + trueCount/count + "%");
            }
        }
예제 #5
0
        public static void Main()
        {
            Console.WriteLine("Hello world");

            Console.WriteLine("Max polinom:");
            var max = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();
            Console.WriteLine("Diametr:");
            var diameter = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine();

            var pm = new PolynomialManager();

            pm.InitBasis(max, diameter);
            Visualisation.ShowPolynomials("Basic:", Polynomials);

            var image = CvInvoke.Imread("..\\..\\..\\..\\Picture.png", ImreadModes.Grayscale);

            CvInvoke.Imshow("Picture:", image);
            CvInvoke.WaitKey();

            var blobs = pm.DetectBlobs(image);

            blobs = pm.NormalizeBlobs(blobs, diameter);

            var decomposedBlobs = new List <ComplexMoments>(blobs.Count);
            var recoveredBlobs  = new List <Mat>(blobs.Count);

            for (var i = 0; i < blobs.Count; i++)
            {
                decomposedBlobs.Add(pm.Decompose(blobs[i]));
                recoveredBlobs.Add(pm.Recovery(decomposedBlobs[i]));
                Visualisation.ShowBlobDecomposition("Восстановленные цифры:", blobs[i], recoveredBlobs[i]);
                CvInvoke.WaitKey();
            }
        }
예제 #6
0
        public SortedDictionary <string, List <ComplexMoments> > GenerateMoments(string path, int diameter, PolynomialManager polyManager)
        {
            var sampleDirs = Directory.GetDirectories(path).ToList();
            SortedDictionary <string, List <ComplexMoments> > result = new SortedDictionary <string, List <ComplexMoments> >();

            //Перебираем все папки.
            for (var i = 0; i < sampleDirs.Count; i++)
            {
                // Ищем файл со значением буквы.
                var tmpFile = new StreamReader(sampleDirs[i] + "\\" + "value.txt");
                var key     = tmpFile.ReadToEnd();
                tmpFile.Close();
                var files = Directory.GetFiles(sampleDirs[i] + "\\", "*.png");
                var tmp   = new List <ComplexMoments>();
                foreach (var file in files)
                {
                    //Считываем картинку.
                    //Обрабатываем.
                    ProcessOneImage(file, polyManager, diameter, out var moment);
                    tmp.Add(moment);
                }

                //Сохраняем
                result.Add(key, tmp);
            }

            return(result);
        }