2016-03-10 11 views
0

Я пытаюсь сделать Fisherfaces с помощью OpenImaj, но код сильфона приводит к следующей ошибке:Fisherfaces с использованием OpenImaj - LAPACK ОШИБКА: DSYGVD вернулся 40

Exception in thread "main" java.lang.RuntimeException: LAPACK ERROR: DSYGVD returned 40 
    at org.openimaj.math.matrix.GeneralisedEigenvalueProblem.sygvd(GeneralisedEigenvalueProblem.java:57) 
    at org.openimaj.math.matrix.GeneralisedEigenvalueProblem.symmetricGeneralisedEigenvectorsSorted(GeneralisedEigenvalueProblem.java:221) 
    at org.openimaj.math.matrix.algorithm.LinearDiscriminantAnalysis.learnBasis(LinearDiscriminantAnalysis.java:211) 
    at org.openimaj.image.model.FisherImages.train(FisherImages.java:195) 
    at org.openimaj.image.model.FisherImages.train(FisherImages.java:159) 
    at org.openimaj.tutorial.facialanalysis.FisherfacesExample.main(FisherfacesExample.java:35) 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.commons.vfs2.FileSystemException; 
import org.openimaj.data.dataset.GroupedDataset; 
import org.openimaj.data.dataset.ListDataset; 
import org.openimaj.data.dataset.VFSGroupDataset; 
import org.openimaj.experiment.dataset.split.GroupedRandomSplitter; 
import org.openimaj.image.DisplayUtilities; 
import org.openimaj.image.FImage; 
import org.openimaj.image.ImageUtilities; 
import org.openimaj.image.model.FisherImages; 

public class FisherfacesExample { 

    public static void main(String[] args) { 
     try { 
      // getting a set of face images 
      VFSGroupDataset<FImage> dataset = new VFSGroupDataset<FImage>(
        "zip:http://datasets.openimaj.org/att_faces.zip", ImageUtilities.FIMAGE_READER); 

      // forming training set & testing set 
      int nTraining = 1; 
      int nTesting = 5; 
      GroupedRandomSplitter<String, FImage> splits = new GroupedRandomSplitter<String, FImage>(dataset, nTraining, 
        0, nTesting); 
      GroupedDataset<String, ListDataset<FImage>, FImage> training = splits.getTrainingDataset(); 
      GroupedDataset<String, ListDataset<FImage>, FImage> testing = splits.getTestDataset(); 

      // set number of components and train the training set of images 
      int components = 50; 
      FisherImages fisher = new FisherImages(components); 
      fisher.train(training); 

      //drawing the first 12 basis vectors 
      List<FImage> fisherFaces = new ArrayList<FImage>(); 
      for (int i = 0; i < 12; i++) { 
       fisherFaces.add(fisher.visualise(i)); 
      } 
      DisplayUtilities.display("FisherFaces", fisherFaces); 

     } catch (FileSystemException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 

Можете ли вы посоветовать, где проблема возможно? Должен ли я что-то сделать, прежде чем тренировать набор образов лица? Спасибо.

ответ

0

Ошибка почти наверняка, потому что вы пытаетесь тренироваться только с одним примером для каждого класса. Увеличьте количество учебных образцов и повторите попытку.

(техническая причина: FisherFaces использует анализ мультиклассируют линейный дискриминантный, который включает в себя вычисления ковариационной матрицы для каждого класса, вы не можете вычислить это правильно с одного образца для каждого класса)

0

Увеличение количества тренировочных образов решена Ошибка. Однако есть еще одна проблема:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 at org.openimaj.image.model.FisherImages.getBasisVector(FisherImages.java:230) at org.openimaj.image.model.FisherImages.visualise(FisherImages.java:243) at org.openimaj.tutorial.facialanalysis.FisherfacesExample.main(FisherfacesExample.java:41)

Что такое значимое значение для числа компонентов? Спасибо.