AWS REKOGNITION - Detect Moderation Labels (Moderação de Conteúdo)
O que é esta operação?
A operação detectModerationLabels do AWS Rekognition é responsável por detectar conteúdo impróprio, violento, adulto ou ofensivo em imagens.
Por que esta operação existe?
O Rekognition detectModerationLabels existe para:
- Moderação Automática: Filtrar conteúdo impróprio em plataformas sociais
- Proteção de Menores: Bloquear conteúdo adulto
- Conformidade Legal: Cumprir regulamentações de conteúdo
- Segurança da Marca: Evitar associação com conteúdo inadequado
- Redução de Custos: Automatizar moderação manual
Como funciona internamente?
Código interno (aws-rekognition.executor.ts:168-180):
private async detectModerationLabels(client: RekognitionClient, data: any, context: ExecutionContext): Promise<any> {
const command = new DetectModerationLabelsCommand({
Image: this.getImageSource(data, context),
MinConfidence: data.minConfidence || 60,
});
const response = await client.send(command);
return {
moderationLabels: response.ModerationLabels || [],
count: response.ModerationLabels?.length || 0,
isSafe: (response.ModerationLabels?.length || 0) === 0,
};
}
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "detectModerationLabels" |
| config | object | Sim | Credenciais AWS |
| s3Bucket/s3Key | string | Condicional | Localização da imagem |
| imageBytes | string | Condicional | Imagem em base64 |
| minConfidence | number | Não | Confiança mínima (padrão: 60) |
| responseVariable | string | Sim | Variável para resultado |
Exemplo: Moderação de Upload de Usuários
{
"name": "Moderação Automática de Conteúdo",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "media_1",
"type": "media",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Upload",
"parameters": {
"message": "Envie sua imagem:",
"variableName": "userImage",
"mediaType": "image"
}
}
},
{
"id": "rekognition_1",
"type": "aws_rekognition",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Moderar",
"operation": "detectModerationLabels",
"config": {
"region": "us-east-1",
"accessKeyId": "KEY",
"secretAccessKey": "SECRET"
},
"imageBytes": "{{userImage}}",
"minConfidence": 75,
"responseVariable": "moderation"
}
},
{
"id": "condition_1",
"type": "condition",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Verificar Segurança",
"parameters": {
"variableA": "{{moderation.isSafe}}",
"operator": "equals",
"variableB": "true"
}
}
},
{
"id": "message_approved",
"type": "message",
"position": { "x": 900, "y": 50 },
"data": {
"label": "Aprovado",
"parameters": {
"message": "✅ Imagem aprovada! Sua foto foi publicada."
}
}
},
{
"id": "message_blocked",
"type": "message",
"position": { "x": 900, "y": 150 },
"data": {
"label": "Bloqueado",
"parameters": {
"message": "❌ Conteúdo bloqueado\n\nSua imagem contém conteúdo impróprio e não pode ser publicada.\n\n⚠️ Encontrados {{moderation.count}} problemas."
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1100, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_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_blocked", "label": "false" },
{ "source": "message_approved", "target": "end_1" },
{ "source": "message_blocked", "target": "end_1" }
]
}
Resposta do Node
{
"moderationLabels": [
{
"Name": "Violence",
"ParentName": "",
"Confidence": 92.5
}
],
"count": 1,
"isSafe": false
}
Boas Práticas
✅ SIM: Use minConfidence: 75+ para evitar falsos positivos | Implemente revisão humana para casos limítrofes | Log todas as moderações para auditoria
❌ NÃO: Não confie 100% sem revisão humana para decisões críticas | Não use threshold muito baixo (<60)
💡 Dica: O campo isSafe é um atalho conveniente para verificar se imagem não tem problemas.