Optical Flow
استكشف أساسيات التدفق البصري في رؤية الكمبيوتر. تعلم كيف تحرك متجهات الحركة فهم الفيديو وتعزز التتبع في Ultralytics YOLO26.
التدفق البصري هو نمط الحركة الظاهرية للأجسام والأسطح والحواف في المشهد المرئي الناتج عن الحركة النسبية بين الراصد والمشهد. في مجال رؤية الكمبيوتر، يُعد هذا المفهوم أساسياً لفهم الديناميكيات الزمنية داخل تسلسلات الفيديو. من خلال تحليل إزاحة البكسلات بين إطارين متتاليين، تولد خوارزميات التدفق البصري حقول متجهات حيث يمثل كل متجه اتجاه وحجم الحركة لنقطة محددة. يتيح هذا المؤشر المرئي منخفض المستوى أنظمة الذكاء الاصطناعي ليس فقط لإدراك ما يوجد في الصورة، بل كيف تتحرك، مما يردم الفجوة بين تحليل الصور الثابتة وفهم الفيديو الديناميكي.
الآليات الأساسية للتدفق البصري#
يعتمد حساب التدفق البصري بشكل عام على فرضية ثبات السطوع، والتي تفترض أن شدة بكسل معين على جسم ما تظل ثابتة من إطار إلى آخر، حتى أثناء حركته. تستخدم الخوارزميات هذا المبدأ لحل معادلات متجهات الحركة باستخدام نهجين رئيسيين:
- التدفق البصري المتناثر: تحسب هذه الطريقة متجه الحركة لمجموعة فرعية محددة من الميزات المميزة، مثل الزوايا أو الحواف، التي يتم اكتشافها عبر استخراج الميزات. تُعد الخوارزميات مثل طريقة لوكاس-كانادي فعالة حسابياً ومثالية لمهام الاستدلال في الوقت الفعلي حيث يكون تتبع نقاط اهتمام محددة كافياً.
- التدفق البصري الكثيف: يحسب هذا النهج متجه حركة لكل بكسل فردي في الإطار. على الرغم من أنه يتطلب حسابات مكثفة بشكل ملحوظ، إلا أنه يوفر خريطة حركة شاملة ضرورية للمهام دقيقة التفاصيل مثل تجزيء الصور والتحليل الهيكلي. غالباً ما تتفوق بنيات التعلم العميق الحديثة على الطرق الرياضية التقليدية في تقدير التدفق الكثيف من خلال تعلم أنماط الحركة المعقدة من مجموعات بيانات ضخمة.
التدفق البصري مقابل تتبع الأجسام#
على الرغم من أنه غالباً ما يُستخدم جنباً إلى جنب، فمن الضروري التمييز بين التدفق البصري وتتبع الكائنات. التدفق البصري هو عملية منخفضة المستوى تصف حركة البكسل اللحظية؛ فهو لا يفهم بطبيعته هوية الكائن أو استمراريته.
على النقيض من ذلك، فإن تتبع الكائنات هو مهمة عالية المستوى تحدد الكيانات المحددة وتعين لها معرفاً متسقاً بمرور الوقت. تؤدي المتتبعات المتقدمة، مثل تلك المدمجة في 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. تجرد هذه النماذج تعقيد تحليل الحركة، مما يوفر معرفات ومسارات قوية للكائنات جاهزة للاستخدام في مهام تتراوح من مراقبة حركة المرور إلى تحليلات التجزئة.






