Face-Detector

Face-Detector es un componente web construido con StencilJs que permite la detección de rostros en entradas de video e imagen. Puede operar en modo cámara de video o carga de archivos, ofreciendo capacidades robustas para aplicaciones web.


Si deseas ver la documentación dentro de npm visita este link: Face-Detector npm. La version mostrada a continuación es 1.2.0-dev.15.


Objetivo


Proporcionar una herramienta esencial para el desarrollo web, ofreciendo capacidades de detección de rostros adaptadas para diversas aplicaciones.


Instalación


Antes de comenzar, asegúrese de tener instalado Node.js y npm en su máquina. Estas herramientas son necesarias para instalar y administrar las dependencias del proyecto.

  1. Node.js: Asegúrate de tener Node.js instalado en tu sistema. Puedes descargarlo e instalarlo desde aquí.
node --version
  1. npm: npm (Node Package Manager) generalmente se instala junto con Node.js. Verifica la instalación de npm con el siguiente comando:
npm -v

Una vez confirmado lo anterior, instala el paquete utilizando npm:

npm i @jaak.ai/[email protected]
  1. Este paquete necesita dependencias de biblioteca, si es necesario, puede instalar las dependencias manualmente usando este comando:
npm install @jaak.ai/video-camera @jaak.ai/file-uploader

Código Muestra


<face-detector
  config={{
    width: '640px',
    height: '480px',
    enableMicrophone: true,
    mode: 'video-camera',
    placeholder: 'Upload your document',
    buttonText: 'Upload',
    documentAccept: 'image/*',
    description: 'Please upload an image file.',
    size: 2048
  }}
  onStatus={(event) => handleStatusChange(event.detail)}
  onComponentError={(event) => handleComponentError(event.detail)}
  onFileResult={(event) => handleFileResult(event.detail)}
></face-detector>

Configuración


El componente puede ser configurado con múltiples opciones para adaptarse a las necesidades específicas de su aplicación. Las propiedades incluyen dimensiones del elemento de vídeo, habilitación del micrófono, modo de operación, configuraciones para la entrada de archivo, tamaño máximo del archivo, duración del vídeo, entre otros:

PropertyTypeDescription
widthstringAncho del elemento de video. Valor por defecto: 500px.
heightstringAlto del elemento de video. Valor por defecto: 400px.
enableMicrophonebooleanIndica si el micrófono debe estar habilitado. Valor por defecto: false.
modestringModo operativo, ya sea video-camera o upload-file. Valor por defecto: upload-file.
placeholderstringTexto del marcador de posición para la entrada de archivo.
buttonTextstringTexto mostrado en el botón de carga.
documentAcceptstringEspecifica los tipos de archivos que pueden ser cargados.
descriptionstringDescripción mostrada cerca de la entrada de archivo.
sizenumberTamaño máximo permitido del archivo en kilobytes. Valor por defecto: 5000.
videoDurationnumberDuración de la grabación de video en segundos. Valor por defecto: 4.
videoMediaTrackConstrainsDuración de la grabación de vídeo en segundos.
cameraSourcestringEspecifica qué cámara usar para la captura de video cuando hay múltiples fuentes disponibles, como user (cámara frontal) o environment (cámara trasera).
videoFormatstringDefine la resolución de video preferida y el formato de velocidad de fotogramas, como 1920x1080@30 para video 1080p a 30 cuadros por segundo.
autoRecorderbooleanSi el sistema detecta una cara en el modo de cámara de video, grabará un video (videoDuration).
hideFaceTrackerbooleanOculta la forma de monitoreo que se superpone en la cara encontrada durante la transmisión de video. Valor por defecto: false.
disableFaceDetectionbooleanDesactive el sistema de detección de rostros, el componente no busca rostros durante el video. Valor por defecto: false.
progressiveAutoRecorderbooleanEl componente no deja de grabar videos después de la primera grabación. ⚠️Aviso: deberá cerrar el ciclo de vida manualmente. Valor por defecto: false.
muteFaceDetectionMessagesbooleanDeshabilitar el envió de mensajes de detección de rostros durante la transmisión de video. Valor por defecto: false.
hideTimerbooleanEl indicador de grabación no se mostrará durante el proceso. Valor por defecto: false.
timerStylesTimerStylesDefinir los estilos del indicador de grabación durante el proceso.
faceTrackerStylesFaceTrackerStylesDefinir los estilos de la figura en el rostro encontrado por el sistema de detección.
offlineModelbooleanCargar el sistema de detección de rostros sin realizar solicitudes de Internet (almacenamiento local).

Eventos


El FaceDetectorComponent emite varios eventos que pueden ser utilizados para responder a cambios de estado, errores y resultados de archivos. Estos incluyen status, componentError, y fileResult:

EventDescription
statusEmitido cuando cambia el estado del componente.
componentErrorEmitido cuando ocurre un error en el componente.
fileResultEmitido con el resultado de la operación del archivo.
faceDetectionMessageEmitido con los resultados de la detección de rostros y sus detalles de estado y calidad.

Interfaces


FileResult Interface

La interfaz FileResult proporciona información detallada sobre el resultado de una operación de archivo:

PropiedadTipoDescripción
base64stringCadena codificada en Base64 del contenido del archivo.
typestringTipo MIME del archivo (opcional).
namestringNombre original del archivo (opcional).
sizenumberTamaño del archivo en bytes (opcional).

FaceDetectionMessage Interface

La interfaz FaceDetectionMessage proporciona información detallada sobre el resultado de la operación FaceDetection.

PropiedadTipoDescripción
labelstringEtiqueta que describe el resultado general de la detección de rostros.
detailsstringDetalles adicionales sobre el resultado de la detección de rostros.
faceExistbooleanIndica si se detectó una cara o no.
correctPositionbooleanIndica si la cara detectada está en la posición correcta según sea necesario.

TimerStyles Interface

La interfaz TimerStyles detalla los estilos del indicador de grabación con temporizador:

PropiedadTipoDescripción
colorstringColor del texto del indicador de progreso.
circleColorstringColor de la parte rellena del círculo de progreso.
circleColorEmptystringColor de la parte vacía del círculo de progreso.
circleColorSuccessstringColor del círculo de progreso cuando la tarea se realiza correctamente.
widthnumberAncho del círculo de progreso en píxeles.
heightnumberAltura del círculo de progreso en píxeles.
fontSizenumberTamaño de fuente del texto del indicador de progreso en píxeles.
posXnumberPosición horizontal del indicador de progreso. Acepta (0 - 100). Valor por defecto: 50.
posYnumberPosición vertical del indicador de progreso. Acepta (0 - 100). Valor por defecto: 50.
strokeWidthnumberAncho del trazo del círculo de progreso en píxeles.
dashArraystringPatrón de trazo y guión del círculo de progreso.

FaceTrackerStyles Interface

La interfaz detalla los estilos del indicador de seguimiento facial:

PropiedadTipoDescripción
validColorstringColor opcional utilizado para indicar una detección de rostro válida.
invalidColorstringColor opcional utilizado para indicar una detección de rostro no válida.

webComponentError Interface

La interfaz que detalla cuándo el componente arroja una operación de error:

PropiedadTipoDescripción
labelstringEtiqueta descriptiva que resume el error.
codestringCódigo opcional que identifica el tipo de error.
detailsanyDatos adicionales opcionales o información sobre el error.

Enum StatusFaceDetector

El enum StatusFaceDetector representa los diversos estados que el FaceDetectorComponent puede emitir durante su operación:

EstadoDescripción
NOT_LOADEDEstado inicial antes de que hayan comenzado las operaciones.
LOADINGEl componente está cargando los recursos necesarios.
LOADEDTodos los recursos están cargados y el componente está listo para ser usado.
RECORDINGEl componente está grabando video actualmente.
ERRORHa ocurrido un error en uno de los procesos.
UPLOADINGEl componente está subiendo un archivo.
RUNNINGEl componente está procesando activamente.
SNAPSHOTTINGEl componente está tomando una instantánea.
FINISHEDEl componente ha completado todas las tareas de procesamiento y registro.

Métodos


El componente ofrece varios métodos para interactuar con él:

  • turnOffFaceDetector(): Desactiva el detector de rostros, oculta la forma del modelo y cancela la suscripción al servicio de detección.
  • switchMode(newMode:video-camera | upload-file): Cambia el modo operativo del componente.
  • stopComponent(): Detiene las operaciones del componente invocando el método interno stopCore.
  • restartComponent(): Restablece el componente a su configuración inicial usando resetCore.
  • getMode(): Retorna el modo actual del componente.
  • recordVideo(): Inicia la grabación de video basado en la config.videoDuration y lo devuelve en formato Base64.
  • takeSnapshot(): Toma una instantánea usando el componente de video y lo retorna en formato Base64.
  • getVideoElement(): Retorna el elemento de video si está disponible en formato Base64.
  • getStream(): Recupera la transmisión multimedia del componente de la cámara de vídeo.
  • toggleCamera(): Alterna la cámara de video entre los modos frontal y posterior.
  • stopVideoStream(): Detiene la transmisión de video desde el componente de la cámara de video.
  • restartVideoStream(): Reanuda la transmisión de video desde el componente de la cámara de video.
  • resetFaceDetector(resetHard: boolean): Restablece el detector de rostros a su estado predeterminado y, opcionalmente, realiza un restablecimiento completo.

Ejemplos


JS

Ejemplo HTML and JavaScript

Utilizando node, y una vez que el paquete face-detector se encuentra instalado:

  1. Crea un archivo HTML

Crea un archivo HTML (por ejemplo, index.html). Copia y pega el siguiente código en el archivo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Ejemplo Face Detector</title>
  	<script type="module" src="https://unpkg.com/@jaak.ai/face-detector"></script>
</head>
<body>
    <!-- Incluir el componente Face Detector -->
    <face-detector id="faceDetector"></face-detector>

    <script type="module">
        // Seleccionar el componente face-detector
        const faceDetector = document.getElementById('faceDetector');

        // Configurar el componente con los ajustes iniciales
        faceDetector.config = {
            width: '640px',
            height: '480px',
            enableMicrophone: false,
            mode: 'video-camera', // o 'upload-file' para modo de carga de archivos
            placeholder: 'Upload your image',
            buttonText: 'Upload File',
            documentAccept: 'image/*',
            description: 'Please upload an image for face detection',
            size: 2048, // Tamaño máximo del archivo en kilobytes
            videoDuration: 5 // Duración en segundos para la grabación de video
        };

        // Manejar el evento de estado
        faceDetector.addEventListener('status', event => {
            console.log('Status event:', event.detail);
            // Puedes actualizar la UI basada en el estado aquí
        });

        // Manejar errores
        faceDetector.addEventListener('componentError', event => {
            console.error('Error event:', event.detail);
            // Mostrar mensajes de error al usuario
        });

        // Manejar resultados de archivos
        faceDetector.addEventListener('fileResult', event => {
            console.log('File result event:', event.detail);
            // Procesar el resultado del archivo, por ejemplo, mostrar la imagen o video
        });

        // Ejemplo de uso de un método del componente para cambiar modos
        function switchToUploadMode() {
            faceDetector.switchMode('upload-file');
        }

        // Agregar más lógica de funcionalidad o interacción según sea necesario
    </script>
</body>
</html>
  1. Despliega el archivo HTML

Usa un servidor web estático para servir el archivo HTML. Por ejemplo, puedes usar live-server:

npm install -g live-server
live-server

Navega a la URL proporcionada por live-server para ver tu página en acción.

ReactJS

Ejemplo ReactJS

  1. Configurar un proyecto React

Si no tienes un proyecto React, crea uno nuevo:

npx create-react-app face-detector-example
cd face-detector-example
  1. Instalar el paquete @jaak.ai/face-detector
npm install @jaak.ai/face-detector
  1. Crear el componente FaceDetector

⚠️ IMPORTANTE si está usando en la configuración(tsconfig) JSX con el valor “jsx-react“, tambien se debe declarar los HTML tags desde el index.ts

declare global {  
	namespace JSX {  
		interface IntrinsicElements {  
			'video-camera-recorder': React.DetailedHTMLProps\<  
				React.HTMLAttributes<HTMLElement>,  
				HTMLElement  
			>;  
		}  
	}  
}

Crea un archivo llamado FaceDetector.js dentro de la carpeta src. Copia y pega el siguiente código en FaceDetector.js:

import React, { useState, useEffect } from 'react';
import { defineCustomElements } from '@jaak.ai/face-detector/loader';


const FaceDetector = () => {
    const [status, setStatus] = useState('');
    const [error, setError] = useState(null);
    const [fileResult, setFileResult] = useState(null);

    useEffect(() => {
      defineCustomElements(window);
    }, []);

    const handleStatusChange = (event) => {
        setStatus(event.detail);
    };

    const handleError = (event) => {
        setError(event.detail);
    };

    const handleFileResult = (event) => {
        setFileResult(event.detail);
    };

    return (
        <div>
            <face-detector
                id="faceDetector"
                onStatus={handleStatusChange}
                onComponentError={handleError}
                onFileResult={handleFileResult}
                config={JSON.stringify({
                    width: '640px',
                    height: '480px',
                    enableMicrophone: true,
                    mode: 'video-camera',
                    placeholder: 'Upload your image',
                    buttonText: 'Upload File',
                    documentAccept: 'image/*',
                    description: 'Please upload an image for face detection',
                    size: 2048,
                    videoDuration: 5
                })}
            ></face-detector>

            <div>Status: {status}</div>
            <div>Error: {error && error.label}</div>
            <div>File Result: {fileResult && fileResult.base64}</div>
        </div>
    );
};

export default FaceDetector;
  1. Usa el componente FaceDetector

Abre el archivo src/App.js y modifica el contenido para incluir el componente FaceDetector:

import React from 'react';
import FaceDetector from './FaceDetector';

function App() {
  return (
    <div className="App">
      <FaceDetector />
    </div>
  );
}

export default App;
  1. Iniciar la aplicación de React
npm run start

Abre tu navegador y navega a http://localhost:3000 para ver tu componente en acción.

Angular

Ejemplo Angular

  1. Configurar un proyecto Angular

Si no tienes un proyecto Angular, crea uno nuevo:

ng new face-detector-example
cd face-detector-example
  1. Instalar el paquete @jaak.ai/face-detector package
npm install @jaak.ai/face-detector
  1. Crear el componente FaceDetector

Abre el archivo src/app/app.component.ts y modifícalo con el siguiente contenido:

import { Component, OnInit } from '@angular/core';

@Component({
  selector: 'app-root',
  template: `
    <face-detector
      (status)="handleStatus($event)"
      (componentError)="handleError($event)"
      (fileResult)="handleFileResult($event)"
      [config]="config">
    </face-detector>

    <div>Status: {{ status }}</div>
    <div>Error: {{ error?.details }}</div>
    <div>File Result: {{ fileResult?.base64 }}</div>
  `
})
export class AppComponent implements OnInit {
  status: string;
  error: any;
  fileResult: any;
  config = {
    width: '640px',
    height: '480px',
    enableMicrophone: true,
    mode: 'video-camera',
    placeholder: 'Upload your image',
    buttonText: 'Upload File',
    documentAccept: 'image/*',
    description: 'Please upload an image for face detection',
    size: 2048,
    videoDuration: 5
  };

  ngOnInit(): void {
    // Registro de elementos personalizados o cualquier lógica de inicialización
  }

  handleStatus(event: CustomEvent) {
    this.status = event.detail;
  }

  handleError(event: CustomEvent) {
    this.error = event.detail;
  }

  handleFileResult(event: CustomEvent) {
    this.fileResult = event.detail;
  }
}
  1. Configurar angular.json

Asegúrate de que tu archivo angular.json incluya el script necesario para cargar el componente de Stencil. Agrega lo siguiente bajo la sección de scripts:

"scripts": [
  "node_modules/@jaak.ai/face-detector/dist/face-detector/face-detector.js"
]
  1. Iniciar la aplicación Angular
ng serve

Abre tu navegador y navega a http://localhost:4200 para ver tu componente en acción.


ℹ️ Para obtener más información sobre cómo implementar la detección de rostros en una aplicación React, puedes revisar la sección de Ejemplos en el siguiente enlace: github.com/jaak-ai/face-detector-react-example. Allí encontrarás un proyecto práctico con instrucciones para configurar y ejecutar el ejemplo.