【问题标题】:How to identify new faces with OpenIMAJ如何使用 OpenIMAJ 识别新面孔
【发布时间】:2013-03-19 22:40:45
【问题描述】:

我在我的 Java 应用程序的不同线程中收到了 JPG 图像的实时流,我想不断扫描人脸,以便稍后输出在相机运行时通过相机的所有不同人脸的列表,以及每张脸被看到了多少次。这是我当前的代码:

void doImageProcessing() {

    // Create face stuff
    FKEFaceDetector faceDetector = new FKEFaceDetector(new HaarCascadeDetector());
    EigenFaceRecogniser<KEDetectedFace, Person> faceRecognizer = EigenFaceRecogniser.create(512, new RotateScaleAligner(), 512, DoubleFVComparison.CORRELATION, Float.MAX_VALUE);
    FaceRecognitionEngine<KEDetectedFace, Extractor<KEDetectedFace>, Person> faceEngine = FaceRecognitionEngine.create(faceDetector, faceRecognizer);

    // Start loop
    while (true) {

        // Get next frame
        byte[] imgData = nextProcessingData;
        nextProcessingData = null;

        // Decode image
        BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgData));

        // Detect faces
        FImage fimg = ImageUtilities.createFImage(img);
        List<KEDetectedFace> faces = faceEngine.getDetector().detectFaces(fimg);

        // Go through detected faces
        for (KEDetectedFace face : faces) {

            // Find existing person for this face
            Person person = null;
            try {

                List<IndependentPair<KEDetectedFace, ScoredAnnotation<Person>>> rfaces = faceEngine.recogniseBest(face.getFacePatch());
                ScoredAnnotation<Person> score = rfaces.get(0).getSecondObject();
                if (score != null)
                    person = score.annotation;

            } catch (Exception e) {
            }

            // If not found, create
            if (person == null) {

                // Create person
                person = new Person();
                System.out.println("Identified new person: " + person.getIdentifier());

                // Train engine to recognize this new person
                faceEngine.train(person, face.getFacePatch());

            } else {

                // This person has been detected before
                System.out.println("Identified existing person: " + person.getIdentifier());

            }

        }

    }

}

问题在于它总是将一张脸检测为新的,即使它是在前一帧中检测到的同一张脸。 rfaces 始终为空。它永远无法识别现有的面孔。我做错了什么?

另外,我不知道EigenFaceRecognizer creator 函数的参数应该是什么,也许这就是它无法识别任何东西的原因......

【问题讨论】:

    标签: java face-recognition openimaj


    【解决方案1】:

    您为EigenFaceRecogniser.create() 函数提供的参数不正确,因此这可能是您的问题的可能原因。以下方法更有可能奏效:

    EigenFaceRecogniser<KEDetectedFace, Person> faceRecognizer = EigenFaceRecogniser.create(20, new RotateScaleAligner(), 1, DoubleFVComparison.CORRELATION, 0.9f);
    

    说明:

    • 第一个参数是EigenFace算法中的主成分个数;确切的值通常是通过实验确定的,但大约 20 左右可能就可以了。

    • 第三个参数是用于 KNN 分类器的最近邻的数量。 1 个最近邻应该没问题。

    • 最后一个参数是分类器的距离阈值。相关性比较返回一个相似性度量(高值意味着更相似),因此给定的阈值是必须超过的下限。由于我们设置了 1 个最近邻,那么最相似的人脸与查询人脸的距离必须大于 0.9。 请注意,0.9 的值只是一个猜测;为了优化识别器的性能,您需要尝试一下。

    另一个小点 - 而不是:

        BufferedImage img = ImageIO.read(new ByteArrayInputStream(imgData));
        FImage fimg = ImageUtilities.createFImage(img);
    

    通常最好让 OpenIMAJ 读取您的图像,因为它可以解决 ImageIO 处理某些类型的 JPEG 的一些已知问题:

        FImage fimg = ImageUtilities.readF(new ByteArrayInputStream(imgData));
    

    【讨论】:

      猜你喜欢
      • 2017-11-23
      • 2016-07-15
      • 2018-11-13
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-12
      相关资源
      最近更新 更多