Detección de imágenes NSFW
La moderación de imágenes de Discuse puntúa las imágenes enviadas por usuarios para detectar contenido explícito. Envía las URL de las imágenes a POST https://api.discuse.com/api/v2/check con check_images activado, y la API devuelve las probabilidades porn, sexual y neutral, además de una marca hit según el objeto results.images.
¿Cómo funciona la detección NSFW?
El modelo de visión por computadora de Discuse devuelve tres probabilidades para cada imagen, cuya suma tiende a 1.0:
porn: probabilidad de que la imagen sea pornográfica.sexual: probabilidad de que la imagen sea sexualmente sugerente.neutral: probabilidad de que la imagen sea segura.
Una marca hit indica que la imagen superó los umbrales NSFW de tu proyecto. Usa las puntuaciones sin procesar para distinguir una imagen claramente explícita (bloqueo automático) de una dudosa (revisión humana).
¿Cómo compruebo una imagen?
Envía una o varias URL de imágenes y activa la comprobación de imágenes con 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
}
}'
Una sola solicitud acepta hasta 10 URL de imágenes.
Formato de respuesta
{
"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
}
}
El resultado de la imagen se encuentra en results.images. processing_time_ms solo está presente cuando la medición de tiempo está activada en la configuración de tu proyecto.
Comprobar varias imágenes
{
"content": {
"image_urls": [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
},
"settings": {
"check_images": true
}
}
Cada imagen analizada cuenta por separado contra tu cuota de análisis de imágenes.
¿Cómo interpreto las puntuaciones?
porn, sexual y neutral son probabilidades de 0.0 a 1.0. En una imagen explícita, porn es alto y neutral es bajo; en una imagen segura, domina neutral.
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';
}
}
También puedes aplicar una regla basada en la marca hit, que ya tiene en cuenta la configuración threshold_images_porn y threshold_images_sexual de tu proyecto.
Casos de uso
Plataformas sociales
Revisa las fotos de perfil y las imágenes de publicaciones antes de que se publiquen:
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
Aplica un umbral más estricto para las imágenes de productos:
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}
Buenas prácticas
Analiza antes del almacenamiento 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);
}
Combínalo con moderación de texto
Una sola solicitud puede analizar una imagen y su pie de foto al mismo tiempo:
{
"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
}
}
Usa resultados en caché
Las respuestas en caché no cuentan contra tu cuota, así que volver a mostrar o revalidar una imagen ya analizada es gratis. La marca cached en la respuesta te indica cuándo un resultado procede de la caché.
Límites de uso
| Plan | Análisis de imágenes mensuales | Tarifa por exceso |
|---|---|---|
| Basic | 500 | No disponible |
| Gold | 2,000 | $0.00075/análisis |
| Platinum | 5,000 | $0.00064/análisis (15% de descuento) |
| Ultimate | 10,000 | $0.00056/análisis (25% de descuento) |
Ejemplos de integración
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óximos pasos
- Análisis de texto - añade puntuación de sentimiento y spam a la misma solicitud
- Detección de idioma - detecta y aplica el idioma del contenido
- Análisis antivirus de archivos - analiza documentos en busca de malware