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.
- La orientación del grabador de vídeo JavaCV no es adecuada en modo retrato
- Android OpenCV Buscar contornos
- Cómo instalar JavaCV en Android y utilizar FrameGrabber
- Reproducción de un vídeo con JavaCV y FFmpeg
- Grabación de vídeo en Android usando JavaCV (Actualizado 2014 02 17)
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; }
- Cargar URL de vídeo en FFmpegFrameGrabber
- Reconocimiento de rostros con JavaCV
- Imagen de limpieza para ayudar a tesseract en Android
- Android JavaCV dilema, NoClassDefFoundError lanzado dentro del método 'dibujar' cuando se crea IplImage
- crear video de la secuencia de imágenes en android
- Javacv: Decodificación H.264 "en vivo" de la corriente procedente del servidor red5 en el dispositivo Android
- Configuración de JavaCV en Android Studio
- Reconocimiento de rostro inestable con OpenCV
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
- Los códigos de error de inicio de MediaRecorder
- Patrón de comandos para pasar los métodos de actividad de la aplicación?