🧪 Novos tutoriais em andamento — do braço robótico ao sensor
Ir para o conteúdo
Compre este produtoLoja oficialSite oficial

Capítulo 8: Reconhecimento facial ​

Comprar na loja

Objetivo do capítulo: registrar características faciais, fazer o NanoCam reconhecer "quem é você" e montar uma solução completa de controle de acesso.

Princípio ​

O reconhecimento facial = detecção de rosto (pipeline de dois estágios MSR01+MNP01) + extração de características (rede neural MFN FaceRecognition112V1S8) + comparação por similaridade de cosseno.

Plain
Quadro RGB565 da câmera
  → Detecção grossa MSR01 (320×240, limiar 0.3F)
  → Detecção fina MNP01 (com base nos candidatos da detecção grossa, limiar 0.4F)
  → Extração de 10 pontos-chave do rosto (olhos/nariz/cantos da boca)
  → Alinhamento pelos pontos-chave → recorte do rosto em 112×112
  → Rede convolucional MFN → vetor de características de 512 dimensões
  → Normalização L2
  → Cálculo da distância de cosseno com cada vetor de ID registrado na Flash
  → Similaridade de cosseno máxima > limiar (0.55) → correspondência → saída do ID
  → Todas as similaridades < limiar → pessoa desconhecida → saída de "who?"

Otimização de desempenho ​

A extração de características MFN e a comparação com toda a base têm um custo computacional alto, e executá-las em todos os quadros deixaria a imagem travada. A implementação atual usa uma estratégia de salto de quadros: a detecção de rosto roda em todos os quadros (barata) e o reconhecimento MFN roda uma vez a cada 10 quadros (caro), com o rótulo sobreposto continuamente a partir do último resultado de reconhecimento. Assim a imagem se mantém fluida e o rótulo de ID não pisca.

Armazenamento das características faciais ​

As características faciais registradas (id + embedding de 512 dimensões) são armazenadas de forma persistente na partição fr da Flash (96 KB, até 47 IDs de face). Não se perdem com a falta de energia.

Preparação de hardware ​

  • Placa principal + placa base do NanoCam
  • Cabo USB-C (para alimentação + porta serial do computador)
  • Assistente de porta serial (taxa de transmissão 115200)

Passos ​

8.1 Entrar no modo de reconhecimento facial ​

Plain
ai_mode:4

O dispositivo reinicia automaticamente e entra no modo FaceID; o LED RGB WS2812 (GPIO18 DIN, alimentação VDD50) fica roxo. Após o reinício, a porta serial deve exibir:

Plain
I (5526) MFN: fr partition size: 98304 bytes, maxminum 47 IDs can be stored
I (5526) MFN: No face ID in flash

No face ID in flash indica que nenhuma face foi registrada ainda; isso é normal.

8.2 Registrar uma face ​

Posicione o rosto bem de frente para a câmera (distância 30-50cm, iluminação uniforme) e garanta que haja apenas um rosto na imagem. Envie pela porta serial:

Plain
face_eril

Ao detectar um rosto, o dispositivo extrai as características automaticamente e as registra na Flash:

Plain
I (xxxx) ENROLL: ID 1 is enrolled

Um texto azul Enroll: ID 1 é sobreposto na imagem e desaparece após cerca de 0.5 segundo.

Atenção: o comando é face_eril (abreviação de enroll), e não face_enroll. Se aparecer fail: unknown command, verifique a grafia.

8.3 Reconhecer uma face ​

Após o registro, envie o comando de reconhecimento:

Plain
face_rz

O sistema entra no modo de reconhecimento contínuo. O rosto atual é comparado com todos os IDs registrados na Flash:

  • Correspondência encontrada: a porta serial exibe Similarity: 0.85, Match ID: 1, e a imagem mostra continuamente ID: 1 em verde
  • Pessoa desconhecida: a porta serial exibe Similarity: 0.32, Match ID: 0, e a imagem mostra continuamente who? em vermelho

O rótulo permanece visível e não desaparece. Para sair do modo de reconhecimento, envie face_detect para voltar ao modo de detecção pura.

8.4 Excluir uma face ​

Plain
face_del

Exclui o último ID de face registrado; a porta serial retorna N IDs left, e a imagem mostra brevemente a quantidade de IDs restantes. As características na Flash são excluídas em conjunto.

8.5 Sair do modo de reconhecimento ​

Plain
face_detect

Volta ao modo de detecção de rosto pura (apenas desenho da caixa + pontos-chave, sem reconhecimento) e os rótulos de ID são removidos.

Sobre o modo DETECT: no ESP32-S3, a impressão de coordenadas na porta serial no modo de detecção de rosto pura está desabilitada (#if !CONFIG_IDF_TARGET_ESP32S3), para evitar que o log de detecção inunde a porta serial. Os logs de coordenadas detection_result só são emitidos ao entrar no modo de reconhecimento (face_rz).

Referência rápida de comandos ​

ComandoFunçãoComportamento do rótuloÉ contínuo?
face_erilRegistra a face detectada no momentoAzul "Enroll: ID N"Pisca por 0.5s
face_rzEntra no modo de reconhecimento contínuoVerde "ID: N" / vermelho "who?"✅ Contínuo
face_delExclui o último ID registradoVermelho "N IDs left"Pisca por 0.5s
face_detectSai do reconhecimento e volta à detecção puraRemove todos os rótulos—

Consulte o manual do protocolo serial para todos os comandos.

Exemplo de fluxo de operação ​

Plain
ai_mode:4                          # Entrar no modo de reconhecimento facial
[dispositivo reinicia, LED roxo]

face_eril                          # Registrar o primeiro rosto (Zhang San)
→ ID 1 is enrolled

face_eril                          # Registrar o segundo rosto (Li Si)
→ ID 2 is enrolled

face_rz                            # Iniciar o reconhecimento contínuo
→ Zhang San diante da câmera: a imagem mostra "ID: 1" continuamente
→ Li Si diante da câmera: a imagem mostra "ID: 2" continuamente
→ Pessoa desconhecida diante da câmera: a imagem mostra "who?" continuamente

face_detect                        # Sair do modo de reconhecimento
→ Os rótulos desaparecem, apenas a caixa de detecção é desenhada

face_del                           # Excluir Li Si (ID 2)
→ 1 IDs left

face_rz                            # Reconhecer novamente
→ Zhang San diante da câmera: "ID: 1"
→ Li Si diante da câmera: "who?" (excluído)

O modo de reconhecimento facial consome bastante memória (modelo MFN + dois modelos de detecção de rosto), e a porta serial Type-C (UART0) funciona normalmente. Se a porta serial não responder, verifique primeiro se a taxa de transmissão está em 115200.

Código ​

Lógica central de reconhecimento ​

components/modules/ai/who_human_face_recognition.cpp — estratégia de reconhecimento com salto de quadros:

C++
case RECOGNIZE:
{
    // Pular quadros: executar o reconhecimento MFN 1 vez a cada 10 detecções
    static int recog_skip = 0;
    if (recog_skip <= 0) {
        recognize_result = recognizer->recognize(
            (uint16_t *)frame->buf,
            {(int)frame->height, (int)frame->width, 3},
            detect_results.front().keypoint);
        recog_skip = 10;
    }
    recog_skip--;
    frame_show_state = SHOW_STATE_RECOGNIZE;
    break;
}

Solução de problemas ​

SintomaCausa possívelSolução
No face ID in flashNormal, nenhuma face registrada aindaEnvie face_eril para registrar
O resultado é sempre who?Iluminação insuficiente / ângulo desfavorável / similaridade abaixo do limiarRegistre novamente, de frente para a câmera e com iluminação uniforme
Sem reação ao registrarNúmero de rostos na imagem ≠ 1Garanta que haja apenas um rosto, a 30-50cm
Imagem travando durante o reconhecimentoNormal, a inferência MFN leva tempoJá otimizado com salto de quadros; roda uma vez a cada 10 quadros
Rótulo piscando—Corrigido; o rótulo permanece visível sem desaparecer
fail: unknown commandErro de digitação no comandoVerifique o comando: face_eril, e não face_enroll

Resultado ​

Registre a face → reconhecimento contínuo com o ID exibido → resultado na I2C/porta serial → controle de relés/servos: uma solução completa de controle de acesso.

Próximo capítulo: Capítulo 9: Conversa por voz (XiaoZhi AI)