Detecção de imagens NSFW
A moderação de imagens da Discuse atribui pontuações a imagens enviadas por usuários para identificar conteúdo explícito. Envie URLs de imagens para POST https://api.discuse.com/api/v2/check com check_images habilitado, e a API retorna probabilidades de porn, sexual e neutral, além de um sinalizador hit conforme o objeto results.images.
Como funciona a detecção NSFW?
O modelo de visão computacional da Discuse retorna três probabilidades para cada imagem, cuja soma tende a 1.0:
porn: probabilidade de a imagem ser pornográfica.sexual: probabilidade de a imagem ter conotação sexual.neutral: probabilidade de a imagem ser segura.
Um sinalizador hit indica que a imagem ultrapassou os limites NSFW do seu projeto. Use as pontuações brutas para diferenciar uma imagem claramente explícita (bloqueio automático) de uma imagem limítrofe (análise humana).
Como verificar uma imagem?
Envie uma ou mais URLs de imagens e habilite a verificação de imagem com check_images:
curl -X POST https://api.discuse.com/api/v2/check \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": {
"image_urls": ["https://example.com/user-upload.jpg"]
},
"settings": {
"check_images": true
}
}'
Uma única solicitação aceita até 10 URLs de imagens.
Formato da resposta
{
"has_violations": true,
"cached": false,
"message": "NSFW content detected",
"results": {
"hits": true,
"images": {
"status": "ok",
"porn": 0.95,
"sexual": 0.85,
"neutral": 0.02,
"hit": true
}
},
"usage": {
"api_requests_used": 12,
"api_requests_limit": 2000,
"api_requests_remaining": 1988
}
}
O resultado da imagem fica em results.images. processing_time_ms só aparece quando a medição de tempo está habilitada nas configurações do seu projeto.
Verificando várias imagens
{
"content": {
"image_urls": [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
},
"settings": {
"check_images": true
}
}
Cada imagem verificada conta separadamente para a sua cota de varreduras de imagem.
Como interpretar as pontuações?
porn, sexual e neutral são probabilidades de 0.0 a 1.0. Em uma imagem explícita, porn é alto e neutral é baixo; em uma imagem segura, neutral predomina.
function interpretImageResult(result) {
const img = result.results.images;
if (img.porn > 0.8) {
return 'block'; // automatically reject
} else if (img.porn > 0.5 || img.sexual > 0.7) {
return 'review'; // queue for human review
} else if (img.sexual > 0.5) {
return 'warn'; // allow with a content-warning label
} else {
return 'allow';
}
}
Você também pode usar o sinalizador hit, que já aplica as configurações threshold_images_porn e threshold_images_sexual do seu projeto.
Casos de uso
Plataformas sociais
Analise fotos de perfil e imagens de publicações antes que elas entrem no ar:
async function handleImageUpload(imageUrl) {
const result = await checkImage(imageUrl);
const img = result.results.images;
if (img.porn > 0.7) {
throw new Error('This image violates our community guidelines');
}
if (img.sexual > 0.7) {
return { url: imageUrl, hasContentWarning: true };
}
return { url: imageUrl, hasContentWarning: false };
}
Marketplaces
Aplique um limite mais rigoroso para imagens de produtos:
def validate_product_image(image_url):
result = check_image(image_url)
img = result['results']['images']
if img['porn'] > 0.3 or img['sexual'] > 0.3:
return {'approved': False, 'reason': 'Image contains inappropriate content'}
return {'approved': True}
Boas práticas
Faça a verificação antes do armazenamento permanente
async function processUpload(file) {
const tempUrl = await uploadToTemp(file);
const result = await checkImage(tempUrl);
if (result.has_violations) {
await deleteTempFile(tempUrl);
throw new Error('Image rejected');
}
return await moveToPermanent(tempUrl);
}
Combine com moderação de texto
Uma única solicitação pode analisar uma imagem e sua legenda ao mesmo tempo:
{
"content": {
"text": "Check out this photo from my vacation!",
"image_urls": ["https://example.com/vacation.jpg"]
},
"settings": {
"check_sentiment": true,
"check_spam": true,
"check_images": true
}
}
Use resultados em cache
Respostas em cache não contam para a sua cota, portanto reexibir ou revalidar uma imagem já verificada é gratuito. O sinalizador cached na resposta informa quando um resultado veio do cache.
Limites de uso
| Plano | Varreduras mensais de imagens | Tarifa por excedente |
|---|---|---|
| Basic | 500 | Não disponível |
| Gold | 2,000 | $0.00075/scan |
| Platinum | 5,000 | $0.00064/scan (15% de desconto) |
| Ultimate | 10,000 | $0.00056/scan (25% de desconto) |
Exemplos de integração
Node.js
const checkImage = async (imageUrl) => {
const response = await fetch('https://api.discuse.com/api/v2/check', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.DISCUSE_API_KEY
},
body: JSON.stringify({
content: { image_urls: [imageUrl] },
settings: { check_images: true }
})
});
return response.json();
};
Python
import os
import requests
def check_image(image_url):
response = requests.post(
'https://api.discuse.com/api/v2/check',
headers={
'Content-Type': 'application/json',
'X-API-Key': os.environ['DISCUSE_API_KEY']
},
json={
'content': {'image_urls': [image_url]},
'settings': {'check_images': True}
}
)
return response.json()
Próximas etapas
- Análise de texto - adicione pontuação de sentimento e spam à mesma solicitação
- Detecção de idioma - detecte e aplique regras sobre o idioma do conteúdo
- Varredura antivírus de arquivos - verifique documentos em busca de malware