PyTorch3D Stereo Implicit Shape Rendering: يعلمك كيفية بناء هيكل المشهد ثلاثي الأبعاد

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

في 23 يناير 2020، أصدرت شركة Facebook AI إصدار PyTorch3D v0.1.0. PyTorch3D عبارة عن مكتبة مكونات محسّنة وفعالة وقابلة لإعادة الاستخدام في PyTorch. إنها تتمتع بثلاث ميزات بارزة: الكفاءة العالية، والوحدات النمطية، والقدرة على التفاضل.يهدف إلى تبسيط التعلم العميق ثلاثي الأبعاد في PyTorch.
يوفر PyTorch3D مكونين رئيسيين: مشغلي الأبعاد الثلاثية والعرض.
في مشغلي 3D،يمكن لـ Fit Mesh استخدام وظيفة الخسارة ثلاثية الأبعاد،قم بتشويه الشكل العام الأولي إلى شكل الهدف وجعل شكل الهدف أكثر سلاسة بمساعدة بعض القواعد.طريقة تعديل الحزمة في مشغلي الأبعاد الثلاثية، ثم يوفر الكاميرات ، يتحول ، so3 هناك ثلاث واجهات برمجة تطبيقات في المجموع، والتي تشكل رسمًا لمنظور الكاميرا استنادًا إلى منظور كاميرا معينة، وبالتالي استنتاج البنية ثلاثية الأبعاد للمشهد.
يتضمن العرض مُقدم شبكة الملمس (Render Textured Meshes)، ومُقدم شبكة DensePose (Render DensePose Meshed)، ومُقدم سحابة النقاط الملونة (Render Colored Pointclouds)، وما إلى ذلك.وبمساعدة هذه البرامج، يمكن تحسين البنية ثلاثية الأبعاد الناتجة للمشهد بشكل أكبر.
في 6 فبراير 2020، تم توفير أكواد PyTorch3D ذات الصلة مفتوحة المصدر على GitHub. بعد 5 إصدارات من التكرارات، في 9 فبراير 2021، أصدر PyTorch3D إصداره العام السادس v0.4.0.تتضمن الميزات الجديدة وظائف ضمنية، وعرضًا مجسمًا، وإعادة تنفيذ NeRF.توفر مكتبة مفتوحة المصدر أسرع وأكثر مرونة لأبحاث التعلم العميق ثلاثية الأبعاد.

تقديم الشكل الضمني
إن تقديم الشكل الضمني هو عملية إنشاء عروض واقعية لمشاهد ثلاثية الأبعاد استنادًا إلى وجهات نظر جديدة للمشهد المدخل.الفكرة الأساسية هي استخدام الشبكات العصبية والرسم التفاضلي لإعادة بناء الشكل الضمني لسطح المشهد ثلاثي الأبعاد.وهذا يجعل من الممكن تعلم هندسة المشاهد ثلاثية الأبعاد باستخدام المشاهد ثنائية الأبعاد فقط.
هناك العديد من المكونات الرئيسية المطلوبة لأداء عرض الشكل الضمني.يتضمن تجريدات لبيانات الحجم ومقدمات الأشكال الضمنية القابلة للتفاضل.
لتسهيل الأمر على ممارسي الصناعة لتجربة تقديم الشكل الضمني،يوفر PyTorch3D بالفعل للمستخدمين سلسلة من مشغلي الأبعاد الثلاثية ووظائف الخسارة الشائعة الاستخدام، بالإضافة إلى واجهة برمجة تطبيقات عرض معيارية وقابلة للتفاضل.في حين يشير إلى المكونات الأساسية القابلة لإعادة الاستخدام، فإنه يوفر أيضًا طرق تنفيذ قياسية ومثبتة لهذه المكونات.
في PyTorch3D v0.4.0، هناك 5 ميزات جديدة تدعم عرض الشكل الضمني:
1. تمت إضافة هيكل حجم البيانات (بنية بيانات المجلدات), يدعم معالجة الدفعات من وحدات التخزين ثلاثية الأبعاد والتحويل بين إطارات الإحداثيات؛
2. تمت إضافة طرق متعددة لتنفيذ نسيج الأشعة: GridRaysampler، وMonteCarloRaysampler، وNDCGridRaysampler
3. تمت إضافة طرق تنفيذ Raymarcher متعددة: AbsorptionOnlyRaymarcher وEmissionAbsorptionRaymarcher
4. تمت إضافة مُقدِّم ضمني (مُقدِّم ضمني) ومقدمي الحجم (مُقدِّم الحجم) API، والتي تتكون من Raysampler وRaymarcher
5. تمت إضافة وظائف متعددة للمرافق، مثل التحويل القابل للتفاضل من سحابة النقاط إلى الحجم.

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

برنامج تعليمي (ملاءمة الحجم المحكم)
استنادًا إلى البرنامج التعليمي الرسمي لـ PyTorch3D GitHub Fit Textured Volume، قمنا بترجمته وتنظيمه لإظهار كيفية استخدام PyTorch3D.باستخدام عرض مجسم قابل للتفاضل، يمكننا التنبؤ بالبنية المجسمة للمشهد بناءً على مجموعة من وجهات النظر للمشهد.
استخدام Raymarching لبناء هيكل مشهد ثلاثي الأبعاد سيقدم هذا البرنامج التعليمي:
- كيفية إنشاء مُقدِّم حجم قابل للتفاضل؛
- كيفية إنشاء نموذج حجم (بما في ذلك كيفية استخدام فئة المجلدات)؛
- استخدم برنامج تقديم الصور المجسمة القابل للتفاضل لتناسب بنية الصور المجسمة من الصورة؛
- تصور البنية الثلاثية الأبعاد المتوقعة.
ملحوظة: نظرًا للمساحة المحدودة، لا تعرض هذه المقالة سوى جزء من الكود. يرجى الاطلاع على الكود الكاملانقر هنا.
0. تثبيت واستيراد الوحدات النمطية
تأكد من تثبيته شعلة و تورشفجن .
إذا لم يتم تثبيته بايتورش 3d ، يرجى تثبيته.
1. إنشاء صور للمشاهد والأقنعة
سوف يقوم الكود التالي بإنشاء بيانات التدريب. سوف يمر شبكة ملائمة للنسيج.ipynb برنامج تعليمي يعرض صورة بقرة من زوايا متعددة ويعيد ما يلي:
سلسلة من موترات الصور وظلالها التي تم إنشاؤها بواسطة برنامج معالجة شبكة البقرة؛ المراسلات الفردية لجميع لقطات الكاميرا.
ملحوظة: توليد_عروض_البقر لمعرفة مبدأ عمل عرض الشبكة المطبق في الوظيفة، يرجى الرجوع إلى:
شبكة ملائمة للنسيج.ipynb
target_cameras, target_images, target_silhouettes = generate_cow_renders(num_views=40)
print(f'Generated {len(target_images)} images/silhouettes/cameras.')
2. تهيئة مُقدِّم وحدة التخزين
يؤدي تهيئة مُقدِّم حجم الصوت إلى إرسال شعاع من كل بكسل من الصورة المستهدفة وعينة مجموعة من النقاط المتباعدة بالتساوي على طول الشعاع. يمكن الحصول على قيمة الكثافة وقيمة اللون المقابلة لكل نقطة شعاع عن طريق الاستعلام عن الموضع المقابل في نموذج الحجم للمشهد.
يتكون المُقدِّم من رايمارشر و أ جهاز أخذ العينات بالأشعة تشكل.
جهاز أخذ العينات بالأشعة المسؤول عن إصدار الأشعة من بكسلات الصورة ونقاط أخذ العينات على طول الأشعة. الذي استخدم هنا هو مُعاينة أشعة NDCGridRaysampler ، والتي تتوافق مع مواصفات شبكة إحداثيات PyTorch3D القياسية.
رايمارشر يحصل على كثافة ولون عينات الأشعة ويعرض جميع الأشعة كقيمة اللون والتعتيم للبكسل الذي جاءت منه الأشعة. الذي استخدم هنا هو انبعاث امتصاص رايمارشر ، الذي ينفذ المعيار الانبعاث والامتصاص خوارزمية.
# render_size 表示渲染图像各个边的像素大小,将其设置为与目标图像尺寸一致
# 也就是说将其渲染成与基准图像一样的尺寸
render_size = target_images.shape[1]
# 渲染场景以(0,0,0)为中心,被限定在一个边长约等于 3.0 (国际单位) 的边框内。
volume_extent_world = 3.0
# 1) 实例化 raysampler
# 此处 NDCGridRaysampler 会生成一矩形图像网格的射线,其坐标遵循 pytorch3d 坐标规定
# 由于此处设定的体积是 128^3,因此取样 n_pts_per_ray=150
# 大致相当于每个体素都有一个射线点
# 进一步设置 min_depth=0.1,因为相机平面内的所有表面都超过了 0.1 单位
raysampler = NDCGridRaysampler(
image_width=render_size,
image_height=render_size,
n_pts_per_ray=150,
min_depth=0.1,
max_depth=volume_extent_world,
)
# 2) 实例化 raymarcher.
# 此处用的是标准 EmissionAbsorptionRaymarcher
# 它会沿着每条射线前进
# 将每条射线都渲染成一个单一的 3D 颜色向量和一个不透明度标量
raymarcher = EmissionAbsorptionRaymarcher()
# 最后,用 raysampler 和 raymarcher 实例化体积渲染器
renderer = VolumeRenderer(
raysampler=raysampler, raymarcher=raymarcher,
)
3. تهيئة نموذج الحجم
بعد ذلك، قم بإنشاء نموذج حجم المشهد. يؤدي هذا إلى تكميم الفضاء ثلاثي الأبعاد إلى وحدات بكسل حجمية، حيث يتم تمثيل كل فوكسل بواسطة متجه ثلاثي الأبعاد للون RGB الخاص بالفوكسل، ومقياس كثافة يصف تعتيم الفوكسل (في النطاق [0-1]، حيث تكون الأرقام الأعلى أكثر تعتيمًا).
ولضمان أن تكون قيم الكثافة واللون ضمن النطاق [0-1]، سنقوم بتمثيل الحجم واللون والكثافة في الفضاء اللوغاريتمي. تشغيل النموذج إلى الأمام وظيفة، مساحة السجل سيتم تمرير القيمة السيني تمرير الوظيفة، بحيث مساحة السجل القيمة في النطاق الصحيح.
أيضًا، نموذج الحجم يحتوي أيضًا على كائن العرض. يظل هذا الكائن دون تغيير طوال عملية التحسين.
هذا القسم من الكود يحدد أيضًا هوبر تحسب دالة الخسارة الفرق بين اللون المقدم والقناع.
4. ضبط الحجم
في هذه الخطوة، نستخدم العرض التفاضلي لإجراء ملاءمة الحجم.
لتناسب الحجم، نبدأ من كاميرا الهدف يتم إجراء العرض من منظور الصور المستهدفة و الصور الظلية المستهدفة للمقارنة.
يتم تقييم هذه المقارنة بواسطة الصور المستهدفة/الصور المقدمة و الصور الظلية المستهدفة/الصور الظلية المُقدمة يتم ذلك عن طريق أخذ متوسط خطأ هوبر (السلس-L1) بين الاثنين.
5. تصور حجم المشهد الأمثل
أخيرًا، يتم تصور الحجم الأمثل عن طريق تدوير حجم المشهد على المحور y وعرضه من وجهات نظر متعددة.
def generate_rotating_volume(volume_model, n_frames = 50):
logRs = torch.zeros(n_frames, 3, device=device)
logRs[:, 1] = torch.linspace(0.0, 2.0 * 3.14, n_frames, device=device)
Rs = so3_exponential_map(logRs)
Ts = torch.zeros(n_frames, 3, device=device)
Ts[:, 2] = 2.7
frames = []
print('Generating rotating volume ...')
for R, T in zip(tqdm(Rs), Ts):
camera = FoVPerspectiveCameras(
R=R[None],
T=T[None],
znear = target_cameras.znear[0],
zfar = target_cameras.zfar[0],
aspect_ratio = target_cameras.aspect_ratio[0],
fov = target_cameras.fov[0],
device=device,
)
frames.append(volume_model(camera)[..., :3].clamp(0.0, 1.0))
return torch.cat(frames)
with torch.no_grad():
rotating_volume_frames = generate_rotating_volume(volume_model, n_frames=7*4)
image_grid(rotating_volume_frames.clamp(0., 1.).cpu().numpy(), rows=4, cols=7, rgb=True, fill=True)
plt.show()
6. الخاتمة
يوضح هذا البرنامج التعليمي كيفية تحسين بناء حجم المشهد ثلاثي الأبعاد بحيث يتطابق عرض الحجم لنقاط المشاهدة المعروفة مع الصورة المرصودة لكل نقطة مشاهدة.
تم إجراء العرض في البرنامج التعليمي باستخدام مُعاينة أشعة NDCGridRaysampler و انبعاث امتصاص رايمارشر تم الانتهاء من إنشاء برنامج تقديم الصور المجسمة PyTorch3D.

الرجاء مشاهدة البرنامج التعليمي الكاملانقر هنا.