Pular para conteúdo

AWS REKOGNITION - Detect Faces (Detecção de Rostos)

O que é esta operação?

A operação detectFaces do AWS Rekognition é responsável por detectar rostos em imagens e extrair atributos faciais detalhados como emoções, idade estimada, gênero, características físicas e muito mais.

Por que esta operação existe?

A análise manual de atributos faciais é subjetiva e demorada. O Rekognition detectFaces existe para:

  1. Análise Demográfica: Estimar idade, gênero e características de públicos
  2. Detecção de Emoções: Identificar sentimentos em rostos para análise comportamental
  3. Controle de Qualidade: Verificar qualidade de fotos (olhos abertos, rosto visível)
  4. Segurança: Detectar uso de óculos escuros, máscaras ou coberturas faciais
  5. Acessibilidade: Identificar características para aplicações especiais

Como funciona internamente?

Quando o detectFaces é executado, o sistema:

  1. Valida Credenciais: Verifica region, accessKeyId e secretAccessKey da AWS
  2. Cria Cliente Rekognition: Instancia o cliente AWS Rekognition com as credenciais
  3. Determina Fonte da Imagem: Aceita imagem do S3 (bucket + key) ou bytes em base64
  4. Configura Atributos: Define quais atributos analisar (ALL, DEFAULT ou específicos)
  5. Envia Comando: Executa DetectFacesCommand na API da AWS
  6. Processa Resposta: Extrai detalhes faciais incluindo emoções, qualidade, atributos
  7. Armazena Resultado: Salva em variável especificada em responseVariable

Código interno (aws-rekognition.executor.ts:105-116):

private async detectFaces(client: RekognitionClient, data: any, context: ExecutionContext): Promise<any> {
  const command = new DetectFacesCommand({
    Image: this.getImageSource(data, context),
    Attributes: data.attributes || ['ALL'],
  });

  const response = await client.send(command);
  return {
    faceDetails: response.FaceDetails || [],
    count: response.FaceDetails?.length || 0,
  };
}

Quando você DEVE usar esta operação?

Use detectFaces sempre que precisar de análise detalhada de atributos faciais:

Casos de uso

  1. Marketing: "Analisar reações emocionais de clientes em fotos de eventos"
  2. Controle de Acesso: "Verificar se pessoa está usando óculos escuros ou máscara antes de permitir entrada"
  3. Análise de Público: "Estimar demografia (idade/gênero) de participantes em eventos"
  4. Qualidade de Foto: "Validar se foto de documento tem rosto visível, olhos abertos e sem obstáculos"

Quando NÃO usar detectFaces

  • Identificação Pessoal: Use AWS Rekognition searchFaces ou compareFaces para identificar pessoas
  • Apenas Contagem: Use detectLabels com filtro "Person" para apenas contar pessoas
  • Texto em Imagens: Use detectText ou AWS Textract para OCR
  • Celebridades: Use recognizeCelebrities para identificar pessoas famosas

Parâmetros Detalhados

attributes (array, opcional)

O que é: Lista de atributos faciais a serem analisados. Pode ser ['ALL'], ['DEFAULT'] ou atributos específicos.

Padrão: ['ALL']

Atributos disponíveis: - ALL: Todos os atributos (idade, gênero, emoções, qualidade, barba, óculos, etc) - DEFAULT: Apenas atributos básicos (bounding box, confiança, landmarks)

Flow completo para testar:

{
  "name": "Teste AWS Rekognition - Detect Faces Attributes",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Instrução",
        "parameters": {
          "message": "Envie uma foto com rostos para análise completa de atributos faciais."
        }
      }
    },
    {
      "id": "media_1",
      "type": "media",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Receber Foto",
        "parameters": {
          "message": "Envie a imagem:",
          "variableName": "facePhoto",
          "mediaType": "image"
        }
      }
    },
    {
      "id": "rekognition_1",
      "type": "aws_rekognition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Analisar Rostos",
        "operation": "detectFaces",
        "config": {
          "region": "us-east-1",
          "accessKeyId": "YOUR_ACCESS_KEY_ID",
          "secretAccessKey": "YOUR_SECRET_ACCESS_KEY"
        },
        "imageBytes": "{{facePhoto}}",
        "attributes": ["ALL"],
        "responseVariable": "faceAnalysis"
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Resultado",
        "parameters": {
          "message": "👤 Rostos detectados: {{faceAnalysis.count}}\n\nAnálise completa de atributos disponível!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "media_1" },
    { "source": "media_1", "target": "rekognition_1" },
    { "source": "rekognition_1", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Teste: Envie uma foto com rostos. O sistema retornará análise completa incluindo emoções, idade, gênero e mais.

Parâmetros

Campo Tipo Obrigatório Descrição
operation string Sim Deve ser "detectFaces"
config object Sim Credenciais AWS (region, accessKeyId, secretAccessKey)
s3Bucket string Condicional Nome do bucket S3 (obrigatório se não usar imageBytes)
s3Key string Condicional Caminho do arquivo no S3 (obrigatório se não usar imageBytes)
imageBytes string Condicional Imagem em base64 (obrigatório se não usar S3)
attributes array Não Atributos a analisar: ['ALL'], ['DEFAULT'] (padrão: ['ALL'])
responseVariable string Sim Nome da variável para armazenar resultado

Exemplo 1: Análise de Emoções em Evento

Objetivo: Capturar emoções de participantes em evento para análise de satisfação

JSON para Importar

{
  "name": "Análise de Emoções - Evento",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Boas-vindas",
        "parameters": {
          "message": "😊 Análise de Satisfação do Evento\n\nTire uma selfie para registrar sua experiência!"
        }
      }
    },
    {
      "id": "media_1",
      "type": "media",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Capturar Selfie",
        "parameters": {
          "message": "📸 Envie sua selfie:",
          "variableName": "selfie",
          "mediaType": "image"
        }
      }
    },
    {
      "id": "rekognition_1",
      "type": "aws_rekognition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Detectar Emoção",
        "operation": "detectFaces",
        "config": {
          "region": "us-east-1",
          "accessKeyId": "YOUR_ACCESS_KEY_ID",
          "secretAccessKey": "YOUR_SECRET_ACCESS_KEY"
        },
        "s3Bucket": "event-photos",
        "s3Key": "selfies/{{selfie}}",
        "attributes": ["ALL"],
        "responseVariable": "emotionData"
      }
    },
    {
      "id": "message_2",
      "type": "message",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Agradecer",
        "parameters": {
          "message": "✅ Obrigado por participar!\n\n😊 Sua emoção foi registrada para nossa análise de satisfação.\n\nEsperamos que tenha aproveitado o evento!"
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1100, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "media_1" },
    { "source": "media_1", "target": "rekognition_1" },
    { "source": "rekognition_1", "target": "message_2" },
    { "source": "message_2", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 😊 Análise de Satisfação do Evento

Tire uma selfie para registrar sua experiência!
Sistema: 📸 Envie sua selfie:
Usuário: [envia selfie]
Sistema: ✅ Obrigado por participar!

😊 Sua emoção foi registrada para nossa análise de satisfação.

Esperamos que tenha aproveitado o evento!

Exemplo 2: Validação de Foto de Perfil

Objetivo: Verificar qualidade de foto de perfil antes de aceitar cadastro

JSON para Importar

{
  "name": "Validação de Foto de Perfil",
  "nodes": [
    {
      "id": "start_1",
      "type": "start",
      "position": { "x": 100, "y": 100 },
      "data": { "label": "Início" }
    },
    {
      "id": "message_1",
      "type": "message",
      "position": { "x": 300, "y": 100 },
      "data": {
        "label": "Instrução",
        "parameters": {
          "message": "📷 Cadastro de Perfil\n\nEnvie uma foto sua para validação.\n\n✅ Requisitos:\n• Rosto visível\n• Olhos abertos\n• Sem óculos escuros\n• Boa iluminação"
        }
      }
    },
    {
      "id": "media_1",
      "type": "media",
      "position": { "x": 500, "y": 100 },
      "data": {
        "label": "Receber Foto",
        "parameters": {
          "message": "Envie sua foto:",
          "variableName": "profilePhoto",
          "mediaType": "image"
        }
      }
    },
    {
      "id": "rekognition_1",
      "type": "aws_rekognition",
      "position": { "x": 700, "y": 100 },
      "data": {
        "label": "Validar Foto",
        "operation": "detectFaces",
        "config": {
          "region": "us-east-1",
          "accessKeyId": "YOUR_ACCESS_KEY_ID",
          "secretAccessKey": "YOUR_SECRET_ACCESS_KEY"
        },
        "imageBytes": "{{profilePhoto}}",
        "attributes": ["ALL"],
        "responseVariable": "validation"
      }
    },
    {
      "id": "condition_1",
      "type": "condition",
      "position": { "x": 900, "y": 100 },
      "data": {
        "label": "Verificar Rosto",
        "parameters": {
          "variableA": "{{validation.count}}",
          "operator": "equals",
          "variableB": "1"
        }
      }
    },
    {
      "id": "message_approved",
      "type": "message",
      "position": { "x": 1100, "y": 50 },
      "data": {
        "label": "Aprovado",
        "parameters": {
          "message": "✅ FOTO APROVADA!\n\n✓ Rosto detectado\n✓ Qualidade adequada\n\nSeu perfil foi criado com sucesso!"
        }
      }
    },
    {
      "id": "message_rejected",
      "type": "message",
      "position": { "x": 1100, "y": 150 },
      "data": {
        "label": "Rejeitado",
        "parameters": {
          "message": "❌ FOTO REJEITADA\n\n⚠️ Problemas detectados:\n• Nenhum rosto ou múltiplos rostos\n• Use uma foto com apenas seu rosto\n• Certifique-se de boa iluminação\n\nPor favor, envie outra foto."
        }
      }
    },
    {
      "id": "end_1",
      "type": "end",
      "position": { "x": 1300, "y": 100 },
      "data": { "label": "Fim" }
    }
  ],
  "edges": [
    { "source": "start_1", "target": "message_1" },
    { "source": "message_1", "target": "media_1" },
    { "source": "media_1", "target": "rekognition_1" },
    { "source": "rekognition_1", "target": "condition_1" },
    { "source": "condition_1", "target": "message_approved", "label": "true" },
    { "source": "condition_1", "target": "message_rejected", "label": "false" },
    { "source": "message_approved", "target": "end_1" },
    { "source": "message_rejected", "target": "end_1" }
  ]
}

Saída esperada:

Sistema: 📷 Cadastro de Perfil

Envie uma foto sua para validação.

✅ Requisitos:
• Rosto visível
• Olhos abertos
• Sem óculos escuros
• Boa iluminação
Sistema: Envie sua foto:
Usuário: [envia foto]
Sistema: ✅ FOTO APROVADA!

✓ Rosto detectado
✓ Qualidade adequada

Seu perfil foi criado com sucesso!

Resposta do Node

{
  "faceDetails": [
    {
      "BoundingBox": {
        "Width": 0.345,
        "Height": 0.567,
        "Left": 0.321,
        "Top": 0.123
      },
      "AgeRange": {
        "Low": 25,
        "High": 35
      },
      "Smile": {
        "Value": true,
        "Confidence": 98.5
      },
      "Eyeglasses": {
        "Value": false,
        "Confidence": 99.2
      },
      "Sunglasses": {
        "Value": false,
        "Confidence": 99.8
      },
      "Gender": {
        "Value": "Male",
        "Confidence": 96.7
      },
      "Emotions": [
        {
          "Type": "HAPPY",
          "Confidence": 95.3
        }
      ],
      "EyesOpen": {
        "Value": true,
        "Confidence": 99.1
      },
      "MouthOpen": {
        "Value": false,
        "Confidence": 97.4
      },
      "Quality": {
        "Brightness": 85.2,
        "Sharpness": 92.1
      }
    }
  ],
  "count": 1
}

Boas Práticas

SIM:

  • Use attributes: ['ALL'] para análises completas de características
  • Valide count === 1 para garantir apenas um rosto em fotos de perfil
  • Verifique EyesOpen, Sunglasses e Quality para fotos de documentos
  • Combine emoções com análise de sentimento para insights completos
  • Use AgeRange para segmentação demográfica
  • Analise Quality.Brightness e Quality.Sharpness antes de aceitar fotos

NÃO:

  • Não use detectFaces para identificação - use compareFaces ou searchFaces
  • Não ignore o campo Confidence - valores baixos indicam incerteza
  • Não assuma gênero ou idade como verdade absoluta - são estimativas
  • Não processe fotos de baixa resolução (<800px) - resultados imprecisos
  • Não use para decisões críticas sem validação humana

Dicas

💡 Dica 1: Para documentos oficiais, exija EyesOpen.Value === true e Sunglasses.Value === false.

💡 Dica 2: O campo Emotions retorna array ordenado por confiança - use [0] para emoção dominante.

💡 Dica 3: Combine detectFaces com compareFaces para verificação de identidade em múltiplas fotos.

💡 Dica 4: Use Quality.Brightness entre 40-90 e Quality.Sharpness > 50 como critérios mínimos.

💡 Dica 5: Para análise de público, processe em lote e agregue AgeRange e Gender para demografia.

Próximas Operações

detectLabels - Detectar objetos e cenas em imagens → compareFaces - Comparar rostos entre duas imagens → detectText - Extrair texto de imagens → detectModerationLabels - Detectar conteúdo impróprio → recognizeCelebrities - Identificar celebridades