Fisherfaces используя OpenImaj - ОШИБКА LAPACK: DSYGVD вернул 40

Я пытаюсь сделать Fisherfaces, используя OpenImaj, но код ниже приводит к следующей ошибке:

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

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

2 ответа

Решение

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

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

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

Исключение в потоке "main" java.lang.ArrayIndexOutOfBoundsException: 2 в org.openimaj.image.model.FisherImages.getBasisVector(FisherImages.java:230) в org.openimaj.image.model.FisherImages.visualise(FisherI243mages.java)) в org.openimaj.tutorial.facialanalysis.FisherfacesExample.main(FisherfacesExample.java:41)

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

Другие вопросы по тегам