Object Detection: چیست، الگوریتم‌ها و اصل کار

نویسنده: IT Sectr منتشر شده: 2026-07-19 زمان مطالعه: 9 دقیقه

Object Detection — یک任务 بینایی کامپیوتر است که به طور همزمان کلاس شی (گربه، ماشین، انسان) و موقعیت آن را در تصویر به صورت یک قاب مستطیلی (bounding box) تعیین می‌کند. برخلاف Image Labeling، Object Detection چندین شی از کلاس‌های مختلف را در یک فریم پیدا می‌کند و مختصات آنها را نشان می‌دهد. در توسعه موبایل، Object Detection در سیستم‌های نظارت تصویری، برنامه‌های AR، پهپادهای خودران، تصویربرداری پزشکی و تحلیل خرده‌فروشی استفاده می‌شود. طبق داده‌های Google ML Kit, 2025، Object Detection روی دستگاه به 30 FPS در دستگاه‌های پرچمدار با دقت 87% mAP می‌رسد.

نکات اصلی

  • Object Detection — طبقه‌بندی + مکان‌یابی اشیاء (bounding box)
  • ML Kit Object Detection — تا 30 FPS، 87% mAP، دسته‌بندی‌ها: fashion, food, home, places
  • YOLOv8-Nano — 2.6M پارامتر، 42% mAP COCO، 10–30 ms تاخیر
  • SSD MobileNetV2 — 22% mAP COCO، 15–40 ms، حداکثر سرعت
  • On-device real-time — تمام محاسبات به صورت محلی، بدون ارسال ویدیو به سرور

Object Detection چیست: اصل کار

Object Detection دو مسئله را همزمان حل می‌کند: چه چیزی در تصویر وجود دارد (طبقه‌بندی) و کجاست (رگرسیون مختصات). مدل تصویر را به یک شبکه تقسیم می‌کند، برای هر خانه bounding box (x, y, width, height) و احتمالات کلاس را پیش‌بینی می‌کند. Non-Maximum Suppression (NMS) قاب‌های تکراری را برای یک شی حذف می‌کند و مطمئن‌ترین پیش‌بینی را نگه می‌دارد. معماری‌های مدرن به two-stage (Faster R-CNN — ابتدا region proposals، سپس طبقه‌بندی) و one-stage (YOLO, SSD — همه چیز یکجا) تقسیم می‌شوند.

معیارهای ارزیابی: mAP (mean Average Precision) — معیار اصلی کیفیت Object Detection. mAP@0.5 — دقت در آستانه IoU 0.5، mAP@0.5:0.95 — میانگین در آستانه‌های 0.5 تا 0.95. FPS — تعداد فریم در ثانیه (سرعت استنتاج). برای برنامه‌های موبایل تعادل mAP/FPS حیاتی است: YOLOv8-Nano 42% mAP@0.5:0.95 در 50+ FPS می‌دهد، SSD MobileNet — 22% mAP در 60+ FPS. برای real-time > 20 FPS، برای استفاده تعاملی 5–15 FPS.

IoU (Intersection over Union) — معیار همپوشانی بین bounding box پیش‌بینی شده و ground truth. IoU = مساحت اشتراک / مساحت اتحاد. آستانه IoU برای NMS معمولاً 0.5–0.7. برای ردیابی اشیاء بین فریم‌ها (re-identification) از Deep SORT یا ByteTrack با تطبیق IoU استفاده کنید. برای شمارش اشیاء در ویدیو — BoT-SORT 85% MOTA (Multiple Object Tracking Accuracy) را تضمین می‌کند.

معماریmAP@0.5:0.95تاخیرپارامترهااندازه
YOLOv8-Nano42%10–30 ms2.6M5.9 MB
YOLOv8-Small50%25–60 ms11.2M22 MB
SSD MobileNetV222%15–40 ms5.2M21 MB
EfficientDet-Lite035%20–50 ms3.9M15 MB

Anchor Boxes — اشکال از پیش تعریف شده bounding box که مدل آنها را تصحیح می‌کند. YOLOv8 از تشخیص بدون لنگر (anchor-free) استفاده می‌کند که یادگیری را ساده و استنتاج را سریع‌تر می‌کند. SSD و YOLO قدیمی نیاز به انتخاب anchor برای مجموعه داده دارند. برای توسعه موبایل معماری‌های anchor-free (YOLOv8, FCOS) ترجیح داده می‌شوند — آنها به اندازه اشیاء وابسته نیستند و در سفارشی‌سازی ساده‌تر هستند.

ML Kit Object Detection و Tracking

ML Kit Object Detection and Tracking — کتابخانه Google برای تشخیص و ردیابی اشیاء روی دستگاه. از دو تغییر پشتیبانی می‌کند: single-image detector (برای عکس‌ها) و streaming detector (برای ویدیو). حالت streaming به طور خودکار اشیاء را بین فریم‌ها با استفاده از جریان نوری ردیابی می‌کند که تاخیر بین فریم‌ها را پس از تشخیص اولیه به 5–10 ms کاهش می‌دهد. دسته‌بندی‌ها: fashion, food, home, places — هر کدام 10–20 کلاس.

API ML Kit: ObjectDetector (گزینه‌ها: detectorMode, enableClassification, enableMultipleObjects) → InputImage → DetectedObject (trackingId, boundingBox, classificationCategory, classificationConfidence). TrackingId امکان ردیابی یک شی را بین فریم‌ها فراهم می‌کند. MultipleObjects = true — تشخیص تا 5 شی در هر فریم. Classification — تشخیص دسته‌بندی شی را فعال می‌کند (پیش‌فرض false برای سرعت). حالت streaming برای real-time توصیه می‌شود: 20–30 FPS در Pixel 6.

kotlin
val options = ObjectDetectorOptions.Builder()
    .setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
    .enableClassification()
    .enableMultipleObjects()
    .build()

val detector = ObjectDetection.getClient(options)

detector.process(inputImage)
    .addOnSuccessListener { objects ->
        objects.forEach { obj ->
            val box = obj.boundingBox
            val trackingId = obj.trackingId
            val category = obj.classificationCategory()
            drawBoundingBox(box, trackingId, category)
        }
    }

Object Tracking: پس از تشخیص شی در اولین فریم، ML Kit آن را در جریان ویدیو بدون تشخیص مجدد ردیابی می‌کند (بر اساس optical flow + feature tracking). این کار بار CPU/GPU را کاهش می‌دهد: اولین تشخیص 30–60 ms، فریم‌های بعدی ردیابی 2–5 ms. اگر شی از فریم خارج شود یا بیش از 30 درجه بچرخد، ردیاب بازنشانی می‌شود و تشخیص مجدد لازم است. TrackingId تا زمانی که شی در فریم است حفظ می‌شود. برای شمارش اشیاء منحصر به فرد از trackingId به عنوان شناسه استفاده کنید.

YOLO: You Only Look Once روی دستگاه‌های موبایل

YOLOv8-Nano — کوچکترین نسخه YOLOv8 (Ultralytics) برای دستگاه‌های لبه. 2.6M پارامتر، 5.9 MB (FP16)، 42% mAP@0.5:0.95 در COCO. YOLOv8 از تشخیص anchor-free + C2f backbone + TaskAlignedAssigner برای تطبیق پیش‌بینی‌ها استفاده می‌کند. برای توسعه موبایل خروجی به TFLite (INT8 — 2.0 MB، تاخیر 8–20 ms) و Core ML (4.5 MB، تاخیر 5–15 ms در iPhone 15 Pro) در دسترس است. YOLOv8-Nano — بهترین انتخاب برای Object Detection بی‌درنگ روی دستگاه است.

خروجی YOLOv8 به TFLite: Ultralytics CLI ارائه می‌دهد: yolo export model=yolov8n.pt format=tflite int8. خروجی — مدل TFLite INT8 بهینه‌شده برای GPU Delegate از طریق NNAPI. برای مجموعه داده سفارشی (کلاس‌های خود، نه COCO) — آموزش از طریق Ultralytics HUB روی 50–500 تصویر در هر کلاس. RT-DETR (Real-Time Detection Transformer) — جایگزین بر اساس معماری Transformer، 48% mAP در 60 FPS در NVIDIA Jetson، اما برای دستگاه‌های موبایل هنوز از نظر سرعت از YOLOv8-Nano عقب‌تر است.

python
# خروجی YOLOv8 به TFLite
from ultralytics import YOLO

model = YOLO("yolov8n.pt")
model.export(format="tflite", int8=True, imgsz=320)

# استنتاج با TFLite در Android
val interpreter = Interpreter(loadFile("yolov8n_int8.tflite"))
val output = Array(1) { Array(8400) { FloatArray(6) } }
interpreter.run(inputBuffer, output)

YOLO در مقابل ML Kit در دستگاه‌های موبایل: ML Kit Object Detection در یکپارچه‌سازی ساده‌تر است (10 خط کد)، نیاز به تخصص ML ندارد، اما به کلاس‌های استاندارد محدود می‌شود (fashion, food, home, places). YOLOv8-Nano نیاز به خروجی سفارشی دارد، اما کنترل کامل می‌دهد: هر کلاس، اندازه ورودی، معماری. برای نمونه‌سازی سریع — ML Kit. برای تولید با اشیاء غیراستاندارد — YOLOv8-Nano. برای iOS: YOLOv8-Core ML از طریق خروجی مدل از Ultralytics + VNCoreMLRequest.

SSD و سایر معماری‌های on-device

SSD (Single Shot Multibox Detector) — معماری کلاسیک one-stage برای دستگاه‌های موبایل. SSD MobileNetV2 — استاندارد دوفاکتو در ۲۰۲۰–۲۰۲۳: 22% mAP@0.5:0.95 در COCO، 15–40 ms در Pixel 6. SSD از feature pyramid (لایه‌های مختلف MobileNet برای تشخیص اشیاء در اندازه‌های مختلف) و default boxes (anchor boxes) برای هر خانه نقشه ویژگی استفاده می‌کند. مزیت: حداکثر سرعت برای زمان خود. عیب: دقت پایین در اشیاء کوچک (10–30 px).

EfficientDet-Lite — خانواده از Google (2020+)، بهینه‌شده برای TFLite. EfficientDet-Lite0: 3.9M پارامتر، 35% mAP، 20–50 ms. EfficientDet-Lite2: 8.1M، 42% mAP، 40–80 ms. EfficientDet از BiFPN (Bidirectional Feature Pyramid Network) برای multi-scale feature fusion استفاده می‌کند — این 2–4% افزایش mAP بدون افزایش تاخیر می‌دهد. برای توسعه موبایل Google EfficientDet-Lite را به عنوان تشخیص‌دهنده اصلی برای TFLite Task Vision توصیه می‌کند.

MediaPipe Object Detector — پیاده‌سازی آماده بر اساس EfficientDet-Lite در MediaPipe Tasks Vision. API یکپارچه برای Android، iOS، Python، Web ارائه می‌دهد. MediaPipe Object Detector از کلاس‌های COCO (80 کلاس)، مدل‌های سفارشی، حالت streaming و نمایندگان CPU/GPU پشتیبانی می‌کند. برای یکپارچه‌سازی سریع Object Detection در پروژه چندپلتفرمی MediaPipe — انتخاب بهینه: یک کد برای همه پلتفرم‌ها.

kotlin
// MediaPipe Object Detection
val options = ObjectDetectorOptions.Builder()
    .setBaseOptions(BaseOptions.builder()
        .setDelegate(BaseOptions.Delegate.GPU)
        .build())
    .setMaxResults(5)
    .setScoreThreshold(0.5f)
    .build()

val detector = ObjectDetector.createFromOptions(context, options)

val image = MPImage.fromBitmap(bitmap)
val result = detector.detect(image)
result.detections.forEach { detection ->
    val box = detection.boundingBox
    val category = detection.categories.first()
}

انتخاب معماری برای برنامه موبایل: برای > 30 FPS در دستگاه‌های متوسط — YOLOv8-Nano (INT8) یا SSD MobileNetV2. برای دقت > 40% mAP — YOLOv8-Small (11.2M) یا EfficientDet-Lite2 (8.1M). برای چندپلتفرمی — MediaPipe Object Detector. برای سادگی — ML Kit. برای iOS-first — Core ML + YOLOv8 .mlpackage. برای Android-first — TFLite Task Vision (ObjectDetector API). آموزش: Roboflow (مجموعه داده) + Ultralytics YOLOv8 (تمرین) + خروجی به TFLite/Core ML.

TensorFlow Lite Task Vision API

TFLite Task Vision ObjectDetector — API یکپارچه از Google برای اجرای مدل‌های Object Detection در Android و iOS. Task API به طور خودکار پیش‌پردازش تصویر (مقیاس‌بندی، نرمال‌سازی، تبدیل فضای رنگی) و پس‌پردازش (NMS، آستانه‌گذاری) را مدیریت می‌کند. توسعه‌دهنده باید مدل .tflite را ارسال کند و لیست Detections با bounding box + category + score دریافت کند. Task API از مدل‌های سازگار با COCO (80 کلاس) پشتیبانی می‌کند.

تبدیل مدل سفارشی به Task API: مدل TFLite باید ورودی [1, height, width, 3] (float32/uint8) و خروجی: detection_boxes[1,N,4]، detection_classes[1,N]، detection_scores[1,N]، num_detections[1] داشته باشد. خروجی از TensorFlow Object Detection API با عملیات پس‌پردازش فعال (SSD Postprocess). برای YOLOv8 — خروجی TFLite با NMS از طریق ops-compat. Task API در iOS از Core ML Delegate برای شتاب‌دهی در ANE استفاده می‌کند.

kotlin
// TFLite Task Vision Object Detector
val options = ObjectDetectorOptions.Builder()
    .setScoreThreshold(0.5f)
    .setMaxResults(10)
    .setDelegate(Delegate.GPU)
    .build()

val detector = ObjectDetector.createFromFileAndOptions(
    context, "custom_model.tflite", options
)

val image = TensorImage.fromBitmap(bitmap)
val results = detector.detect(image)
results.forEach { detection ->
    onObjectDetected(
        detection.boundingBox,
        detection.categories.first().label,
        detection.categories.first().score
    )
}

عملکرد Task API: GPU Delegate در Android شتاب 3–5x در مقایسه با CPU (XNNPACK) می‌دهد. NNAPI Delegate — 1.5–2x اضافی در دستگاه‌های دارای NPU (Pixel 8, Snapdragon 8 Gen 3, Dimensity 9300). Hexagon, DSP — تا 10x در شتاب‌دهنده‌های DSP. برای iOS Core ML Delegate — 4–6x نسبت به CPU. Task API به طور خودکار شتاب‌دهنده سخت‌افزاری موجود را انتخاب می‌کند، اما می‌توان نماینده را از طریق DetectorOptions اجباری تعیین کرد.

کاربرد Object Detection در برنامه‌های موبایل

شمارش افراد و اشیاء — تحلیل خرده‌فروشی: تشخیص بازدیدکنندگان در فروشگاه، شمارش صف‌ها، تعیین پر بودن قفسه‌ها از کالا. شمارنده Object Detection در فریم امکان ارزیابی عبور و مرور و تبدیل را فراهم می‌کند. ML Kit Object Detector تا 30 FPS می‌دهد — برای شمارش بی‌درنگ کافی است. برای عبور از خط (zone crossing) — ترکیب Object Detection + ردیابی ByteTrack. دقت شمارش: 92–95% در روشنایی خوب.

تشخیص عیوب در تولید — Object Detection عیوب روی خط تولید را تعیین می‌کند: خط و خش، ترک، مونتاژ نادرست. مدل سفارشی YOLOv8-Nano (INT8) روی تبلت Android متصل به دوربین USB کار می‌کند. تاخیر: 20–40 ms در هر فریم (25–50 FPS). برای عیوب پیچیده (ریزترک‌ها) — رزولوشن ورودی را به 640x640 افزایش دهید (تاخیر 40–80 ms). آموزش: Roboflow — مجموعه داده 200–1000 تصویر عیوب + Ultralytics YOLOv8.

علامت‌گذاری اشیاء AR در زمان واقعی — ARCore (Android) و ARKit (iOS) از Object Detection برای تشخیص سطوح صاف، سطوح عمودی و اشیاء سه‌بعدی استفاده می‌کنند. ML Kit Object Detection + ARCore Scene Semantics بخش‌بندی اشیاء را می‌دهد: دیوار، کف، سقف، مبلمان. برای علامت‌گذاری AR سفارشی (مثلاً تشخیص مدل خاص مبل و قرار دادن اطلاعات AR) — YOLOv8-Nano + SceneKit/SceneForm. نیاز real-time: > 20 FPS.

swift
// ARKit + Object Detection
let request = VNCoreMLRequest(model: objectDetector) { req, _ in
    guard let results = req.results as? [VNDetectedObjectObservation] else { return }
    for result in results where result.confidence > 0.6 {
        let rect = result.boundingBox
        let worldPos = arView.hitTest(rect.center)
        arView.addAnchor(ARAnchor(name: label, transform: worldPos))
    }
}

تصویربرداری پزشکی — Object Detection برای تحلیل عکس‌های رادیوگرافی، MRI، CT. تشخیص تومور، شکستگی، آسیب‌شناسی در دستگاه موبایل پزشک. YOLOv8-Nano در تبلت Android گره‌های ریوی را در 15–30 ms با حساسیت 89% و ویژگی 93% تشخیص می‌دهد (داده‌های NIH ChestX-ray14). الزامات: کوانت‌سازی INT8 (حریم خصوصی داده‌ها)، high recall (از دست دادن آسیب‌شناسی خطرناک‌تر از هشدار کاذب است)، استفاده از آستانه confidence < 0.4. پردازش روی دستگاه حریم خصوصی داده‌های پزشکی را تضمین می‌کند.

سوالات متداول

تفاوت بین Object Detection و Image Segmentation چیست؟

Object Detection برای هر شی bounding box برمی‌گرداند — یک قاب مستطیلی که شی را احاطه می‌کند. Image Segmentation (معنایی یا نمونه) کانتور دقیق شی را برمی‌گرداند — ماسک پیکسل‌به‌پیکسل. Segmentation دقیق‌تر اما کندتر است (50–300 ms در مقابل 10–30 ms برای تشخیص). برای کارهایی که شکل شی مهم است (پزشکی، AR) از segmentation استفاده کنید. برای کارهایی که موقعیت و وجود مهم است (شمارش، تعدیل) از تشخیص استفاده کنید. MobileViT — معماری که هر دو مسئله را حل می‌کند.

Object Detection در دستگاه موبایل چند کلاس می‌تواند تشخیص دهد؟

YOLOv8-Nano روی COCO آموزش دیده است (80 کلاس). ML Kit Object Detection — 40+ کلاس (fashion, food, home, places). مدل سفارشی می‌تواند تا 100 کلاس را در دستگاه موبایل بدون افت عملکرد تشخیص دهد. بیش از 100 کلاس — تاخیر افزایش و mAP کاهش می‌یابد. برای برنامه‌های با 1000+ کلاس از طبقه‌بندی سلسله‌مراتبی استفاده کنید: ابتدا دسته کلی (10 کلاس)، سپس دقیق (100 زیرکلاس). EfficientNet + YOLO — رویکرد سلسله‌مراتبی برای 1000+ کلاس با تاخیر < 50 ms.

آیا می‌توان از Object Detection برای ردیابی اشیاء بین فریم‌ها استفاده کرد؟

بله، ML Kit Object Detection شامل ردیابی داخلی است: پس از تشخیص در اولین فریم، شی در جریان ویدیو بدون تشخیص مجدد ردیابی می‌شود. برای ردیابی پیچیده‌تر (تقاطع اشیاء، خروج از فریم) از ByteTrack یا BoT-SORT استفاده کنید. ByteTrack بر اساس IoU (intersection over union) بین bounding box فریم‌های مجاور کار می‌کند — 85% MOTA در MOT17. BoT-SORT علاوه بر این از re-identification (ReID) برای بازیابی اشیاء گمشده استفاده می‌کند — 90% MOTA.

چگونه YOLOv8 را در iOS مستقر کنیم؟

YOLOv8 را به Core ML صادر کنید: yolo export model=yolov8n.pt format=coreml int8. .mlpackage حاصل از طریق VNCoreMLRequest (Vision Framework) یکپارچه می‌شود. جایگزین: YOLOv8 → TFLite → Core ML Delegate (iOS TFLite API). خروجی Ultralytics YOLOv8 Core ML از iOS 16+، شتاب ANE، کوانت‌سازی FP16 و INT8 پشتیبانی می‌کند. برای streaming از AVFoundation + Vision با درخواست‌های تکراری VNImageRequestHandler استفاده کنید. Real-time: 20–30 FPS در iPhone 14 Pro.

چگونه دقت Object Detection را در دستگاه‌های موبایل بهبود دهیم؟

تنوع مجموعه داده را افزایش دهید (زاویه‌ها، نور، پس‌زمینه) — 500+ تصویر در هر کلاس. از data augmentation استفاده کنید: mosaic, mixup, random perspective (augmentation Ultralytics YOLOv8 — 2–5% افزایش mAP). اندازه ورودی را به 640x640 افزایش دهید (به جای 320x320) — +4–8% mAP، اما تاخیر ×2. از کوانت‌سازی FP16 یا INT8 پس از آموزش (post-training) استفاده کنید — +0–1% کاهش mAP، 4x فشرده‌سازی. برای iOS از ANE (Neural Engine) از طریق Core ML Delegate استفاده کنید — شتاب 3–5x نسبت به CPU.

خلاصه

  • Object Detection — طبقه‌بندی + مکان‌یابی اشیاء با bounding box
  • ML Kit — تا 30 FPS، 40+ کلاس، ردیابی داخلی اشیاء
  • YOLOv8-Nano — 2.6M پارامتر، 42% mAP، 10–30 ms، بهترین برای on-device
  • SSD / EfficientDet — جایگزین‌های کلاسیک و مدرن برای TFLite
  • Task Vision API — API یکپارچه TFLite با شتاب GPU/ANE
  • On-device — حریم خصوصی داده، تاخیر صفر، بدون اینترنت
  • کاربرد — تحلیل خرده‌فروشی، AR، پزشکی، عیب‌یابی، شمارش اشیاء

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید