コード例 #1
0
ファイル: Form1_Cnn.cs プロジェクト: Maggie123-huang/CnnDemo
 private void TrainBP(Dictionary <Bitmap, List <Rectangle> > imgs)
 {
     bpTrainDataCount = imgs.Count;
     for (int tc = 0; tc < 10; tc++)
     {
         foreach (var item in imgs)
         {
             Bitmap      img   = item.Key;
             Rectangle[] rects = item.Value.ToArray();
             //图片
             Bitmap             tmpImg       = ZoomImg(img, bpWidth, bpHeight, ref rects);
             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(0,
                                                  (int)trainingData.Data[j, i, 2],
                                                  (int)trainingData.Data[j, i, 1],
                                                  (int)trainingData.Data[j, i, 0]
                                                  ).ToArgb() / (float)0xFFFFFF;
                 }
             }
             //矩形数据
             double[] output = new double[bpRectangleCount * 4];
             for (int i = 0; i < rects.Length * 4 && i < bpRectangleCount * 4; i += 4)
             {
                 output[i]     = rects[i / 4].X / (float)bpWidth;
                 output[i + 1] = rects[i / 4].Y / (float)bpHeight;
                 output[i + 2] = rects[i / 4].Width / (float)bpWidth;
                 output[i + 3] = rects[i / 4].Height / (float)bpHeight;
             }
             tmpImg.Dispose();
             tmpImg = null;
             double[] forwardOutputFull = null;
             cnn.Train(input, output, 0.01, ref forwardOutputFull);
         }
     }
 }
コード例 #2
0
        static void Main(string[] args)
        {
            string filePath     = @"C:/Users/arnal/Documents/coins.jpg";
            var    coinDetector = new CoinDetector(filePath);

            coinDetector.ImagePreprocessing();

            var numberClasses   = 60;
            var fileExt         = new string[] { ".png" };
            var dataSetFilePath = @"C:/Users/arnal/Downloads/coin_dataset";
            var predictImgPath  = dataSetFilePath + "/" + "class6_image1.png";

            var dataSet = new PreProcessing.DataSet(dataSetFilePath, fileExt, numberClasses, 0.2);

            dataSet.LoadDataSet();

            var cnn = new Cnn(dataSet);

            cnn.Train();
            //Console.WriteLine("Predicted: " + cnn.Predict(predictImgPath));

            Console.ReadLine();
        }
コード例 #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            if (threadCnn != null && threadCnn.ThreadState == ThreadState.Running)
            {
                return;
            }
            learningRate = (double)numLearningRate.Value;
            threadCnn    = new Thread(() =>
            {
                try
                {
                    trainCount = 0;
                    //int retry = 0;
                    while (CnnHelper.TruePercent != 1)
                    {
                        trainCount++;
                        CnnHelper.SumCount  = 0;
                        CnnHelper.TrueCount = 0;
                        if (!chkHandwritten.Checked)
                        {
                            #region MNIST库
                            using (FileStream fs = new FileStream("data/MNIST/train-labels.idx1-ubyte", FileMode.Open))
                            {
                                using (FileStream fsImages = new FileStream("data/MNIST/train-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);
                                        double[] labels = new double[10];
                                        for (int i2 = 0; i2 < 10; i2++)
                                        {
                                            labels[i2] = 0;
                                        }
                                        labels[label] = 1;
                                        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;
                                            }
                                        }
                                        int left = CnnHelper.RandomObj.Next(4), top = CnnHelper.RandomObj.Next(4);
                                        input    = CnnHelper.MatrixExpand(input, left, top, 4 - left, 4 - top, 0);
                                        double[] forwardOutputFull = null;
                                        cnn.Train(input, labels, learningRate, ref forwardOutputFull);
                                        CnnHelper.ShowChange(forwardOutputFull, labels, 60000);
                                        this.Invoke(new Action(() =>
                                        {
                                            lblInfo.Text = String.Format("训练周期:{0} 训练次数:{1}/{2} 正确率:{3:00.####%}", trainCount, CnnHelper.TrueCount, CnnHelper.SumCount, CnnHelper.TrueCount / (double)CnnHelper.SumCount);
                                            if (i % 20 == 0)
                                            {
                                                lblResult.Text = CnnHelper.LabelsNum + " " + CnnHelper.ResultNum;
                                                pbImage.Image  = img;
                                            }
                                            //if (CnnHelper.LabelsNum != CnnHelper.ResultNum && retry < 5)
                                            //{
                                            //    i--;
                                            //    retry++;
                                            //}
                                            //else
                                            //{
                                            //    retry = 0;
                                            //}
                                        }));
                                        //img.Save("imgs/" + i + "_" + label + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
                                    }
                                    fsImages.Close();
                                    fs.Close();
                                }
                            }
                            #endregion
                        }
                        else
                        {
                            #region 手写字体集
                            foreach (var file in Directory.GetFiles("img", "*.jpg"))
                            {
                                using (Bitmap img = new Bitmap(file))
                                {
                                    byte label      = Convert.ToByte(file.Substring(file.LastIndexOf('\\') + 1, 1));
                                    double[] labels = new double[10];
                                    for (int i2 = 0; i2 < 10; i2++)
                                    {
                                        labels[i2] = 0;
                                    }
                                    labels[label] = 1;
                                    //he
                                    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;
                                        }
                                    }
                                    int left = CnnHelper.RandomObj.Next(4), top = CnnHelper.RandomObj.Next(4);
                                    input    = CnnHelper.MatrixExpand(input, left, top, 4 - left, 4 - top, 0);
                                    double[] forwardOutputFull = null;
                                    cnn.Train(input, labels, learningRate, ref forwardOutputFull);
                                    CnnHelper.ShowChange(forwardOutputFull, labels, 60000);
                                    this.Invoke(new Action(() =>
                                    {
                                        lblInfo.Text = String.Format("训练周期:{0} 训练次数:{1}/{2} 正确率:{3:00.####%}", trainCount, CnnHelper.TrueCount, CnnHelper.SumCount, CnnHelper.TrueCount / (double)CnnHelper.SumCount);

                                        lblResult.Text = CnnHelper.LabelsNum + " " + CnnHelper.ResultNum;
                                        pbImage.Image  = new Bitmap(img);
                                    }));
                                }
                            }
                            #endregion
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            });
            threadCnn.Start();
        }
コード例 #4
0
        private void button1_Click(object sender, EventArgs e)
        {
            if (threadCnn != null && threadCnn.ThreadState == ThreadState.Running)
            {
                return;
            }
            learningRate = (double)numLearningRate.Value;
            threadCnn    = new Thread(() =>
            {
                try
                {
                    trainCount = 0;
                    //int retry = 0;
                    string path              = "F:\\迅雷下载\\lfw\\";
                    StreamReader sr          = new StreamReader(path + "pairsDevTrain.txt");
                    int trueCount            = Convert.ToInt32(sr.ReadLine()); //正确数
                    string nowLine           = sr.ReadLine();                  //当前行
                    List <string[]> dataList = new List <string[]>();
                    while (!String.IsNullOrEmpty(nowLine))
                    {
                        string[] values  = nowLine.Split('\t');
                        string[] values2 = new string[4];
                        if (values.Length == 3)
                        {
                            values2[0] = values[0];
                            values2[1] = values[1];
                            values2[2] = values[0];
                            values2[3] = values[2];
                        }
                        else
                        {
                            values2[0] = values[0];
                            values2[1] = values[1];
                            values2[2] = values[2];
                            values2[3] = values[3];
                        }
                        dataList.Add(values2);
                        nowLine = sr.ReadLine();//当前行
                    }
                    while (CnnHelper.TruePercent != 1)
                    {
                        trainCount++;
                        CnnHelper.SumCount  = 0;
                        CnnHelper.TrueCount = 0;
                        #region LFW人脸集
                        List <string[]> randomList = new List <string[]>();
                        foreach (var data in dataList)//随机排序
                        {
                            randomList.Insert(CnnHelper.RandomObj.Next(randomList.Count + 1), data);
                        }
                        foreach (var data in randomList)
                        {
                            string file1 = path + "lfw\\" + data[0] + "\\" + data[0] + "_" + Convert.ToInt32(data[1]).ToString("0000") + ".jpg";
                            string file2 = path + "lfw\\" + data[2] + "\\" + data[2] + "_" + Convert.ToInt32(data[3]).ToString("0000") + ".jpg";
                            using (Bitmap img1 = new Bitmap(file1))
                            {
                                using (Bitmap img2 = new Bitmap(file2))
                                {
                                    double[] labels = new double[1];
                                    if (dataList.IndexOf(data) < trueCount)
                                    {
                                        labels[0] = 1;
                                    }
                                    Image <Bgr, float> trainingData1 = new Image <Bgr, float>(img1);
                                    Image <Bgr, float> trainingData2 = new Image <Bgr, float>(img2);
                                    double[,] input = new double[img1.Width * 2 + 8, img1.Height + 2];
                                    for (int w = 2; w < img1.Width; w++)
                                    {
                                        for (int h = 1; h < img1.Height; h++)
                                        {
                                            input[w, h] = Color.FromArgb(0,
                                                                         (int)trainingData1.Data[h, w, 2],
                                                                         (int)trainingData1.Data[h, w, 1],
                                                                         (int)trainingData1.Data[h, w, 0]
                                                                         ).ToArgb() / (double)0xFFFFFF;
                                            input[img1.Width + 4 + w, h] = Color.FromArgb(0,
                                                                                          (int)trainingData2.Data[h, w, 2],
                                                                                          (int)trainingData2.Data[h, w, 1],
                                                                                          (int)trainingData2.Data[h, w, 0]
                                                                                          ).ToArgb() / (double)0xFFFFFF;
                                        }
                                    }
                                    double[] forwardOutputFull = null;
                                    cnn.Train(input, labels, learningRate, ref forwardOutputFull);
                                    CnnHelper.ShowChange2(forwardOutputFull, labels);
                                    this.Invoke(new Action(() =>
                                    {
                                        lblInfo.Text = String.Format("训练周期:{0} 训练次数:{1}/{2} 正确率:{3:00.####%}", trainCount, CnnHelper.TrueCount, CnnHelper.SumCount, CnnHelper.TrueCount / (double)CnnHelper.SumCount);

                                        lblResult.Text = labels[0].ToString();
                                        pbImage1.Image = new Bitmap(img1);
                                        pbImage2.Image = new Bitmap(img2);
                                    }));
                                }
                            }
                        }
                        #endregion
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.ToString());
                }
            });
            threadCnn.Start();
        }