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); } } }
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(); }
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(); }
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(); }