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:
- Análise Demográfica: Estimar idade, gênero e características de públicos
- Detecção de Emoções: Identificar sentimentos em rostos para análise comportamental
- Controle de Qualidade: Verificar qualidade de fotos (olhos abertos, rosto visível)
- Segurança: Detectar uso de óculos escuros, máscaras ou coberturas faciais
- Acessibilidade: Identificar características para aplicações especiais
Como funciona internamente?
Quando o detectFaces é executado, o sistema:
- Valida Credenciais: Verifica region, accessKeyId e secretAccessKey da AWS
- Cria Cliente Rekognition: Instancia o cliente AWS Rekognition com as credenciais
- Determina Fonte da Imagem: Aceita imagem do S3 (bucket + key) ou bytes em base64
- Configura Atributos: Define quais atributos analisar (ALL, DEFAULT ou específicos)
- Envia Comando: Executa DetectFacesCommand na API da AWS
- Processa Resposta: Extrai detalhes faciais incluindo emoções, qualidade, atributos
- 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
- Marketing: "Analisar reações emocionais de clientes em fotos de eventos"
- Controle de Acesso: "Verificar se pessoa está usando óculos escuros ou máscara antes de permitir entrada"
- Análise de Público: "Estimar demografia (idade/gênero) de participantes em eventos"
- 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
searchFacesoucompareFacespara identificar pessoas - Apenas Contagem: Use
detectLabelscom filtro "Person" para apenas contar pessoas - Texto em Imagens: Use
detectTextou AWS Textract para OCR - Celebridades: Use
recognizeCelebritiespara 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 === 1para garantir apenas um rosto em fotos de perfil - Verifique
EyesOpen,SunglasseseQualitypara fotos de documentos - Combine emoções com análise de sentimento para insights completos
- Use
AgeRangepara segmentação demográfica - Analise
Quality.BrightnesseQuality.Sharpnessantes 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