Beispiel #1
0
        /// <summary>
        /// Распознавание.
        /// </summary>
        /// <param name="pathToSettings">Путь к файлу настроек.</param>
        private static void DoRecognize(string pathToSettings)
        {
            Console.Clear();
            var path = string.Empty;

            ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Green,
                                              "Вас приветствует распознавание!");

            if (pathToSettings.Equals(string.Empty))
            {
                ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Green,
                                                  "\nВведите путь до файла настроек:");

                path = Console.ReadLine();
            }
            else
            {
                ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Blue,
                                                  $"\nНайден последний сохранённый файл настроек.\nДиректория: {pathToSettings}" +
                                                  $"\nНажмите enter, чтобы использовать данный файл, либо введите путь до файла настроек:");

                var input = Console.ReadLine();

                if (input.Equals(string.Empty))
                {
                    path = pathToSettings;
                }
                else
                {
                    path = input;
                }
            }

            var recognizeUtil = new RecognizeUtil(path);

            while (true)
            {
                ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Green,
                                                  "\nВведите путь до файла с изображением, чтобы распознать его:");

                var pathToImage = Console.ReadLine();

                // Для отладки.
                /**/

                if (pathToImage.Equals("default"))
                {
                    pathToImage = @"C:\Лабы\Учёба (3 семестр)\CNN2\CNN\BL\Resources\0\0(0).bmp";
                }

                /**/

                if (!File.Exists(pathToImage))
                {
                    throw new Exception($"Не удалось найти файл по указанному пути!\nДиректория: {pathToImage}");
                }

                var image = PathToImageConverter.LoadImages(new List <string> {
                    pathToImage
                }).First();
                var resizedImage = NormilizeUtil.ResizeImage(image, 6, 6);

                var normilizedMatrix = NormilizeUtil.GetNormilizedMatrixFromImage(resizedImage);
                var answer           = recognizeUtil.ToRecognizeData(normilizedMatrix);

                ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Cyan, answer);
                Console.WriteLine("Введите 0, чтобы распознать другое изображение.\n" +
                                  "Введите 1, чтобы выйти в меню.");

                var input = Console.ReadLine();

                if (input.Equals("1"))
                {
                    break;
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Выполнить обучение.
        /// </summary>
        /// <param name="pathToSettings">Путь до сохранённого файла настроек.</param>
        private static void DoTrain(out string pathToSettings)
        {
            Console.Clear();
            ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Green,
                                              "Вас приветствует обучение!\nУкажите директорию обучающей выборки " +
                                              "(enter для директории по-умолчанию):");

            var input = Console.ReadLine();

            if (input.Equals(string.Empty))
            {
                input = PathHelper.GetResourcesPath();
            }

            if (!Directory.Exists(input))
            {
                throw new Exception($"Указанная директория не существует!\nДиректория: {input}");
            }

            var directories      = Directory.GetDirectories(input).ToList();
            var matrixDictionary = new Dictionary <int, List <double[, ]> >();

            var key = 0;

            foreach (var directory in directories)
            {
                var files = Directory.GetFiles(directory).ToList();

                if (!files.Any())
                {
                    throw new Exception($"Файлы не найдены!\nДиректория: {directory}");
                }

                var images        = PathToImageConverter.LoadImages(files);
                var resizedImages = NormilizeUtil.ResizeImages(images, 6, 6);

                var normilizedMatrixies = NormilizeUtil.GetNormilizedMatrixesFromImages(resizedImages);
                matrixDictionary.Add(key, normilizedMatrixies);

                ++key;
            }

            var hyperParameters = new HyperParameters
            {
                EpochCount = 1,
                Epsilon    = 0.75,
                Alpha      = 0.001
            };

            var topology = new Topology();

            topology.Add(2, 2, LayerType.Convolution);
            topology.Add(3, 2, LayerType.Subsampling);
            topology.Add(4, 2, LayerType.Hidden, true);

            if (!topology.IsClosed)
            {
                throw new Exception("Не удалось замкнуть топологию.");
            }

            var dataSet = new DataSet(DataSetType.ForNumberRecognizing);

            if (!matrixDictionary.Count.Equals(dataSet.MaxCountInDataSet()))
            {
                throw new Exception("Не соответсвие количества выборок для распознавания чисел!");
            }

            foreach (var pair in matrixDictionary)
            {
                dataSet.Add(pair.Value);
            }

            var trainUtil = new TrainUtil(dataSet, TrainType.Backpropagation, hyperParameters, topology);

            trainUtil.Start(3, 2, out var error, out pathToSettings);

            var errorString = $"{Math.Round(error * 100, 2)}%";

            ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Yellow,
                                              $"\nОшибка: {errorString}");

            if (pathToSettings.Equals(string.Empty))
            {
                ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Red,
                                                  "\nДанные не были сохранены!");
            }
            else
            {
                ConsoleExtensions.WriteWithColors(ConsoleColor.Black, ConsoleColor.Blue,
                                                  $"\nДанные сохранены!\nДиректория: {pathToSettings}");
            }
        }