مخزن باز · Python · FastAPI

لوگوی Basir NSFW API

Basir NSFW API

میکروسرویس stateless برای اجرای مدل NudeNet با ONNX روی CPU؛ هر کلاینتی می‌تواند تصویر بفرستد و لیست detectionها (کلاس، امتیاز، محدوده) را دریافت کند.

  • Python 3.11
  • FastAPI
  • ONNX Runtime
  • Docker
  • NudeNet

این سرویس چه کاری انجام می‌دهد؟

Basir NSFW API یک سرویس REST ساده است که روی تشخیص محتوای نامناسب در تصویر تمرکز دارد. در زمان راه‌اندازی یک session ONNX بارگذاری می‌شود و برای هر درخواست POST /infer دوباره استفاده می‌شود — بدون نیاز به GPU.

ورودی: یک یا چند فایل تصویر (JPEG/PNG و مشابه) در قالب multipart با نام فیلدهای f1، f2، f3 و … خروجی: آرایه‌ای از detectionها برای هر تصویر — شامل نام کلاس، امتیاز اطمینان (۰ تا ۱) و مختصات جعبه (box).

سرویس خودش «مجاز / غیرمجاز» اعلام نمی‌کند؛ شما در اپلیکیشن خودتان (بات، پنل moderation، pipeline آپلود) امتیاز را با آستانهٔ دلخواه مقایسه می‌کنید. معمولاً روی کلاس‌های حساس (مثل FEMALE_BREAST_EXPOSED و موارد مشابه) حداکثر score محاسبه می‌شود.

امکانات

مناسب استقرار در VPS، Docker یا شبکهٔ داخلی کنار سرویس‌های دیگر.

اجرای CPU با ONNX

بدون وابستگی به GPU؛ مناسب سرورهای معمولی و هزینهٔ پایین‌تر نسبت به استقرار GPU.

دو پروفایل مدل

320n (سریع‌تر) و 640m (دقت بهتر روی تصاویر کوچک). با متغیر محیطی BASIR_NSFW_MODEL بدون rebuild عوض می‌شود.

قرارداد HTTP ساده

POST /infer برای inference؛ GET /health و GET /ready برای مانیتورینگ و orchestration (Kubernetes، Compose).

warmup و readiness

تا وقتی مدل لود و یک inference آزمایشی موفق نشود، /ready مقدار 503 برمی‌گرداند — برای healthcheck قبل از ترافیک واقعی.

Docker و استقرار آفلاین

وزن‌های ONNX داخل image قابل بسته‌بندی است؛ برای محیط‌های بدون اینترنت با docker save/load قابل انتقال است.

امنیت شبکه

احراز هویت داخلی ندارد — سرویس را در شبکهٔ خصوصی یا پشت reverse proxy با کنترل دسترسی قرار دهید.

نحوه استفاده

از نصب تا اولین درخواست موفق

  1. دریافت سورس و وابستگی‌ها

    مخزن GitHub را کلون کنید، Python 3.11 و venv آماده کنید، pip install -r requirements.txt. فایل‌های 320n.onnx و 640m.onnx را در app/model/ قرار دهید (راهنمای مخزن).

  2. اجرای سرویس

    BASIR_NSFW_MODEL=320n (یا 640m) تنظیم کنید و uvicorn app.main:app --host 0.0.0.0 --port 8000 را اجرا کنید. GET /ready باید {ready:true} برگرداند.

  3. ارسال تصویر

    با curl یا هر HTTP client: curl -F "f1=@photo.jpg" http://localhost:8000/infer — در پاسخ، prediction[0] لیست detectionهای تصویر اول است.

  4. تفسیر نتیجه در اپلیکیشن شما

    روی کلاس‌های موردنظر (مثلاً کلاس‌های ناامن بالا) max(score) بگیرید و با threshold خودتان مقایسه کنید. سرویس فقط detection خام برمی‌گرداند.

  5. یکپارچه‌سازی در production

    سرویس را در Docker یا Compose بالا بیاورید؛ از /health و /ready در healthcheck استفاده کنید. timeout و retry را در کلاینت HTTP خود تنظیم کنید.

مرجع API

endpointها و نمونهٔ پاسخ

Endpointها

پورت پیش‌فرض 8000 — base URL را در کلاینت خود جایگزین کنید.

GET /health
بررسی زنده بودن process — همیشه 200 با status: ok.
GET /ready
آماده بودن مدل — 200 با ready: true پس از warmup.
POST /infer
multipart/form-data؛ فیلدهای f1، f2، … — پاسخ: { success, prediction: [[{ class, score, box }, …], …] }.

نمونه پاسخ موفق

ساختار JSON — هر عنصر داخلی prediction مربوط به یک تصویر است.

{ "success": true, "prediction": [[...]] }
هر detection: class (رشته)، score (۰–۱)، box [x1,y1,x2,y2]. کلاس‌های دیگر (مثل FACE) ممکن است برگردند ولی در فیلتر شما نادیده گرفته شوند.
success: false
ورودی نامعتبر، خطای داخلی، یا سرویس هنوز آماده نیست — کلاینت باید خطا را مدیریت کند (مثلاً عدم حذف محتوا به‌خاطر خطای موقت).

Docker

از ریشهٔ پوشهٔ پروژه

docker build -t basir-nsfw-api:latest .
فایل‌های onnx قبل از build در app/model/ باشند.
docker run -p 8000:8000 -e BASIR_NSFW_MODEL=640m basir-nsfw-api:latest
پروفایل مدل را با env عوض کنید.

متغیرهای محیطی

تنظیمات runtime

BASIR_NSFW_MODEL
320n (پیش‌فرض) یا 640m.
BASIR_NSFW_MODELS_DIR
مسیر پوشهٔ فایل‌های .onnx.
BASIR_NSFW_MIN_SCORE
حداقل confidence برای نگه‌داشتن box (پیش‌فرض 0.15).

لینک‌ها

مخزن و مستندات تکمیلی

مخزن GitHub

سورس کامل، Dockerfile، requirements و README فنی (انگلیسی).

https://github.com/mbasirmajd/rmshub-nsfw

همهٔ پروژه‌های مخزن باز

سایر ابزارهای منتشرشده توسط RMS Hub.

/open-source

نکات مهم

  • آستانهٔ تصمیم (threshold) را در لایهٔ business logic خودتان تعریف کنید — این API فقط detection برمی‌گرداند.
  • برای چند تصویر در یک درخواست، f1، f2، … بفرستید؛ ترتیب فیلدها در prediction حفظ می‌شود.
  • فایل‌های .onnx حجم بالایی دارند؛ در GitHub معمولاً از LFS یا Release artifact استفاده می‌شود.
  • سرویس را مستقیماً روی اینترنت عمومی بدون فایروال یا API gateway قرار ندهید.