Optical Flow
يقدّر التدفق البصري حركة كل بكسل بين إطارين من الفيديو على هيئة حقل من متجهات الحركة. تعرّف إلى الأساليب التقليدية والعميقة واستخداماتها، مع أمثلة برمجية باستخدام OpenCV.
التدفق البصري هو الحركة الظاهرية لأنماط السطوع بين صورتين، وعادةً ما تكونان إطارين متتاليين في الفيديو. تقدّر خوارزمية التدفق البصري، لكل بكسل في الإطار الأول، متجه إزاحة ثنائي الأبعاد (dx, dy) يشير إلى الموضع الذي يظهر فيه محتوى ذلك البكسل في الإطار الثاني. وتلتقط النتيجة، المسماة حقل التدفق، الحركة الناتجة عن الأجسام المتحركة وعن الكاميرا نفسها، ما يتيح لأنظمة الرؤية الحاسوبية تثبيت الفيديو وتقدير الحركة الذاتية واستيفاء الإطارات والتعرّف على الأفعال. يقيس التدفق ما تراه الكاميرا لا الحركة الحقيقية ثلاثية الأبعاد: فالدوران الموضعي لكرة متجانسة تمامًا لا ينتج أي تدفق، بينما ينتج الظل المتحرك تدفقًا في موضع لا يتحرك فيه أي جسم مادي.
كيفية تقدير التدفق البصري#
تبدأ معظم الطرق من افتراض ثبات السطوع، أي إن النقطة تحافظ على الشدة نفسها أثناء تحركها. ويعطي تحويل هذا الافتراض إلى صيغة خطية معادلةً لكل بكسل، Ix·u + Iy·v + It = 0، حيث إن Ix وIy وIt هي مشتقات الصورة في الاتجاهين x وy والزمن، و(u, v) هو التدفق المجهول. لا تكفي معادلة واحدة لتحديد مجهولين، وهذه هي مشكلة الفتحة: فعند النظر إلى حافة مستقيمة عبر نافذة صغيرة، لا يمكن قياس سوى الحركة العمودية على الحافة. وتضيف الطرق التقليدية افتراضًا ثانيًا لمعالجة هذه المشكلة:
- طريقة لوكاس-كانادي (1981): تفترض ثبات التدفق داخل نافذة صغيرة، وتحل معادلات جميع بكسلاتها باستخدام المربعات الصغرى. وتنجح عندما تحتوي النافذة على تدرجات في اتجاهين، كما في الزوايا، لذا تُستخدم عادةً لحساب التدفق المتناثر عند نقاط السمات المختارة.
- طريقة هورن-شونك (1981): تفترض أن حقل التدفق أملس على امتداد الصورة كلها، وتحل مسألة تحسين شاملة لإنتاج تدفق كثيف لكل بكسل.
لا يصمد كلا الافتراضين أمام الحركات الكبيرة، لذا تقدّر الطرق العملية التدفق من الخشن إلى الدقيق على هرم الصور، حيث تصبح حركة مقدارها 16 بكسل بالدقة الكاملة حركةً مقدارها بكسلان على بُعد ثلاثة مستويات:
تطبّق OpenCV طريقة لوكاس-كانادي الهرمية للنقاط المتناثرة، وخوارزمية غونار فارنيباك لعام 2003 القائمة على التوسّع متعدد الحدود للتدفق الكثيف. ينقل هذا الرمز نسيجًا عشوائيًا بمقدار معلوم، ثم يستعيد الحركة باستخدام تدفق فارنيباك الكثيف:
import cv2
import numpy as np
# A smooth random texture, then the same texture moved 3 px right and 2 px down
rng = np.random.default_rng(0)
texture = cv2.GaussianBlur(rng.random((240, 320)), (0, 0), 3)
frame1 = cv2.normalize(texture, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8)
frame2 = np.roll(frame1, shift=(2, 3), axis=(0, 1))
# Dense Farneback optical flow: one (dx, dy) displacement vector for every pixel
flow = cv2.calcOpticalFlowFarneback(
frame1, frame2, None, pyr_scale=0.5, levels=3, winsize=15, iterations=3, poly_n=5, poly_sigma=1.2, flags=0
)
print(f"flow field shape: {flow.shape}")
print(f"median motion: dx={np.median(flow[..., 0]):.2f}, dy={np.median(flow[..., 1]):.2f} pixels")يطبع flow field shape: (240, 320, 2) وmedian motion: dx=3.00, dy=2.00 pixels: متجهًا ذا مركبتين لكل بكسل من أصل 76,800 بكسل، مستعيدًا الإزاحة الأفقية البالغة 3 بكسلات والرأسية البالغة بكسلين.
طرق التعلم العميق#
أثبت FlowNet في عام 2015 أن الشبكة العصبية الالتفافية يمكنها تعلّم التدفق من البداية إلى النهاية باستخدام بيانات تدريب اصطناعية، لأن مقاطع الفيديو الحقيقية نادرًا ما تتضمن تدفقًا مرجعيًا صحيحًا. ودمج PWC-Net أفكار الهرم والالتواء وحجم التكلفة من الطرق التقليدية في شبكة مدمجة. تقارن RAFT، التي فازت بجائزة أفضل ورقة بحثية في ECCV 2020، كل بكسل في الإطار الأول بكل بكسل في الإطار الثاني ضمن حجم ترابط، ثم تنقّح حقل تدفق واحدًا عالي الدقة عبر تحديثات تكرارية متكررة. تتعامل الطرق المتعلَّمة مع الإزاحات الكبيرة وضبابية الحركة والمناطق الخالية من النسيج أفضل بكثير من الطرق التقليدية، كما توفّر torchvision نماذج RAFT مدرّبة مسبقًا. ويُبلَّغ عن الدقة باستخدام خطأ نقطة النهاية (EPE)، وهو متوسط المسافة بالبكسل بين متجهات التدفق المتوقعة والحقيقية، على معايير مثل MPI Sintel وKITTI 2015.
التدفق البصري والمصطلحات ذات الصلة#
- تتبّع الأجسام: يتعقب الأجسام كاملةً بمعرّفات ثابتة عبر إطارات عديدة، بينما يصف التدفق البصري الحركة على مستوى البكسل بين إطارين ولا يتضمن معلومات عن الأجسام. تستخدم أنظمة التتبّع التدفقَ بوصفه مؤشرًا: ففي وضع التتبّع في Ultralytics YOLO، يقدّر المتتبّع الافتراضي TrackTrack وBoT-SORT حركة الكاميرا باستخدام تدفق لوكاس-كانادي المتناثر (
gmc_method: sparseOptFlow)، إذ يتتبعان ما يصل إلى 400 زاوية في إطار بنصف الدقة، ويلائمان لها دورانًا ومقياسًا وإزاحة باستخدام RANSAC، ثم يزيحان كل صندوق تتبّع متوقّع وفق تلك الحركة قبل مطابقته بالكشوف الجديدة. - تتبّع النقاط: يتابع نقاطًا مختارة عبر مقاطع فيديو طويلة، بما في ذلك أثناء حجبها، بدلًا من تقدير الحركة لكل بكسل بين إطارين.
- تدفق المشهد: حركة النقاط ثلاثية الأبعاد في الفضاء، وتُقدّر من بيانات الاستريو أو العمق. أما التدفق البصري فهو إسقاطها على مستوى الصورة.
- متجهات الحركة في ترميز الفيديو: تخزّن مُرمّزات H.264 وHEVC وAV1 متجه حركة واحدًا لكل كتلة، وتختاره لتقليل عدد البتات اللازمة لترميز الإطار، لذا كثيرًا ما يختلف عن الحركة الحقيقية.
تطبيقات عملية#
- تثبيت الفيديو: يكشف التدفق الغالب عبر الإطار اهتزاز الكاميرا، ويعوضه البرنامج بإمالة كل إطار في الاتجاه المعاكس.
- استيفاء الإطارات: ينشئ التصوير البطيء وتحويل معدل الإطارات إطارات وسيطة بتحريك البكسلات جزئيًا على امتداد متجهات التدفق الخاصة بها.
- المركبات ذاتية القيادة والطائرات المسيّرة: يدعم التدفق قياس الحركة البصري، كما أن معدل تمدد تدفق جسم ما ينبّه إلى اقتراب حدوث تصادم.
- التعرّف على الأفعال: صنّفت الشبكة ثنائية المسار لعام 2014 الأفعال اعتمادًا على مسار مكاني من إطارات مفردة ومسار زمني مُدخل إليه تكديس لعشرة حقول تدفق بصري متتالية.










