gpt4 book ai didi

java - 如何使用 OpenIMAJ 识别新面孔

转载 作者:行者123 更新时间:2023-11-30 07:18:17 26 4
gpt4 key购买 nike

我在我的 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 函数应该是,也许这就是为什么它无法识别任何东西的原因......

最佳答案

您为 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));

关于java - 如何使用 OpenIMAJ 识别新面孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15496269/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com