private static TrainedRecognizer Train(TrainerInput input, ConvolutionBase2D convolution, bool isColor, int finalResolution) { if (input == null || input.ImportantEvents == null || input.ImportantEvents.Length == 0) { return null; } TrainerInput normalized = GetTrainingInput(input, convolution, isColor, finalResolution); List<double[]> inputs = new List<double[]>(); List<double[]> outputs = new List<double[]>(); // Important Events inputs.AddRange(normalized.ImportantEvents.Select(o => o.Item2)); outputs.AddRange(normalized.ImportantEvents.Select(o => o.Item1.Vector)); // Unimportant Events (sensor input that should output zeros) if (normalized.UnimportantEvents != null && normalized.UnimportantEvents.Length > 0) { int outputVectorLength = outputs[0].Length; inputs.AddRange(normalized.UnimportantEvents); outputs.AddRange(Enumerable.Range(0, normalized.UnimportantEvents.Length). Select(o => new double[outputVectorLength])); } //NOTE: If there is an exception, the network couldn't be trained BasicNetwork network = null; try { //network = UtilityEncog.GetTrainedNetwork(inputs.ToArray(), outputs.ToArray(), UtilityEncog.ERROR, 15, 45).NetworkOrNull; network = UtilityEncog.GetTrainedNetwork(inputs.ToArray(), outputs.ToArray(), UtilityEncog.ERROR, 5, 15).NetworkOrNull; } catch (Exception) { } if (network == null) { return null; } return new TrainedRecognizer() { Network = network, InputRaw = input, InputNormalized = normalized, }; }
/// <summary> /// This runs the input through NormalizeInput, and returns an object with those results /// </summary> private static TrainerInput GetTrainingInput(TrainerInput raw, ConvolutionBase2D convolution, bool isColor, int finalResolution) { var importantEvents = raw.ImportantEvents. Select(o => { double[] normalized = NormalizeInput(o.Item2, raw.Width, raw.Height, finalResolution, convolution, isColor); return Tuple.Create(o.Item1, normalized); }). ToArray(); var unimportantEvents = raw.UnimportantEvents. Select(o => NormalizeInput(o, raw.Width, raw.Height, finalResolution, convolution, isColor)). ToArray(); var awayPoints = GetAwayPoints(importantEvents.Select(o => o.Item2).ToArray()); //VectorInt reduction; //if (convolution == null) //{ // reduction = new VectorInt(0, 0); //} //else //{ // reduction = convolution.GetReduction(); //} return new TrainerInput() { //Width = raw.Width - reduction.X, //Height = raw.Height - reduction.Y, Width = finalResolution, Height = finalResolution, ImportantEvents = importantEvents, UnimportantEvents = unimportantEvents.Concat(awayPoints).ToArray(), IsColor = isColor, }; }
private static void SaveImages(string parentFolder, string childFolder, TrainerInput trainerInput) { if (trainerInput == null) { return; } foreach (var set in trainerInput.ImportantEvents.ToLookup(o => o.Item1)) { SaveImages(parentFolder, childFolder, trainerInput.Width, trainerInput.Height, set.Select(o => o.Item2).ToArray(), trainerInput.IsColor, set.Key.ToString()); } SaveImages(parentFolder, childFolder, trainerInput.Width, trainerInput.Height, trainerInput.UnimportantEvents, trainerInput.IsColor, "none"); }
/// <summary> /// This returns raw input (still need to call NormalizeInput) /// </summary> private TrainerInput GetTrainingInput() { var camera = _camera; if (camera == null) { return null; } double numCategories = _importantEvents. Distinct(o => o.Item1.Type). Count(); int unimportantCount = Math.Min(20, (_importantEvents.Count / numCategories).ToInt_Round()); TrainerInput trainerInput = new TrainerInput() { ImportantEvents = _importantEvents.ToArray(), UnimportantEvents = _nonLifeEventSnapshots.GetSamples(unimportantCount), Width = camera.PixelWidthHeight, Height = camera.PixelWidthHeight, IsColor = _isColor, }; return trainerInput; }