tutoriales.com

React Native y Detección Facial: Creando Experiencias Interactivas con ML Kit

Este tutorial te guiará a través de la implementación de detección facial en aplicaciones React Native. Utilizaremos el poderoso ML Kit de Google para procesar imágenes de la cámara, detectar rostros y extraer información valiosa como la posición de los ojos y la boca, así como expresiones faciales. Aprenderás desde la configuración inicial hasta la visualización de resultados.

Intermedio20 min de lectura6 views
Reportar error

🚀 Introducción a la Detección Facial en React Native con ML Kit

La detección facial es una tecnología fascinante que permite a las aplicaciones identificar la presencia y la ubicación de rostros humanos en imágenes o transmisiones de video. Más allá de simplemente reconocer un rostro, la detección facial puede analizar características clave como la posición de los ojos, la nariz y la boca, e incluso estimar la orientación y las expresiones faciales.

En este tutorial, exploraremos cómo integrar esta capacidad en tus aplicaciones de React Native utilizando el ML Kit de Google. ML Kit es una suite de aprendizaje automático lista para usar que te permite añadir potentes funcionalidades de ML a tus aplicaciones móviles de forma sencilla, y la detección facial es una de sus características más destacadas.

¿Por qué ML Kit para Detección Facial?

ML Kit ofrece una solución robusta y optimizada para la detección facial en dispositivos móviles. Algunas de sus ventajas clave incluyen:

  • Rendimiento: Está optimizado para ejecutarse directamente en el dispositivo (on-device), lo que significa procesamiento rápido y sin necesidad de conexión a internet para la detección básica.
  • Precisión: Ofrece una alta precisión en la detección y el seguimiento de rostros, incluso en diferentes ángulos y condiciones de iluminación.
  • Funcionalidades: Además de la detección, permite la extracción de puntos de referencia faciales (landmarks), contornos, clasificación de expresiones (sonrisa, ojos abiertos) y seguimiento de rostros en video.
  • Integración Sencilla: Diseñado para ser fácil de integrar en plataformas móviles como Android e iOS, y con librerías de terceros, también en React Native.

💡 Consejo: La detección facial no es lo mismo que el reconocimiento facial. La detección facial identifica la presencia y ubicación de un rostro, mientras que el reconocimiento facial identifica a la persona específica a la que pertenece ese rostro.


🛠️ Configuración Inicial del Proyecto React Native

Antes de sumergirnos en la detección facial, necesitamos configurar nuestro entorno de desarrollo y crear un nuevo proyecto React Native. Utilizaremos react-native-cli o Expo para la creación del proyecto. Para este tutorial, asumiremos un proyecto de React Native "bare" (sin Expo Managed Workflow), ya que ML Kit a menudo requiere configuraciones nativas que son más accesibles en este tipo de proyecto.

1. Crear un Nuevo Proyecto React Native

Si aún no tienes un proyecto, crea uno nuevo con el siguiente comando:

npx react-native init FaceDetectionApp
cd FaceDetectionApp

2. Instalar Librerías Clave

Para interactuar con la cámara y ML Kit, necesitaremos algunas librerías esenciales. La más común para la cámara es react-native-camera o react-native-vision-camera. Para este tutorial, usaremos react-native-vision-camera por su rendimiento y su mejor integración con módulos de ML como react-native-vision-camera-mlkit.

Primero, instala react-native-vision-camera:

npm install react-native-vision-camera
cd ios && pod install && cd ..

Luego, instala react-native-vision-camera-mlkit. Esta librería nos proporcionará los hooks y las utilidades para integrar ML Kit con la cámara.

npm install react-native-vision-camera-mlkit
cd ios && pod install && cd ..

3. Configuración Nativa (iOS y Android)

La integración de librerías nativas como la cámara y ML Kit requiere permisos y configuraciones específicas en los proyectos de iOS y Android.

🍏 Configuración para iOS

  1. Permisos de Cámara: Abre tu proyecto en Xcode (o edita Info.plist). Añade la clave NSCameraUsageDescription con una descripción de por qué tu app necesita acceso a la cámara.
<key>NSCameraUsageDescription</key>
<string>Para detectar rostros en tiempo real.</string>
  1. Instalación de Pods (si no lo hiciste antes): Asegúrate de haber ejecutado cd ios && pod install después de instalar las librerías.

🤖 Configuración para Android

  1. Permisos de Cámara: En android/app/src/main/AndroidManifest.xml, asegúrate de tener los permisos de cámara:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <!-- Opcional, si planeas usar audio -->
  1. Configuración de Gradle: Para ML Kit, podrías necesitar añadir o verificar la configuración en android/app/build.gradle. La librería react-native-vision-camera-mlkit debería manejar la mayoría de las dependencias por ti, pero si encuentras errores, asegúrate de que tengas minSdkVersion al menos 21 y compileSdkVersion y targetSdkVersion a 31 o superior.
android {
// ...
defaultConfig {
// ...
minSdkVersion 21
targetSdkVersion 33 // O la versión más reciente
compileSdkVersion 33 // O la versión más reciente
// ...
}
// ...
}

📸 Accediendo a la Cámara con react-native-vision-camera

Antes de detectar rostros, necesitamos mostrar la transmisión de la cámara en nuestra aplicación. react-native-vision-camera es una excelente opción por su flexibilidad y rendimiento.

1. Solicitando Permisos de Cámara

Es fundamental solicitar los permisos de la cámara al usuario antes de intentar acceder a ella. Esto se hace típicamente cuando el componente de la cámara se monta por primera vez.

import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet, PermissionsAndroid, Platform } from 'react-native';
import { Camera, useCameraDevices } from 'react-native-vision-camera';

function App() {
  const [hasPermission, setHasPermission] = useState(false);
  const devices = useCameraDevices();
  const device = devices.back; // Usar la cámara trasera

  useEffect(() => {
    async function getCameraPermission() {
      if (Platform.OS === 'android') {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.CAMERA,
          {
            title: 'Permiso de Cámara',
            message: 'Tu aplicación necesita acceso a la cámara para la detección facial.',
            buttonNeutral: 'Preguntar Luego',
            buttonNegative: 'Cancelar',
            buttonPositive: 'OK',
          },
        );
        setHasPermission(granted === PermissionsAndroid.RESULTS.GRANTED);
      } else {
        const status = await Camera.requestCameraPermission();
        setHasPermission(status === 'authorized');
      }
    }
    getCameraPermission();
  }, []);

  if (!hasPermission) {
    return <Text>Esperando permisos de cámara...</Text>;
  }

  if (device == null) {
    return <Text>No se encontró la cámara.</Text>;
  }

  return (
    <View style={styles.container}>
      <Camera
        style={StyleSheet.absoluteFill}
        device={device}
        isActive={true}
      />
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
});

export default App;

2. Probando la Cámara

Ejecuta la aplicación en tu dispositivo o emulador. Deberías ver la transmisión de la cámara trasera llenando la pantalla. Si no es así, revisa los permisos y la configuración nativa.

💡 Consejo: Siempre prueba las funcionalidades de la cámara en un dispositivo real para obtener la mejor experiencia y depuración.

✨ Integrando ML Kit para Detección Facial

Ahora que tenemos la cámara funcionando, es hora de integrar la detección facial de ML Kit. La librería react-native-vision-camera-mlkit simplifica este proceso al proporcionar un frame processor que podemos conectar directamente a la Camera.

1. El Frame Processor para Detección Facial

Un frame processor es una función que se ejecuta para cada fotograma de video que la cámara captura. react-native-vision-camera-mlkit nos da un useFaceDetector hook que crea este procesador.

Modifica tu App.js:

import React, { useState, useEffect } from 'react';
import { View, Text, StyleSheet, PermissionsAndroid, Platform } from 'react-native';
import { Camera, useCameraDevices } from 'react-native-vision-camera';
import { useFaceDetector, Face } from 'react-native-vision-camera-mlkit';

function App() {
  const [hasPermission, setHasPermission] = useState(false);
  const devices = useCameraDevices();
  const device = devices.front; // Usar la cámara frontal para probar fácilmente
  const [faces, setFaces] = useState<Face[]>([]);

  useEffect(() => {
    async function getCameraPermission() {
      if (Platform.OS === 'android') {
        const granted = await PermissionsAndroid.request(
          PermissionsAndroid.PERMISSIONS.CAMERA,
          {
            title: 'Permiso de Cámara',
            message: 'Tu aplicación necesita acceso a la cámara para la detección facial.',
            buttonNeutral: 'Preguntar Luego',
            buttonNegative: 'Cancelar',
            buttonPositive: 'OK',
          },
        );
        setHasPermission(granted === PermissionsAndroid.RESULTS.GRANTED);
      } else {
        const status = await Camera.requestCameraPermission();
        setHasPermission(status === 'authorized');
      }
    }
    getCameraPermission();
  }, []);

  // Configuración del detector facial de ML Kit
  const frameProcessor = useFaceDetector({ 
    // Opciones del detector de rostros
    // Ver la documentación de ML Kit para más detalles
    // Por ejemplo: enableClassification: true, enableLandmarks: true, enableTracking: true
    enableClassification: true, // Detectar si los ojos están abiertos, si sonríe
    enableLandmarks: true,      // Detectar puntos clave como ojos, nariz, boca
    enableTracking: true,       // Seguir rostros a lo largo de los fotogramas
    minFaceSize: 0.15,          // Tamaño mínimo del rostro en relación al tamaño de la imagen
  }, (detectedFaces) => {
    setFaces(detectedFaces);
  });

  if (!hasPermission) {
    return <Text>Esperando permisos de cámara...</Text>;
  }

  if (device == null) {
    return <Text>No se encontró la cámara.</Text>;
  }

  return (
    <View style={styles.container}>
      <Camera
        style={StyleSheet.absoluteFill}
        device={device}
        isActive={true}
        frameProcessor={frameProcessor}
        frameProcessorFps={30} // Procesar a 30 FPS
      />
      {/* Aquí dibujaremos los resultados de la detección */}
      {faces.map((face, index) => (
        <View
          key={index}
          style={[
            styles.faceBox,
            {
              left: face.bounds.left,
              top: face.bounds.top,
              width: face.bounds.width,
              height: face.bounds.height,
              borderColor: face.smilingProbability > 0.5 ? 'green' : 'red',
            },
          ]}
        >
          <Text style={styles.faceIdText}>ID: {face.trackingId}</Text>
          {face.smilingProbability && (
            <Text style={styles.faceDataText}>😊 Sonriendo: {Math.round(face.smilingProbability * 100)}%</Text>
          )}
          {face.leftEyeOpenProbability && (
            <Text style={styles.faceDataText}>👁️ Izq. Abierto: {Math.round(face.leftEyeOpenProbability * 100)}%</Text>
          )}
          {face.rightEyeOpenProbability && (
            <Text style={styles.faceDataText}>👁️ Der. Abierto: {Math.round(face.rightEyeOpenProbability * 100)}%</Text>
          )}
          {/* Puedes dibujar puntos de referencia aquí si los habilitaste */}
        </View>
      ))}
    </View>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  faceBox: {
    position: 'absolute',
    borderWidth: 2,
    borderRadius: 5,
    padding: 5,
    backgroundColor: 'rgba(255, 255, 255, 0.2)',
  },
  faceIdText: {
    color: 'white',
    fontSize: 12,
    fontWeight: 'bold',
  },
  faceDataText: {
    color: 'white',
    fontSize: 10,
  }
});

export default App;

2. Entendiendo las Propiedades de Face

Cuando ML Kit detecta un rostro, devuelve un objeto Face con diversas propiedades:

  • bounds: Un objeto con left, top, width, height que define el recuadro delimitador del rostro.
  • headEulerAngleX, headEulerAngleY, headEulerAngleZ: Ángulos que indican la orientación del rostro (cabeceo, giro, balanceo).
  • smilingProbability: Probabilidad de que la persona esté sonriendo (solo si enableClassification está en true).
  • leftEyeOpenProbability, rightEyeOpenProbability: Probabilidad de que cada ojo esté abierto (solo si enableClassification está en true).
  • landmarks: Un objeto que contiene las posiciones de puntos clave como leftCheek, rightCheek, leftEye, rightEye, noseBase, mouthLeft, mouthRight, mouthBottom. (solo si enableLandmarks está en true).
  • contours: Conjunto de puntos que definen los contornos de diferentes partes del rostro (solo si enableContours está en true).
  • trackingId: Un ID que permite seguir el mismo rostro a lo largo de múltiples fotogramas (solo si enableTracking está en true).
🔥 Importante: Las probabilidades y los puntos de referencia solo se devolverán si las opciones correspondientes (`enableClassification`, `enableLandmarks`) se establecen en `true` al inicializar el `useFaceDetector` hook.

🎨 Visualizando los Resultados de la Detección

Ahora que estamos obteniendo datos de detección, es crucial visualizarlos de una manera intuitiva. Dibujaremos un recuadro alrededor de cada rostro detectado y mostraremos información relevante.

1. Dibujando el Recuadro Delimitador

En el código anterior, ya hemos añadido un <View> que se superpone a la cámara y se posiciona y dimensiona según las bounds de cada rostro detectado. Hemos añadido un estilo borderColor que cambia según la probabilidad de sonrisa.

  faceBox: {
    position: 'absolute',
    borderWidth: 2,
    borderRadius: 5,
    padding: 5,
    backgroundColor: 'rgba(255, 255, 255, 0.2)',
  },
  faceIdText: {
    color: 'white',
    fontSize: 12,
    fontWeight: 'bold',
  },
  faceDataText: {
    color: 'white',
    fontSize: 10,
  }

El position: 'absolute' es clave para superponer los elementos sobre la Camera que tiene StyleSheet.absoluteFill.

2. Añadiendo Información Detallada

Dentro de cada faceBox, podemos mostrar más detalles obtenidos de las propiedades de Face. Hemos incluido el trackingId y las probabilidades de sonrisa y ojos abiertos.

          <Text style={styles.faceIdText}>ID: {face.trackingId}</Text>
          {face.smilingProbability && (
            <Text style={styles.faceDataText}>😊 Sonriendo: {Math.round(face.smilingProbability * 100)}%</Text>
          )}
          {face.leftEyeOpenProbability && (
            <Text style={styles.faceDataText}>👁️ Izq. Abierto: {Math.round(face.leftEyeOpenProbability * 100)}%</Text>
          )}
          {face.rightEyeOpenProbability && (
            <Text style={styles.faceDataText}>👁️ Der. Abierto: {Math.round(face.rightEyeOpenProbability * 100)}%</Text>
          )}

3. Visualizando Puntos de Referencia (Landmarks) y Contornos

Si habilitaste enableLandmarks: true en el useFaceDetector hook, puedes acceder a face.landmarks. De manera similar, para contornos, enableContours: true y luego face.contours.

Para dibujar estos puntos, necesitarías añadir más <View>s o `

`s superpuestos. Aquí tienes un ejemplo de cómo podrías dibujar los puntos de los ojos y la nariz: ```jsx // Dentro del map de faces, después de las probabilidades: {face.landmarks.leftEye && ( )} {face.landmarks.rightEye && ( )} {face.landmarks.noseBase && ( )} ``` Y añadir el estilo para `landmarkPoint`: ```css landmarkPoint: { position: 'absolute', width: 6, height: 6, borderRadius: 3, backgroundColor: 'white', }, ```
📌 Nota: Las coordenadas de `landmarks` y `contours` se proporcionan en relación al fotograma de la cámara. Asegúrate de que tu superposición tiene el mismo tamaño y posición que el `Camera` para que la superposición sea precisa.
1. Inicio de la App 2. Solicitar Permiso de Cámara 3. Acceso a VisionCamera (Input: Frame Processor) 4. ML Kit: Detección Facial (Output: Array de Rostros) 5. Renderizar Cámara + UI (Recuadros y Puntos de Referencia)

🧪 Opciones Avanzadas y Consideraciones de Rendimiento

ML Kit es potente, pero como cualquier procesamiento intensivo, requiere consideración en términos de rendimiento y uso de recursos.

1. Optimizando el Frame Processor

  • frameProcessorFps: En la Camera component, puedes controlar cuántos fotogramas por segundo se envían al procesador. Un valor más bajo (15 o 10) puede reducir la carga de la CPU si no necesitas una detección ultrarrápida.
  • Opciones del useFaceDetector: Desactiva las opciones que no necesites (enableClassification, enableLandmarks, enableTracking, enableContours). Cada una de estas añade una sobrecarga de procesamiento.
    • FAST_MODE vs ACCURATE_MODE: ML Kit permite seleccionar un modo para la detección de rostros. El FAST_MODE es más rápido pero menos preciso, ideal para casos de uso de alta velocidad. ACCURATE_MODE es más lento pero ofrece mayor precisión.
import { FaceDetectorPerformanceMode } from 'react-native-vision-camera-mlkit';
// ... dentro de useFaceDetector
performanceMode: FaceDetectorPerformanceMode.FAST, // o ACCURATE

2. Gestión de Recursos y Ciclo de Vida

Asegúrate de que la cámara se detenga y libere recursos cuando el componente no esté visible o la aplicación esté en segundo plano. react-native-vision-camera maneja esto automáticamente si isActive se establece correctamente, pero es algo a tener en cuenta.

3. Consideraciones sobre la Orientación del Dispositivo

Las coordenadas de los rostros se devuelven en el espacio de la imagen de la cámara. Es posible que necesites ajustar las coordenadas si la orientación de tu aplicación es diferente de la orientación nativa de la cámara o si permites la rotación de la pantalla.

4. Alternativas a react-native-vision-camera-mlkit

Aunque react-native-vision-camera-mlkit es excelente, hay otras opciones:

  • @react-native-firebase/ml: Esta librería proporciona una integración más directa con Firebase ML Kit, pero puede requerir más trabajo manual para conectar la transmisión de la cámara.
  • react-native-camera: Es otra librería popular para la cámara, y existen módulos de ML Kit que se integran con ella, aunque react-native-vision-camera es generalmente preferida por su rendimiento y su API más moderna.
90% Completado

💡 Ejemplos de Uso y Aplicaciones Prácticas

La detección facial abre un mundo de posibilidades para aplicaciones interactivas y creativas:

1. Filtros de Realidad Aumentada (AR) 🎭

Coloca máscaras, gafas o sombreros virtuales sobre los rostros detectados. Utiliza los landmarks o contours para alinear los objetos virtuales con precisión.

2. Apps de Bienestar y Salud Mental 😌

Monitorea expresiones faciales para detectar signos de fatiga, estrés o emociones. Por ejemplo, una app que te sugiere tomar un descanso si detecta signos de cansancio visual.

3. Juegos Interactivos 🎮

Crea juegos donde los usuarios controlan personajes o interactúan con elementos usando expresiones faciales o movimientos de cabeza.

4. Asistencia en Accesibilidad ♿

Desarrolla interfaces de usuario que puedan ser controladas por movimientos de cabeza o parpadeos para personas con movilidad reducida.

5. Edición de Fotos y Video 📸

Aplicaciones que pueden mejorar automáticamente las fotos, por ejemplo, corrigiendo el 'red-eye' o aplicando efectos de belleza específicos en los rostros.

¿Qué otros datos puedo extraer de ML Kit?

Además de la posición del rostro, los puntos de referencia y las probabilidades de sonrisa/ojos abiertos, ML Kit puede estimar la orientación 3D del rostro (Euler X, Y, Z), lo cual es útil para determinar hacia dónde está mirando el usuario. También puedes obtener contornos faciales detallados para una superposición AR más precisa.


conclusión ✨

Has llegado al final de este tutorial sobre detección facial en React Native con ML Kit. Hemos cubierto la configuración del entorno, la integración de la cámara, la implementación del detector facial de ML Kit y la visualización de los resultados. Ahora tienes las herramientas necesarias para empezar a construir tus propias aplicaciones interactivas y conscientes del rostro.

La detección facial es un campo en constante evolución, y ML Kit de Google es una excelente puerta de entrada para los desarrolladores móviles que desean añadir inteligencia artificial a sus aplicaciones. ¡Experimenta con las diferentes opciones, construye algo increíble y diviértete!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!