مدلسازی سهبعدی با استفاده از NeRF
ما انسان ها و به طور کلی حیوانات در ساختن نمای سهبعدی از اشیایی و تصاویر دوبعدیشون ماهر هستیم؛ ولی این ماجرا برای هوش مصنوعی فرق میکنه. فرض کنید یک تعداد عکس از یک شی (مثلا صندلی) با زاویههای مختلف میگیرم و میخواهیم مدل سهبعدی اون شی رو داشته باشیم که تصویر با هر زاویه دلخواه از اون رو بتونیم رندر بگیریم به این کار میگیم View Synthesis. برای این کار یک سری روش اولیه و ساده این بوده که از تصویرهای دو بعدی سعی میکردند حجم (volume) سهبعدی شی رو بسازند که البته ذخیرهسازی این volume حافظهای نزدیک به چند گیگ میخواسته و خب قاعدتا کار به صرفهای نبوده. یک دسته دیگر از روشها اما سعی کردهاند شی سه بعدی رو به شکل یک رویه مدل کنند و پارامترهای معادله اون رویه رو به دست بیارند (در مقایسه با دسته قبلی، این روشهای مثلا فقط نیاز به ۱۰ مگابایت حافظه داشتهاند)
اما یک مقالهای پارسال منتشر شد به اسم Neural Radiance Fields یا به اختصار NeRF، کاری که تو این مقاله میکنند اینه که یک شبکه عصبی آموزش میدن که با گرفتن تصویر در ورودی خودش، در خروجی خودش سه کانال رنگی و میزان آلفا یا opacity رو با گرفتن مختصات x,y,z و زاویه نگاه مورد نظر (تتا و فای) تولید میکنه. به صورت واضحتر یعنی شما به شبکه مثلا یک تصویر صندلی میدید و بهش x,y,z خودتون و زاویه دیدتون رو هم میدید و شبکه براتون اون نما از صندلی نسبت به اون موقعیت و زاویه رو درست میکنه؛ یعنی:
(x,y,z,theta,phi) => MLP => (R,G,B, alpha)
حالا این کار چه طوری انجام میپذیره؟ برای تولید تصویر دوبعدی در زاویه مورد نظر یه ray (پرتو، خط فرضی) از مرکز نگاه ما (دوربین) به هر نقطه در تصویر دوبعدی که میخواهیم بسازیم رد میکنند و ادامه میدهند. (این پرتو صرفا یه معادله خط در فضاست، یک خط بین دونقطه: دوربین و هر پیکسل تصویر دو بعدی) در نقاطی در طول پرتو سمپل برمیدارند و میانگین میگیرند (تقریب یک انتگرال) یعنی همونطوری که توی شکل مشخص شده مقادیر RGB و آلفا رو برای نقاط روی خط در نظر گرفته شده (که بش میگیم پرتو) حساب میکنند و میانگین این مقادیر میشه RGB و آلفا پیکسلی از تصویر دو بعدی که پرتو اون رو قطع میکنه. این کار رو برای چندین تصویر دوبعدی که از شی داریم انجام میدن. با این کار اون شی شکل سهبعدیش در وزنهای شبکه عصبی انکود میشه و میشه هر view ازش رو ساخت.
سوال بعدی اینه که این رو چطوری آموزش میدن؟ همین کار پرتو رو انجام میدن و برای تصاویری که داریم. شبکه یسری پیکسل تولید کرده که با پیکسل های واقعی MSE، به عنوان loss میگیرند. تقریبا نیمروز طول میکشه برای یک جسم یاد بگیره ولی توی 30 ثانیه view تولید میکنه. وزنهای شبکه عصبی هم حدود 5 مگابایت اینا میشه. دقت خیلی خوب وضوح تصویر عالی داره.
این همه حسن گفتیم اما مشکلش و جای کار بیشتر کجاست؟ باید سمپلهای زیادی در هر پرتو برداشت که حداقل موقع inference خیلی اذیت میکنه، تازه هر پرتو میشه یک پیکسل، رزولوشن بالا باشه دیگه دردسر بیشتره.
یسری بحث یادگیری ویژگیهای فرکانس بالا برای جزییات بهتر هم داره که از محدوده این پست خارجه.
مقاله:
https://arxiv.org/pdf/2003.08934
لینک مقالهها و پیادهسازیهاشون برای این زمینه:
https://github.com/yenchenlin/awesome-NeRF
پ.ن. با تشکر از آقای محمدمهدی عبداللهپور بابت درست کردن این پست. شما هم اگر پست خوبی دارید، بفرستید.
#read
#paper
@nlp_stuff
Post #225
1.76K