Medidor de Similaridade Facial
Envie duas fotos e descubra com IA o quanto os rostos se parecem. Cálculo de similaridade facial 100% no navegador, com privacidade total.
Sobre o Medidor de Similaridade Facial
O Medidor de Similaridade Facial compara duas fotos e relata o quanto os rostos se parecem visualmente como porcentagem de 0% a 100%. Funciona inteiramente no seu navegador via @vladmandic/face-api (um fork mantido do face-api.js). Ambas as imagens são decodificadas localmente, rostos são detectados com um detector estilo MobileNet, cada rosto é codificado como descriptor de 128 dimensões por uma rede inspirada em FaceNet, e a distância cosseno entre os dois descriptors é convertida em porcentagem de similaridade. Nenhum byte de imagem sai do seu dispositivo — não há processamento server-side, nem upload, nem log.
Use para exploração casual: 'meus dois primos realmente se parecem?', 'aquela selfie de cinco anos atrás ainda parece comigo?', 'esses dois artistas de MPB não relacionados parecem similares?'. É divertido, rápido, te dá um número. Escolhemos intencionalmente um modo de operação permissivo (apenas o melhor rosto por imagem, sem checagem de vivacidade, sem filtragem de qualidade) para que fotos pequenas ou de baixa qualidade ainda produzam resultado em vez de erro. Isso torna a ferramenta amigável mas também significa que as porcentagens não são calibradas para autenticação biométrica. Trate o score como indicador relativo de similaridade visual, não como prova de identidade.
Os melhores resultados exigem fotos frontais, bem iluminadas, em resolução decente onde o rosto ocupa parte significativa do quadro. Fotos com óculos escuros, máscaras, maquiagem pesada, chapéus cobrindo as sobrancelhas, ângulos laterais ou baixa resolução vão distorcer o descriptor e baixar o score, mesmo quando a mesma pessoa está em ambas as fotos. Inversamente, gêmeos idênticos, pais e filhos, e até pessoas não relacionadas de idade, etnia e penteado similares podem produzir scores surpreendentemente altos. Cirurgia plástica, mudança significativa de peso, envelhecimento de dez ou mais anos, ou filtros fortes / software face-tune também importam — o modelo não foi treinado para ser invariante a esses.
Projetamos deliberadamente esta ferramenta como curiosidade e não como sistema de verificação. Não é adequada para verificação de identidade biométrica, KYC (know-your-customer), controle de fronteira, vigilância, triagem de empregos, verificação em apps de namoro, ou qualquer situação onde o resultado seja usado para permitir ou negar algo a uma pessoa. Para esses casos de uso você precisa de um sistema de fornecedor avaliado sob NIST FRVT 1:1, que suporte detecção de vivacidade (anti-spoofing), avaliação de equidade demográfica, inscrição segura e revogação. Uma demo gratuita no navegador não pode satisfazer esses requisitos operacionais, legais ou de auditoria.
A privacidade é por design. Os pesos do modelo são baixados ao seu navegador uma vez (cerca de 6 MB, cacheados para futuras visitas) e toda a comparação roda localmente como JavaScript. Não há etapa de upload, não há cache temporário do lado do servidor, não há chamada de API. A página usa analytics padrão apenas para contagem de tráfego. Fechar a aba limpa todo o estado. Não armazenamos, registramos, vendemos ou compartilhamos as fotos comparadas.
Como funciona a comparação
O pipeline tem três etapas — detecção, alinhamento + codificação, e pontuação por distância — e cada etapa usa uma rede neural open-source estabelecida. O detector é um SSD MobileNetV1 treinado em WIDER FACE. Retorna um ou mais bounding boxes por imagem com pontuações de confiança; mantemos o rosto mais confiável por foto para comparação. Para fluxo com múltiplos rostos, veja nosso Preditor de Idade e Gênero que itera sobre cada detecção.
Cada rosto detectado é então alinhado. Um detector de 68 landmarks (pequena ConvNet treinada no dataset iBUG 300-W) prediz coordenadas de landmarks: cantos externos e internos dos olhos, cavalete e ponta do nariz, cantos da boca e linha do queixo. O rosto é rotacionado e cortado para que os olhos fiquem horizontais e a distância interpupilar seja normalizada. Alinhamento importa: a rede de codificação foi treinada em rostos alinhados e produz descriptors inconsistentes em entrada não alinhada.
O recorte alinhado passa por uma rede de codificação facial — em face-api.js esta é uma arquitetura ResNet-34 inspirada em FaceNet (Schroff, Kalenichenko & Philbin, 2015) e treinada com triplet loss para produzir vetores unitários de 128 dimensões que se agrupem fortemente dentro da mesma identidade e se espalhem entre identidades. ArcFace (Deng et al., 2019) é uma melhoria mais recente que usa perda de margem angular aditiva; o fork do vladmandic suporta backbones mais novos estilo ArcFace para maior precisão quando necessário. Usamos o modelo ResNet-34 padrão para compatibilidade de navegador e tamanho.
Dois descriptors de 128 dimensões são comparados por distância cosseno: distance = 1 − (dot(a,b) / (|a||b|)). Distância menor = mais similar. O limiar padrão face-api.js para 'mesma pessoa' é aproximadamente 0,6 (distância 0,6 significa cerca de 70% de similaridade no nosso display). Mapeamos distância para porcentagem de similaridade usando uma curva suave: 0,0 → 100%, 0,4 → ~70%, 0,6 → ~50%, 1,0 → 0%. Esse mapeamento é empírico e amigável em vez de calibrado contra um padrão biométrico, então um score de 85% deve ser lido como 'muito similar' mas não como probabilidade de ser a mesma pessoa.
Todos os pesos são quantizados para float de 32 bits para o runtime TensorFlow.js no navegador; download total ~6 MB. A inferência roda em WebGL quando disponível (acelerado por GPU) e cai para CPU via WebAssembly. Comparação ponta-a-ponta de dois rostos tipicamente leva 200 ms a 1 s em laptop moderno, mais em celular. A UI mostra uma barra estilo confiança e uma de cinco faixas qualitativas (muito similar, similar, algo similar, não similar, muito diferente) escolhidas para amabilidade, não para rigor biométrico.
Precisão, limiares e onde esta ferramenta falha
No benchmark acadêmico LFW (Labelled Faces in the Wild), encoders faciais bem treinados de 128 dimensões alcançam ~99% de precisão de verificação em pares casados. Esse número não é a precisão que você deve esperar em fotos arbitrárias da internet. Pares LFW são pré-selecionados por qualidade de imagem e pose frontal; desempenho in-the-wild é muito mais ruidoso. NIST FRVT 1:1 — que avalia dezenas de fornecedores comerciais sobre centenas de milhares de fotos operacionais — mostra que mesmo sistemas líderes têm valores de FAR (False Acceptance Rate) e FRR (False Rejection Rate) que variam em uma ordem de magnitude com demografia, idade e qualidade de imagem. Nosso backbone open-source é mais antigo e menor que os líderes do FRVT.
Modos de falha concretos que você encontrará: gêmeos idênticos quase sempre pontuam acima de 80% — o encoder não consegue distingui-los confiavelmente. Pais e filhos adultos, irmãos, ou pessoas não relacionadas da mesma etnia e idade e penteado similares podem todos pontuar 70–85%. A mesma pessoa fotografada com dez anos de diferença pode cair para 50% se as características faciais mudaram. Filtros fortes (FaceTune, Snapchat, beauty filters) efetivamente editam um rosto diferente na foto e baixam o score significativamente. Óculos, máscaras, barbas, hijabs, chapéus e oclusão parcial reduzem a precisão porque escondem landmarks informativos.
Equidade demográfica é uma limitação conhecida. Buolamwini & Gebru (2018), NIST FRVT (2019, 2024) e muitas outras auditorias mostraram que modelos de reconhecimento facial treinados predominantemente em sujeitos de pele mais clara produzem taxas de erro maiores para rostos de pele mais escura, mulheres e crianças. O descriptor face-api.js usado aqui herda esses vieses. Trate qualquer comparação individual com cautela, especialmente quando um ou ambos os sujeitos sejam de grupos sub-representados em sets de treinamento públicos padrão.
Não use esta ferramenta como autenticador biométrico, sistema de prova de identidade, checagem antifraude, correspondência de vigilância, filtro de triagem de emprego ou verificador de app de namoro. Para esses usos você precisa de um sistema comercial auditado com detecção de vivacidade (para que foto impressa ou vídeo deepfake não passe), pipeline de revogação e avaliação de viés documentada. Não temos essas garantias e dizemos explicitamente para você não implantar isto em produção. É uma ferramenta de curiosidade, e o score é um guia, não veredito.
- Gêmeos idênticos tipicamente pontuam 85–95% — o modelo não consegue distingui-los confiavelmente.
- A mesma pessoa com 10+ anos de diferença pode cair para 50–70% de similaridade por envelhecimento natural.
- Óculos escuros, máscaras, barbas, chapéus ou outras oclusões bloqueiam landmarks e reduzem o score.
- Filtros fortes (FaceTune, beauty filters, lentes Snapchat) editam efetivamente o rosto e distorcem o descriptor.
- Equidade demográfica é desigual: tons de pele escuros, mulheres e crianças têm taxas de erro maiores por desbalanço do set de treinamento.
- A ferramenta reporta o melhor rosto por imagem; fotos em grupo devem ser cortadas para um único rosto primeiro.
- Sem detecção de vivacidade — uma foto impressa de um rosto produz o mesmo descriptor que captura ao vivo.
- Não adequado para verificação de identidade biométrica, KYC, controle de fronteira, emprego ou checagens de segurança em apps de namoro.
- Mapeamento de distância cosseno para porcentagem é amigável e não calibrado contra padrão biométrico.
Glossário
- Embedding facial (descriptor)
- Vetor numérico de comprimento fixo — aqui, 128 números float — produzido por uma rede neural que codifica a identidade visual de um rosto. Fotos da mesma pessoa devem ter embeddings similares; de pessoas diferentes, embeddings diferentes.
- Similaridade cosseno / distância cosseno
- Medida geométrica de quão alinhados estão dois vetores. Similaridade cosseno = dot(a,b) / (|a||b|), faixa [-1, 1]; distância cosseno = 1 − similaridade cosseno. Usada porque descriptors vivem em uma hiperesfera de alta dimensão.
- Limiar (threshold)
- A distância cosseno abaixo da qual dois descriptors são declarados como casamento. face-api.js usa ~0,6 como padrão; corresponde a aproximadamente 50% na nossa escala UI amigável. Baixá-lo torna a ferramenta mais rigorosa (menos falsos casamentos, mais perdidos).
- FAR (False Acceptance Rate)
- Taxa em que um casador facial diz incorretamente que duas pessoas diferentes são a mesma. Crítica para sistemas de segurança — FAR alto significa que impostores passam.
- FRR (False Rejection Rate)
- Taxa em que um casador facial diz incorretamente que fotos da mesma pessoa são diferentes. FRR alto significa que usuários genuínos são incomodados.
- FaceNet
- Paper marco de 2015 de Schroff, Kalenichenko & Philbin (Google) que introduziu o esquema de treinamento por triplet loss para produzir embeddings faciais de 128 dimensões em uma hiperesfera unitária.
- ArcFace
- Função de perda para reconhecimento facial de 2019 (Deng et al., InsightFace) que usa margem angular aditiva para empurrar classes de descriptors mais distantes na hiperesfera. Estado da arte em benchmarks acadêmicos como LFW e IJB-B.
- LFW / NIST FRVT
- Benchmarks acadêmicos e governamentais para sistemas de reconhecimento facial. LFW (Labelled Faces in the Wild, 2007) é pequeno e de alta qualidade. NIST FRVT (Face Recognition Vendor Test) é a avaliação governamental padrão-ouro, com centenas de milhares de fotos operacionais e publicação contínua.
Perguntas Frequentes
Como a IA compara dois rostos?
Detecta um rosto por imagem, alinha cada um usando 68 landmarks faciais, codifica cada rosto alinhado como vetor de 128 dimensões com ResNet estilo FaceNet, e calcula distância cosseno entre os dois vetores. Distância cosseno é mapeada para score amigável de 0–100% de similaridade. Toda a inferência é JavaScript no seu navegador via @vladmandic/face-api sobre TensorFlow.js.
O que a porcentagem realmente significa?
É um mapeamento suave de distância cosseno para escala 0–100. Em termos gerais: 90–100% = visualmente quase idênticos (mesma pessoa, gêmeos ou sósia extremo); 70–90% = mesma pessoa provável, ou parentes próximos; 50–70% = algumas características compartilhadas mas não necessariamente a mesma pessoa; abaixo de 50% = pessoas diferentes. NÃO é probabilidade e NÃO é resultado de verificação biométrica.
Por que pessoas não relacionadas pontuam 60%?
Porque o descriptor codifica a forma geral do rosto — espaçamento dos olhos, largura do nariz, ângulo da mandíbula, etnia, idade — e muitas pessoas não relacionadas compartilham o suficiente dessas características para cair em região similar do espaço de embeddings. É propriedade fundamental dos descriptors faciais de 128 dimensões, não bug.
Por que minha própria foto pontuou só 75% contra outra foto minha?
Causas comuns: (1) iluminação ou ângulo de câmera diferentes; (2) idade diferente (mais que poucos anos pode mover descriptors significativamente); (3) óculos ou pelos faciais em apenas uma das fotos; (4) filtros fortes ou FaceTune em uma foto; (5) uma foto está em resolução muito menor; (6) você está com maquiagem em uma e sem em outra. Tente outro par de fotos com condições similares.
Minhas fotos são enviadas?
Não. Toda detecção, codificação e comparação facial acontece localmente no seu navegador via TensorFlow.js. Os pesos do modelo são baixados uma vez (cerca de 6 MB, cacheados) e a inferência roda nos JPEGs que você seleciona. Bytes das fotos nunca deixam o dispositivo. Não armazenamos, registramos ou compartilhamos fotos.
Posso usar para verificação de identidade?
Não. Não use esta ferramenta para verificar identidade de alguém, controlar acesso a serviço, prevenir fraude, ou triar funcionários / namoros. Não tem detecção de vivacidade, não tem limiar calibrado, não tem auditoria de equidade demográfica e usa modelo open-source menor que sistemas comerciais. Para verificação de identidade você precisa de fornecedor avaliado sob NIST FRVT com FAR/FRR documentados e garantias operacionais.
Por que gêmeos idênticos não são distinguíveis?
O descriptor facial é treinado para ser invariante a iluminação, expressão e pose, mas não foi projetado para capturar microcaracterísticas que mesmo humanos usam para distinguir gêmeos (pinta pequena, leve assimetria). Discriminação de gêmeos é área de pesquisa ativa; encoders faciais padrão geralmente falham nela.
Distingue pais e filhos?
Frequentemente, mas nem sempre. Pais e filhos adultos compartilham muitas características faciais genéticas e podem pontuar 60–80%. O modelo é treinado para aproximar a mesma identidade, mas não tem noção de 'parecença familiar' versus 'identidade', então scores altos entre parentes são comuns e esperados.
Suporta múltiplos rostos em uma foto?
Atualmente pega o melhor rosto por imagem e compara esses dois. Se suas fotos são em grupo, corte cada uma para um único rosto primeiro. Para fluxos com múltiplos rostos temos um Preditor de Idade e Gênero dedicado que itera sobre cada rosto detectado em uma imagem.

E se nenhum rosto for detectado?
A ferramenta reporta 'nenhum rosto detectado' para essa imagem. Causas comuns: rosto pequeno demais (abaixo do tamanho mínimo do detector), rosto em ângulo extremo, iluminação muito escura ou clara, imagem muito borrada ou imagem que não é realmente foto de rosto. Tente foto mais clara, maior, frontal.
Referências e fontes acadêmicas
- Schroff, F., Kalenichenko, D., & Philbin, J.. (2015). FaceNet: A Unified Embedding for Face Recognition and Clustering IEEE CVPR.
- Deng, J., Guo, J., Xue, N., & Zafeiriou, S.. (2019). ArcFace: Additive Angular Margin Loss for Deep Face Recognition IEEE CVPR (projeto InsightFace).
- Huang, G. B., Ramesh, M., Berg, T., & Learned-Miller, E.. (2007). Labeled Faces in the Wild: A Database for Studying Face Recognition in Unconstrained Environments Universidade de Massachusetts Amherst Technical Report.
- Grother, P., Ngan, M., & Hanaoka, K.. (2024). NIST Face Recognition Vendor Test (FRVT) Instituto Nacional de Padrões e Tecnologia dos EUA.
- Buolamwini, J., & Gebru, T.. (2018). Gender Shades: Disparidades de precisão interseccional em classificação comercial de gênero Proceedings of Machine Learning Research.
- Mandic, V.. (2024). @vladmandic/face-api — fork TypeScript mantido do face-api.js Projeto open-source, licença MIT.
Last reviewed: · Reviewed by Equipe de Ética e Engenharia de IA WuTools
Perguntas Frequentes
A comparação de rostos acontece no meu navegador ou minhas fotos são enviadas?
Tudo roda dentro do seu navegador. Os modelos de detecção facial e embedding (ResNet estilo FaceNet via @vladmandic/face-api no TensorFlow.js) são baixados uma vez e depois cada comparação é calculada localmente usando WebGL, WebGPU ou WebAssembly. Suas fotos de rosto nunca deixam o dispositivo — sem uploads, sem processamento no servidor, sem template biométrico armazenado fora do navegador. Isso importa enormemente porque, sob LGPD/GDPR e BIPA de Illinois, embeddings faciais contam como identificadores biométricos sensíveis, e muitas políticas de segurança empresariais proíbem explicitamente enviá-los a APIs de terceiros. O único tráfego de rede após o download do modelo são os recursos estáticos da página.
Quais formatos e condições de imagem dão os melhores resultados?
Formatos aceitos: JPEG, PNG, WebP, AVIF, GIF (primeiro quadro), BMP e HEIC em navegadores compatíveis. Para comparação precisa, ambos os rostos devem ser: pelo menos 160x160 pixels na região facial recortada, frontais ou quase frontais (rotação dentro de ±30°), iluminados uniformemente sem sombras duras, em foco e sem obstrução por reflexos em óculos, máscaras ou cabelo. Tomadas de perfil, iluminação extrema, desfoque de movimento e rostos menores que 80 pixels degradam a qualidade do embedding. Se múltiplos rostos aparecerem em alguma imagem, a ferramenta usa o maior rosto detectado — para retratos com várias pessoas, recorte manualmente primeiro.
O que a porcentagem de similaridade realmente representa?
É um remapeamento amigável da distância cosseno entre dois embeddings faciais de 128 dimensões produzidos pela rede estilo FaceNet. Internamente, cada rosto é codificado como um vetor unitário em espaço 128D; a distância cosseno (1 - cos(ângulo) entre os dois vetores) é então mapeada para uma pontuação 0-100%. Acima de 70% tipicamente significa "mesma pessoa" com alta confiança em imagens de boa qualidade. 50-70% é uma zona limítrofe afetada por diferenças de iluminação, idade ou expressão. Abaixo de 50% é quase certamente "pessoa diferente". A porcentagem não é uma probabilidade literal — é uma métrica de conveniência calibrada. Para aplicações legais ou de segurança, use sempre a distância cosseno bruta com um limiar adequadamente validado para seu dataset.
Por que o modelo às vezes diz que minhas fotos antigas e recentes não são a mesma pessoa?
Embeddings faciais são muito sensíveis a mudanças de idade (>5 anos pode derrubar a similaridade 10-20%), barba, óculos, mudanças de peso, penteado, maquiagem e temperatura de cor da iluminação. Um modelo FaceNet treinado em fotos da web aprendeu a discriminar centenas de milhares de identidades sob condições típicas; mudanças significativamente fora da distribuição reduzirão a pontuação mesmo para a mesma pessoa. Gêmeos e parentes próximos também podem enganá-lo (alta similaridade mas tecnicamente pessoas diferentes). Para comparações estilo genealogia através de décadas, espere pontuações de 50-70% entre correspondências genuínas; para aplicações de segurança ou desbloqueio você tipicamente quer exigir ≥75% com ambas as imagens capturadas sob condições similares.
WebGPU é mais rápido que WebAssembly para comparação facial?
Sim, significativamente. A passagem de detecção (SSD-MobileNet) e a passagem de embedding 128D (ResNet) são ambas redes pesadas em convoluções que se beneficiam do paralelismo da GPU. Em um notebook típico, WebGPU completa um ciclo completo detectar-alinhar-embed-comparar em 100-300 ms por par; WebAssembly com SIMD leva 500-2000 ms, e WebGL (um backend GPU mais antigo) fica no meio. Para comparações em lote (um rosto de consulta vs muitas referências), a vantagem da GPU se acumula. A ferramenta detecta automaticamente o melhor backend ao iniciar: WebGPU > WebGL > WebAssembly-SIMD > WebAssembly. Você pode ver qual backend está ativo no console do navegador.
A ferramenta pode ser enganada por uma foto impressa, foto de tela ou deepfake?
Esta ferramenta é um medidor de similaridade de reconhecimento facial, não um detector de ataque de apresentação. Ela alegremente comparará uma foto de uma foto impressa sua com uma foto real sua, e o embedding corresponderá. Não verifica vivacidade, profundidade, reflexos de tela ou artefatos gerados por IA. Para verificação de pagamento, prova de identidade ou aplicações de desbloqueio, você precisa de uma camada separada de detecção de vivacidade (desafios ativos como piscar ou virar a cabeça, ou análise passiva de profundidade de câmera true-depth) sobre a verificação de similaridade. Detecção de vivacidade só no navegador é possível (MediaPipe Face Landmarker pode detectar mudanças de pose) mas não faz parte desta ferramenta. Para uso casual ou genealogia, a ausência não importa.
Qual arquitetura neural faz o trabalho pesado — FaceNet, ArcFace ou DeepFace?
O pipeline padrão usa face-api.js / @vladmandic/face-api, que combina um detector facial SSD-MobileNet v1, um regressor de 68 landmarks (para alinhamento) e uma rede de embedding ResNet-34 estilo FaceNet que produz um descritor de 128 dimensões treinado com triplet loss. ArcFace (2019) e CosFace (2018) são arquiteturas mais novas usando perdas de margem angular e embeddings de 512 dimensões que alcançam maior precisão no LFW (99.83% vs 99.65% do FaceNet) mas requerem modelos maiores e alinhamento ligeiramente diferente. Estão disponíveis como opções avançadas se você precisar de precisão de ponta. Para comparação cotidiana, o pipeline FaceNet padrão é rápido, bem testado e suficiente.
Qual a diferença entre FP32 e INT8 para embeddings faciais e isso afeta a precisão?
FP32 armazena cada peso da rede como float de 32 bits; INT8 o armazena como inteiro de 8 bits, encolhendo o modelo 4x e acelerando a inferência na CPU 2-3x. Para embeddings faciais, INT8 tipicamente reduz a precisão LFW em 0.1-0.3% — invisível para um humano comparando pontuações mas mensurável em um benchmark de 6000 imagens. Mais importante, embeddings INT8 são ligeiramente mais ruidosos, o que pode empurrar pares limítrofes (em torno de 70% de similaridade) para o balde errado. A ferramenta entrega FP32 por padrão para a rede de embedding porque dados faciais merecem a precisão; as redes detector e de landmarks usam INT8 porque sua saída (caixa delimitadora, 68 pontos) é robusta ao ruído de quantização.
