حول نفسك إلى 3D Gaussian Splat | بواسطة ساشا كيرش
دليل عملي ل الممارسين
في الصيف الماضي، دخلت اللعبة طريقة تعلم غير عميقة لتوليف المشاهد الجديدة: 3D Gaussian splattig. إنها طريقة لتمثيل مشهد ثلاثي الأبعاد وعرض الصور في الوقت الفعلي من أي اتجاه عرض. حتى أن البعض يقول إنهم يحلون محل NeRFs، وهي الطريقة السائدة لتوليف المشاهد الجديدة وتمثيل المشهد الضمني في ذلك الوقت. أعتقد أن هذا أمر قابل للنقاش نظرًا لأن NeRFs هي أكثر بكثير من مجرد أجهزة عرض الصور. لكن هذا ليس شيئًا نهتم به اليوم… اليوم نحن نهتم فقط بالنماذج ثلاثية الأبعاد ذات المظهر الواضح وهذا هو المكان الذي يتألق فيه الرش الغاوسي ثلاثي الأبعاد 🎉
في هذا المنشور، سننظر بإيجاز شديد في Gaussian Splatting ثم نبدل التروس وسأوضح لك كيف يمكنك تحويل نفسك إلى نموذج ثلاثي الأبعاد.
علاوة: في النهاية سأوضح لك كيف يمكنك بعد ذلك تضمين النموذج الخاص بك في عارض تفاعلي على أي موقع ويب.
إذا هيا بنا!
- ما هي البقع الغوسية؟
- دعونا نحول أنفسنا إلى رش غاوسي ثلاثي الأبعاد
- الاستنتاج والموارد الإضافية
3D Gaussian splatting هي تقنية لتمثيل مشهد ثلاثي الأبعاد. إنها في الواقع إحدى الطرق العديدة. على سبيل المثال، يمكنك أيضًا تمثيل مشهد كمجموعة من النقاط، أو شبكة، أو وحدات فوكسل، أو باستخدام تمثيل ضمني مثل Neural Radiance Fields (المعروف أيضًا باسم NeRFs).
لقد كان أساس تقنية 3D Gaussian Splatting موجودًا منذ بعض الوقت، بدءًا من عام 2001 إلى النهج الكلاسيكي من الرؤية الحاسوبية الذي يُسمى بالرش السطحي.
ولكن كيف يمثل 3D Gaussian Splatting مشهدًا فعليًا؟
التمثيل ثلاثي الأبعاد
في تقنية 3D Gaussian Splatting، يتم تمثيل المشهد بمجموعة من النقاط. تحتوي كل نقطة على سمات معينة مرتبطة بها لتحديد معلمات غاوسي ثلاثي الأبعاد متباين الخواص. إذا تم تقديم صورة، فإن هذه الـ Gaussians تتداخل لتشكل الصورة. تتم عملية تحديد المعلمات الفعلية أثناء مرحلة التحسين التي تناسب هذه المعلمات بطريقة تجعل الصور المعروضة أقرب ما يمكن إلى صور الإدخال الأصلية.
يتم تحديد معلمات Gaussian ثلاثية الأبعاد باستخدام
- هذا يعني μ، وهو إحداثي x,y,z في الفضاء ثلاثي الأبعاد.
- مصفوفة التغاير الخاصة بها Σ، والتي يمكن تفسيرها على أنها انتشار غاوسي في أي اتجاه ثلاثي الأبعاد. نظرًا لأن Gaussian متباين الخواص، فيمكن تمديده في أي اتجاه.
- لون يتم تمثيله عادة على شكل توافقيات كروية. تسمح التوافقيات الكروية للبقع الغوسية بالحصول على ألوان مختلفة من وجهات نظر مختلفة مما يؤدي إلى تحسين جودة العرض بشكل كبير. يسمح بعرض تأثيرات غير لامبرتية مثل انعكاسات الأجسام المعدنية.
- العتامة 𝛼 الذي يحدد مدى شفافية الغاوسي.
الصورة أدناه توضح تأثير 3D Gaussian Splat بالنسبة إلى النقطة p. المفسد: هذه النقطة p ستكون هي النقطة ذات الصلة إذا عرضنا الصورة.
كيف يمكنك الحصول على صورة من هذا التمثيل؟
عرض الصورة
مثل NeRFs، يستخدم 3D Gaussian Splatting المزج 𝛼 على طول الشعاع الذي يتم إطلاقه من الكاميرا عبر مستوى الصورة وعبر المشهد. ويعني هذا بشكل أساسي أنه من خلال التكامل على طول الشعاع، فإن الغاوسيين المتقاطعين يساهمون في لون البكسل النهائي.
تُظهر الصورة أدناه الفرق المفاهيمي بين NeRF الأساسي (للبساطة) والرش الغوسي.
على الرغم من التشابه من الناحية المفاهيمية، إلا أن هناك اختلافًا كبيرًا في التنفيذ. في Gaussian Splatting، ليس لدينا أي نموذج للتعلم العميق مثل الإدراك الحسي متعدد الطبقات (MLP) في NeRFs. ومن ثم لا نحتاج إلى تقييم الوظيفة الضمنية التي تقريبها بواسطة MLP لكل نقطة (والتي تستغرق وقتًا طويلاً نسبيًا) ولكننا نتداخل مع العديد من Gaussians الشفافة جزئيًا ذات الحجم واللون المختلفين. ما زلنا بحاجة إلى إلقاء شعاع واحد على الأقل لكل بكسل من الصورة لتقديم الصورة النهائية.
لذلك، من خلال مزج كل ما يفعله الغوسيون، يظهر وهم الصورة المثالية. إذا قمت بإزالة الشفافية من البقع، فيمكنك بالفعل رؤية الغاوسيين الفرديين بأحجام واتجاهات مختلفة.
وكيف يتم تحسينه؟
تحسين
التحسين واضح ومباشر من الناحية النظرية وسهل الفهم. ولكن بالطبع، كما هو الحال دائما، النجاح يكمن في التفاصيل.
لتحسين البقع الغاوسية، نحتاج إلى مجموعة أولية من النقاط والصور للمشهد. يقترح مؤلفو البحث استخدام خوارزمية البنية من الحركة (SfM) للحصول على السحابة النقطية الأولية. أثناء التدريب، يتم عرض المشهد بوضعية الكاميرا المقدرة وجوهر الكاميرا الذي تم الحصول عليه من SfM. تتم مقارنة الصورة المقدمة والصورة الأصلية، ويتم حساب الخسارة ويتم تحسين معلمات كل Gaussian باستخدام نزول التدرج العشوائي (SGD).
أحد التفاصيل المهمة الجديرة بالذكر هو مخطط التكثيف التكيفي. SGD قادر فقط على ضبط معلمات Gaussians الموجودة، لكنه لا يمكنه إنتاج معلمات جديدة أو تدمير المعلمات الموجودة. قد يؤدي هذا إلى حدوث ثغرات في المشهد أو نقص التفاصيل الدقيقة إذا كان هناك عدد قليل جدًا من النقاط وإلى سحب نقطية كبيرة بشكل غير ضروري إذا كان هناك عدد كبير جدًا من النقاط. للتغلب على ذلك، تقوم طريقة التكثيف التكيفي بتقسيم النقاط ذات التدرجات الكبيرة وإزالة النقاط التي تقاربت إلى قيم منخفضة.
بعد أن تحدثنا عن بعض الأساسيات النظرية، فلننتقل الآن إلى الجزء العملي من هذا المنشور، حيث سأوضح لك كيف يمكنك إنشاء تناثر غاوسي ثلاثي الأبعاد لنفسك.
ملاحظة: يقترح المؤلفون استخدام وحدة معالجة الرسومات (GPU) بسعة 24 جيجابايت على الأقل، ولكن لا يزال بإمكانك إنشاء 3D Gaussian Splats باستخدام بعض الحيل التي سأذكرها عند الحاجة إلى تطبيقها. لدي هاتف RTX 2060 بسعة 6 جيجابايت.
هذه هي الخطوات التي سنغطيها:
- تثبيت
- التقاط فيديو
- احصل على نقطة السحابة ووضعيات الكاميرا
- قم بتشغيل Gaussian Splatting Algo
- المعالجة البعدية
- (مكافأة) قم بتضمين النموذج الخاص بك على موقع ويب في عارض تفاعلي
تثبيت
للتثبيت، يمكنك إما الانتقال إلى مستودع 3D Gaussian Splatting الرسمي واتباع تعليماتهم أو التوجه إلى The NeRF Guru على YouTube الذي يقوم بعمل ممتاز في توضيح كيفية تثبيت كل ما تحتاجه. أوصي في وقت لاحق.
لقد اخترت شخصيًا تثبيت colmap على نظام التشغيل windows لأنني لم أتمكن من إنشاء colmap من المصدر بدعم GPU في بيئة WSL الخاصة بي، وبالنسبة لنظام التشغيل windows يوجد برنامج تثبيت مُعد مسبقًا. تم إجراء التحسين لـ 3D Gaussian Splatting على نظام التشغيل Linux. ولكن في الواقع لا يهم حقًا والأوامر التي أظهرها لك متساوية على نظامي التشغيل Windows أو Linux.
التقاط فيديو
اطلب من شخص ما التقاط مقطع فيديو لك. يجب أن تقف ثابتًا قدر الإمكان ويجب على الشخص الآخر أن يتجول حولك محاولًا التقاطك من أي زاوية.
بعض التلميحات:
- اختر وضعًا يسهل عليك عدم التحرك فيه. على سبيل المثال، رفع يديك لمدة دقيقة واحدة دون تحريك ليس بهذه السهولة 😅
- اختر معدل إطارات مرتفعًا لالتقاط الفيديو لتقليل ضبابية الحركة. على سبيل المثال 60 إطارًا في الثانية.
- إذا كان لديك وحدة معالجة رسومات صغيرة، فلا تقم بالتصوير بدقة 4K وإلا فمن المحتمل أن يتعطل المُحسِّن بسبب استثناء نفاد الذاكرة.
- تأكد من وجود إضاءة كافية، بحيث يكون تسجيلك واضحًا ونقيًا.
- إذا كان لديك وحدة معالجة رسومات صغيرة، ففضل المشاهد الداخلية على المشاهد الخارجية. تحتوي المشاهد الخارجية على الكثير من المحتوى “عالي التردد” المعروف أيضًا باسم. الأشياء الصغيرة القريبة من بعضها البعض مثل العشب والأوراق مما يؤدي إلى ظهور العديد من الغاوسيين أثناء التكثيف التكيفي.
بمجرد تسجيل الفيديو الخاص بك، انقله إلى جهاز الكمبيوتر الخاص بك واستخرج الإطارات الفردية باستخدام ffmpeg.
ffmpeg -i <PATH_VIDEO> -qscale:v 1 -qmin 1 -vf fps=<FRAMES_PER_SEC> <PATH_OUTPUT>/%04d.jpg
يأخذ هذا الأمر الفيديو ويحوله إلى صور jpg ذات جودة عالية مع ضغط منخفض (يعمل jpg فقط). عادةً ما أستخدم ما بين 4 إلى 10 إطارات في الثانية. سيتم تسمية ملفات الإخراج برقم مكون من أربعة أرقام.
يجب أن ينتهي بك الأمر بمجلد مليء بصور الإطار الفردي مثل:
بعض النصائح لجودة أفضل:
- قم بإزالة الصور الباهتة، وإلا فسيؤدي ذلك إلى حدوث ضبابية حولك ونشوء “أجسام طافية”.
- قم بإزالة الصور التي تكون فيها عيناك مغمضتين – وإلا فسيؤدي ذلك إلى عيون ضبابية في النموذج النهائي.
احصل على نقطة السحابة وأوضاع الكاميرا
كما ذكرنا سابقًا، يجب تهيئة خوارزمية الرش الغاوسي. إحدى الطرق هي تهيئة متوسط Gaussians مع موقع نقطة في الفضاء ثلاثي الأبعاد. يمكننا استخدام أداة colmap التي تنفذ البنية من الحركة (SfM) للحصول على سحابة نقطية متفرقة من الصور فقط. لحسن الحظ، قدم لنا مؤلفو ورقة 3D Gaussian Splatting رمزًا لتبسيط العملية.
لذا توجه إلى Gaussian Splatting repo الذي قمت باستنساخه، وقم بتنشيط بيئتك واستدعاء البرنامج النصي Convert.py.
python .\convert.py -s <ROOT_PATH_OF_DATA> --resize
المسار الجذر لبياناتك هو الدليل الذي يحتوي على مجلد “الإدخال” مع جميع الصور المدخلة. في حالتي قمت بإنشاء مجلد فرعي داخل الريبو: ./gaussian-splatting/data/<NAME_OF_MODEL>
. الحجة --resize
سوف يقوم بإخراج صور إضافية مع عوامل أخذ العينات السفلية 2 و4 و8. وهذا مهم في حالة نفاد الذاكرة للصور عالية الدقة، لذا يمكنك ببساطة التبديل إلى دقة أقل.
ملاحظة: اضطررت إلى تعيين متغير البيئة CUDA_VISIBLE_DEVICES=0 لاستخدام وحدة معالجة الرسومات مع colmap.
اعتمادًا على عدد الصور لديك، قد تستغرق هذه العملية بعض الوقت، لذا إما تناول كوبًا من القهوة أو التحديق في التقدم كما أفعل أحيانًا وأضيع الكثير من الوقت 😂
بمجرد الانتهاء من colmap، يمكنك الكتابة colmap gui
في سطر الأوامر الخاص بك وتفحص سحابة النقاط المتفرقة.
لفتح السحابة النقطية، انقر على “ملف>استيراد نموذج” وانتقل إلى <ROOT_PATH_DATA>/sparse/0
وافتح هذا المجلد.
الكائنات الحمراء هي الكاميرات التي تقدرها خوارزمية SfM من إطارات الإدخال. إنها تمثل موضع الكاميرا ووضعيتها حيث تم التقاط الإطار. يوفر SfM أيضًا معايرة الكاميرا الجوهرية، وهو أمر مهم لخوارزمية الرش الغاوسي ثلاثية الأبعاد بحيث يمكن تحويل الغاوسي إلى صورة ثنائية الأبعاد أثناء التحسين.
تشغيل محسن الرش الغاوسي
كل شيء حتى الآن كان بمثابة تحضير لخوارزمية الرش الغاوسي ثلاثية الأبعاد الفعلية.
البرنامج النصي لتدريب 3D Gaussian splatt هو Train.py. عادةً ما أرغب في تغليف نصوص python النصية هذه في برنامج نصي shell حتى أتمكن من إضافة التعليقات وتغيير معلمات التشغيل بسهولة. وهنا ما أستخدمه:
ما عدا data_device=cpu
يتم تعيين كافة الوسائط إلى وضعها الافتراضي. إذا واجهت مشاكل في الذاكرة، يمكنك محاولة تعديل الوسيطات التالية:
resolution
: هذا هو عامل أخذ العينات السفلي لدقة الصورة. 1 يعني الدقة الكاملة، و2 يعني نصف الدقة. منذ أن استخدمنا --resize
بالنسبة إلى Convert.py لتوليد السحابة ذات النقاط المتفرقة، يمكنك الاختبار باستخدام 1 و2 و4 و8. قبل خفض الدقة أوصي بمحاولة خفض sh_degree
أولاً.
sh_degree
: يضبط الدرجة القصوى للتوافقيات الكروية، حيث تكون 3 هي الحد الأقصى. إن خفض هذه القيمة له تأثير كبير على مساحة الذاكرة. تذكر أن التوافقيات الكروية تتحكم في عرض الألوان المعتمد على العرض. عمليا sh_degree=1
عادة لا تزال تبدو جيدة من تجربتي.
densify_*_iter
: يتحكم في نطاق التكرارات حيث يتم إجراء التكثيف التكيفي. قد يؤدي التغيير والتبديل في الوسيطة إلى ظهور عدد أقل من النقاط وبالتالي تقليل مساحة الذاكرة. لاحظ أن هذا قد يكون له تأثير كبير على الجودة.
إذا سار كل شيء على ما يرام، نأمل أن ينتهي بك الأمر إلى مشهد كما هو موضح أدناه. في القسم التالي ننتقل إلى التصور والمعالجة اللاحقة.
يمكنك في الواقع رؤية الشكل الغاوسي للبقع الفردية في المناطق منخفضة الكثافة.
المعالجة البعدية
على الرغم من أن Gaussian splatting repo يأتي مع متخيل خاص به، إلا أنني أفضل استخدام Super Splat لأنه أكثر سهولة ويمكنك تعديل المشهد الخاص بك مباشرة.
لذا للبدء، توجه إلى محرر Super Splat وافتح ملف الطبقات الموجود أسفله ./output/<RUN_NAME/point_cloud/iteration_xxxx>
.
عادةً ما أبدأ بإزالة معظم نقاط الخلفية باستخدام كرة كما هو موضح أدناه.
اكتشاف المزيد من موقع علم
اشترك للحصول على أحدث التدوينات المرسلة إلى بريدك الإلكتروني.