Cómo utilizar FaceDetector.Face para el reconocimiento facial en Android

Este es mi primer post aquí por lo que siento si mi pregunta no es clara o no hay suficiente información proporcionada.

Actualmente estoy trabajando en una aplicación de Android que podría reconocer caras de imágenes.

Mi primer enfoque fue utilizar JavaCV y todo funciona bien, excepto el hecho de que la detección de rostros tarda demasiado tiempo en terminar!

Después de eso, traté de detectar caras utilizando FaceDetector.Face. Luego usé las caras detectadas para entrenar mi modelo de reconocimiento de cara. No se ha encontrado ningún error hasta ahora.

Mi problema es que mi modelo no podía reconocer ningún rostro detectado dado por FaceDetector.Face. Siempre obtengo -1 de la función de predicción. ¿Podría alguien decir lo que podría estar mal? ¡Gracias de antemano!

Así es como recorte las caras después de la detección:

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

Aquí está una parte principal de la formación del modelo.

  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()); } 

Finalmente reconozco la cara con el código siguiente:

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

Esto sólo puede ocurrir si no establece el umbral de forma adecuada, consulte la documentación:

El método para crear un LBPHFaceRecognizer es:

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

, dónde:

  • Umbral – El umbral aplicado en la predicción. Si la distancia al vecino más cercano es mayor que el umbral, este método devuelve -1.

Por lo tanto, en la firma del método anterior se ve, que el umbral se establece en DBL_MAX de forma predeterminada. Así que si usted simplemente deja el umbral fuera, entonces nunca se producirá -1 . Por otro lado, si establece el umbral demasiado bajo, el FaceRecognizer siempre va a producir -1 . Dicho esto, comprueba lo que has establecido binaryTreshold en tu código. Encontrar el umbral de decisión adecuado para sus datos es un problema clásico de optimización, en el que tiene que optimizar el mejor umbral según un criterio determinado (por ejemplo, basado en la tasa de aceptación falsa / tasa de rechazo falsa).

Sé que esto es muy tarde, pero trate de usar Haar cascada clasificador de JavaCV en lugar de facedetector de Android mismo

  • Error opencv: No se pudo cargar opencv_contrib: findLibrary returned null
  • Cómo convertir imágenes en vídeo en android con javacv?
  • Muxing Android MediaCodec codificado H264 paquetes en RTMP
  • Android Detección de la cara con OpenCV / JavaCV
  • Vista de la computadora Android JavaCV OpenCV FastCV comparación
  • Mostrar dos vídeos juntos y luego mostrar como un video fusionado en una sola pantalla
  • JavaCV Android, Colores extraños en la superposición mientras se transmite al servidor rtmp
  • Javacv: la aplicación termina con opencv_contrib.createLBPHFaceRecognizer
  • Devolver objeto Mat desde código nativo a java en OpenCV
  • JavaCV - Rendimiento a una superficie GL
  • Opencv manager package no se ha encontrado ?? Cómo instalar automáticamente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.