Optical Flow
استكشف أساسيات التدفق البصري في الرؤية الحاسوبية. وتعلّم كيف تقود متجهات الحركة فهم الفيديو وتعزز التتبّع في Ultralytics YOLO26.
التدفق البصري هو نمط الحركة الظاهرية للكائنات والأسطح والحواف في مشهد مرئي، وينتج عن الحركة النسبية بين المراقب والمشهد. في مجال الرؤية الحاسوبية، يُعد هذا المفهوم أساسيًا لفهم الديناميكيات الزمنية ضمن تسلسلات الفيديو. ومن خلال تحليل إزاحة وحدات البكسل بين إطارين متتاليين، تنشئ خوارزميات التدفق البصري مجالًا متجهيًا، حيث يمثل كل متجه اتجاه الحركة ومقدارها لنقطة محددة. وتمكّن هذه الإشارة البصرية منخفضة المستوى أنظمة الذكاء الاصطناعي من إدراك ليس فقط ما يوجد في الصورة، بل أيضًا كيفية تحركه، مما يسد الفجوة بين تحليل الصور الثابتة وفهم الفيديو الديناميكي.
الآليات الأساسية للتدفق البصري#
يعتمد حساب التدفق البصري عمومًا على افتراض ثبات السطوع، الذي يفترض أن شدة البكسل على كائن ما تظل ثابتة من إطار إلى الإطار التالي، حتى أثناء تحركه. وتستخدم الخوارزميات هذا المبدأ لحساب متجهات الحركة من خلال نهجين أساسيين:
- التدفق البصري المتناثر: تحسب هذه الطريقة متجه الحركة لمجموعة فرعية محددة من الميزات المميزة، مثل الزوايا أو الحواف، التي يُكتشف وجودها عبر استخراج الميزات. وتتميز خوارزميات مثل طريقة لوكاس-كاناده بكفاءة حسابية، وهي مثالية لمهام الاستدلال في الوقت الفعلي التي يكفي فيها تتبع نقاط اهتمام محددة.
- التدفق البصري الكثيف: يحسب هذا النهج متجه حركة لكل بكسل في الإطار. وعلى الرغم من أنه يتطلب موارد حسابية أكبر بكثير، فإنه يوفر خريطة حركة شاملة ضرورية لمهام دقيقة مثل تجزئة الصور والتحليل البنيوي. وغالبًا ما تتفوق بنيات التعلم العميق الحديثة على الأساليب الرياضية التقليدية في تقدير التدفق الكثيف، من خلال تعلم أنماط الحركة المعقدة من مجموعات بيانات كبيرة.
التدفق البصري مقابل تتبع الكائنات#
على الرغم من استخدامهما معًا في كثير من الأحيان، فمن الضروري التمييز بين التدفق البصري وتتبع الكائنات. فالتدفق البصري عملية منخفضة المستوى تصف حركة البكسلات اللحظية؛ ولا يفهم بطبيعته هوية الكائن أو استمراريته.
في المقابل، يُعد تتبع الكائنات مهمة عالية المستوى تحدد مواقع كيانات معينة وتخصص لها معرّفًا ثابتًا (ID) بمرور الوقت. وعادةً ما تُجري أدوات التتبع المتقدمة، مثل تلك المدمجة في Ultralytics YOLO26، اكتشاف الكائنات للعثور على الكائن، ثم تستخدم إشارات الحركة—المستمدة أحيانًا من التدفق البصري—لربط الاكتشافات عبر الإطارات. يجيب التدفق البصري عن سؤال «ما سرعة تحرك هذه البكسلات الآن؟»، بينما يجيب التتبع عن سؤال «إلى أين ذهبت السيارة رقم 5؟»
التطبيقات الواقعية#
تتيح القدرة على تقدير الحركة على مستوى البكسل تشغيل مجموعة واسعة من التقنيات المتقدمة:
- المركبات ذاتية القيادة والروبوتات: يُستخدم التدفق البصري في قياس الحركة البصرية، مما يتيح لروبوت أو سيارة تقدير حركته الذاتية بالنسبة إلى البيئة المحيطة. كما يساعد في تقدير العمق وتجنب العوائق من خلال تحليل مدى سرعة تمدد الكائنات الموجودة في المجال المرئي أو تحركها.
- تثبيت الفيديو: تستخدم الكاميرات وبرامج التحرير متجهات التدفق لاكتشاف اهتزاز الكاميرا غير المقصود. ومن خلال التعويض عن هذه الحركة العامة، تستطيع الأنظمة تثبيت اللقطات رقميًا. وتُعد هذه ميزة قياسية في الإلكترونيات الاستهلاكية الحديثة، مثل الهواتف الذكية وكاميرات الحركة.
- التعرف على الأفعال: يساعد تحليل التدفق الزمني للبكسلات في تحليلات الرياضة والأمن الأنظمةَ على تحديد الأفعال البشرية المعقدة. فعلى سبيل المثال، يمكن تعزيز نماذج تقدير الوضعية ببيانات التدفق للتمييز بين شخص يمشي وآخر يركض، استنادًا إلى سرعة حركة الأطراف.
- ضغط الفيديو: تعتمد معايير مثل ترميز فيديو MPEG اعتمادًا كبيرًا على تقدير الحركة. فبدلًا من تخزين كل إطار كامل، يخزن برنامج الترميز التدفق البصري (متجهات الحركة) والفرق (المتبقي) بين الإطارات، مما يقلل أحجام الملفات بدرجة كبيرة للبث والتخزين.
مثال على التنفيذ#
يوضح المثال التالي كيفية حساب التدفق البصري الكثيف باستخدام مكتبة OpenCV، وهي أداة قياسية في منظومة الرؤية الحاسوبية. يستخدم هذا المقتطف خوارزمية فارنيباك لإنشاء خريطة تدفق بين إطارين متتاليين.
import cv2
import numpy as np
# Simulate two consecutive frames (replace with actual image paths)
frame1 = np.zeros((100, 100, 3), dtype=np.uint8)
frame2 = np.zeros((100, 100, 3), dtype=np.uint8)
cv2.rectangle(frame1, (20, 20), (40, 40), (255, 255, 255), -1) # Object at pos 1
cv2.rectangle(frame2, (25, 25), (45, 45), (255, 255, 255), -1) # Object moved
# Convert to grayscale for flow calculation
prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# Calculate dense optical flow
flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
# Compute magnitude and angle of 2D vectors
mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])
print(f"Max motion detected: {np.max(mag):.2f} pixels")بالنسبة إلى التطبيقات عالية المستوى التي تتطلب استمرارية الكائن بدلًا من حركة البكسلات الخام، ينبغي للمستخدمين مراعاة أوضاع التتبع المتاحة في Ultralytics YOLO11 وYOLO26. وتجرّد هذه النماذج تعقيد تحليل الحركة، فتوفّر معرّفات للكائنات ومساراتها بصورة موثوقة وجاهزة للاستخدام، في مهام تتراوح من مراقبة حركة المرور إلى تحليلات تجارة التجزئة.









