void BuildTopology(MediaSource source, Topology topology) { using (var presentationDescriptor = source.CreatePresentationDescriptor()) foreach (var stream in presentationDescriptor.Streams.Where(s => s.IsSelected)) using (var sourceNode = TopologyNode.Create(MFTopologyType.SourcestreamNode)) { if (!stream.MediaType.IsAudio && !stream.MediaType.IsVideo) throw new Exception("Unknown stream format!"); sourceNode.TopNodeSource = source; sourceNode.TopNodePresentationDescriptor = presentationDescriptor; sourceNode.TopNodeStreamDescriptor = stream; using (var outputNode = TopologyNode.Create(MFTopologyType.OutputNode)) { outputNode.Object = stream.MediaType.IsAudio ? Activate.CreateAudioRenderer() : Activate.CreateVideoRenderer(hwndVideo); topology.Add(sourceNode); topology.Add(outputNode); sourceNode.ConnectOutput(0, outputNode, 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}"); } }