如何在Android上使用FaceDetector.Face进行人脸识别

如何在Android上使用FaceDetector.Face进行人脸识别,第1张

概述这是我在这里的第一篇文章,所以如果我的问题不明确或者提供的信息不足,我很抱歉. 我目前正在研究一种可以识别图片中脸部的Android应用程序. 我的第一个方法是使用JavaCV并且一切正常,除了面部检测需要花费太多时间才能完成的事实! 之后,我尝试使用FaceDetector.Face检测面部.然后我使用检测到的面部来训练我的脸部识别器模型.到目前为止没有发现任何错误. 我的问题是我的模型无法识别 这是我在这里的第一篇文章,所以如果我的问题不明确或者提供的信息不足,我很抱歉.

我目前正在研究一种可以识别图片中脸部的Android应用程序.

我的第一个方法是使用JavaCV并且一切正常,除了面部检测需要花费太多时间才能完成的事实!

之后,我尝试使用FaceDetector.Face检测面部.然后我使用检测到的面部来训练我的脸部识别器模型.到目前为止没有发现任何错误.

我的问题是我的模型无法识别FaceDetector.Face给出的任何检测到的面部.我总是从预测函数得到-1.谁能说出可能出错的地方呢?先感谢您!

这是我在检测后裁剪面部的方法:

for(int count=0;count<NUMBER_OF_FACE_DETECTED;count++)    {        Face face=detectedFaces[count];        PointF mIDPoint=new PointF();        face.getMIDPoint(mIDPoint);                 eyedistance=face.eyesdistance();        left = mIDPoint.x - (float)(1.4 * eyedistance);        top = mIDPoint.y - (float)(1.8 * eyedistance);        bmFace = Bitmap.createBitmap(origiImage,(int) left,(int) top,(int) (2.8 * eyedistance),(int) (3.6 * eyedistance));                  bmFaces.add(bmFace);    }

这是培训模型的主要部分.

MatVector images = new MatVector(imagefiles.length);                int[] labels = new int[imagefiles.length];    Iplimage img;    Iplimage grayImage;    FaceRecognizer faceRecognizer = createLBPHFaceRecognizer(1,8,binaryTreshold);    try    {                  fileinputStream fstream = new fileinputStream(working_Dir.getabsolutePath()+"/csv.txt");        BufferedReader br = new BufferedReader(new inputStreamReader(fstream));        String imgInfo;        for (int i = 0; (imgInfo = br.readline()) != null; i++)          {            String info[] = imgInfo.split(";");            String imagePath = info[0];                         img = cvLoadImage(imagePath);            grayImage = Iplimage.create(img.wIDth(),img.height(),IPL_DEPTH_8U,1);            cvCvtcolor(img,grayImage,CV_BGR2GRAY);            images.put(i,grayImage);            labels[i] = Integer.parseInt(info[1]);;        }        in.close();        //train the FaceRecognizer model                 faceRecognizer.train(images,labels);    }catch (Exception e)    {        System.err.println("Error: " + e.getMessage());    }

最后我用以下代码识别face:

public static String IDentifyFace(Iplimage grayimg){    String predictedname = "";    //IDentify face from the image    int predictedLabel = faceRecognizer.predict(grayimg);    if(predictedLabel != -1 )    {        predictedname = new String(IDToname.get(predictedLabel));    }    return predictedname;}
解决方法 只有在未正确设置阈值时才会发生这种情况,请参阅文档:

> http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_api.html#createlbphfacerecognizer

创建LBPHFaceRecognizer的方法是:

Ptr<FaceRecognizer> createLBPHFaceRecognizer(int radius=1,int neighbors=8,int grID_x=8,int grID_y=8,double threshold=DBL_MAX)

,其中:

> threshold – 预测中应用的阈值.如果到最近邻居的距离大于阈值,则此方法返回-1.

因此,在上面的方法签名中,您会看到默认情况下阈值设置为DBL_MAX.因此,如果您只是将阈值排除在外,那么它永远不会产生-1.另一方面,如果将阈值设置得太低,FaceRecognizer总是会产生-1.也就是说,检查你在代码中设置了binaryTreshold的内容.为您的数据找到合适的决策阈值是一个典型的优化问题,您必须根据给定的标准(例如基于错误接受率/错误拒绝率)优化最佳阈值.

总结

以上是内存溢出为你收集整理的如何在Android上使用FaceDetector.Face进行人脸识别全部内容,希望文章能够帮你解决如何在Android上使用FaceDetector.Face进行人脸识别所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1134951.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存