Deteksi Gambar NSFW
Moderasi gambar Discuse memberi skor pada gambar yang dikirim pengguna untuk mendeteksi konten eksplisit. Kirim URL gambar ke POST https://api.discuse.com/api/v2/check dengan check_images diaktifkan, dan API akan mengembalikan probabilitas porn, sexual, dan neutral serta flag hit sesuai objek results.images.
Bagaimana cara kerja deteksi NSFW?
Model computer vision Discuse mengembalikan tiga probabilitas untuk setiap gambar, dengan total mendekati 1.0:
porn: kemungkinan gambar bersifat pornografis.sexual: kemungkinan gambar bersifat sugestif secara seksual.neutral: kemungkinan gambar aman.
Flag hit menunjukkan bahwa gambar melewati ambang NSFW proyek Anda. Gunakan skor mentah untuk membedakan gambar yang jelas eksplisit (blokir otomatis) dari gambar yang berada di area abu-abu (ditinjau manusia).
Bagaimana cara memeriksa gambar?
Kirim satu atau beberapa URL gambar dan aktifkan pemeriksaan gambar dengan 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
}
}'
Satu permintaan menerima hingga 10 URL gambar.
Format respons
{
"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
}
}
Hasil gambar berada di bawah results.images. processing_time_ms hanya muncul jika pengukuran waktu diaktifkan di pengaturan proyek Anda.
Memeriksa beberapa gambar
{
"content": {
"image_urls": [
"https://example.com/image1.jpg",
"https://example.com/image2.jpg",
"https://example.com/image3.jpg"
]
},
"settings": {
"check_images": true
}
}
Setiap gambar yang dipindai dihitung secara terpisah terhadap kuota pemindaian gambar Anda.
Bagaimana cara menafsirkan skor?
porn, sexual, dan neutral adalah probabilitas dari 0.0 hingga 1.0. Untuk gambar eksplisit, porn tinggi dan neutral rendah; untuk gambar yang aman, neutral lebih dominan.
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';
}
}
Anda juga dapat menggunakan flag hit sebagai gerbang, yang sudah menerapkan pengaturan threshold_images_porn dan threshold_images_sexual proyek Anda.
Kasus penggunaan
Platform sosial
Saring foto profil dan gambar postingan sebelum ditayangkan:
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 };
}
Marketplace
Terapkan batas yang lebih ketat untuk gambar produk:
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}
Praktik terbaik
Pindai sebelum penyimpanan permanen
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);
}
Gabungkan dengan moderasi teks
Satu permintaan dapat memindai gambar dan keterangannya sekaligus:
{
"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
}
}
Gunakan hasil cache
Respons yang di-cache tidak dihitung terhadap kuota Anda, sehingga menampilkan ulang atau memvalidasi ulang gambar yang sudah dipindai tidak dikenai biaya. Flag cached dalam respons memberi tahu Anda saat hasil berasal dari cache.
Batas penggunaan
| Paket | Pemindaian Gambar Bulanan | Tarif Kelebihan |
|---|---|---|
| Basic | 500 | Tidak tersedia |
| Gold | 2,000 | $0.00075/pemindaian |
| Platinum | 5,000 | $0.00064/pemindaian (diskon 15%) |
| Ultimate | 10,000 | $0.00056/pemindaian (diskon 25%) |
Contoh integrasi
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()
Langkah berikutnya
- Analisis Teks - tambahkan penilaian sentimen dan spam ke permintaan yang sama
- Deteksi Bahasa - deteksi dan terapkan bahasa konten
- Pemindaian Antivirus File - pindai dokumen untuk malware