UNPKG

@the-horizon-dev/fast-face-detection

Version:

Fast face detection package using TensorFlow.js MediaPipe models for browser and Node.js environments

335 lines (248 loc) 10.8 kB
# Fast Face Detection Um pacote poderoso e fácil de usar para detecção facial e landmarks usando os modelos MediaPipe. ## Características - ✅ Detecção facial rápida e precisa - ✅ Detecção de landmarks faciais - ✅ Rastreamento de faces (tracking) - ✅ Funciona em navegadores, Node.js e React Native - ✅ API simples e fácil de usar - ✅ Tipagem completa em TypeScript - ✅ Tratamento robusto de erros - ✅ Métricas de performance - ✅ Sem necessidade de conhecimento de TensorFlow ## Instalação ```bash npm install @the-horizon-dev/fast-face-detection ``` ### Dependências para Ambientes Específicos O pacote carrega automaticamente apenas as dependências necessárias para cada ambiente: #### Aplicações Web (navegadores) ```bash # O pacote principal já inclui tudo que você precisa para navegadores npm install @the-horizon-dev/fast-face-detection ``` #### React Native ```bash # Para React Native, é necessário instalar uma dependência adicional: npm install @the-horizon-dev/fast-face-detection @tensorflow/tfjs-react-native ``` #### Node.js ```bash # Para Node.js, você precisará do módulo canvas: npm install @the-horizon-dev/fast-face-detection canvas # Para melhor performance em Node.js, recomendamos instalar o backend nativo: npm install @tensorflow/tfjs-node ``` > **Nota**: O pacote agora trata `@tensorflow/tfjs-node` como uma dependência opcional, o que significa que ele não será instalado automaticamente em ambientes de navegador. Isso evita problemas com dependências específicas do Node.js como `@mapbox/node-pre-gyp`. ## Uso Básico ```typescript import { mediapipeFace } from '@the-horizon-dev/fast-face-detection'; // Detectar faces em uma imagem async function detectFaces(imageElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) { // Detectar faces const faces = await mediapipeFace.detectFaces(imageElement); console.log(`Encontradas ${faces.length} faces!`); // Acessar informações de cada face faces.forEach(face => { const { x, y, width, height } = face.detection.box; const score = face.detection.score; console.log(`Face em (${x}, ${y}) com tamanho ${width}x${height}, confiança: ${score}`); }); } // Detectar faces com landmarks async function detectLandmarks(imageElement: HTMLImageElement | HTMLVideoElement | HTMLCanvasElement) { // Detectar faces com landmarks const facesWithLandmarks = await mediapipeFace.detectFacesWithLandmarks(imageElement); // Acessar landmarks de cada face facesWithLandmarks.forEach(face => { // Pontos faciais (olhos, boca, etc.) const landmarks = face.landmarks.positions; // Fazer algo com os landmarks... landmarks.forEach((point, index) => { console.log(`Landmark ${index}: (${point.x}, ${point.y})`); }); }); } // Lembre-se de liberar recursos quando terminar function cleanUp() { mediapipeFace.dispose(); } ``` ## Obter Métricas de Performance A biblioteca agora oferece métricas de performance para ajudar a otimizar sua aplicação: ```typescript import { mediapipeFace } from '@the-horizon-dev/fast-face-detection'; async function detectWithMetrics(imageElement) { // O terceiro parâmetro como 'true' retorna métricas de performance const result = await mediapipeFace.detectFaces(imageElement, {}, true); // Acesse as faces detectadas const faces = result.faces; console.log(`Detectadas ${faces.length} faces`); // Acesse as métricas de performance const timing = result.timing; console.log(`Tempo total: ${timing.total.toFixed(2)}ms`); console.log(`Pré-processamento: ${timing.preprocessing.toFixed(2)}ms`); console.log(`Inferência: ${timing.inference.toFixed(2)}ms`); console.log(`Pós-processamento: ${timing.postprocessing.toFixed(2)}ms`); } ``` ## Tratamento de Erros Robusto A biblioteca agora fornece erros detalhados com códigos específicos para um tratamento mais preciso: ```typescript import { mediapipeFace, FaceDetection } from '@the-horizon-dev/fast-face-detection'; async function detectFacesWithErrorHandling(imageElement) { try { const faces = await mediapipeFace.detectFaces(imageElement); // Processar faces } catch (error) { if (error instanceof FaceDetection.FaceDetectionError) { // Acesse o código de erro const errorCode = error.code; switch (errorCode) { case FaceDetection.ErrorCode.MODEL_LOAD_FAILED: console.error('Falha ao carregar o modelo. Verifique sua conexão.'); break; case FaceDetection.ErrorCode.INVALID_INPUT: console.error('Entrada inválida. Verifique se a imagem/vídeo é válido.'); break; case FaceDetection.ErrorCode.DETECTION_FAILED: console.error('Falha na detecção. Tente novamente com outra imagem.'); break; // outros códigos de erro... default: console.error('Erro desconhecido:', error.message); } // Também pode acessar o erro original if (error.originalError) { console.error('Erro original:', error.originalError); } } else { console.error('Erro não relacionado à detecção facial:', error); } } } ``` ## Opções Avançadas ```typescript import { DetectionOptions, ModelType } from '@the-horizon-dev/fast-face-detection'; // Configurações personalizadas com tipagem completa const options: DetectionOptions = { scoreThreshold: 0.7, // Limite de confiança (0-1) maxFaces: 5, // Número máximo de faces a detectar enableTracking: true, // Ativar rastreamento de faces entre frames modelType: ModelType.SHORT, // Modelo mais leve e rápido runtime: 'tfjs' // Runtime do TensorFlow }; // Uso com opções personalizadas const faces = await mediapipeFace.detectFaces(imageElement, options); ``` ## Otimização de Performance ### Pré-carregamento de Modelos Para aplicações onde você precisa iniciar rapidamente: ```typescript // Pré-carregar modelos na inicialização da aplicação async function initApp() { // Retorna o ambiente detectado ('browser', 'node' ou 'react-native') const environment = await mediapipeFace.initialize(); console.log(`Modelos carregados para ambiente ${environment}!`); } ``` ### Controle de Log A biblioteca permite controlar o nível de log para depuração: ```typescript import { utils } from '@the-horizon-dev/fast-face-detection'; // Configurar nível de log utils.setLogLevel('debug'); // Valores possíveis: 'debug', 'info', 'warn', 'error', 'none' ``` ### Carregamento de Recursos A biblioteca carrega automaticamente apenas os recursos necessários para o ambiente detectado: - Em navegadores: usa WebGL por padrão, com fallback para CPU - Em React Native: usa o backend otimizado para React Native - Em Node.js: usa o backend TensorFlow.js Node nativo se disponível, com fallback para CPU ## Uso Avançado com TypeScript A biblioteca fornece tipagem TypeScript completa: ```typescript import { mediapipeFace, PossiblyTrackedFace, TrackedFace, isTrackedFace, Box, Point, DetectionResult } from '@the-horizon-dev/fast-face-detection'; // Detectar faces com verificação de rastreamento async function processTrackedFaces(videoElement: HTMLVideoElement) { const faces = await mediapipeFace.detectFaces(videoElement, { enableTracking: true }); faces.forEach(face => { // Verificar se a face possui ID de rastreamento if (isTrackedFace(face)) { // face tem trackingID console.log(`Face #${face.trackingID} em posição:`, face.detection.box); } else { // face é uma detecção normal sem trackingID console.log('Face sem rastreamento em posição:', face.detection.box); } }); } // Função tipada para processar uma caixa delimitadora function processBox(box: Box) { const area = box.width * box.height; return area; } // Função tipada para trabalhar com resultado completo async function analyzeDetectionPerformance(imageElement: HTMLImageElement): Promise<number> { const result: DetectionResult<PossiblyTrackedFace> = await mediapipeFace.detectFaces(imageElement, {}, true); console.log(`Tempo de detecção: ${result.timing.total}ms`); return result.timing.total; } ``` ## Notas de Performance - A primeira detecção pode ser mais lenta devido ao carregamento do modelo - Use `initialize()` para pré-carregar modelos - Para streams de vídeo, use uma taxa de quadros mais baixa para economizar CPU/GPU - Em dispositivos móveis, considere usar modelos mais leves ## Solução de Problemas ### WebGL em Headless Se estiver executando em um ambiente headless (como um servidor Node.js), a biblioteca automaticamente usará o backend CPU. ### React Native Certifique-se de que sua aplicação React Native está configurada corretamente para uso com TensorFlow.js. Consulte a [documentação oficial](https://www.tensorflow.org/js/tutorials/react_native) para mais detalhes. ## Exemplos Consulte a pasta `/examples` para exemplos completos de: - Detecção facial em imagens - Detecção em streams de vídeo - Uso com React e React Native - Utilização de landmarks para filtros faciais ## Licença MIT ## Testes A biblioteca inclui testes unitários e de integração. Os testes de integração utilizam imagens reais para verificar o funcionamento correto da detecção facial. ### Executar testes ```bash # Executar todos os testes npm test # Executar apenas testes unitários npm run test:unit # Executar apenas testes de integração npm run test:integration ``` ### Resultados visuais Os testes de integração com imagens reais geram resultados visuais que são salvos no diretório `tests/output/`. Estes resultados mostram as faces detectadas e os pontos faciais (landmarks). ### Requisitos para testes Para executar os testes de integração, você precisará instalar a biblioteca `canvas`: ```bash npm install canvas ``` Em alguns sistemas, pode ser necessário instalar dependências adicionais. Consulte a [documentação do node-canvas](https://github.com/Automattic/node-canvas#compiling) para mais informações. ## Testing The package includes unit tests for core functionality. To run the tests: ```bash npm test ``` ### Testing Limitations Due to the dependency on TensorFlow.js and browser APIs, some tests may not run correctly in a Node.js environment. - Unit tests for services and utility functions run well in Node.js - Integration tests requiring actual face detection need a browser environment When developing this package, it's recommended to focus on unit testing the non-browser-dependent code. For full integration testing, consider using a browser-based test environment like Playwright or Cypress.