7

これは私の最初の投稿です。私の質問が明確でないか、十分な情報が提供されていない場合は申し訳ありません。

私は現在、写真から顔を認識できる 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, 8, 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());
    }

最後に、次のコードで顔を認識します。

    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;
}
4

2 に答える 2

2

これは、しきい値を適切に設定しない場合にのみ発生する可能性があります。ドキュメントを参照してください。

を作成する方法LBPHFaceRecognizerは次のとおりです。

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

、 どこ:

  • しきい値 – 予測に適用されるしきい値。最近隣までの距離がしきい値より大きい場合、このメソッドは -1 を返します。

したがって、上記のメソッド シグネチャでは、しきい値がDBL_MAXデフォルトで に設定されていることがわかります。したがって、単純にしきい値を除外すると、絶対に得られません-1。一方、しきい値を低く設定しすぎると、FaceRecognizer は常に-1. とはいえbinaryTreshold、コードで設定した内容を確認してください。データの適切な決定しきい値を見つけることは、古典的な最適化問題であり、特定の基準 (たとえば、偽受諾率/偽拒否率に基づく) によって最適なしきい値を最適化する必要があります。

于 2013-01-10T21:25:24.030 に答える