private void Learn_Click(object sender, RoutedEventArgs e) { var downsample = new Downsampler(); var training = new ImageMLDataSet(downsample, true, 1, -1); for (var i = 0; i < Images.Count; ++i) { var ideal = new BasicMLData(DIGITS_COUNT); for (int j = 0; j < DIGITS_COUNT; ++j) { if (j == i) { ideal[j] = 1; } else { ideal[j] = -1; } } foreach (var img in Images[i]) { MemoryStream stream = new MemoryStream(); BitmapEncoder encoder = new BmpBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(img)); encoder.Save(stream); var bitmap = new Drawing.Bitmap(stream); var data = new ImageMLData(bitmap); training.Add(data, ideal); } } training.Downsample(DIGIT_HEIGHT, DIGIT_WIDTH); network = EncogUtility.SimpleFeedForward(training.InputSize, 35, 0, training.IdealSize, true); double strategyError = 0.01; int strategyCycles = 2000; var train = new ResilientPropagation(network, training); //train.AddStrategy(new ResetStrategy(strategyError, strategyCycles)); EncogUtility.TrainDialog(train, network, training); EncogDirectoryPersistence.SaveObject(new FileInfo("network.eg"), network); }
private void RecCanvas_MouseUp(object sender, MouseButtonEventArgs e) { recCanvas_drawing = false; var size = new Size(RecCanvas.ActualWidth, RecCanvas.ActualHeight); // Measure and arrange the surface // VERY IMPORTANT RecCanvas.Measure(size); RecCanvas.Arrange(new Rect(size)); var renderBitmap = new RenderTargetBitmap((int)size.Width, (int)size.Height, 96d, 96d, PixelFormats.Pbgra32); renderBitmap.Render(RecCanvas); MemoryStream stream = new MemoryStream(); BitmapEncoder encoder = new BmpBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderBitmap)); encoder.Save(stream); var bitmap = new Drawing.Bitmap(stream); var downsample = new Downsampler(); var result = downsample.DownSample(bitmap, DIGIT_HEIGHT, DIGIT_WIDTH); var image = new Drawing.Bitmap(DIGIT_WIDTH, DIGIT_HEIGHT); for (var i = 0; i < DIGIT_HEIGHT; ++i) { for (var j = 0; j < DIGIT_WIDTH; ++j) { image.SetPixel(j, i, Drawing.Color.FromArgb( 255, (int)result[i * DIGIT_WIDTH + j], (int)result[i * DIGIT_WIDTH + j], (int)result[i * DIGIT_WIDTH + j] )); } } RecComp.Source = Imaging.CreateBitmapSourceFromHBitmap( image.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); if (network == null) { return; } var input = new ImageMLData(bitmap); input.Downsample(downsample, false, DIGIT_HEIGHT, DIGIT_WIDTH, 1, -1); int winner = network.Winner(input); RecDigit.Text = winner.ToString(); var data = network.Compute(input); for (var i = 0; i < DIGITS_COUNT; ++i) { Results[i] = new ResultObject { Char = i.ToString(), Result = (data[i] + 1) / 2 }; } }