これは私の最初の投稿です。私の質問が明確でないか、十分な情報が提供されていない場合は申し訳ありません。
私は現在、写真から顔を認識できる 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;
}