Command Palette
Search for a command to run...
PyTorch3D Stereo Implicit Shape Rendering: يعلمك كيفية بناء هيكل المشهد ثلاثي الأبعاد

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

يوفر 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 هو نموذج التعلم العميق.**تم تطويره بواسطة فريق البحث في 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.







