Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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
                };
            }
        }