private void DifferentFragmentationsRecognitionButton_Click(object sender, EventArgs e) { OpenFileDialog FiguresToRecognizeFileDialog = new OpenFileDialog(); MessageBox.Show("Все данные по будут помещены в лог " + DefaultDifferentFragmentationsRecognitionLog, "Форма", MessageBoxButtons.OK, MessageBoxIcon.Asterisk); try { //Сброс матрицы весов WeightsMatrixCheckBox.Checked = false; FiguresToRecognizeFileDialog.Filter = "Изображения " + DefaultImageExtension + "|*" + DefaultImageExtension; //"Файлы|*.bmp"; FiguresToRecognizeFileDialog.Multiselect = true; if (FiguresToRecognizeFileDialog.ShowDialog() == DialogResult.OK) { //Создание и предварительная запись образов для каждого изображения { foreach (String CurrentFigureFile in FiguresToRecognizeFileDialog.FileNames) { //Работа с образом Obraz CurrentFigureObraz = new Obraz(CurrentFigureFile); String FigureFileName = Path.GetFileNameWithoutExtension(CurrentFigureFile); CurrentFigureObraz.WriteObrazLog(FigureFileName); } } //Инициализация лога String RecognitionLogFilePath = Directory.GetCurrentDirectory() + "\\" + DefaultDifferentFragmentationsRecognitionLog; File.Delete(RecognitionLogFilePath); foreach (String FilePath in FiguresToRecognizeFileDialog.FileNames) { String FileName = Path.GetFileName(FilePath); File.AppendAllText(RecognitionLogFilePath, FileName + ";"); } File.AppendAllText(RecognitionLogFilePath, Environment.NewLine + Environment.NewLine); //Распознавание для различных разбиений foreach (uint Y_fragment in Y_fragmentationsArray) { foreach (uint X_fragment in X_fragmentationsArray) { SetMainPerceptronVectorLength(Y_fragment, X_fragment); //Обучение при текущих разбиениях TeachOnAllTeachingSets(Y_fragment, X_fragment); File.AppendAllText(RecognitionLogFilePath, Y_fragment.ToString() + " " + X_fragment.ToString() + ";"); foreach (String CurrentFigureFile in FiguresToRecognizeFileDialog.FileNames) { String ImageName = Path.GetFileNameWithoutExtension(CurrentFigureFile); //Загрузка образов Obraz CurrentFigureObraz = new Obraz(); String CurrentFigureObrazFilePath = Directory.GetCurrentDirectory() + DefaultRecognitionInformationCatalog + Obraz.GetDefaultObrazName(ImageName); CurrentFigureObraz.LoadObrazFromFile(CurrentFigureObrazFilePath); //Работа с вектором Vector CurrentFigureVector = new Vector(CurrentFigureObraz, Y_fragment, X_fragment); CurrentFigureVector.WriteVectorLog(ImageName); //Получение ответа String NeuralNetworkAnswer = MainPerceptron.GetAnswerFromVector(CurrentFigureVector.complete_vector); //Запись в лог распознавания File.AppendAllText(RecognitionLogFilePath, NeuralNetworkAnswer + ";"); } File.AppendAllText(RecognitionLogFilePath, Environment.NewLine); //Закрытие строки лога распознавания } } } } catch (Exception) { MessageBox.Show("Ошибка при попытке распознавания вне функции распознавания", "Форма", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } finally { if (FiguresToRecognizeFileDialog != null) { FiguresToRecognizeFileDialog.Dispose(); } } }
/// <summary> /// Обучение на всех обучающих наборах /// </summary> /// <param name="Y_frag">Разбиения вертикальной составляющей</param> /// <param name="X_frag">Разбиения горизонтальной составляющей</param> /// <returns>Количество итераций, за которое произошло полное обучение</returns> private uint TeachOnAllTeachingSets(uint Y_frag, uint X_frag) { try { SetMainPerceptronVectorLength(Y_frag, X_frag); //Если не создан каталог для хранения информации об обучающих наборах String TeachingSetsInformationCatalogPath = Directory.GetCurrentDirectory() + DefaultTeachingSetsInformationCatalog; if (!Directory.Exists(TeachingSetsInformationCatalogPath)) { Directory.CreateDirectory(TeachingSetsInformationCatalogPath); } uint TeachingSetsCount = Convert.ToUInt32(TeachingSetsCountTextBox.Text); //Количество заданных обучающих наборов bool EveryTeachingSuccessful = false; //Прошло ли каждое обучение успешно uint IterationsAmount = 0; //Количество итераций //Цикл обучения while (!EveryTeachingSuccessful) { EveryTeachingSuccessful = true; for (uint CurrentTeachingSet = 0; CurrentTeachingSet < TeachingSetsCount; ++CurrentTeachingSet) //Проход по всем обучающим наборам { for (uint CurrentFigureIndex = 0; CurrentFigureIndex < MainPerceptron.Figures_Amount; ++CurrentFigureIndex) //Проход по каждой фигуре в наборе { //Работа с образом Obraz CurrentObraz = new Obraz(); //Образ текущего изображения //Создание образов необходимо только на первом этапе для создания векторов if (IterationsAmount == 0) { String ObrazName = Obraz.GetDefaultObrazName ( Path.GetFileNameWithoutExtension ( GetDefaultTeachingSetFileName(MainPerceptron.figures_array[CurrentFigureIndex], CurrentTeachingSet) ) ); //Имя образа изображения String CurrentFigureObrazFilePath = TeachingSetsInformationCatalogPath + ObrazName; //Путь к файлу текущего образа if (File.Exists(CurrentFigureObrazFilePath)) //Попытка получения уже существующего образа { CurrentObraz.LoadObrazFromFile(CurrentFigureObrazFilePath); } else //Создание нового образа { String CurrentFigureFilePath = TeachingSetsFilePaths.ElementAt(( int )(CurrentTeachingSet * MainPerceptron.Figures_Amount + CurrentFigureIndex)); //Путь к текущему файлу изображения CurrentObraz = new Obraz(CurrentFigureFilePath); CurrentObraz.WriteObrazLog(Path.GetFileNameWithoutExtension(CurrentFigureFilePath), DefaultTeachingSetsInformationCatalog); } } //Работа с вектором Vector CurrentVector = new Vector(); //Попытка получения уже существующего вектора if (IterationsAmount != 0) { String VectorName = Vector.GetDefaultVectorName ( Path.GetFileNameWithoutExtension ( GetDefaultTeachingSetFileName(MainPerceptron.figures_array[CurrentFigureIndex], CurrentTeachingSet) ) ); //Имя вектора изображения String CurrentFigureVectorPath = TeachingSetsInformationCatalogPath + VectorName; if (File.Exists(CurrentFigureVectorPath)) { CurrentVector.LoadVectorFromFile(CurrentFigureVectorPath, Y_frag, X_frag); } } else //Создание нового вектора { String CurrentFigureFilePath = TeachingSetsFilePaths.ElementAt(( int )(CurrentTeachingSet * MainPerceptron.Figures_Amount + CurrentFigureIndex)); //Путь к текущему файлу изображения CurrentVector = new Vector(CurrentObraz, Y_frag, X_frag); CurrentVector.WriteVectorLog(Path.GetFileNameWithoutExtension(CurrentFigureFilePath), DefaultTeachingSetsInformationCatalog); } //Обучение bool CurrentTeachingResult = MainPerceptron.TeachPerceptronOnFigure(CurrentVector.complete_vector, MainPerceptron.figures_array[CurrentFigureIndex]); //Попытка обучения if (CurrentTeachingResult == false) { EveryTeachingSuccessful = false; } } } ++IterationsAmount; } return(IterationsAmount); } catch (Exception) { MessageBox.Show("Ошибка при обучении на всех обучающих наборах во внутренней функции", "Форма", MessageBoxButtons.OK, MessageBoxIcon.Error); return(0); } }