Görsel NSFW Tespiti
Discuse görsel moderasyonu, kullanıcıların gönderdiği görselleri müstehcen içerik açısından puanlar. Görsel URL’lerini check_images etkinleştirilmiş şekilde POST https://api.discuse.com/api/v2/check adresine gönderin; API, results.images nesnesine göre porn, sexual ve neutral olasılıklarının yanı sıra bir hit bayrağı döndürür.
NSFW tespiti nasıl çalışır?
Discuse’ın bilgisayarlı görü modeli, her görsel için toplamı 1.0’a yaklaşan üç olasılık döndürür:
porn: görselin pornografik olma olasılığı.sexual: görselin cinsel çağrışım içerme olasılığı.neutral: görselin güvenli olma olasılığı.
hit bayrağı, görselin projenizin NSFW eşiklerini aştığını gösterir. Açıkça müstehcen bir görseli (otomatik engelleme) sınırda kalan bir görselden (insan incelemesi) ayırmak için ham puanları kullanın.
Bir görseli nasıl kontrol ederim?
Bir veya daha fazla görsel URL’si gönderin ve görsel kontrolünü check_images ile etkinleştirin:
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
}
}'
Tek bir istek en fazla 10 görsel URL’si kabul eder.
Yanıt biçimi
{
"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
}
}
Görsel sonucu results.images altında yer alır. processing_time_ms yalnızca proje ayarlarınızda zamanlama etkinleştirildiğinde bulunur.
Birden fazla görseli kontrol etme
{
"content": {
"image_urls": [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
},
"settings": {
"check_images": true
}
}
Taranan her görsel, görsel tarama kotanızdan ayrı ayrı düşülür.
Puanları nasıl yorumlamalıyım?
porn, sexual ve neutral, 0.0 ile 1.0 arasında olasılıklardır. Müstehcen bir görselde porn yüksek, neutral düşüktür; güvenli bir görselde ise neutral baskındır.
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';
}
}
Ayrıca, projenizin threshold_images_porn ve threshold_images_sexual ayarlarını zaten uygulayan hit bayrağını temel alarak da geçiş kuralı koyabilirsiniz.
Kullanım alanları
Sosyal platformlar
Profil fotoğraflarını ve gönderi görsellerini yayına alınmadan önce tarayın:
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 };
}
Pazaryerleri
Ürün görselleri için daha sıkı bir eşik uygulayın:
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}
En iyi uygulamalar
Kalıcı depolamadan önce tarayın
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);
}
Metin moderasyonuyla birlikte kullanın
Tek bir istek, bir görseli ve başlığını birlikte tarayabilir:
{
"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
}
}
Önbelleğe alınmış sonuçları kullanın
Önbelleğe alınmış yanıtlar kotanızdan düşülmez; bu nedenle daha önce taranmış bir görseli yeniden göstermek veya yeniden doğrulamak ücretsizdir. Yanıttaki cached bayrağı, bir sonucun önbellekten geldiğini belirtir.
Kullanım limitleri
| Plan | Aylık Görsel Taramaları | Aşım Ücreti |
|---|---|---|
| Basic | 500 | Kullanılamaz |
| Gold | 2,000 | $0.00075/tarama |
| Platinum | 5,000 | $0.00064/tarama (%15 indirim) |
| Ultimate | 10,000 | $0.00056/tarama (%25 indirim) |
Entegrasyon örnekleri
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()
Sonraki adımlar
- Metin Analizi - aynı isteğe duygu ve spam puanlaması ekleyin
- Dil Tespiti - içerik dilini tespit edin ve kurallar uygulayın
- Dosya Antivirüs Taraması - belgeleri kötü amaçlı yazılımlara karşı tarayın