'Gaussian splatting' oldukça havalı
(aras-p.info)- SIGGRAPH 2023'teki 3D Gaussian Splatting makalesi, fotoğraf tabanlı sahneleri milyonlarca 3D Gaussian'a dönüştürüp gerçek zamanlı render etmeye yönelik bir yaklaşım sunuyor; ayrıca Unity görselleştirme deneysel uygulaması da yayımlandı
- Sahne, mesh·voksel·distance field yerine konum, dönüş, eşitsiz ölçek, opaklık ve küresel harmonik katsayıları taşıyan uzaydaki blob kümeleri olarak temsil ediliyor
- Bu yöntem NeRF değildir ve resmi uygulama da sabit işlevli rasterization pipeline yerine %100 CUDA tabanlı kutucuklu yazılım render'ı kullanıyor
- Unity uygulaması, NVIDIA RTX 3080 Ti üzerinde 1200x800 çözünürlükte resmi görüntüleyicinin 7.40ms'sine karşılık daha yavaş olan 23.8ms sürse de, standart HLSL ile yazıldığı için Mac'te de çalışıyor
- bicycle sahnesi diskte 1.5GB, yaklaşık 6 milyon blob ve blob başına yaklaşık 250 bayt yer kaplıyor; bu da performansın yanı sıra veri boyutu ve GPU belleğini de önemli iyileştirme alanları haline getiriyor
SIGGRAPH 2023 makalesi ve Unity deneyi
- SIGGRAPH 2023 makalesi 3D Gaussian Splatting for Real-Time Radiance Field Rendering, Kerbl, Kopanas, Leimkühler ve Drettakis'in çalışması
- Makale sitesi, kaynak kodu ve veri seti açık olduğundan, deney yapmak ve yeniden üretmek doğrudan mümkün
- Unity deneyi, önceden üretilmiş Gaussian Splat “model” dosyasını alıp gerçek zamanlı görselleştirmeye odaklanıyor
- Uygulama aras-p/UnityGaussianSplatting adresinde açıklandı ve ardından ek deneylerin sürmesi planlanıyor
- Veri boyutunun azaltılıp azaltılamayacağı da bir ilgi konusu; önceki float sıkıştırma deneylerinden yararlanma ihtimali var
Gaussian Splat nelerden oluşur
- Gaussian Splatting, 3D sahneleri poligon mesh, voksel veya distance field yerine milyonlarca parçacıkla temsil ediyor
- Her parçacık, yani bir “3D Gaussian”, şu bilgileri taşıyor
- 3D uzaydaki konum
- dönüş
- eşitsiz 3D ölçek
- opaklık
- renk bilgisi
- Renk tek bir renk değil; görüş yönüne göre değişebilen 3. derece Spherical Harmonics katsayılarıyla ifade ediliyor
- Render sırasında parçacıklar uzamış 3D küreler olarak çizilmiyor; ekran uzayındaki 2D Gaussian olarak “splat” ediliyor
- Temel fikir, ölçek ve renge sahip blob kümelerinden fotoğraf tabanlı sahne temsili oluşturmak ve bunu hızlı biçimde render etmek
NeRF de değil, sabit işlevli rasterization da değil
- Gaussian Splatting NeRF değildir
- İçinde “Neural” bir unsur olmadığı açıkça belirtiliyor
- Hızlı olmasının nedeni de “GPU rasterization donanımı kullanması” değil
- Resmi uygulama rasterization pipeline kullanmıyor
- %100 CUDA ile uygulanmış
- Resmi uygulamanın performansı, sabit işlevli rasterization'dan değil, milyonlarca ölçeklenmiş parçacığı verimli biçimde işleyen kutucuk tabanlı yazılım render'ından geliyor
- Yine de kutucuk tabanlı “GPU üzerinde yazılım” rasterizer fikri tamamen yeni değil
Eski teknik yapı taşlarıyla bağlantı
- Gaussian Splatting'in kendisi, 2001~2002 civarındaki EWA Splatting gibi çalışmalarla bağlantılı
- Ölçeklenmiş ve yönlendirilmiş blob'lar uzaya yerleştirilir, ekrana nasıl izdüşecekleri hesaplanır ve ardından ekran uzayında Gaussian biçimi işlenir
- 1994 oyunu Ecstatica, elipsoid tabanlı bir renderer kullanan ilginç bir örnek
- Spherical Harmonics, fizikte yüzlerce yıldır kullanılıyor; bilgisayar grafiklerinde ise 2000 civarında Ravi Ramamoorthi ve Peter-Pike Sloan'ın çalışmalarıyla yaygınlaştı
- 1984 tarihli Kajiya & Von Herzen'in Ray tracing volume densities çalışması, grafikteki erken kullanım örneklerinden biri olabilir
- İlgili özetler Patapom’s page üzerinden görülebilir
- Point-Based Rendering de eski bir alan
- Parçacık sistemleri uzun zamandır VFX ve katı olmayan olguların temsili için kullanılıyor
- The Use of Points as a Display Primitive 1985 tarihli bir çalışma
- Surfels ise 2000 tarihli bir makale
- Demoscene ve gerçek zamanlı VFX araçları da alışılmadık render yaklaşımlarını uzun süredir kullanıyor
- Fairlight & CNCD'nin Agenda Circling Forth, Ceasefire (all falls down..), Number One / Another One işleri buna örnek
- Notch, nokta ve blob tabanlı nesneler oluşturma, simüle etme ve görüntüleme yeteneklerine sahip gerçek zamanlı bir VFX aracı
- fogleman/primitive, bir görüntüyü primitive shape kümeleri olarak ifade eden 2016 tarihli bir araç örneği
- Media Molecule'ün “Dreams”i splat tabanlı bir renderer kullandı; yayımlanan sürümün birkaç tekniğin birleşimi olduğu görülüyor
- Alex Evans'ın “Learning from Failure” sunumu SIGGRAPH 2015 ve Umbra Ignite 2015 üzerinden izlenebilir
- Parçacıklar için kutucuklu rasterization, en azından 2014'te Gareth Thomas'ın Holy smoke! Faster Particle Rendering using Direct Compute çalışmasından beri var
- Ekranı kutucuklara bölüp kutucuk içinde çalışmak bellek trafiğini azaltabiliyor
- Bu yaklaşım, mobil GPU'ların genel çalışma biçimiyle de bağlantılı; PowerVR'ın ilk tasarımı 1996'ya, Pixel Planes 5 ise 1989'a kadar gidiyor
UnityGaussianSplatting'in mevcut durumu
- aras-p/UnityGaussianSplatting, Gaussian Splat modelinin bir görselleştirici uygulaması
- Mevcut durumu, “çalışıyor ama hızlı değil”e daha yakın
- NVIDIA RTX 3080 Ti üzerinde bicycle sahnesi 1200x800 çözünürlükte render edilirken performans farkı büyük
- Resmi görüntüleyici: 7.40ms, 135FPS
- Unity uygulaması: 23.8ms, 42FPS
- Yaklaşık 4 kat daha yavaş
- Sıralama yöntemi de performans farkını etkiliyor
- Unity uygulaması görece basit bir GPU bitonic sort kullanıyor
- Resmi uygulama, OneSweep algoritmasına dayanan CUDA radix sort kullanıyor
- Rasterization yaklaşımı da farklı
- Resmi uygulama, CUDA ile yazılmış kutucuk tabanlı bir yöntem kullanıyor
- Unity uygulaması ise her splat'i ekran uzayında bir quad olarak render etmek için genel GPU rasterization pipeline'ını kullanıyor
- Unity uygulamasının taşınabilirlik açısından avantajı var
- Kod, Unity içindeki standart HLSL ile yazıldığı için Mac'te de çalışıyor
- Apple M1 Max üzerinde aynı sahne 108ms, 9FPS ile render ediliyor
- GPU belleği açısından şu anda Unity uygulaması daha az kullanıyor gibi görünüyor
- Resmi görüntüleyici: 4.8GB
- Unity uygulaması: 2.2GB
- Bu rakamlara Unity Editor'ün kullandığı bellek de dahil
Veri boyutu ve bellek kullanımı
- Gaussian Splatting tartışmaları çoğu zaman render kalitesi ve hızına odaklansa da veri boyutu ve bellek kullanımı da büyük bir sorun
- bicycle sahnesi diskte 1.5GB yer kaplıyor
- Söz konusu sahne yaklaşık 6 milyon blobdan oluşuyor
- Her blob yaklaşık 250 bayt kullanıyor
- Çalışma anında sıralama ve kutucuk tabanlı render gibi işlemler için ek bellek gerekiyor
- Dreams sunumunda, boyutu azaltmaya yardımcı olabilecek fikirler bulunuyor
1 yorum
Hacker News yorumları
Gradyan inişi ve türevlenebilir rendering kullanırken “neural”dan kaçınıldığını söylemek biraz böbürlenme gibi geliyor
Kavramsal olarak NeRF’e benzer biçimde, görüntülerden yola çıkarak 3D sahneyle ilgili değişkenleri yaklaşıkleyen veri odaklı bir gösterimi optimize ediyor; fark şu gibi görünüyor: NeRF ışık taşınımının tamamını, yani radiance field’ı modellemeye çalışırken burada yalnızca ışığın ulaştığı sınır koşulları modelleniyor
Hedef farklı olduğu için daha basit bir temsil tabanı makul ve sonuçlar da iyi görünüyor; ama sinir ağından kaçınmanın başlı başına övgüye değer bir şeymiş gibi sunulması üzücü. Sinir ağları yalnızca moda oldukları için kullanılmıyor; gerçekten güçlü fonksiyon yaklaştırıcıları ve “sinir ağı” denen yapıların kapsamı da çok geniş
Bu izlenim, blog yazısının girişindeki tondan kaynaklanıyor; makalenin kendisiyle farklı olabilir
Bu yüzden anlaşılması daha kolay, editörler veya renderer’lar gibi diğer 3D yazılımlara entegre edilmesi de daha kolay görünüyor; animasyon da mümkün olabilir. Tüm sahneyi tek seferde ifade eden bir kara kutu fonksiyon yaklaştırıcısı ölçeklenebilir ya da zarif hissettirmiyor
Ancak sinir ağlarında, problem iyi modellense bile eğitilmiş modelin gerçekte nasıl çalıştığını çoğu zaman bilmiyoruz; veri ihtiyacı ve tekrarlı yeniden eğitim nedeniyle uzun vadeli çözümler üretmede sınırları var
Burada yazarların küçük bir kültür savaşını körüklediğini değil, dostça bir şaka yaptığını iyi niyetle kabul etmek istiyorum
Her rendering pikseli, sınırı olmayan, bakış açısına bağlı Gauss’ların katkılarını ağırlıklı toplam olarak aldığı için, NeRF’in radiance field’ı modellediği, bunun ise yalnızca sınır koşullarını modellediği ayrımı doğru değil
NeRF’in yön alanında düşük rütbeli küresel harmonik temsil kullandığı da düşünülürse neredeyse 3D+α’ya yakın; bu kadar düşük boyutlu bir fonksiyonu geri kazanmak için neden sinir ağı seçildiği sorusu doğuyor
Çıkarım sırasında her piksel için görüş ışını boyunca sinir ağının tekrar tekrar örneklenmesi gerekiyor; oysa light field’ın sıkıştırılmış temsili grafik alanında zaten uzun süredir ele alınan bir problem, bu yüzden bu kısım oldukça tuhaf
Daha sonra Plenoxels, NeRF’ten “Ne”yi çıkarıp eğitim ve çıkarım performansını büyük ölçüde artırdı; Nvidia’nın Instant NeRF’i ise küçük bir sinir ağına ayrıntılı giriş gömme temsillerini enterpole ederek ekleyen bir yöntemle bunu bir ölçüde telafi etti: https://nvlabs.github.io/instant-ngp/assets/mueller2022insta...
Grafik mühendisliğinde sinir ağlarının yaygın kullanıldığı yerler çoğunlukla seyrek veri rekonstrüksiyonu, özellikle de gürültü giderme; bu da yüksek boyutlu bir problem olduğu için doğal. Yine de elle tasarlanmış algoritmaları ezip geçtiği durumlar nadir; küçük sinir ağlarını sıkıştırma için kullanmanın ise geleceği var gibi görünüyor
Grafiklerde fonksiyon yaklaştırma çok olduğu için sinir ağlarına yer var; ancak ele alınan fonksiyonlar genelde daha anlaşılabilir ve kontrol edilebilir olduğundan, doğal dil anlama gibi elle algoritmik çözüm üretmenin neredeyse imkânsız olduğu alanlardan farklı
Pek çok sohbet AI=kötü, CRYPTO=kötü diye bitiyor; sorun karşı görüşün yanlış olması değil, sonuca baştan karar verip düşünmeyi bırakırsanız kendi fikrinizin tamamen saçma olup olmadığını fark etmenin bir yolunun kalmaması
Gerçekten harika bir iş
Yazıda nokta tabanlı rendering ve parçacık sistemlerinden bahsediliyor; son oyunlarda, doku parçalarından ziyade nokta odaklı ama fizik sistemi gibi davranan yeni bir parçacık stiline doğru ince bir kayış varmış gibi hissediliyor
Örnek olarak Hogwarts: https://www.gamespot.com/a/uploads/original/1816/18167535/40..., Forspoken: https://oyster.ignimgs.com/mediawiki/apis.ign.com/project-at..., Starfield: https://dotesports.com/wp-content/uploads/2023/08/temple-loc..., AC6, FF16 var
Ortak noktaları, fiziği olan renkli saydam nokta parçacıkları gibi görünmeleri; özellikle konsollarda CPU yükü olmadan GPU üzerinde ucuz efektler üretmek için kullanılıyor gibi. Oyun geliştirme tarafında bilen biri varsa merak ederim
Akışkan simülasyonu yoksa nokta tabanlı parçacık sistemi yalnızca havai fişek gibi görünür. Bir sonraki aşama, her parçacığın bağımsız olarak momentum ya da rüzgâr gibi fizik özelliklerine sahip olup küçük doku billboard’ları olarak render edilmesiydi; nispeten yakın zamana kadar patlama ve duman gösteriminde kullanılıyordu
Artık makine performansı ve fizik algoritmaları iyileştiği için parçacıkların birbiriyle etkileştiği akışkan simülasyonları gerçek zamanlı çalıştırılabiliyor; şu an gördüğümüz efektler de o tarafa benziyor
3D oyun dünyasında yalnızca gerçek 3D temel şekillerle çalışmanın kavramsal ve yapısal olarak pek çok avantajı var; nokta sprite’ları da neredeyse sonsuz küçük 3D nesneler gibi ele alınabiliyor
Buna karşılık 2D sprite’ları 3D sahneye koyduğunuzda, kısmi saydamlık varsa arkadan öne doğru sıralamak gerekir; z-buffer ile pek uyumlu değildir, GPU’ya uygun çizim sırası ile çatışır, 3D yüzeylerin içine girerek 2D olduğu gerçeğini kolayca belli eder
Bu sorunları çözmek için screen-door saydamlık, z-buffer yazma biçimini değiştiren shader’lar, alpha test, alpha-to-coverage gibi birçok uzlaşma zamanla birikti
VR’da 3D sahne içindeki 2D görüntü tabanlı rendering, tek bir ekrandakinden çok daha kötü göze batar ve düz bir billboard olduğu çok daha kolay anlaşılır. Bu nedenleri bir araya getirince, 3D sahnelerdeki 2D doku sprite efektlerinden uzaklaşmak istemek için yeterince sebep var
Yapay zeka tarafındaki akım nedeniyle GPU’ların RT çekirdekleri ve tensor çekirdekleri gibi bileşenlerle “GPU içindeki küçültülmüş komut kümesi GPU’su” yönüne gitmesi de bir ölçüde ilgili görünüyor
Birkaç yıl önce NVIDIA tarafında SE(3) çekirdeklerini tensor çekirdeklerine taşıyan bir kernel yazmışlardı; Gaussian splatting’in küresel harmonik kısmına da sıkıştırma ve çalışma sırasında kısmi taşıma uygulanabilecek gibi görünmesi şaşırtıcı değil: https://developer.nvidia.com/blog/accelerating-se3-transform...
Gaussian splatting 3D uzayda her zaman bir destek bölgesine sahip olduğundan oldukça verimli olacak gibi; kabaca ve hızlı dönüştürülse bile nihai sonuç oldukça iyi olabilir
Parlayan noktaların güzel girdaplarını yapmak da nispeten kolay. Unreal Engine’de de benzeri vardır diye düşünüyorum ama doğrudan pek deneyimim yok
Buradan türediğini düşünmüyorum ama işaret edebileceğim ilk kilometre taşı o demo
Siggraph makalesi ilk çıktığında gerçekten heyecanlanmıştım
Son yaklaşık 10 yılda yaşadığım odaları bir gün 3D olarak yeniden oluşturmak için yüzlerce açıdan fotoğraflar çektim; Gaussian splatting, bunu neredeyse gerçekmiş gibi hissettirecek şekilde yeniden oluşturabilecek ilk teknik gibi geliyor
Araçlar daha olgunlaştığında eski odalarımı yeniden dolaşıp nostaljiye kapılma fikri beni çok heyecanlandırıyor
Pek bilmediğim bir alan olduğu için cahilce bir soru olabilir ama bu videolar gerçekten harika görünüyor
Anladığım kadarıyla sahne ya da radiance field her zaman statik ve aydınlatma bake edilmiş oluyor; bunun dinamik olarak aydınlatmayı değiştirmeyi ve hareketi de destekleyecek yönde gelişme ihtimali olup olmadığını merak ediyorum
Radiance field’da ışığın yayılması, yansıması, soğurulması gibi kavramlar yok; her şey “iletilen ışık” denen tek bir değerde ezilmiş durumda. Bu anlamda radiance field daha çok 3D fotoğrafa yakın
Bunu değiştirmek için inverse rendering ya da fotogrametriyle ışık kaynaklarının konumlarını, yüzeyleri, malzemeleri vb. tahmin edip ardından yeniden geleneksel path tracing kullanmak gerekir
Başka bir yön de animasyon değil video olabilir: radiance field’ı zaman içinde sürekli yakalayıp kareler arasındaki benzerliği sıkıştırarak zamansal tutarlılık elde etmek gibi bir yöntem olabilir
Birkaçını birbirine ekleyerek animasyon da yapılabilir: https://twitter.com/8Infinite8/status/1699460316529090568
Yeniden aydınlatma için bunu destekleyen çok sayıda NeRF varyantı olduğundan, splat’lerin malzeme parametrelerini optimize etmek de mümkün görünüyor
Örneğin bir iç mekân sahnesinde masa zeminde koyu bir gölge oluşturuyorsa, NeRF henüz ışık kaynağını ve gölgeyi anlamadığından zeminin siyah mı olduğunu, beyaz bir zeminin masa gölgesiyle mi örtüldüğünü, yoksa gölgenin içinde mavi bir Stanford bunny’nin mi saklandığını bilemez
İnsan yüzü gibi küçük nesneleri yakalayan 3D tarama düzenekleri, aydınlatmayı manipüle edip BRDF’yi doğrudan örnekleyerek bunu çözer. Aydınlatmayı manipüle edemiyorsanız BRDF’yi tahmin etmek mümkün olabilir ama sınırları vardır
Sonradan animasyon eklemek kolay olabilir; ancak animasyonun kendisini yakalamak için birden fazla kamera gerekir ya da konu insan olduğu için karşı tarafı hayal edip dolduran bir sinir ağı gibi tahminlere dayanmak gerekir
Intel birkaç yıl önce birden fazla kamerayla sahneyi yakalayıp son işlemede kamera konumunu değiştirebildiğiniz bir proje yapmıştı; sanırım Amerikan futbolu yayınlarını hedefliyordu ama fiilen çıktığına dair bir haber duymadım. Matrix tarzında birden fazla kamera gerekiyor
Yani veriyi günün saatine göre animasyonlu hâle getirme yöntemi. Veri gereksinimi büyüyebilir ama enterpolasyon yöntemleri olduğu için o kadar da kötü olmayabilir
Statik bir sahne 2GB ise, kabaca zaman dilimi yaklaşımı 16GB’tan azıyla mümkün olabilir ve modern GPU’larda render edilebilir. Sonrası, H100 sınıfı performansın tüketici tarafına inmesini beklerken birkaç yıl optimizasyon yapma meselesi
Bilimin bilimkurgunun beklentilerini aşması her zaman eğlenceli
Bu durumda aklıma hemen Cyberpunk 2077’deki Braindance kavramı geldi; başka birinin görsel anılarının içinde, o kişinin sahnede algıladığı kapsam dahilinde dolaşabilme özelliği
Kamerayı özgün bakış açısından farklı bir yere taşıdığınızda görüş alanı üç boyutlu bir piksel yığını gibi dağılıyor; buradaki blob kavramına benziyor ama şaşırtıcı biçimde bu makaledekinden çok daha az rafine görünüyor
https://steelseries.com/blog/how-to-braindance-cyberpunk-207...
Hacim render etmede splatting oldukça eski bir teknik. Westover, Lee Alan’ın Temmuz 1991 tarihli “SPLATTING: A Parallel, Feed-Forward Volume Rendering Algorithm” makalesi var
İkincisini kimse saklamaya çalışıyor gibi görünmüyor; birincisi ise doğru görünmüyor
O içgörünün nereden geldiğini bilmiyorum ama o dönemde Boston yakınlarında yaşıyordum ve küçük çocuklarım vardı
3DGS render etmenin ilk yerel optimize WebGPU uygulamasını heyecanla bekliyorum
Sahne verilerinin nasıl verimli biçimde sıkıştırılıp açılacağını da merak ediyorum
Bu soruyla ilgili bazı notları Zulip başlığında bırakmıştım: https://xi.zulipchat.com/#narrow/stream/197075-gpu/topic/Gau...
Geçenlerde Gaussian splatting kullanımını gösteren bir video izledim: Getting Started With 3D Gaussian Splats for Windows (Beginner Guide) - https://www.youtube.com/watch?v=UXtuigy_wYc
Hareketten yapı çıkarımı alanındaki son durum merak ediliyor
Bir mekâna ait video olduğunda, bugün bunun pratikte nasıl 3B sahneye dönüştürüldüğünü bilmek istiyorum
Bu makalede açıklanan sahne yeniden oluşturma sürecinin girdisi de tam olarak budur
Bildiğim kadarıyla SfM’in temel yaklaşımı son yaklaşık 10 yılda pek değişmedi; SIFT gibi görüntü öznitelik çıkarımı, sezgisel eşleştirme, bundle adjustment ve aykırı değer temizleme olarak özetlenebilir
Genel yanıt fotogrametridir; NeRF tarzı yaklaşımlara yönelik ilgi ve bunların pratikliği de giderek artıyor
Ancak bunun video olması sayesinde çıkarılabilecek ek uzamsal ilişkilerin daha fazla ilgi görmemesi şaşırtıcı. Kareler arasında kameranın yalnızca belirli şekillerde hareket edebileceği kısıtının kamera pozu kestiriminde kullanılabileceği düşünülebilir
Splat edilmiş Gauss’lar üzerinde marching cubes çalıştırıp mesh çıkarmak fikri var, ama henüz bunu gerçekten yapan bir örnek gördüğümü sanmıyorum
90’ların sonunda blob ile voksel eş-yüzeyleri render ediyorduk
Tüm 3B voksel dizisinde yüzey voksellerini tarıyor, yerel yoğunluk gradyanından normali hesaplayıp 240 taneden birine kuantalıyorduk
Ardından bir yer değiştirme vektörü tablosu kullanarak yüzey voksel zincirleri oluşturuyorduk; voksellerin çoğu, önceki voksele göre yer değiştirme indeksi ve normal vektör indeksi olmak üzere 2 bayttı
240 normal vektör için aydınlatma önceden hesaplanıp bir lookup table’a konuyordu; yazılım da z-buffer’a küçük renkli daireleri çok hızlı boyayabiliyordu
O dönemdeki büyük hayal kırıklığı, perspektif kullanamamamızdı. Yer değiştirme vektörlerini her karede ekran uzayına dönüştürdüğümüz için blob’u boyuyor, offset uyguluyor, rengi lookup ediyor ve tekrar boyuyorduk. Zincirin sonunu ve bir sonraki mutlak konumun saklandığını işaretleyen tek bir yer değiştirme değeri vardı, ama voksellerin çoğu 2 bayttı