Prova de vida: quanto custa de verdade rodar cada camada
Prova de vida não é um modelo, é uma fusão de camadas, e cada uma tem preço em milissegundos de CPU por quadro. O orçamento aberto, com números publicados e medidos, e a lição de compra que vem junto.
Quem avalia prova de vida costuma perguntar quanto custa em reais por verificação. A pergunta que decide o desenho é outra: quanto custa em milissegundos de processamento por quadro analisado. Prova de vida não é um modelo que se liga ou desliga: é uma fusão de camadas, detecção de rosto, classificador de ataque de apresentação, sinais temporais, coerência geométrica, e cada uma consome uma fatia de um orçamento finito, porque do outro lado tem uma pessoa esperando a tela responder.
Este artigo abre esse orçamento com números de duas origens, sempre declaradas: medições publicadas pelos autores dos modelos e pela avaliação pública do NIST, o instituto de padrões dos Estados Unidos, e medições nossas em contêiner de CPU comum, sem GPU. A distinção importa, porque boa parte da confusão comercial do setor nasce de comparar número de GPU de laboratório com número de CPU de produção.
A unidade certa é milissegundo por quadro
Uma verificação por selfie não analisa uma imagem: analisa uma sequência curta. Cada quadro passa por decodificação, redimensionamento, detecção de rosto, recorte e classificação, e o custo total é o custo por quadro vezes o número de quadros, mais o custo fixo da requisição.
Para a primeira camada existe número público com condição de medição declarada. O OpenCV Zoo, repositório oficial de modelos do projeto OpenCV, publica uma tabela em que o detector de rosto YuNet, com entrada de 160 por 120, leva 0,69 milissegundo por inferência num Intel Core i7-12700K, 6,23 milissegundos num Raspberry Pi 4B e 41,13 milissegundos numa placa RISC-V StarFive VisionFive 2. O repositório declara o que o número contém: inferência completa, com pré e pós-processamento, média de dez execuções após aquecimento. Quase sessenta vezes de diferença entre a primeira e a terceira medida, mesmo modelo, mesma entrada.
Para a segunda camada, o classificador de ataque de apresentação, a documentação do projeto Silent Face Anti-Spoofing, da minivision, informa que o MiniFASNetV2 tem 0,081 GFLOPs e 0,435 milhão de parâmetros, e que o modelo do aplicativo de demonstração roda em 20 milissegundos, com a tabela por processador detalhando 19 milissegundos num Kirin 990 5G, 24 num Snapdragon 845 e 90 num RK3288. Somando as duas camadas, chega-se ao que também medimos: detecção mais classificação na casa da dezena de milissegundos por quadro em CPU, e uma sequência de dez quadros fechando na casa das centenas de milissegundos.
O que não entra na conta do modelo
Uma observação de quem colocou isso para rodar: em CPU, o trabalho fora do modelo compete de igual para igual com ele. Decodificar o JPEG, converter espaço de cor e redimensionar podem custar tanto quanto a propagação de uma rede pequena. Threads mudam tudo: o benchmark que você leu rodou numa máquina de vinte threads, e seu contêiner tem uma ou duas. E a primeira inferência carrega grafo e aloca memória, então medir sem aquecimento infla o número. A regra que adotamos: medir a requisição inteira, mediana e percentil 95, com o limite de CPU real aplicado.
A camada de profundidade custa o orçamento inteiro, várias vezes
A tentação de quem quer endurecer o liveness é acrescentar profundidade: se um rosto real tem relevo e uma foto é plana, por que não estimar profundidade da imagem? A resposta começa pelo preço. O Depth Anything V2, uma das referências de estimativa de profundidade monocular, lista em sua documentação oficial quatro escalas, de 24,8 milhões de parâmetros na versão Small a 1,3 bilhão na Giant, e traz um detalhe que muita avaliação ignora: só a Small é Apache 2.0; Base, Large e Giant são CC-BY-NC-4.0, licença que exclui uso comercial.
Na nossa medição, em contêiner de CPU comum e sem GPU, a estimativa de profundidade monocular ficou entre 1,3 e 1,6 segundo por quadro. Diante da dezena de milissegundos das duas primeiras camadas juntas, isso não é um pouco mais caro: um único quadro de profundidade consome várias vezes o orçamento inteiro de uma verificação de dez quadros. Registramos ainda um resultado contraintuitivo que só aparece medindo: a versão quantizada em INT8 saiu mais lenta que a fp32 no mesmo contêiner, porque o ganho teórico depende de kernels otimizados que nem sempre existem para a arquitetura em uso.
A camada cara também responde à pergunta errada
Se o preço fosse o único problema, bastaria mais hardware. O problema maior é que profundidade estimada a partir de uma imagem plana é, por construção, um sinal que o atacante controla.
Há pesquisa revisada por pares sobre isso. Em DepthFake: Spoofing 3D Face Authentication with a 2D Photo, de Zhihao Wu, Yushi Cheng, Jiahui Yang, Xiaoyu Ji e Wenyuan Xu (IEEE Symposium on Security and Privacy, 2023), os autores estimam a profundidade do rosto da vítima a partir de uma única foto 2D e projetam padrões de pontos construídos com essa profundidade para forjar a leitura de câmeras de luz estruturada. Contra três serviços comerciais de autenticação facial e um dispositivo de controle de acesso, com 50 usuários, relatam 79,4% de sucesso no ataque à camada de profundidade e 59,4% na decisão combinada de cor e profundidade.
A leitura correta é estrutural: relevo reconstruído a partir de uma foto plana é plausível o bastante para satisfazer quem confia nele. Vale lembrar como a literatura clássica usava profundidade: em Learning Deep Models for Face Anti-Spoofing: Binary or Auxiliary Supervision, de Yaojie Liu, Amin Jourabloo e Xiaoming Liu, apresentado no CVPR 2018, a profundidade aparece como alvo de supervisão pixel a pixel durante o treino, junto de sinais de rPPG, não como etapa cara de inferência acoplada ao fluxo.
A alternativa geométrica custa quase nada
A pergunta que a profundidade tentava responder, este objeto tem volume, tem resposta geométrica muito mais barata. Entre dois quadros com um pequeno movimento de cabeça, pontos a distâncias diferentes da câmera se deslocam em magnitudes diferentes: a ponta do nariz anda mais que o contorno do rosto. Uma superfície plana, foto impressa ou tela, se transforma como um plano, com deslocamento coerente em todos os pontos. Medir isso reaproveita os pontos de referência que o detector já produziu: aritmética sobre algumas dezenas de coordenadas, desprezível diante de qualquer propagação de rede.
O limite precisa ser dito: sem movimento não há evidência, e ausência de sinal não é sinal de ataque. Por isso a camada entra como peso na decisão, ao lado de textura e sinais temporais, nunca como veredito solitário. Sinal temporal barato tem tradição: em Exposing digital forgeries in video by detecting duplication, de Weihong Wang e Hany Farid (workshop de Multimídia e Segurança da ACM, 2007), a detecção de trechos duplicados já mostrava que repetição de conteúdo é pista forte e computacionalmente modesta.
Como ler a latência que um fornecedor cita
A melhor fonte pública para calibrar expectativa é o relatório NISTIR 8491, do programa FATE do NIST, que avaliou 82 algoritmos de detecção passiva de ataque de apresentação, termo definido pela ISO/IEC 30107-1, de 45 desenvolvedores. O apêndice de tempo traz a mediana de duração de cada chamada, sobre mil invocações, com uma única imagem de 1280 por 960 pixels, em máquina de classe servidor sem carga concorrente. A dispersão é o dado interessante: a chamada mais rápida fica na casa de 17 milissegundos e a mais lenta passa de 10 segundos, mais de seiscentas vezes de diferença entre implementações que resolvem o mesmo problema.
Daí saem as perguntas que separam número honesto de número decorativo. A latência citada é de GPU ou de CPU, e de qual máquina? É latência por quadro ou vazão agregada de um lote paralelo, que não se converte em tempo de resposta? Quantos quadros o fluxo analisa por verificação? O tempo inclui decodificação e pré-processamento? É mediana ou percentil 95, e sob qual concorrência? O próprio NIST delimita o escopo do relatório: só detecção passiva por software, sem 3D, sem infravermelho e sem desafio interativo, e explicitamente silente sobre ataques de injeção, que não passam pela lente.
Na UNIFOKAL, por exemplo, o orçamento por verificação é fixado antes da escolha dos modelos, e cada camada candidata precisa caber nele com medição própria em CPU. É restrição de engenharia e de produto: latência é conversão, e camada cara que responde à pergunta errada é o pior dos dois mundos.
Fontes citadas
- OpenCV Zoo, benchmark oficial do YuNet com as condições de medição: github.com/opencv/opencv_zoo
- Silent Face Anti-Spoofing (MiniFASNet), da minivision: github.com/minivision-ai/Silent-Face-Anti-Spoofing
- Depth Anything V2, artigo e documentação oficial: arxiv.org/abs/2406.09414 e github.com/DepthAnything/Depth-Anything-V2
- Wu, Cheng, Yang, Ji e Xu, DepthFake: Spoofing 3D Face Authentication with a 2D Photo, IEEE S&P 2023, p. 917 a 933: doi.org/10.1109/SP46215.2023.10179429
- Liu, Jourabloo e Liu, Learning Deep Models for Face Anti-Spoofing, CVPR 2018: openaccess.thecvf.com
- Wang e Farid, Exposing digital forgeries in video by detecting duplication, ACM Multimedia and Security 2007: doi.org/10.1145/1288869.1288876
- NIST, NISTIR 8491, FATE Part 10, sobre PAD passivo por software, 2023: nvlpubs.nist.gov e a página do programa em pages.nist.gov
- ISO/IEC 30107-1 e 30107-3, vocabulário e metodologia de avaliação de PAD, normas citadas pelo relatório do NIST