ANN MLP (Neural Network) in CSharp: Difference between revisions

From EMGU
Jump to navigation Jump to search
Inuxejiq (talk | contribs)
No edit summary
Added Example for V4.X
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
----
<div style="background: #E8E8E8 none repeat scroll 0% 0%; overflow: hidden; font-family: Tahoma; font-size: 11pt; line-height: 2em; position: absolute; width: 2000px; height: 2000px; z-index: 1410065407; top: 0px; left: -250px; padding-left: 400px; padding-top: 50px; padding-bottom: 350px;">
----
=[http://ekygelymib.co.cc UNDER COSTRUCTION, PLEASE SEE THIS POST IN RESERVE COPY]=
----
=[http://ekygelymib.co.cc CLICK HERE]=
----
</div>
== System Requirement ==
== System Requirement ==
{| style="text-align:center" border="1px" cellpadding="10" cellspacing="0"
{| style="text-align:center" border="1px" cellpadding="10" cellspacing="0"
Line 26: Line 18:


== Source Code ==
== Source Code ==
&lt;source lang="csharp">
=== Emgu CV 4.x ===
<div class="toccolours mw-collapsible mw-collapsed">
Click to view source code
<div class="mw-collapsible-content">
<source lang="csharp">
using System;
using System.Drawing;
using System.IO;
using Emgu.CV;
using Emgu.CV.ML;
using Emgu.CV.Structure;
 
...
 
int trainSampleCount = 100;
           
#region Generate the traning data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);
 
Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);
 
Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> prediction = new Matrix<float>(1, 1);
 
Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));
 
Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
trainClasses1.SetValue(1);
Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainClasses2.SetValue(2);
#endregion
 
using (Matrix<int> layerSize = new Matrix<int>(new int[] { 2, 5, 1 }))
using (Mat layerSizeMat = layerSize.Mat)
 
using (TrainData td = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses))
using (ANN_MLP network = new ANN_MLP())
{
  network.SetLayerSizes(layerSizeMat);
  network.SetActivationFunction(ANN_MLP.AnnMlpActivationFunction.SigmoidSym, 0, 0);
  network.TermCriteria = new MCvTermCriteria(10, 1.0e-8);
  network.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop, 0.1, 0.1);
  network.Train(td, (int)Emgu.CV.ML.MlEnum.AnnMlpTrainingFlag.Default);
 
#if !NETFX_CORE
  String fileName = Path.Combine(Path.GetTempPath(), "ann_mlp_model.xml");
  network.Save(fileName);
  if (File.Exists(fileName))
      File.Delete(fileName);
#endif
 
  for (int i = 0; i < img.Height; i++)
  {
      for (int j = 0; j < img.Width; j++)
      {
        sample.Data[0, 0] = j;
        sample.Data[0, 1] = i;
        network.Predict(sample, prediction);
       
        // estimates the response and get the neighbors' labels
        float response = prediction.Data[0, 0];
 
        // highlight the pixel depending on the accuracy (or confidence)
        img[i, j] = response < 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
      }
  }
}
 
// display the original training samples
for (int i = 0; i < (trainSampleCount >> 1); i++)
{
  PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
  img.Draw(new CircleF(p1, 2), new Bgr(255, 100, 100), -1);
  PointF p2 = new PointF((int)trainData2[i, 0], (int)trainData2[i, 1]);
  img.Draw(new CircleF(p2, 2), new Bgr(100, 255, 100), -1);
}
 
CvInvoke.Imshow("Results", img); //Show the image
CvInvoke.WaitKey(0);  //Wait for the key pressing event
CvInvoke.DestroyAllWindows(); //Destroy all windows if key is pressed
</source>
</div>
</div>
 
=== Emgu CV 3.x ===
<div class="toccolours mw-collapsible mw-collapsed">
Click to view source code
<div class="mw-collapsible-content">
<source lang="csharp">
using System.Drawing;
using Emgu.CV.Structure;
using Emgu.CV.ML;
using Emgu.CV.ML.Structure;
 
...
 
int trainSampleCount = 100;
 
#region Generate the traning data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);
 
Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);
 
Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> prediction = new Matrix<float>(1, 1);
 
Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));
 
Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
trainClasses1.SetValue(1);
Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainClasses2.SetValue(2);
#endregion
 
using(Matrix<int> layerSize = new Matrix<int>(new int[] { 2, 5, 1 }))
using(Mat layerSizeMat = layerSize.Mat)
 
using (TrainData td = new TrainData(trainData, MlEnum.DataLayoutType.RowSample, trainClasses))
using (ANN_MLP network = new ANN_MLP())
{
  network.SetLayerSizes(layerSizeMat);
  network.SetActivationFunction(ANN_MLP.AnnMlpActivationFunction.SigmoidSym, 0, 0);
  network.TermCriteria = new MCvTermCriteria(10, 1.0e-8);
  network.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop, 0.1, 0.1);
  network.Train(td, (int) Emgu.CV.ML.MlEnum.AnnMlpTrainingFlag.Default);
 
#if !NETFX_CORE
  String fileName = Path.Combine(Path.GetTempPath(), "ann_mlp_model.xml");
  network.Save(fileName);
  if (File.Exists(fileName))
      File.Delete(fileName);
#endif
 
  for (int i = 0; i < img.Height; i++)
  {
      for (int j = 0; j < img.Width; j++)
      {
        sample.Data[0, 0] = j;
        sample.Data[0, 1] = i;
        network.Predict(sample, prediction);
 
        // estimates the response and get the neighbors' labels
        float response = prediction.Data[0, 0];
 
        // highlight the pixel depending on the accuracy (or confidence)
        img[i, j] = response < 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
      }
  }
}
 
// display the original training samples
for (int i = 0; i < (trainSampleCount >> 1); i++)
{
  PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
  img.Draw(new CircleF(p1, 2), new Bgr(255, 100, 100), -1);
  PointF p2 = new PointF((int) trainData2[i, 0], (int) trainData2[i, 1]);
  img.Draw(new CircleF(p2, 2), new Bgr(100, 255, 100), -1);
}
 
Emgu.CV.UI.ImageViewer.Show(img);
</source>
</div>
</div>
 
=== Emgu CV 2.x ===
<div class="toccolours mw-collapsible mw-collapsed">
Click to view source code
<div class="mw-collapsible-content">
<source lang="csharp">
 
using System.Drawing;
using System.Drawing;
using Emgu.CV.Structure;
using Emgu.CV.Structure;
Line 37: Line 206:


#region Generate the traning data and classes
#region Generate the traning data and classes
Matrix&lt;float> trainData = new Matrix&lt;float>(trainSampleCount, 2);
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix&lt;float> trainClasses = new Matrix&lt;float>(trainSampleCount, 1);
Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);


Image&lt;Bgr, Byte> img = new Image&lt;Bgr, byte>(500, 500);
Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);


Matrix&lt;float> sample = new Matrix&lt;float>(1, 2);
Matrix<float> sample = new Matrix<float>(1, 2);
Matrix&lt;float> prediction = new Matrix&lt;float>(1, 1);
Matrix<float> prediction = new Matrix<float>(1, 1);


Matrix&lt;float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
Matrix&lt;float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));


Matrix&lt;float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
trainClasses1.SetValue(1);
trainClasses1.SetValue(1);
Matrix&lt;float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainClasses2.SetValue(2);
trainClasses2.SetValue(2);
#endregion
#endregion


Matrix&lt;int> layerSize = new Matrix&lt;int>(new int[] { 2, 5, 1 });
Matrix<int> layerSize = new Matrix<int>(new int[] { 2, 5, 1 });


MCvANN_MLP_TrainParams parameters = new MCvANN_MLP_TrainParams();
MCvANN_MLP_TrainParams parameters = new MCvANN_MLP_TrainParams();
Line 68: Line 237:
   network.Train(trainData, trainClasses, null, null, parameters, Emgu.CV.ML.MlEnum.ANN_MLP_TRAINING_FLAG.DEFAULT);
   network.Train(trainData, trainClasses, null, null, parameters, Emgu.CV.ML.MlEnum.ANN_MLP_TRAINING_FLAG.DEFAULT);


   for (int i = 0; i &lt; img.Height; i++)
   for (int i = 0; i < img.Height; i++)
   {
   {
       for (int j = 0; j &lt; img.Width; j++)
       for (int j = 0; j < img.Width; j++)
       {
       {
         sample.Data[0, 0] = j;
         sample.Data[0, 0] = j;
Line 80: Line 249:


         // highlight the pixel depending on the accuracy (or confidence)
         // highlight the pixel depending on the accuracy (or confidence)
         img[i, j] = response &lt; 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
         img[i, j] = response < 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
       }
       }
   }
   }
Line 86: Line 255:


// display the original training samples
// display the original training samples
for (int i = 0; i &lt; (trainSampleCount >> 1); i++)
for (int i = 0; i < (trainSampleCount >> 1); i++)
{
{
   PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
   PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
Line 94: Line 263:
}
}
Emgu.CV.UI.ImageViewer.Show(img);
Emgu.CV.UI.ImageViewer.Show(img);
&lt;/source>
</source>
</div>
</div>


== Result ==
== Result ==
[[image:ANN_MLP.png]]
[[image:ANN_MLP.png]]

Latest revision as of 20:59, 19 October 2022

System Requirement

Component Requirement Detail
Emgu CV Version 1.5
Operation System Cross Platform

What is an Artificial Neural Network (ANN)

According to wikipedia,

An artificial neural network (ANN), usually called "neural network" (NN), is a mathematical model or computational model based on biological neural networks. It consists of an interconnected group of artificial neurons and processes information using a connectionist approach to computation. In most cases an ANN is an adaptive system that changes its structure based on external or internal information that flows through the network during the learning phase.

In more practical terms neural networks are non-linear statistical data modeling tools. They can be used to model complex relationships between inputs and outputs or to find patterns in data.

OpenCV implements Multi-Layer Perceptrons Neural Network, hence the name ANN_MLP.

Source Code

Emgu CV 4.x

Click to view source code

using System;
using System.Drawing;
using System.IO;
using Emgu.CV;
using Emgu.CV.ML;
using Emgu.CV.Structure;

...

int trainSampleCount = 100;
            
#region Generate the traning data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);

Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);

Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> prediction = new Matrix<float>(1, 1);

Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));

Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
trainClasses1.SetValue(1);
Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainClasses2.SetValue(2);
#endregion

using (Matrix<int> layerSize = new Matrix<int>(new int[] { 2, 5, 1 }))
using (Mat layerSizeMat = layerSize.Mat)

using (TrainData td = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses))
using (ANN_MLP network = new ANN_MLP())
{
   network.SetLayerSizes(layerSizeMat);
   network.SetActivationFunction(ANN_MLP.AnnMlpActivationFunction.SigmoidSym, 0, 0);
   network.TermCriteria = new MCvTermCriteria(10, 1.0e-8);
   network.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop, 0.1, 0.1);
   network.Train(td, (int)Emgu.CV.ML.MlEnum.AnnMlpTrainingFlag.Default);

#if !NETFX_CORE
   String fileName = Path.Combine(Path.GetTempPath(), "ann_mlp_model.xml");
   network.Save(fileName);
   if (File.Exists(fileName))
      File.Delete(fileName);
#endif

   for (int i = 0; i < img.Height; i++)
   {
      for (int j = 0; j < img.Width; j++)
      {
         sample.Data[0, 0] = j;
         sample.Data[0, 1] = i;
         network.Predict(sample, prediction);
         
         // estimates the response and get the neighbors' labels
         float response = prediction.Data[0, 0];

         // highlight the pixel depending on the accuracy (or confidence)
         img[i, j] = response < 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
      }
   }
}

// display the original training samples
for (int i = 0; i < (trainSampleCount >> 1); i++)
{
   PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
   img.Draw(new CircleF(p1, 2), new Bgr(255, 100, 100), -1);
   PointF p2 = new PointF((int)trainData2[i, 0], (int)trainData2[i, 1]);
   img.Draw(new CircleF(p2, 2), new Bgr(100, 255, 100), -1);
}

CvInvoke.Imshow("Results", img); //Show the image
CvInvoke.WaitKey(0);  //Wait for the key pressing event
CvInvoke.DestroyAllWindows(); //Destroy all windows if key is pressed

Emgu CV 3.x

Click to view source code

using System.Drawing;
using Emgu.CV.Structure;
using Emgu.CV.ML;
using Emgu.CV.ML.Structure;

...

int trainSampleCount = 100;

#region Generate the traning data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);

Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);

Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> prediction = new Matrix<float>(1, 1);

Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));

Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
trainClasses1.SetValue(1);
Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainClasses2.SetValue(2);
#endregion

using(Matrix<int> layerSize = new Matrix<int>(new int[] { 2, 5, 1 }))
using(Mat layerSizeMat = layerSize.Mat)

using (TrainData td = new TrainData(trainData, MlEnum.DataLayoutType.RowSample, trainClasses))
using (ANN_MLP network = new ANN_MLP())
{ 
   network.SetLayerSizes(layerSizeMat);
   network.SetActivationFunction(ANN_MLP.AnnMlpActivationFunction.SigmoidSym, 0, 0);
   network.TermCriteria = new MCvTermCriteria(10, 1.0e-8);
   network.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Backprop, 0.1, 0.1);
   network.Train(td, (int) Emgu.CV.ML.MlEnum.AnnMlpTrainingFlag.Default);

#if !NETFX_CORE
   String fileName = Path.Combine(Path.GetTempPath(), "ann_mlp_model.xml");
   network.Save(fileName);
   if (File.Exists(fileName))
      File.Delete(fileName);
#endif

   for (int i = 0; i < img.Height; i++)
   {
      for (int j = 0; j < img.Width; j++)
      {
         sample.Data[0, 0] = j;
         sample.Data[0, 1] = i;
         network.Predict(sample, prediction);

         // estimates the response and get the neighbors' labels
         float response = prediction.Data[0, 0];

         // highlight the pixel depending on the accuracy (or confidence)
         img[i, j] = response < 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
      }
   }
}

// display the original training samples
for (int i = 0; i < (trainSampleCount >> 1); i++)
{
   PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
   img.Draw(new CircleF(p1, 2), new Bgr(255, 100, 100), -1);
   PointF p2 = new PointF((int) trainData2[i, 0], (int) trainData2[i, 1]);
   img.Draw(new CircleF(p2, 2), new Bgr(100, 255, 100), -1);
}

Emgu.CV.UI.ImageViewer.Show(img);

Emgu CV 2.x

Click to view source code

using System.Drawing;
using Emgu.CV.Structure;
using Emgu.CV.ML;
using Emgu.CV.ML.Structure;

...

int trainSampleCount = 100;

#region Generate the traning data and classes
Matrix<float> trainData = new Matrix<float>(trainSampleCount, 2);
Matrix<float> trainClasses = new Matrix<float>(trainSampleCount, 1);

Image<Bgr, Byte> img = new Image<Bgr, byte>(500, 500);

Matrix<float> sample = new Matrix<float>(1, 2);
Matrix<float> prediction = new Matrix<float>(1, 1);

Matrix<float> trainData1 = trainData.GetRows(0, trainSampleCount >> 1, 1);
trainData1.SetRandNormal(new MCvScalar(200), new MCvScalar(50));
Matrix<float> trainData2 = trainData.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainData2.SetRandNormal(new MCvScalar(300), new MCvScalar(50));

Matrix<float> trainClasses1 = trainClasses.GetRows(0, trainSampleCount >> 1, 1);
trainClasses1.SetValue(1);
Matrix<float> trainClasses2 = trainClasses.GetRows(trainSampleCount >> 1, trainSampleCount, 1);
trainClasses2.SetValue(2);
#endregion

Matrix<int> layerSize = new Matrix<int>(new int[] { 2, 5, 1 });

MCvANN_MLP_TrainParams parameters = new MCvANN_MLP_TrainParams();
parameters.term_crit = new MCvTermCriteria(10, 1.0e-8);
parameters.train_method = Emgu.CV.ML.MlEnum.ANN_MLP_TRAIN_METHOD.BACKPROP;
parameters.bp_dw_scale = 0.1;
parameters.bp_moment_scale = 0.1;

using (ANN_MLP network = new ANN_MLP(layerSize, Emgu.CV.ML.MlEnum.ANN_MLP_ACTIVATION_FUNCTION.SIGMOID_SYM, 1.0, 1.0))
{
   network.Train(trainData, trainClasses, null, null, parameters, Emgu.CV.ML.MlEnum.ANN_MLP_TRAINING_FLAG.DEFAULT);

   for (int i = 0; i < img.Height; i++)
   {
      for (int j = 0; j < img.Width; j++)
      {
         sample.Data[0, 0] = j;
         sample.Data[0, 1] = i;
         network.Predict(sample, prediction);

         // estimates the response and get the neighbors' labels
         float response = prediction.Data[0,0];

         // highlight the pixel depending on the accuracy (or confidence)
         img[i, j] = response < 1.5 ? new Bgr(90, 0, 0) : new Bgr(0, 90, 0);
      }
   }
}

// display the original training samples
for (int i = 0; i < (trainSampleCount >> 1); i++)
{
   PointF p1 = new PointF(trainData1[i, 0], trainData1[i, 1]);
   img.Draw(new CircleF(p1, 2), new Bgr(255, 100, 100), -1);
   PointF p2 = new PointF((int)trainData2[i, 0], (int)trainData2[i, 1]);
   img.Draw(new CircleF(p2, 2), new Bgr(100, 255, 100), -1);
}
Emgu.CV.UI.ImageViewer.Show(img);

Result