public void Evaluate(IEvolutionState state, Individual ind, int subpop, int threadnum)
        {
            if (!ind.Evaluated)
            {
                int imageIndex;
                var SVMTrainData = new StreamWriter(@"F:\Gesty\features\traindata" + threadnum + ".txt");
                var SVMTestData  = new StreamWriter(@"F:\Gesty\features\testdata" + threadnum + ".txt");
                for (imageIndex = 0; imageIndex < imageList.Length; imageIndex++)
                {
                    var image = new Image <Gray, Byte>(imageList[imageIndex]);
                    var line  = new StringBuilder();
                    image.CopyTo(currentImage[threadnum]);
                    image.CopyTo(originalImage[threadnum]);
                    image.Dispose();
                    ((GPIndividual)ind).Trees[0].Child.Eval(state, threadnum, Input, Stack, ((GPIndividual)ind), this);
                    //int[] features = imageTransformer.GetSuperpixelFeatures(currentImage[threadnum]);
                    int[] features = ImageTransformer.GetSquareSuperpixelFeatures(currentImage[threadnum], 25);

                    line.Append((imageIndex / 213) + 1 + " ");
                    for (int i = 1; i <= features.Length; i++)
                    {
                        line.Append(i + ":" + features[i - 1] + " ");
                    }
                    var lineString = line.ToString().Trim();
                    if (imageIndex % 2 == 0)
                    {
                        SVMTrainData.WriteLine(lineString);
                    }
                    else
                    {
                        SVMTestData.WriteLine(lineString);
                    }
                }
                SVMTrainData.Close();
                SVMTestData.Close();
                var      problem     = SVMProblemHelper.Load(@"F:\Gesty\features\traindata" + threadnum + ".txt");
                var      testProblem = SVMProblemHelper.Load(@"F:\Gesty\features\testdata" + threadnum + ".txt");
                var      model       = problem.Train(Parameter);
                double[] target      = testProblem.Predict(model);
                double   accuracy    = testProblem.EvaluateClassificationProblem(target);
                var      f           = ((KozaFitness)ind.Fitness);
                f.SetStandardizedFitness(state, (float)(100 - accuracy));
                ind.Evaluated = true;
            }
        }
Beispiel #2
0
        public void Evaluate(IEvolutionState state, Individual ind, int subpop, int threadnum)
        {
            if (!ind.Evaluated)
            {
                int counter  = 0;
                var features = new int[5, NumOfImagesPerCategory *NumOfClasses, NumOfFeatures];
                var labels   = new int[5, NumOfImagesPerCategory *NumOfClasses];

                for (int i = 0; i < 5; i++)
                {
                    counter = 0;
                    var categoryDir     = CategoryDirs[i];
                    var subcategoryDirs = Directory.EnumerateDirectories(categoryDir).ToArray();
                    for (int j = 0; j < NumOfClasses; j++)
                    {
                        var subcategoryDir = subcategoryDirs[j];
                        var images         = Directory.GetFiles(subcategoryDir);
                        for (int k = 0; k < NumOfImagesPerCategory; k++)
                        {
                            var tempImage = new Image <Gray, Byte>(images[k]);

                            tempImage.CopyTo(currentImage[threadnum]);
                            tempImage.CopyTo(originalImage[threadnum]);
                            tempImage.Dispose();

                            ((GPIndividual)ind).Trees[0].Child.Eval(state, threadnum, Input, Stack, ((GPIndividual)ind), this);

                            int[] imageFeatures = ImageTransformer.GetSquareSuperpixelFeatures(currentImage[threadnum], SuperpixelSize);
                            for (int x = 0; x < imageFeatures.Length; x++)
                            {
                                features[i, counter, x] = imageFeatures[x];
                                labels[i, counter]      = j + 1;
                            }
                            counter++;
                        }
                    }
                }

                /*
                 * var trainDataFile = new StreamWriter(@"F:\Gesty\problem2\features\traindata" + threadnum + ".txt");
                 * var testDataFile = new StreamWriter(@"F:\Gesty\problem2\features\testdata" + threadnum + ".txt");
                 *
                 * for(int i=0; i<4; i++)
                 * {
                 *  for(int j=0; j<1000; j++)
                 *  {
                 *      var line = new StringBuilder();
                 *      line.Append(labels[i, j].ToString() + " ");
                 *      for (int k=0; k<NumOfFeatures; k++)
                 *      {
                 *          line.Append((k + 1).ToString() + ":" + features[i, j, k].ToString() + " ");
                 *      }
                 *      trainDataFile.WriteLine(line.ToString().Trim());
                 *  }
                 * }
                 * for (int j = 0; j < 1000; j++)
                 * {
                 *  var line = new StringBuilder();
                 *  line.Append(labels[4, j].ToString() + " ");
                 *  for (int k = 0; k < NumOfFeatures; k++)
                 *  {
                 *      line.Append((k + 1).ToString() + ":" + features[4, j, k].ToString() + " ");
                 *  }
                 *  testDataFile.WriteLine(line.ToString().Trim());
                 * }
                 * trainDataFile.Close();
                 * testDataFile.Close();
                 */
                var    confMatI = new double[10, 10];
                double accuracy = 0;
                for (int x = 0; x < 5; x++)
                {
                    var trainData    = new Matrix <float>(NumOfImagesPerCategory * NumOfClasses * 4, NumOfFeatures);
                    var trainClasses = new Matrix <int>(NumOfImagesPerCategory * NumOfClasses * 4, 1);
                    var testData     = new Matrix <float>(NumOfImagesPerCategory * NumOfClasses, NumOfFeatures);
                    var testClasses  = new Matrix <int>(NumOfImagesPerCategory * NumOfClasses, 1);
                    //trainData


                    int imageCount = 0;
                    for (int i = 0; i < 5; i++)
                    {
                        if (i != x)
                        {
                            for (int j = 0; j < NumOfImagesPerCategory * NumOfClasses; j++)
                            {
                                for (int k = 0; k < NumOfFeatures; k++)
                                {
                                    trainData[imageCount, k]    = features[i, j, k];
                                    trainClasses[imageCount, 0] = labels[i, j];
                                }
                                imageCount++;
                            }
                        }
                        else
                        {
                            for (int j = 0; j < NumOfImagesPerCategory * NumOfClasses; j++)
                            {
                                for (int k = 0; k < NumOfFeatures; k++)
                                {
                                    testData[j, k]    = features[i, j, k];
                                    testClasses[j, 0] = labels[i, j];
                                }
                            }
                        }
                    }


                    Emgu.CV.ML.SVM model = new Emgu.CV.ML.SVM();


                    var predictions = new Matrix <float>(NumOfImagesPerCategory * NumOfClasses, 1);
                    var trainData2  = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses);
                    model.Type = Emgu.CV.ML.SVM.SvmType.CSvc;
                    model.SetKernel(Emgu.CV.ML.SVM.SvmKernelType.Poly);
                    model.TermCriteria = new MCvTermCriteria(10000, 0.001);
                    model.Degree       = 3;
                    model.Gamma        = 0.001;
                    model.Coef0        = 0;
                    model.C            = 1000;
                    model.Nu           = 0.5;
                    model.P            = 0.1;
                    model.Train(trainData2);
                    model.Predict(testData, predictions);
                    // var predictionsArray = (float[,])predictions.GetData();
                    int correctPredictions = 0;
                    for (int i = 0; i < predictions.Rows; i++)
                    {
                        if ((int)predictions[i, 0] == testClasses[i, 0])
                        {
                            correctPredictions++;
                        }
                        var predictedLabel = (int)predictions[i, 0];
                        var trueLabel      = testClasses[i, 0];
                        confMatI[predictedLabel - 1, trueLabel - 1]++;
                    }
                    for (int i = 0; i < 10; i++)
                    {
                        for (int j = 0; j < 10; j++)
                        {
                            confMat[i, j] = (confMatI[i, j] / 500) * 100;
                        }
                    }
                    if (correctPredictions > 0)
                    {
                        accuracy += 100 * ((double)correctPredictions / (double)predictions.Rows);
                    }
                }

                /*
                 * for(int i=0; i<NumOfImagesPerCategory*NumOfClasses*4; i++)
                 * {
                 *  for(int j=0; j<NumOfFeatures; j++)
                 *  {
                 *      //trainData[i, j] = ((trainData[i, j] - 0) / (255 - 0)) * (1 + 1) - 1;
                 *  }
                 *  trainClasses[i, 0] = ((trainClasses[i, 0] - 1) / (NumOfClasses - 1)) * (1 + 1) - 1;
                 * }
                 */

                //testData

                /*
                 * for (int j = 0; j < NumOfImagesPerCategory * NumOfClasses; j++)
                 * {
                 *  var line = new StringBuilder();
                 *  line.Append(labels[4, j] + " ");
                 *  for (int k = 0; k < NumOfFeatures; k++)
                 *  {
                 *      line.Append(k + 1 + ":" + features[4, j, k] + " ");
                 *  }
                 *  testData.WriteLine(line.ToString().Trim());
                 * }
                 *
                 * trainData.Close();
                 * testData.Close();
                 */

                //predictions.Dispose();

                /*
                 * var netData = new SharpLearning.Containers.Matrices.F64Matrix(NumOfImagesPerCategory * NumOfClasses * 4, NumOfFeatures);
                 * var netTargets = new double[NumOfImagesPerCategory * NumOfClasses * 4];
                 * int imageCount = 0;
                 * for (int i = 0; i < 4; i++)
                 * {
                 *  for (int j = 0; j < NumOfImagesPerCategory * NumOfClasses; j++)
                 *  {
                 *      for (int k = 0; k < NumOfFeatures; k++)
                 *      {
                 *          netData[imageCount, k] = features[i, j, k];
                 *          netTargets[imageCount] = labels[i, j];
                 *      }
                 *      imageCount++;
                 *  }
                 * }
                 */
                /*
                 * var CVNeuralNet = new Emgu.CV.ML.ANN_MLP();
                 *
                 * CVNeuralNet.TermCriteria = new MCvTermCriteria(10000, 0.001);
                 * var layerSizes = new Matrix<int>(new int[4] { NumOfFeatures, NumOfFeatures * 10, NumOfFeatures*5, 1 });
                 * CVNeuralNet.SetLayerSizes(layerSizes);
                 * CVNeuralNet.SetTrainMethod(ANN_MLP.AnnMlpTrainMethod.Rprop);
                 * CVNeuralNet.SetActivationFunction(ANN_MLP.AnnMlpActivationFunction.SigmoidSym);
                 * CVNeuralNet.BackpropMomentumScale = 0.01;
                 * CVNeuralNet.BackpropWeightScale = 0.2;
                 * var trainData2 = new TrainData(trainData, Emgu.CV.ML.MlEnum.DataLayoutType.RowSample, trainClasses);
                 * var predictions = new Matrix<float>(NumOfImagesPerCategory * NumOfClasses*4, 1);
                 * CVNeuralNet.Train(trainData2);
                 * CVNeuralNet.Predict(trainData, predictions);
                 */
                /*
                 * var net = new NeuralNet();
                 * net.Add(new InputLayer(NumOfFeatures));
                 * net.Add(new DropoutLayer(0.5));
                 * net.Add(new DenseLayer(NumOfFeatures * 4, SharpLearning.Neural.Activations.Activation.Sigmoid));
                 * net.Add(new DenseLayer(NumOfFeatures * 4, SharpLearning.Neural.Activations.Activation.Sigmoid));
                 * net.Add(new DropoutLayer(0.5));
                 * net.Add(new SoftMaxLayer(NumOfClasses));
                 * var learner = new ClassificationNeuralNetLearner(net, new SquareLoss());
                 * var model = learner.Learn(netData, netTargets);
                 * var predictions = model.Predict(netData);
                 * int correctPredictions = 0;
                 * for (int i = 0; i < predictions.Length; i++)
                 * {
                 *  if ((int)predictions[i] == netTargets[i])
                 *      correctPredictions++;
                 * }
                 * if (correctPredictions > 0)
                 *  accuracy = 100 * ((double)correctPredictions / (double)predictions.Length);
                 */
                /*
                 * var problem = SVMProblemHelper.Load(@"F:\Gesty\problem2\features\traindata" + threadnum + ".txt");
                 * var testProblem = SVMProblemHelper.Load(@"F:\Gesty\problem2\features\testdata" + threadnum + ".txt");
                 * var model = problem.Train(Parameter);
                 * double[] target = testProblem.Predict(model);
                 * double accuracy = testProblem.EvaluateClassificationProblem(target);
                 */
                var f = ((KozaFitness)ind.Fitness);
                f.SetStandardizedFitness(state, (float)(100 - (accuracy / 5)));
                ind.Evaluated = true;

                var transFeatures = new StreamWriter(@"F:\Gesty\testy\transFeatures.csv");
                for (int i1 = 0; i1 < 1000; i1++)
                {
                    for (int i2 = 0; i2 < 5; i2++)
                    {
                        var line = new StringBuilder();
                        line.Append(labels[i2, i1].ToString() + ',');
                        for (int i3 = 0; i3 < 64; i3++)
                        {
                            line.Append(features[i2, i1, i3].ToString() + ',');
                        }
                        transFeatures.WriteLine(line.ToString().Trim(','));
                    }
                }
                transFeatures.Close();
            }
        }