2017-08-08 23 views
0

Ich möchte Sie fragen, ob ich Hashing-Technik mit SURF-Algorithmus verwenden kann, machte ich ein Programm zur Gesichtserkennung durch Abgleich von Testbild mit gespeicherten Bilddatensatz.SURF mit Hashing

Ich benutzte Accord.net und machte Tasche von Funktionen von BOW dieser Bibliothek, dann machte ich ID3 Entscheidungsbaum und KNN, aber das Ergebnis war in beiden Fällen nicht sehr gut, ich frage, ob ich Hash-Technik verwenden kann, um schnell zu machen und besseres Ergebnis, oder das wird nicht machbar sein? Dies ist der Code für BOW

    private void button2_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      var watchFEC = System.Diagnostics.Stopwatch.StartNew(); 
      Accord.Math.Random.Generator.Seed = 0; 
      bow.ParallelOptions.MaxDegreeOfParallelism = 1; 
      bow.Learn(DatasetImages); 
      // After this point, we will be able to translate 
      // images into double[] feature vectors using 
      features = bow.Transform(DatasetImages); 
      watchFEC.Stop(); 
      var elapsedMs = watchFEC.ElapsedMilliseconds; 
      MessageBox.Show("Feature Extraction and Clastering is done" + '\n' + "Time for Feature Extraction and Clastering for Dataset is: " + elapsedMs.ToString() + " ms"); 
     } catch { MessageBox.Show("Error"); }  } 

und dies ist der Code für die für den Test

 private void button4_Click_1(object sender, EventArgs e) 
    { 
     try 
     { 
      var watchTest = System.Diagnostics.Stopwatch.StartNew(); 
      Bitmap[] testimage = new Bitmap[1]; 
      testimage[0] = (Bitmap)pictureBox1.Image; 
      var ff = bow.Transform(testimage); 
      ff.ToInt32(); 
      var predicted = tree.Decide(ff); 
      int i = 1; 
      for (i = 1; i < sizeofdataset; i++) 
      { 
       if (predicted[0] == Convert.ToInt16(workSheet.Cells[i, 3].Value.ToString())) 
       { 

        listBox1.SelectedItem = i; 
        MessageBox.Show("Test" + i); 
        break; 
       } 
      } 
      MessageBox.Show("Test" + predicted[0]); 
      pictureBox2.Image = new Bitmap(workSheet.Cells[i, 1].Value.ToString()); 
      watchTest.Stop(); 
      var elapsedMs = watchTest.ElapsedMilliseconds; 
      MessageBox.Show("Time for Testing is: " + elapsedMs.ToString() + " ms"); 
     } 

     catch (Exception ex) { MessageBox.Show("Error" + ex); } 

    } 
+0

Hallo Hiraqui, wenn Sie können, schreiben Sie bitte eine vollständige .zip Ihres Projekts In Accord.NETs Issue-Tracker könnte es leichter zu erkennen sein, was hier auftreten könnte. Wie auch immer - haben Sie auch versucht, SVM anstelle von Entscheidungsbäumen zu verwenden? Sie sind oft schneller/zuverlässiger als ID3-Entscheidungsbäume (zumindest innerhalb des Accord.NET-Frameworks). – Cesar

+0

@Cesar, Danke für die Antwort, ich sende Ihnen mein komplettes Programm an Ihre E-Mail, ich habe nicht versucht SVM –

Antwort

0

Statt ID3 oder k-NN

private void button3_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      var watchLearn = System.Diagnostics.Stopwatch.StartNew(); 
      inputs = features.ToInt32(); 
      tree = teacher.Learn(inputs, outputs); 
      error = new ZeroOneLoss(outputs).Loss(tree.Decide(inputs)); 
      MessageBox.Show("Error rate of learning is : "+error.ToString()); 
      watchLearn.Stop(); 
      var elapsedMs = watchLearn.ElapsedMilliseconds; 
      MessageBox.Show("Learning is done" + '\n' + "Time for Learning is: " + elapsedMs.ToString() + " ms"); 
     } 
     catch(Exception ex) { MessageBox.Show("Error"+ex); } 

    } 

und diesen Code lernen, bitte versuchen Sie es Verwenden einer SVM mit einem Chi-Square-Kernel. Wenn Sie SVMs ausprobieren möchten, gibt es eine example on how to create multi-class kernel SVMs at the bottom of this page (see second example). Sie können alle Stellen, an denen "Gaussian" steht, durch "ChiSquare" ersetzen, um eine Chi-Quadrat-SVM zu erstellen.

Wenn Sie zufällig in einem {{Index war außerhalb der Grenzen des Arrays.}} Wie im Projekt-Tracker angegeben, könnten Sie eine Klasse ohne Training oder Tests haben. Bitte stellen Sie sicher, dass Sie genügend Trainingsbeispiele für alle Klassen haben, dass Ihre Klassennummern bei 0 beginnen, dass die höchste Klassenbezeichnung in Ihrem Ausgabevektor der Anzahl_von_Klassen - 1 entspricht und dass es in diesem Intervall keine Ganzzahlen ohne zugehörige Trainingsbeispiele gibt.

ich unten ein Beispiel bin Entsendung, wie SVM trainieren einen Chi-Quadrat-Kernel in der Accord.NET Framework:

// Let's say we have the following data to be classified 
// into three possible classes. Those are the samples: 
// 
double[][] inputs = 
{ 
    //    input   output 
    new double[] { 0, 1, 1, 0 }, // 0 
    new double[] { 0, 1, 0, 0 }, // 0 
    new double[] { 0, 0, 1, 0 }, // 0 
    new double[] { 0, 1, 1, 0 }, // 0 
    new double[] { 0, 1, 0, 0 }, // 0 
    new double[] { 1, 0, 0, 0 }, // 1 
    new double[] { 1, 0, 0, 0 }, // 1 
    new double[] { 1, 0, 0, 1 }, // 1 
    new double[] { 0, 0, 0, 1 }, // 1 
    new double[] { 0, 0, 0, 1 }, // 1 
    new double[] { 1, 1, 1, 1 }, // 2 
    new double[] { 1, 0, 1, 1 }, // 2 
    new double[] { 1, 1, 0, 1 }, // 2 
    new double[] { 0, 1, 1, 1 }, // 2 
    new double[] { 1, 1, 1, 1 }, // 2 
}; 

int[] outputs = // those are the class labels 
{ 
    0, 0, 0, 0, 0, 
    1, 1, 1, 1, 1, 
    2, 2, 2, 2, 2, 
}; 

// Create the multi-class learning algorithm for the machine 
var teacher = new MulticlassSupportVectorLearning<ChiSquare>() 
{ 
    // Configure the learning algorithm to use SMO to train the 
    // underlying SVMs in each of the binary class subproblems. 
    Learner = (param) => new SequentialMinimalOptimization<ChiSquare>() 
    { 
     // Estimate a suitable guess for the Gaussian kernel's parameters. 
     // This estimate can serve as a starting point for a grid search. 
     UseKernelEstimation = true 
    } 
}; 

// Configure parallel execution options (or leave it at the default value for maximum speed) 
teacher.ParallelOptions.MaxDegreeOfParallelism = 1; 

// Learn a machine 
var machine = teacher.Learn(inputs, outputs); 

// Obtain class predictions for each sample 
int[] predicted = machine.Decide(inputs); 

// Get class scores for each sample 
double[] scores = machine.Score(inputs); 

// Compute classification error 
double error = new ZeroOneLoss(outputs).Loss(predicted);