اجرای CPU با ONNX
بدون وابستگی به GPU؛ مناسب سرورهای معمولی و هزینهٔ پایینتر نسبت به استقرار GPU.
مخزن باز · Python · FastAPI

میکروسرویس stateless برای اجرای مدل NudeNet با ONNX روی CPU؛ هر کلاینتی میتواند تصویر بفرستد و لیست detectionها (کلاس، امتیاز، محدوده) را دریافت کند.
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 یا شبکهٔ داخلی کنار سرویسهای دیگر.
بدون وابستگی به GPU؛ مناسب سرورهای معمولی و هزینهٔ پایینتر نسبت به استقرار GPU.
320n (سریعتر) و 640m (دقت بهتر روی تصاویر کوچک). با متغیر محیطی BASIR_NSFW_MODEL بدون rebuild عوض میشود.
POST /infer برای inference؛ GET /health و GET /ready برای مانیتورینگ و orchestration (Kubernetes، Compose).
تا وقتی مدل لود و یک inference آزمایشی موفق نشود، /ready مقدار 503 برمیگرداند — برای healthcheck قبل از ترافیک واقعی.
وزنهای ONNX داخل image قابل بستهبندی است؛ برای محیطهای بدون اینترنت با docker save/load قابل انتقال است.
احراز هویت داخلی ندارد — سرویس را در شبکهٔ خصوصی یا پشت reverse proxy با کنترل دسترسی قرار دهید.
از نصب تا اولین درخواست موفق
مخزن GitHub را کلون کنید، Python 3.11 و venv آماده کنید، pip install -r requirements.txt. فایلهای 320n.onnx و 640m.onnx را در app/model/ قرار دهید (راهنمای مخزن).
BASIR_NSFW_MODEL=320n (یا 640m) تنظیم کنید و uvicorn app.main:app --host 0.0.0.0 --port 8000 را اجرا کنید. GET /ready باید {ready:true} برگرداند.
با curl یا هر HTTP client: curl -F "f1=@photo.jpg" http://localhost:8000/infer — در پاسخ، prediction[0] لیست detectionهای تصویر اول است.
روی کلاسهای موردنظر (مثلاً کلاسهای ناامن بالا) max(score) بگیرید و با threshold خودتان مقایسه کنید. سرویس فقط detection خام برمیگرداند.
سرویس را در Docker یا Compose بالا بیاورید؛ از /health و /ready در healthcheck استفاده کنید. timeout و retry را در کلاینت HTTP خود تنظیم کنید.
endpointها و نمونهٔ پاسخ
پورت پیشفرض 8000 — base URL را در کلاینت خود جایگزین کنید.
GET /healthبررسی زنده بودن process — همیشه 200 با status: ok.
GET /readyآماده بودن مدل — 200 با ready: true پس از warmup.
POST /infermultipart/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 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_MODEL320n (پیشفرض) یا 640m.
BASIR_NSFW_MODELS_DIRمسیر پوشهٔ فایلهای .onnx.
BASIR_NSFW_MIN_SCOREحداقل confidence برای نگهداشتن box (پیشفرض 0.15).
مخزن و مستندات تکمیلی
سورس کامل، Dockerfile، requirements و README فنی (انگلیسی).
https://github.com/mbasirmajd/rmshub-nsfw
آستانهٔ تصمیم (threshold) را در لایهٔ business logic خودتان تعریف کنید — این API فقط detection برمیگرداند.
برای چند تصویر در یک درخواست، f1، f2، … بفرستید؛ ترتیب فیلدها در prediction حفظ میشود.
فایلهای .onnx حجم بالایی دارند؛ در GitHub معمولاً از LFS یا Release artifact استفاده میشود.
سرویس را مستقیماً روی اینترنت عمومی بدون فایروال یا API gateway قرار ندهید.