Optical Flow
استكشف أساسيات التدفق البصري في رؤية الكمبيوتر. تعلم كيف تحرك متجهات الحركة فهم الفيديو وتعزز التتبع في Ultralytics YOLO26.
التدفق البصري هو نمط الحركة الظاهرية للأجسام والأسطح والحواف في مشهد مرئي ناتج عن الحركة النسبية بين المراقب والمشهد. في مجال رؤية الحاسوب، يُعد هذا المفهوم أساسياً لفهم الديناميكيات الزمنية ضمن تسلسلات الفيديو. من خلال تحليل إزاحة البكسلات بين إطارين متتاليين، تُنشئ خوارزميات التدفق البصري مجالاً شعاعياً حيث يمثل كل شعاع اتجاه وحجم الحركة لنقطة معينة. يُمكّن هذا المؤشر البصري منخفض المستوى أنظمة الذكاء الاصطناعي من إدراك ليس فقط ما يوجد في الصورة، بل كيف تتحرك، مما يسد الفجوة بين تحليل الصور الثابتة وفهم الفيديو الديناميكي.
Link to this sectionالآليات الأساسية للتدفق البصري#
يعتمد حساب التدفق البصري بشكل عام على فرضية ثبات السطوع، والتي تفترض أن شدة بكسل معين على جسم ما تظل ثابتة من إطار إلى آخر، حتى أثناء حركته. تستخدم الخوارزميات هذا المبدأ لحل معادلات متجهات الحركة باستخدام نهجين رئيسيين:
- التدفق البصري المتناثر: تحسب هذه الطريقة متجه الحركة لمجموعة فرعية محددة من الميزات المميزة، مثل الزوايا أو الحواف، التي يتم اكتشافها عبر استخراج الميزات. تُعد خوارزميات مثل طريقة Lucas-Kanade فعالة من حيث الحوسبة ومثالية لمهام الاستدلال في الوقت الفعلي حيث يكفي تتبع نقاط اهتمام محددة.
- التدفق البصري الكثيف: يحسب هذا النهج متجه الحركة لكل بكسل في الإطار. على الرغم من كونه أكثر كثافة من حيث الحوسبة بشكل ملحوظ، إلا أنه يوفر خريطة حركة شاملة ضرورية للمهام الدقيقة مثل تجزئة الصور والتحليل الهيكلي. غالباً ما تتفوق بنيات التعلم العميق الحديثة على الطرق الرياضية التقليدية في تقدير التدفق الكثيف من خلال تعلم أنماط حركة معقدة من مجموعات بيانات ضخمة.
Link to this sectionالتدفق البصري مقابل تتبع الأجسام#
على الرغم من أنهما يُستخدمان غالباً جنباً إلى جنب، فمن الضروري التمييز بين التدفق البصري وتتبع الأجسام. التدفق البصري هو عملية منخفضة المستوى تصف حركة البكسل اللحظية؛ وهي لا تفهم بطبيعتها هوية الجسم أو استمراريته.
على النقيض من ذلك، يعد تتبع الأجسام مهمة عالية المستوى تحدد كيانات معينة وتخصص لها معرفاً (ID) ثابتاً بمرور الوقت. تقوم المتتبعات المتقدمة، مثل تلك المدمجة في Ultralytics YOLO26، عادةً بإجراء اكتشاف الأجسام للعثور على الجسم ثم استخدام مؤشرات الحركة -المستمدة أحياناً من التدفق البصري- لربط الاكتشافات عبر الإطارات. يجيب التدفق البصري على سؤال "ما مدى سرعة تحرك هذه البكسلات الآن؟"، بينما يجيب التتبع على سؤال "أين ذهبت السيارة رقم 5؟".
Link to this sectionتطبيقات العالم الحقيقي#
تعمل القدرة على تقدير الحركة على مستوى البكسل على تشغيل مجموعة واسعة من التقنيات المتطورة:
- المركبات ذاتية القيادة والروبوتات: يُستخدم التدفق البصري لقياس المسافة بصرياً، مما يسمح للروبوت أو السيارة بتقدير حركتها الخاصة بالنسبة للبيئة. كما يساعد في تقدير العمق وتجنب العوائق من خلال تحليل مدى سرعة توسع أو تحرك الأجسام في المجال البصري.
- تثبيت الفيديو: تستخدم الكاميرات وبرامج التحرير متجهات التدفق لاكتشاف اهتزاز الكاميرا غير المقصود. من خلال تعويض هذه الحركة العالمية، يمكن للأنظمة تثبيت اللقطات رقمياً. تعد هذه ميزة قياسية في الإلكترونيات الاستهلاكية الحديثة مثل الهواتف الذكية وكاميرات الحركة.
- التعرف على الإجراءات: في تحليلات الرياضة والأمن، يساعد تحليل التدفق الزمني للبكسلات الأنظمة على تحديد الأفعال البشرية المعقدة. على سبيل المثال، يمكن تعزيز نماذج تقدير وضعية الجسم ببيانات التدفق للتمييز بين شخص يمشي وشخص يركض بناءً على سرعة حركة الأطراف.
- ضغط الفيديو: تعتمد معايير مثل ترميز الفيديو MPEG بشكل كبير على تقدير الحركة. بدلاً من تخزين كل إطار بالكامل، يقوم الترميز بتخزين التدفق البصري (متجهات الحركة) والفرق (المتبقي) بين الإطارات، مما يقلل بشكل كبير من أحجام الملفات للبث والتخزين.
Link to this sectionمثال على التنفيذ#
يوضح المثال التالي كيفية حساب التدفق البصري الكثيف باستخدام مكتبة OpenCV، وهي أداة قياسية في نظام رؤية الحاسوب. تستخدم هذه القطعة البرمجية خوارزمية Farneback لإنشاء خريطة تدفق بين إطارين متتاليين.
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. تعمل هذه النماذج على تجريد تعقيد تحليل الحركة، مما يوفر معرفات أجسام ومسارات قوية جاهزة للاستخدام في مهام تتراوح من مراقبة حركة المرور إلى تحليلات التجزئة.






