الرؤية الحاسوبية2020متوسط10 دقيقة قراءة

NeRF: تمثيل المشاهد كحقول إشعاع عصبية لتوليف المناظر

NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

Mildenhall, B. · Srinivasan, P. P. · Tancik, M. · Barron, J. T. · Ramamoorthi, R. · Ng, R. — ECCV

المشكلة

توليد صور واقعية لمشهد من زوايا كاميرا لم تُلتقط منه — انطلاقاً من عدد محدود من الصور — ظلّ تحدياً مفتوحاً. التمثيلات التقليدية ثلاثية الأبعاد كالأسطح المضلّعة والشبكات الحجمية إما افتقرت إلى التفاصيل الدقيقة أو التهمت ذاكرة هائلة. أما الأساليب العصبية المتوفرة فلم تنجح في تصيير مشاهد واقعية معقدة تتضمن تأثيرات مرتبطة بزاوية النظر كالانعكاسات والشفافية الجزئية بدقة عالية.

الإسهام

حقول الإشعاع العصبية (NeRF): تمثّل المشهد بوصفه دالة مستمرة ذات خمسة أبعاد — تأخذ الإحداثيات المكانية (x, y, z) (θ, φ) وتُخرج واللون المرتبط بزاوية الرؤية — وتُخزَّن بالكامل داخل شبكة عصبية متعددة الطبقات. يرفع المدخلات إلى فضاء عالي التردد ليتمكن النموذج من التقاط التفاصيل الهندسية الدقيقة. واستراتيجية اختيار العينات الهرمية () تُركِّز الحساب حيث توجد المادة فعلاً فيصبح التصيير أكثر كفاءة. ولأن قابل للاشتقاق بطبيعته، يُدرَّب النموذج بالكامل من صور ثنائية الأبعاد معلومة الوضعية فقط.

الأثر

أطلق NeRF موجة التصيير العصبي. في غضون ثلاث سنوات ظهر Instant-NGP ( في ثوانٍ) وMip-NeRF (تصيير خالٍ من التشويه) ثم ثلاثي الأبعاد — الذي استبدل الشبكة الضمنية بملايين التوزيعات الغاوسية الصريحة لتحقيق تصيير آني. الفكرة المحورية في NeRF — تصيير قابل للاشتقاق لدالة ضمنية تصف المشهد — أصبحت ركيزةً لإنشاء المحتوى ثلاثي الأبعاد ومحاكاة القيادة الذاتية وتطبيقات الواقع المعزز والافتراضي.

تخيّل أنك تملك عالماً مصغّراً محبوساً داخل كرة ثلج زجاجية. تستطيع تصويره من أي زاوية، لكنك لا تستطيع فتح الكرة ولمس ما بداخلها.

الطرق التقليدية تحاول إعادة بناء الأجسام — أي تصنع نسخة هندسية من صورك. لكن NeRF يسلك طريقاً مختلفاً تماماً: يدرِّب على حفظ الضوء داخل الكرة. أعطِها أي نقطة في الفضاء وأي اتجاه نظر، فتُخبرك بالضبط ما لون تلك النقطة ومدى عتامتها. ولالتقاط صورة جديدة، ما عليك سوى إطلاق أشعة وهمية عبر الكرة وسؤال الشبكة عمّا سيراه كل شعاع.

المشكلة: كيف تلتقط عالماً ثلاثي الأبعاد من صور مسطحة؟

تصوِّر مشهداً من 20 إلى 100 زاوية، ثم تريد صورة واقعية من زاوية لم تُصوِّرها قط — هذا ما نسميه الجديدة. قبل NeRF كان لكل أسلوب حدوده:

  • الأسطح المضلّعة تبني أشكالاً مثلثية صريحة، لكنها تعجز أمام الأجسام الضبابية والشفافة كالدخان والشعر والزجاج.
  • الشبكات الحجمية () تقسِّم الفضاء إلى مكعبات صغيرة، لكن الذاكرة تنفجر تكعيبياً — شبكة 512³ وحدها تحتاج 134 مليون خلية قبل أن تُخزِّن لوناً واحداً.
  • متناثرة وتُنتج ثقوباً عند التصيير.

NeRF يتجاوز هذه العقبات الثلاث بتمثيل المشهد لا كأشكال هندسية، بل كـ — دالة مُتعلَّمة محفوظة بالكامل داخل أوزان الشبكة العصبية.

افتح في المختبر
قارن بين ثلاثة تمثيلات تقليدية ثلاثية الأبعاد ونهج NeRF الضمني. انقر على كل بطاقة لتستكشف مزاياها وقيودها.
تستيقظ التجربة عند وصولك…

الفكرة الجوهرية: شبكة عصبية تعرف شكل كل نقطة في الفضاء

الفكرة أن NeRF يُخزِّن المشهد بأكمله داخل واحدة. هذه الشبكة دالة FΘF_\Theta تستقبل — موقع مكاني (x,y,z)(x, y, z) واتجاه نظر (θ,ϕ)(\theta, \phi) — وتُعطيك شيئين:

  • الكثافة الحجمية σ\sigma — ما مدى عتامة هذه النقطة؟ هل يوجد هنا جسم صلب أم فراغ؟
  • بقيم (r,g,b)(r, g, b) — ما اللون الذي تراه من هذا الاتجاه تحديداً؟

الكثافة تتبع الموقع المكاني فقط (الجدار يظلّ جداراً أينما وقفت)، أما اللون فيتغير حسب اتجاه النظر — وهذا ما يمنح NeRF القدرة على محاكاة الانعكاسات اللامعة والتأثيرات البصرية التي تتبدّل بتغيُّر زاوية المشاهدة.

FΘ:(x,y,z,θ,ϕ)(σ,r,g,b)F_\Theta : (x, y, z, \theta, \phi) \rightarrow (\sigma, r, g, b)
دالة NeRF — ربط من 5 أبعاد إلى 4 مخرجاتالمدخل: نقطة ثلاثية الأبعاد واتجاه نظر. المُخرج: كثافة حجمية σ (الهندسة) ولون RGB (المظهر). أوزان الشبكة Θ تُرمِّز المشهد بأكمله.
افتح في المختبر
انقر على كل مرحلة لترى كيف يحوِّل NeRF إحداثيات خماسية الأبعاد إلى لون وكثافة.
تستيقظ التجربة عند وصولك…

الترميز الموضعي: تعليم الشبكة رؤية التفاصيل الدقيقة

الشبكات متعددة الطبقات تميل بطبيعتها لتعلُّم دوال ناعمة منخفضة التردد. إحداثي خام مثل (0.5,0.3,0.7)(0.5, 0.3, 0.7) يتغير ببطء شديد فلا يكفي لنحت حواف حادة أو تفاصيل دقيقة. NeRF يعالج ذلك بـالترميز الموضعي — وهي الفكرة نفسها المستخدمة في ورقة المُحوِّل، لكنها هنا مُوظَّفة لخدمة الفضاء ثلاثي الأبعاد.

كل إحداثي عددي pp يُحوَّل إلى عالي الأبعاد عبر دوال جيبية بترددات تتضاعف أُسيّاً. تخيّل أنك تحوِّل نغمة واحدة هادئة إلى وتر غني بالتوافقيات — الترددات المنخفضة تلتقط الشكل العام، والترددات العالية ترسم الحواف الحادة والتفاصيل الدقيقة.

γ(p)=[sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp)]\gamma(p) = \left[\sin(2^0 \pi p),\, \cos(2^0 \pi p),\, \ldots,\, \sin(2^{L-1} \pi p),\, \cos(2^{L-1} \pi p)\right]
الترميز الموضعي — من رقم واحد إلى 2L سمةللإحداثيات المكانية L = 10 (يُنتج 60 سمة من 3 مدخلات)؛ ولاتجاه النظر L = 4 (يُنتج 24 سمة من 3 مُركِّبات اتجاهية). بدون هذه الخطوة تُنتج الشبكة صوراً ضبابية مُفرطة النعومة.
افتح في المختبر
اسحب شريط الإحداثي وراقب كيف تكشف إضافة ترددات أعلى عن تفاصيل مكانية أدق.
تستيقظ التجربة عند وصولك…

التصيير الحجمي: من حقل الكثافة إلى بكسلات

لتصيير بكسل واحد، يُطلق NeRF من عين الكاميرا عبر ذلك البكسل نحو المشهد، ثم يسأل الشبكة عند NN نقطة على طول هذا الشعاع. كل نقطة تُسهم بلونها وفق عاملين:

  • كثافتها — النقاط المعتمة تُسهم بلون أكبر.
  • مقدار الضوء الذي حجبته النقاط الأقرب للكاميرا — وهو ما يُعرف بـ TT.

لون البكسل النهائي هو مجموع موزون لكل العينات على امتداد الشعاع. هذه هي فكرة التصيير الحجمي الكلاسيكي — الفيزياء نفسها المستخدمة في التصوير المقطعي الطبي وتأثيرات السُحب السينمائية — لكن مصدر حقل الكثافة هنا شبكة عصبية وليس قياساً فيزيائياً.

C^(r)=i=1NTiαici,Ti=j=1i1(1αj),αi=1eσiδi\hat{C}(\mathbf{r}) = \sum_{i=1}^{N} T_i \, \alpha_i \, \mathbf{c}_i, \quad T_i = \prod_{j=1}^{i-1}(1 - \alpha_j), \quad \alpha_i = 1 - e^{-\sigma_i \delta_i}
معادلة التصيير الحجمي — مزج الألوان على طول الشعاعلتحديد اللون النهائي للبكسل، يأخذ المصيّر عينات من نقاط عديدة على طول شعاع الرؤية ثم يجمع مساهماتها. وتعتمد مساهمة كل نقطة على ثلاثة عوامل: لونها، وعتامتها، ومقدار الضوء المتبقي بعد مروره عبر النقاط السابقة. فالمناطق الكثيفة تحجب مزيداً من الضوء، بينما تسمح المناطق الشفافة برؤية النقاط الأبعد. ويكون اللون النهائي للبكسل هو المحصلة المتراكمة لجميع هذه المساهمات.
افتح في المختبر
تابع مسير شعاع كاميرا واحد. راقب كيف تنخفض النفاذية عندما يصطدم الشعاع بمناطق كثيفة.
تستيقظ التجربة عند وصولك…

السير الشعاعي: التنقل عبر المشهد نقطة بنقطة

عملية بسيطة المبدأ: لتصيير صورة، يرسم NeRF شعاعاً واحداً لكل بكسل. على طول كل شعاع تُؤخذ NN عينة بين الحد القريب والبعيد للمشهد. عند كل نقطة تُسأل الشبكة عن الكثافة واللون، ثم تُدمج النتائج عبر معادلة التصيير الحجمي.

تخيّل أنك تسير داخل ضباب على طول شعاع ليزر: في كل خطوة تسجّل كثافة الضباب ولونه. حين تمرّ بسحابة كثيفة تحجب ما خلفها، وحين يكون الهواء صافياً تظلّ ألوان الخلفية مرئية. البكسل النهائي هو حصيلة كل ما رأيته أثناء المسير، مُرجَّحاً بكمية الضوء المتبقية عند كل خطوة.

افتح في المختبر
أطلق شعاعاً عبر المشهد وراقب كيف تتراكم الألوان كلما مرّ الشعاع بأجسام جديدة.
تستيقظ التجربة عند وصولك…

اختيار العينات الهرمي: أنفق العينات حيث يهمّ الأمر

توزيع العينات بالتساوي على طول الشعاع مُبذِّر — فمعظم الفضاء فارغ ولا يُضيف شيئاً للون النهائي. لذلك يعتمد NeRF من مرحلتين:

  • الشبكة الخشنة: تأخذ NcN_c = 64 عينة منتظمة وتُجري تصييراً حجمياً سريعاً لرسم خارطة كثافة تقريبية على طول الشعاع — أي تكتشف أين توجد المادة.
  • الشبكة الدقيقة: تأخذ أوزان المرحلة الخشنة كتوزيع احتمالي وتسحب NfN_f = 128 عينة إضافية مُركَّزة في المناطق عالية الكثافة، ثم تُشغِّل شبكة ثانية أكبر على كل العينات Nc+NfN_c + N_f معاً لإنتاج اللون النهائي.

الأمر أشبه بمسح رف كتب بمصباح يدوي (المرور الخشن) لتحديد أيّ الرفوف عليها كتب، ثم تسليط ضوء القراءة هناك فقط (المرور الدقيق).

افتح في المختبر
بدّل بين اختيار العينات المنتظم والهرمي. لاحظ كيف يُركِّز المرور الدقيق العينات بالقرب من الأسطح.
تستيقظ التجربة عند وصولك…

بنية الشبكة متعددة الطبقات: كيف تُوصَّل الشبكة

بنية الشبكة متعددة الطبقات في NeRF مصمَّمة عمداً لفصل الهندسة عن المظهر:

  • 8 (256 قناة لكل منها مع تنشيط ) تعالج الإحداثيات المكانية (x,y,z)(x, y, z) بعد ترميزها موضعياً. تُعيد المدخل الأصلي إلى الطبقة الخامسة — الفكرة ذاتها من شبكة ResNet.
  • بعد الطبقة الثامنة تُخرج الشبكة الكثافة الحجمية σ\sigma — وهي تعتمد فقط على الموقع المكاني.
  • طبقة إضافية واحدة تأخذ المتجه ذا 256 بُعداً من الطبقة الثامنة، وتُضيف إليه اتجاه النظر المُرمَّز موضعياً، ثم تُخرج لون RGB.

هذا الفصل مقصود: الكثافة مستقلة عن الزاوية لأن هندسة المشهد ثابتة بصرف النظر عن مكان المشاهد، أما اللون فيتغير لأن السطح اللامع يبدو مختلفاً من كل زاوية.

افتح في المختبر
انقر على كل كتلة لترى دورها. لاحظ أين ينفصل فرع الكثافة عن فرع اللون.
تستيقظ التجربة عند وصولك…

التدريب: التعلم من الصور فقط

تدريب NeRF لا يحتاج سوى مجموعة صور مع معرفة لكل منها (تُحسب عادةً بتقنية البنية من الحركة). في كل خطوة تدريبية:

  • تُختار دفعة عشوائية من أشعة الكاميرا من صور التدريب.
  • لكل شعاع، تُؤخذ عينات وتُمرَّر عبر الشبكتين الخشنة والدقيقة.
  • يُصيَّر لون البكسل المتوقع عبر التصيير الحجمي.
  • تُحسب الضوئية — بين اللون المُصيَّر واللون الحقيقي.
  • تُنشر التدرجات خلفياً عبر معادلة التصيير إلى أوزان الشبكة.

بعد نحو 100–300 ألف تكرار (يوم إلى يومين على واحدة)، تكون الشبكة قد استوعبت هندسة المشهد ومظهره بما يكفي لتوليد صور واقعية من زوايا لم تُصوَّر قط.

L=rR[C^c(r)C(r)22+C^f(r)C(r)22]\mathcal{L} = \sum_{\mathbf{r} \in \mathcal{R}} \left[ \| \hat{C}_c(\mathbf{r}) - C(\mathbf{r}) \|_2^2 + \| \hat{C}_f(\mathbf{r}) - C(\mathbf{r}) \|_2^2 \right]
دالة الخسارة التدريبية — خطأ ضوئي من المرحلتين الخشنة والدقيقةيقارن هدف التدريب بين الصورة المُصيَّرة والصورة الحقيقية الملتقطة بالكاميرا. ولكل شعاع رؤية مُختار، يقيس النموذج مدى تطابق اللون الذي يتنبأ به مع اللون الحقيقي للبكسل. وتُؤخذ أخطاء مرحلتي التصيير الخشنة والدقيقة معاً في الحسبان، مما يسمح بتدريب الشبكتين بشكل متزامن وتحسين جودة إعادة البناء تدريجياً.

الفكرة نفسها في الكود

تصيير NeRF مُبسَّط بمكتبة NumPypython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

import numpy as np

def positional_encoding(x, L=10):
    """رفع عدد واحد إلى 2L سمة جيبية."""
    freqs = 2.0 ** np.arange(L) * np.pi
    return np.concatenate([np.sin(x * freqs), np.cos(x * freqs)])

def volume_render(colors, densities, deltas):
    """تصيير حجمي كلاسيكي على شعاع واحد.
    colors:    (N, 3)  — لون RGB عند كل عينة
    densities: (N,)    — كثافة σ عند كل عينة
    deltas:    (N,)    — المسافة بين عينات متتالية
    """
    alpha = 1.0 - np.exp(-densities * deltas)          # عتامة كل عينة
    transmittance = np.cumprod(1.0 - alpha + 1e-10)    # الضوء المتبقي
    transmittance = np.concatenate([[1.0], transmittance[:-1]])  # إزاحة
    weights = alpha * transmittance                    # إسهام كل عينة
    pixel_color = (weights[:, None] * colors).sum(axis=0)
    return pixel_color   # (3,) — بكسل RGB واحد

# خط أنابيب NeRF الكامل لكل بكسل:
# 1. أطلق شعاعاً من الكاميرا عبر البكسل
# 2. اختر N نقطة على طول الشعاع
# 3. رمِّز موضعياً إحداثيات (x,y,z) والاتجاه (θ,φ)
# 4. أدخِلها للشبكة → احصل على (σ, r, g, b) لكل نقطة
# 5. صيِّر حجمياً عينات (σ, rgb) إلى لون بكسل واحد
# 6. خسارة MSE مقابل البكسل الحقيقي ← تحديث تراجعي للشبكة

لماذا كان NeRF مهماً

  1. 2020

    NeRF (هذه الورقة)

    تمثيل ضمني خماسي الأبعاد للمشهد مع ترميز موضعي واختيار عينات هرمي. نتائج مذهلة الواقعية لكنها بطيئة — ساعات للتدريب وثوانٍ لتصيير صورة واحدة.

  2. 2021

    Mip-NeRF

    استبدل العينات النقطية بمخاريط مُتتبَّعة مما قضى على تشوّهات التعرّج وحسّن جودة التصيير على مقاييس مختلفة.

  3. 2022

    Instant-NGP

    ترميز بجداول تجزئة متعددة الدقة حلّ محلّ الترميز الموضعي، فانخفض زمن التدريب من ساعات إلى ثوانٍ وأصبح NeRF صالحاً للتطبيقات التفاعلية.

  4. 2023

    التطاير الغاوسي ثلاثي الأبعاد

    استبدل الشبكة الضمنية بملايين التوزيعات الغاوسية الصريحة ثلاثية الأبعاد، فحقق تصييراً آنياً (أكثر من 30 إطاراً/ثانية) بجودة تضاهي NeRF، مما فتح الباب لتطبيقات الواقع المعزز والافتراضي.

  5. 2024

    غاوسيات رباعية الأبعاد والمشاهد الديناميكية

    التوسّع إلى أربعة أبعاد (مكان + زمن) أتاح تصييراً آنياً للمشاهد المتحركة — من الإعادات الرياضية إلى الحضور عن بُعد والإنتاج الافتراضي.

النموذج الذي أرساه NeRF — درِّب على الصور وصيِّر من أي زاوية — أصبح ركيزة الجيل التالي من إنشاء المحتوى ثلاثي الأبعاد، من العرض الغامر في Google إلى محاكاة القيادة الذاتية. وسليله المباشر التطاير الغاوسي ثلاثي الأبعاد حلّ مشكلة السرعة وجعل الآني واقعاً عملياً.

المرجعMildenhall, Srinivasan, Tancik, Barron, Ramamoorthi, Ng. NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis. ECCV, 2020.

مصطلحات هذه الورقة