Esempio n. 1
0
        private void button2_Click(object sender, EventArgs e)
        {
            if (threadCnn != null && threadCnn.ThreadState == ThreadState.Running)
            {
                return;
            }
            threadCnn = new Thread(() =>
            {
                CnnHelper.SumCount  = 0;
                CnnHelper.TrueCount = 0;
                #region LFW人脸集
                foreach (var file in Directory.GetFiles("img2", "*.jpg"))
                {
                    using (Bitmap img = new Bitmap(file))
                    {
                        byte label = Convert.ToByte(file.Substring(file.LastIndexOf('\\') + 1, 1));
                        Image <Bgr, float> trainingData = new Image <Bgr, float>(img);;
                        double[,] input = new double[img.Width, img.Height];
                        for (int w = 0; w < img.Width; w++)
                        {
                            for (int h = 0; h < img.Height; h++)
                            {
                                input[w, h] = Color.FromArgb(0,
                                                             (int)trainingData.Data[h, w, 2],
                                                             (int)trainingData.Data[h, w, 1],
                                                             (int)trainingData.Data[h, w, 0]
                                                             ).ToArgb() / (double)0xFFFFFF;
                            }
                        }
                        input               = CnnHelper.MatrixExpand(input, 2, 2, 0);
                        double[] labels     = cnn.Predict(input);
                        double[] labelsTrue = new double[10];
                        double maxtype      = labels[0], max = 0;
                        for (int n = 0; n < 10; n++)
                        {
                            if (maxtype < labels[n])
                            {
                                max     = n;
                                maxtype = labels[n];
                            }
                            if (label == n)
                            {
                                labelsTrue[n] = 1;
                            }
                        }
                        //Console.WriteLine(i + ":" + label + "," + max);
                        CnnHelper.ShowChange(labels, labelsTrue, 10000);
                        this.Invoke(new Action(() =>
                        {
                            lblInfo.Text = String.Format("识别次数:{0}/{1} 正确率:{2:00.####%}", CnnHelper.TrueCount, CnnHelper.SumCount, CnnHelper.TrueCount / (double)CnnHelper.SumCount);

                            lblResult.Text = CnnHelper.LabelsNum + " " + CnnHelper.ResultNum;
                            pbImage1.Image = new Bitmap(img);
                        }));
                    }
                }
                #endregion
            });
            threadCnn.Start();
        }
Esempio n. 2
0
        private Rectangle[] PredictBP(Bitmap img)
        {
            Rectangle[]        tmpR         = new Rectangle[] { };
            Bitmap             tmpImg       = ZoomImg(img, bpWidth, bpHeight, ref tmpR);
            List <Rectangle>   retRects     = new List <Rectangle>();
            Image <Bgr, float> trainingData = new Image <Bgr, float>(tmpImg);

            double[,] input = new double[bpWidth, bpHeight];
            for (int i = 0; i < bpWidth; i++)
            {
                for (int j = 0; j < bpHeight; j++)
                {
                    input[i, j] = Color.FromArgb(
                        (int)trainingData.Data[j, i, 2],
                        (int)trainingData.Data[j, i, 1],
                        (int)trainingData.Data[j, i, 0]
                        ).ToArgb() / (float)0xFFFFFF;
                }
            }
            double[] output = cnn.Predict(input);
            for (int i = 0; i < bpRectangleCount * 4; i += 4)
            {
                Rectangle r = new Rectangle();
                r.X      = (int)(output[i] * (float)bpWidth);
                r.Y      = (int)(output[i + 1] * (float)bpHeight);
                r.Width  = (int)(output[i + 2] * (float)bpWidth);
                r.Height = (int)(output[i + 3] * (float)bpHeight);
                if (r.X >= 0 && r.Y >= 0 && r.Width > 0 && r.Height > 0)
                {
                    retRects.Add(r);
                }
            }
            return(retRects.ToArray());
        }
Esempio n. 3
0
        private void button2_Click(object sender, EventArgs e)
        {
            if (threadCnn != null && threadCnn.ThreadState == ThreadState.Running)
            {
                return;
            }
            threadCnn = new Thread(() =>
            {
                CnnHelper.SumCount  = 0;
                CnnHelper.TrueCount = 0;
                if (!chkHandwritten.Checked)
                {
                    #region MNIST库
                    using (FileStream fs = new FileStream("t10k-labels.idx1-ubyte", FileMode.Open))
                    {
                        using (FileStream fsImages = new FileStream("t10k-images.idx3-ubyte", FileMode.Open))
                        {
                            byte[] bytes4 = new byte[4];
                            fsImages.Seek(4, SeekOrigin.Current);
                            fs.Seek(8, SeekOrigin.Current);
                            fsImages.Read(bytes4, 0, 4);
                            int count = ToInt32(bytes4);
                            fsImages.Read(bytes4, 0, 4);
                            int height = ToInt32(bytes4);
                            fsImages.Read(bytes4, 0, 4);
                            int width = ToInt32(bytes4);
                            for (int i = 0; i < count; i++)
                            {
                                Bitmap img = GetImage(fsImages, width, height);
                                byte label = GetLable(fs);
                                Image <Bgr, float> trainingData = new Image <Bgr, float>(img);;
                                double[,] input = new double[width, height];
                                for (int w = 0; w < width; w++)
                                {
                                    for (int h = 0; h < height; h++)
                                    {
                                        input[w, h] = Color.FromArgb(0,
                                                                     (int)trainingData.Data[h, w, 2],
                                                                     (int)trainingData.Data[h, w, 1],
                                                                     (int)trainingData.Data[h, w, 0]
                                                                     ).ToArgb() / (double)0xFFFFFF;
                                    }
                                }
                                input               = CnnHelper.MatrixExpand(input, 2, 2, 0);
                                double[] labels     = cnn.Predict(input);
                                double[] labelsTrue = new double[10];
                                double maxtype      = labels[0], max = 0;
                                for (int n = 0; n < 10; n++)
                                {
                                    if (maxtype < labels[n])
                                    {
                                        max     = n;
                                        maxtype = labels[n];
                                    }
                                    if (label == n)
                                    {
                                        labelsTrue[n] = 1;
                                    }
                                }
                                //Console.WriteLine(i + ":" + label + "," + max);
                                CnnHelper.ShowChange(labels, labelsTrue, 10000);
                                this.Invoke(new Action(() =>
                                {
                                    lblInfo.Text = String.Format("识别次数:{0}/{1} 正确率:{2:00.####%}", CnnHelper.TrueCount, CnnHelper.SumCount, CnnHelper.TrueCount / (double)CnnHelper.SumCount);
                                    if (i % 20 == 0)
                                    {
                                        lblResult.Text = CnnHelper.LabelsNum + " " + CnnHelper.ResultNum;
                                        pbImage.Image  = img;
                                    }
                                }));
                                //img.Save("imgs/" + i + "_" + label + ".jpg");
                            }
                            fsImages.Close();
                            fs.Close();
                        }
                    }
                    #endregion
                }
                else
                {
                    #region 手写字体集
                    foreach (var file in Directory.GetFiles("img2", "*.jpg"))
                    {
                        using (Bitmap img = new Bitmap(file))
                        {
                            byte label = Convert.ToByte(file.Substring(file.LastIndexOf('\\') + 1, 1));
                            Image <Bgr, float> trainingData = new Image <Bgr, float>(img);;
                            double[,] input = new double[img.Width, img.Height];
                            for (int w = 0; w < img.Width; w++)
                            {
                                for (int h = 0; h < img.Height; h++)
                                {
                                    input[w, h] = Color.FromArgb(0,
                                                                 (int)trainingData.Data[h, w, 2],
                                                                 (int)trainingData.Data[h, w, 1],
                                                                 (int)trainingData.Data[h, w, 0]
                                                                 ).ToArgb() / (double)0xFFFFFF;
                                }
                            }
                            input               = CnnHelper.MatrixExpand(input, 2, 2, 0);
                            double[] labels     = cnn.Predict(input);
                            double[] labelsTrue = new double[10];
                            double maxtype      = labels[0], max = 0;
                            for (int n = 0; n < 10; n++)
                            {
                                if (maxtype < labels[n])
                                {
                                    max     = n;
                                    maxtype = labels[n];
                                }
                                if (label == n)
                                {
                                    labelsTrue[n] = 1;
                                }
                            }
                            //Console.WriteLine(i + ":" + label + "," + max);
                            CnnHelper.ShowChange(labels, labelsTrue, 10000);
                            this.Invoke(new Action(() =>
                            {
                                lblInfo.Text = String.Format("识别次数:{0}/{1} 正确率:{2:00.####%}", CnnHelper.TrueCount, CnnHelper.SumCount, CnnHelper.TrueCount / (double)CnnHelper.SumCount);

                                lblResult.Text = CnnHelper.LabelsNum + " " + CnnHelper.ResultNum;
                                pbImage.Image  = new Bitmap(img);
                            }));
                        }
                    }
                    #endregion
                }
            });
            threadCnn.Start();
        }