示例#1
0
        private void teachButton_Click(object sender, EventArgs e)
        {
            _terminate    = false;
            _error        = 1.0;
            _progress     = 0;
            _terminated   = false;
            _controlError = -1;
            _updateProgress();

            new Thread(() =>
            {
                var samples      = CaptchasLibrary.GetRecognizedCaptchas();
                var digitImages  = new List <Image>();
                var digitResults = new List <int>();

                int controlStart = (int)(samples.Count * 0.8);
                for (var i = 0; i < controlStart; i++)
                {
                    var recognizer = new CaptchaRecognizer(samples[i].Image);
                    var rectangles = recognizer.SplitDigits();

                    for (var j = 0; j < rectangles.Length; j++)
                    {
                        digitImages.Add(ImageHelper.Crop(recognizer.Target, rectangles[j]));
                        digitResults.Add(int.Parse(samples[i].Answer.Substring(j, 1)));
                    }
                }
                var teacher = new NeuralNetworkTrainer(digitImages.ToArray(), digitResults.ToArray());

                teacher.Run((net, data, epochs, reports, er, u, userData) =>
                {
                    _error    = net.MSE;
                    _progress = 1.0 * u / epochs;
                    if (_terminate)
                    {
                        return(-1);
                    }
                    return(0);
                });
                teacher.Network.Save(CaptchaRecognizer.NetworkPath);

                var controlTotal  = 0;
                var controlPasses = 0;
                for (var i = controlStart; i < samples.Count; i++)
                {
                    var rec = new CaptchaRecognizer(samples[i].Image);
                    var res = rec.Recognize();
                    controlTotal++;
                    if (res.Result == samples[i].Answer)
                    {
                        controlPasses++;
                    }
                }
                _controlError = 1.0 * controlPasses / controlTotal;
                _error        = teacher.Network.MSE;
                _terminate    = true;
                _terminated   = true;
                _progress     = 1;
            }).Start();
        }
示例#2
0
        public Form1()
        {
            InitializeComponent();
            timer1.Start();
            var samples = CaptchasLibrary.GetRecognizedCaptchas();

            for (var i = 0; i < Math.Min(20, samples.Count); i++)
            {
                Controls.Add(new Panel
                {
                    Location              = new Point(0, (CaptchaHeight + 3) * i),
                    Name                  = "imagePanel",
                    Size                  = new Size(CaptchaWidth, CaptchaHeight),
                    TabIndex              = 0,
                    BackgroundImage       = samples[i].Image,
                    BackgroundImageLayout = ImageLayout.Stretch
                });

                var img = samples[i].Image;
                img = ImageHelper.Crop(img, new Rectangle(1, 1, img.Width - 2, img.Height - 2));
                //img = ImageHelper.Binarize(img);
                //img = ImageHelper.Blur(img);
                img = ImageHelper.EdgeDetector(img);

                Controls.Add(new Panel
                {
                    Location              = new Point(CaptchaWidth + 3, (CaptchaHeight + 3) * i),
                    Name                  = "imagePanel",
                    Size                  = new Size(CaptchaWidth, CaptchaHeight),
                    TabIndex              = 0,
                    BackgroundImage       = img,
                    BackgroundImageLayout = ImageLayout.Stretch
                });

                img = ImageHelper.RemoveLines2(img);
                Controls.Add(new Panel
                {
                    Location              = new Point((CaptchaWidth + 3) * 2, (CaptchaHeight + 3) * i),
                    Name                  = "imagePanel",
                    Size                  = new Size(CaptchaWidth, CaptchaHeight),
                    TabIndex              = 0,
                    BackgroundImage       = img,
                    BackgroundImageLayout = ImageLayout.Stretch
                });


                var recognizer = new CaptchaRecognizer(samples[i].Image);
                var rects      = recognizer.SplitDigits();

                var dividedPanel = new Panel
                {
                    Location = new Point((CaptchaWidth + 3) * 3, (CaptchaHeight + 3) * i),
                    Name     = "imagePanel",
                    Size     = new Size(recognizer.Target.Width, recognizer.Target.Height),
                    TabIndex = 0,
                    BackgroundImageLayout = ImageLayout.Stretch
                };

                var drawArea = new Bitmap(recognizer.Target);
                dividedPanel.BackgroundImage = drawArea;

                Graphics g   = Graphics.FromImage(drawArea);
                var      pen = new Pen(Brushes.Blue);

                foreach (var rect in rects)
                {
                    g.DrawRectangle(pen, rect);
                }
                Controls.Add(dividedPanel);
            }
        }