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