‘Gaussian splatting’ khá ấn tượng
(aras-p.info)- Bài báo 3D Gaussian Splatting tại SIGGRAPH 2023 là một cách tiếp cận tạo cảnh dựa trên ảnh bằng hàng triệu Gaussian 3D và kết xuất thời gian thực; một bản triển khai thử nghiệm trực quan hóa trên Unity cũng đã được công bố
- Cảnh được biểu diễn không phải bằng mesh, voxel hay distance field, mà bằng một tập hợp các blob trong không gian có vị trí, phép quay, tỉ lệ phi đồng nhất, độ mờ và hệ số spherical harmonics
- Cách này không phải NeRF, và bản triển khai chính thức cũng không dùng pipeline rasterization fixed-function, mà dùng kết xuất phần mềm theo tile dựa trên CUDA 100%
- Bản triển khai Unity chạy trên NVIDIA RTX 3080 Ti mất 23,8ms ở 1200x800, chậm hơn viewer chính thức 7,40ms, nhưng được viết bằng HLSL thông thường nên cũng chạy trên Mac
- Cảnh bicycle chiếm 1,5GB trên đĩa, khoảng 6 triệu blob, mỗi blob khoảng 250 byte, nên không chỉ hiệu năng mà cả kích thước dữ liệu và bộ nhớ GPU cũng là mục tiêu cải thiện quan trọng
Bài báo SIGGRAPH 2023 và thử nghiệm Unity
- Bài báo SIGGRAPH 2023 3D Gaussian Splatting for Real-Time Radiance Field Rendering là công trình của Kerbl, Kopanas, Leimkühler và Drettakis
- Website của bài báo, mã nguồn và dataset đã được công bố, nên có thể trực tiếp thử nghiệm và tái lập kết quả
- Thử nghiệm Unity tập trung vào việc nhận các file “mô hình” Gaussian Splat đã được tạo sẵn và trực quan hóa thời gian thực
- Bản triển khai được công bố tại aras-p/UnityGaussianSplatting, và dự kiến sẽ tiếp tục có thêm các thử nghiệm sau này
- Khả năng giảm kích thước dữ liệu cũng là một điểm được quan tâm, và có thể tận dụng các thử nghiệm nén float trước đây
Gaussian Splat gồm những gì
- Gaussian Splatting biểu diễn cảnh 3D bằng hàng triệu hạt thay vì mesh polygon, voxel hay distance field
- Mỗi hạt, tức “3D Gaussian”, có các thông tin sau
- Vị trí trong không gian 3D
- Phép quay
- Tỉ lệ 3D phi đồng nhất
- Độ mờ
- Thông tin màu sắc
- Màu sắc không phải một màu đơn lẻ mà được biểu diễn bằng các hệ số Spherical Harmonics bậc 3, nên có thể thay đổi theo hướng nhìn
- Khi kết xuất, hạt không được vẽ như một khối cầu 3D kéo dài, mà được “splat” thành Gaussian 2D trong không gian màn hình
- Cốt lõi là tạo ra một biểu diễn cảnh dựa trên ảnh dưới dạng tập hợp các blob có tỉ lệ và màu sắc, rồi kết xuất nó thật nhanh
Không phải NeRF, cũng không phải rasterization fixed-function
- Gaussian Splatting không phải NeRF
- Tài liệu nêu rõ rằng không có yếu tố “Neural”
- Lý do nó nhanh cũng không phải là “vì dùng phần cứng rasterization của GPU”
- Bản triển khai chính thức không dùng pipeline rasterization
- Được triển khai 100% bằng CUDA
- Hiệu năng của bản triển khai chính thức không đến từ rasterization fixed-function, mà từ kết xuất phần mềm dựa trên tile xử lý hiệu quả hàng triệu hạt đã được scale
- Tuy vậy, bản thân rasterizer kiểu “phần mềm trên GPU” dựa trên tile không phải là một khái niệm hoàn toàn mới
Liên hệ với các khối kỹ thuật cũ
- Bản thân Gaussian Splatting có liên quan đến các công trình khoảng năm 2001~2002 như EWA Splatting
- Đặt các blob đã được scale và có hướng trong không gian, tính cách chúng được chiếu lên màn hình, rồi xử lý dạng Gaussian trong không gian màn hình
- Trò chơi Ecstatica năm 1994 là một ví dụ độc đáo dùng renderer dựa trên ellipsoid
- Spherical Harmonics đã được dùng trong vật lý suốt hàng trăm năm, và trở nên phổ biến trong đồ họa máy tính quanh năm 2000 qua các công trình của Ravi Ramamoorthi và Peter-Pike Sloan
- Ray tracing volume densities năm 1984 của Kajiya & Von Herzen có thể là một trường hợp sử dụng sớm trong đồ họa
- Có thể xem phần tổng hợp liên quan tại trang của Patapom
- Point-Based Rendering cũng là một lĩnh vực lâu đời
- Hệ hạt đã được dùng từ lâu trong VFX và biểu diễn các hiện tượng phi rắn
- The Use of Points as a Display Primitive là công trình năm 1985
- Surfels là bài báo năm 2000
- Demoscene và các công cụ VFX thời gian thực cũng đã sử dụng những cách tiếp cận kết xuất phi truyền thống
- Ví dụ gồm Agenda Circling Forth, Ceasefire (all falls down..), Number One / Another One của Fairlight & CNCD
- Notch là một công cụ VFX thời gian thực có chức năng tạo, mô phỏng và hiển thị các đối tượng dựa trên điểm và blob
- fogleman/primitive là một ví dụ công cụ năm 2016 biểu diễn hình ảnh bằng tập hợp các primitive shape
- “Dreams” của Media Molecule đã dùng renderer dựa trên splat, và phiên bản phát hành có vẻ là sự kết hợp của nhiều kỹ thuật
- Bài trình bày “Learning from Failure” của Alex Evans có thể xem tại SIGGRAPH 2015 và Umbra Ignite 2015
- Rasterization theo tile cho hạt đã tồn tại ít nhất từ Holy smoke! Faster Particle Rendering using Direct Compute của Gareth Thomas năm 2014
- Chia màn hình thành các tile rồi xử lý bên trong tile có thể giảm lưu lượng bộ nhớ
- Cách này cũng liên quan đến cách vận hành chung của GPU di động; thiết kế PowerVR ban đầu có từ năm 1996, còn Pixel Planes 5 lùi về tận năm 1989
Tình trạng hiện tại của UnityGaussianSplatting
- aras-p/UnityGaussianSplatting là bản triển khai trình trực quan hóa cho mô hình Gaussian Splat
- Tình trạng hiện tại gần với “chạy được nhưng chưa nhanh”
- Trên NVIDIA RTX 3080 Ti, khi kết xuất cảnh bicycle ở 1200x800, chênh lệch hiệu năng khá lớn
- Viewer chính thức: 7,40ms, 135FPS
- Bản triển khai Unity: 23,8ms, 42FPS
- Chậm hơn khoảng 4 lần
- Cách sắp xếp cũng ảnh hưởng đến chênh lệch hiệu năng
- Bản triển khai Unity dùng GPU bitonic sort tương đối đơn giản
- Bản triển khai chính thức dùng CUDA radix sort dựa trên thuật toán OneSweep
- Cách tiếp cận rasterization cũng khác nhau
- Bản triển khai chính thức là phương pháp dựa trên tile viết bằng CUDA
- Bản triển khai Unity dùng pipeline rasterization GPU thông thường để kết xuất từng splat thành quad trong không gian màn hình
- Bản triển khai Unity có lợi thế về tính di động
- Mã được viết bằng HLSL thông thường trong Unity nên cũng chạy trên Mac
- Trên Apple M1 Max, cùng cảnh đó được kết xuất trong 108ms, 9FPS
- Hiện có vẻ bản triển khai Unity dùng ít bộ nhớ GPU hơn
- Viewer chính thức: 4,8GB
- Bản triển khai Unity: 2,2GB
- Con số này bao gồm cả bộ nhớ Unity Editor sử dụng
Kích thước dữ liệu và mức dùng bộ nhớ
- Các thảo luận về Gaussian Splatting thường dễ tập trung vào chất lượng và tốc độ kết xuất, nhưng kích thước dữ liệu và mức dùng bộ nhớ cũng là vấn đề lớn
- Cảnh bicycle chiếm 1,5GB trên đĩa
- Cảnh này gồm khoảng 6 triệu blob
- Mỗi blob dùng khoảng 250 byte
- Khi chạy, cần thêm bộ nhớ cho việc sắp xếp, kết xuất dựa trên tile, v.v.
- Bài trình bày về Dreams có những ý tưởng đáng tham khảo để giảm kích thước
1 bình luận
Ý kiến trên Hacker News
Cách diễn đạt rằng họ đã tránh dùng “neural” dù vẫn dùng gradient descent và differentiable rendering nghe hơi có vẻ tự đắc
Về mặt khái niệm, cũng giống NeRF ở chỗ tối ưu hóa một biểu diễn dựa trên dữ liệu, xấp xỉ các biến liên quan đến cảnh 3D từ hình ảnh; điểm khác là trong khi NeRF mô hình hóa radiance field, tức toàn bộ hàm truyền ánh sáng, thì ở đây dường như chỉ mô hình hóa các điều kiện biên nơi ánh sáng chạm tới
Vì đối tượng khác nhau nên một cơ sở biểu diễn đơn giản hơn là hợp lý và kết quả trông cũng tốt, nhưng nói như thể việc tránh dùng mạng nơ-ron tự thân đã là điều đáng khen thì hơi đáng tiếc. Mạng nơ-ron không chỉ được dùng vì là mốt, mà thực sự là các bộ xấp xỉ hàm rất mạnh, và phạm vi các cấu trúc được gọi là “mạng nơ-ron” cũng rất rộng
Đây chỉ là ấn tượng từ giọng điệu phần mở đầu của bài blog, nên có thể khác với bản thân bài báo
Vì vậy có vẻ dễ hiểu hơn, dễ tích hợp vào các phần mềm 3D khác như trình chỉnh sửa hay trình kết xuất hơn, và có lẽ cũng có thể làm animation. Một bộ xấp xỉ hàm dạng hộp đen biểu diễn cả cảnh cùng lúc không tạo cảm giác có khả năng mở rộng hay thanh nhã
Tuy nhiên, với mạng nơ-ron, dù mô hình hóa vấn đề tốt, ta thường không biết mô hình đã học thực sự hoạt động như thế nào; và do nhu cầu dữ liệu cùng việc phải huấn luyện lặp lại, chúng có hạn chế trong việc tạo ra các giải pháp dài hạn
Ở đây tôi muốn hiểu theo hướng tích cực rằng các tác giả chỉ đùa thân thiện, chứ không kích động một cuộc chiến văn hóa nhỏ
Mỗi pixel kết xuất là tổng có trọng số các đóng góp từ những Gaussian phụ thuộc góc nhìn và không có biên, nên cách phân biệt rằng NeRF mô hình hóa radiance field còn kỹ thuật này chỉ mô hình hóa điều kiện biên là không đúng
Nếu xét thêm việc NeRF đã dùng biểu diễn spherical harmonics hạng thấp cho miền hướng, thì gần như chỉ là 3D+α; điều này khiến người ta đặt câu hỏi vì sao lại chọn mạng nơ-ron để khôi phục một hàm có số chiều thấp như thế
Khi suy luận, với mỗi pixel phải lấy mẫu mạng nơ-ron lặp lại dọc theo tia nhìn; trong khi biểu diễn nén của light field là vấn đề đã được xử lý từ lâu trong đồ họa, nên phần này khá gượng gạo
Sau đó Plenoxels đã bỏ “Ne” khỏi NeRF và tăng mạnh hiệu năng huấn luyện cũng như suy luận; còn Instant NeRF của Nvidia phần nào bù đắp bằng cách nội suy các embedding đầu vào tinh vi vào một mạng nơ-ron nhỏ: https://nvlabs.github.io/instant-ngp/assets/mueller2022insta...
Trong kỹ thuật đồ họa, mạng nơ-ron được dùng rộng rãi chủ yếu ở phục hồi dữ liệu thưa, đặc biệt là khử nhiễu, và điều đó là tự nhiên vì đây là bài toán nhiều chiều. Dù vậy, hiếm khi chúng áp đảo các thuật toán làm thủ công; còn hướng dùng mạng nơ-ron nhỏ cho nén thì có vẻ có tương lai
Đồ họa có nhiều bài toán xấp xỉ hàm nên có chỗ cho mạng nơ-ron, nhưng các hàm được xử lý nhìn chung dễ hiểu và dễ kiểm soát hơn, khác với những lĩnh vực như hiểu ngôn ngữ tự nhiên, nơi gần như không thể dùng giải pháp thuật toán thủ công
Nhiều cuộc trò chuyện kết thúc bằng AI=xấu, CRYPTO=xấu; vấn đề không phải là ý kiến phản đối sai, mà là nếu quyết định kết luận trước rồi ngừng suy nghĩ, bạn sẽ không có cách nào nhận ra suy nghĩ của mình có hoàn toàn vô căn cứ hay không
Đây là một công trình thật sự rất ấn tượng
Bài viết có nhắc đến rendering dựa trên điểm và hệ thống hạt; trong các game gần đây, tôi có cảm giác đang có một sự dịch chuyển tinh tế sang một kiểu hạt mới, thiên về điểm hơn là các mảnh texture nhưng vẫn hoạt động như một hệ thống vật lý
Ví dụ có 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
Điểm chung là chúng trông như các hạt điểm trong suốt có màu và có vật lý; đặc biệt trên console, có vẻ chúng được dùng để tạo hiệu ứng rẻ trên GPU mà không gây tải cho CPU. Nếu có ai trong mảng phát triển game biết rõ thì tôi rất tò mò
Nếu không có mô phỏng chất lưu, hệ thống hạt dựa trên điểm chỉ trông như pháo hoa. Bước tiếp theo là mỗi hạt có vật lý riêng như động lượng hoặc gió và được render thành các billboard texture nhỏ; cách này từng được dùng để thể hiện cháy nổ hoặc khói cho đến khá gần đây
Giờ thì hiệu năng máy và thuật toán vật lý đã tốt hơn, nên có thể chạy mô phỏng chất lưu thời gian thực nơi các hạt tương tác với nhau, và hiệu ứng hiện thấy có vẻ thuộc hướng đó
Trong thế giới game 3D, về mặt khái niệm và cấu trúc có rất nhiều lợi thế khi chỉ xử lý các primitive 3D thật sự, và point sprite có thể được xem gần như một vật thể 3D nhỏ vô hạn
Ngược lại, nếu đưa sprite 2D vào cảnh 3D, khi có độ trong suốt từng phần thì phải sắp xếp từ sau ra trước, không ăn khớp tốt với z-buffer, xung đột với thứ tự batching tối ưu cho GPU, dễ xuyên vào bề mặt 3D và làm lộ rõ bản chất 2D
Để xử lý những vấn đề này, nhiều giải pháp thỏa hiệp đã tích lũy theo thời gian như screen-door transparency, shader thay đổi cách ghi z-buffer, alpha test, alpha-to-coverage, v.v.
Trong VR, rendering dựa trên ảnh 2D bên trong cảnh 3D còn nổi bật khó chịu hơn so với trên một màn hình đơn, và việc đó là một billboard phẳng lộ ra rõ hơn nhiều. Gộp các lý do này lại thì có đủ động lực để muốn rời xa các hiệu ứng texture sprite 2D trong cảnh 3D
Do xu hướng bên AI, việc GPU cũng đang đi theo hướng giống như “một GPU với tập lệnh rút gọn bên trong GPU” thông qua RT core, tensor core, v.v. có vẻ cũng liên quan phần nào
Vài năm trước phía NVIDIA đã viết một kernel chuyển SE(3) kernel sang tensor core; nên cũng không ngạc nhiên nếu phần spherical harmonics của Gaussian splatting có thể được port một phần khi nén và khi chạy: https://developer.nvidia.com/blog/accelerating-se3-transform...
Gaussian splatting luôn có vùng hỗ trợ trong không gian 3D nên có vẻ sẽ khá hiệu quả, và ngay cả khi biến đổi xấp xỉ nhanh thì kết quả cuối cùng vẫn có thể khá ổn
Việc tạo ra những xoáy tuyệt đẹp bằng các điểm phát sáng cũng tương đối dễ. Unreal Engine chắc cũng có thứ tương tự, nhưng tôi không có nhiều trải nghiệm trực tiếp
Tôi không cho rằng nó bắt nguồn từ đó, nhưng cột mốc đầu tiên tôi có thể chỉ ra là demo ấy
Tôi đã thật sự rất háo hức khi bài báo Siggraph lần đầu xuất hiện
Tôi đã chụp ảnh từ hàng trăm góc của những căn phòng mình từng sống trong khoảng 10 năm qua, với ý định một ngày nào đó tái tạo chúng ở dạng 3D; Gaussian splatting là kỹ thuật đầu tiên có vẻ có thể tái hiện chúng gần như giống thật
Tôi rất mong đến lúc các công cụ trưởng thành hơn, để có thể đi thăm lại những căn phòng cũ và chìm trong hoài niệm
Vì đây là lĩnh vực tôi không rành nên có thể là câu hỏi thiếu hiểu biết, nhưng những video kiểu này trông thật sự rất ấn tượng
Theo tôi hiểu thì cảnh hoặc trường bức xạ luôn tĩnh và ánh sáng đã được bake sẵn; tôi tò mò liệu có khả năng phát triển theo hướng thay đổi ánh sáng động và hỗ trợ cả chuyển động hay không
Trong trường bức xạ không có các khái niệm như phát xạ, phản xạ hay hấp thụ ánh sáng; mọi thứ bị gộp lại thành một giá trị duy nhất là “ánh sáng được truyền tới”. Theo nghĩa đó, trường bức xạ gần giống một bức ảnh 3D hơn
Muốn thay đổi điều này thì phải ước lượng vị trí nguồn sáng, bề mặt, vật liệu, v.v. bằng inverse rendering hoặc photogrammetry, rồi dùng lại path tracing truyền thống
Một hướng khác không phải là animation mà là video: có thể liên tục capture trường bức xạ theo thời gian và nén độ tương đồng giữa các frame để đạt được tính nhất quán theo thời gian
Cũng có thể nối nhiều cái lại với nhau để tạo animation: https://twitter.com/8Infinite8/status/1699460316529090568
Về relighting, có nhiều biến thể NeRF hỗ trợ việc này, nên việc tối ưu các tham số vật liệu của splat cũng có vẻ khả thi
Ví dụ trong một cảnh trong nhà, nếu một cái bàn tạo bóng tối trên sàn, NeRF hiện vẫn chưa hiểu nguồn sáng và bóng đổ, nên nó không biết sàn vốn màu đen, hay đó là sàn trắng bị bóng của cái bàn che, hay có một con Stanford bunny màu xanh đang ẩn trong bóng
Các rig scan 3D dùng để capture vật thể nhỏ như khuôn mặt người giải quyết bằng cách điều khiển ánh sáng và trực tiếp lấy mẫu BRDF. Nếu không thể điều khiển ánh sáng thì vẫn có thể ước lượng BRDF, nhưng sẽ có giới hạn
Gắn animation vào sau đó có thể dễ, nhưng để capture chính animation thì cần nhiều camera, hoặc vì là con người nên phải dựa vào các ước lượng như mạng nơ-ron tưởng tượng và điền phần phía đối diện
Vài năm trước Intel từng làm một dự án capture cảnh bằng nhiều camera để có thể đổi vị trí camera trong hậu kỳ, hình như nhắm tới phát sóng bóng bầu dục Mỹ, nhưng tôi chưa nghe tin nó thực sự ra mắt. Kiểu Matrix thì cần nhiều camera
Tức là làm cho dữ liệu được animate theo thời điểm trong ngày. Nhu cầu dữ liệu có thể lớn, nhưng có các phương pháp nội suy nên có thể không quá tệ
Nếu một cảnh tĩnh là 2GB, tôi nghĩ xấp xỉ sơ bộ theo thời điểm trong ngày có thể làm được dưới 16GB và render được trên GPU hiện đại. Phần tiếp theo là vài năm tối ưu trong lúc chờ hiệu năng cỡ H100 trở thành hàng tiêu dùng
Luôn thú vị khi khoa học vượt qua kỳ vọng của khoa học viễn tưởng
Trong trường hợp này tôi lập tức nghĩ đến khái niệm Braindance trong Cyberpunk 2077, một tính năng cho phép đi lại trong ký ức thị giác của người khác trong phạm vi mà người đó đã cảm nhận cảnh
Khi di chuyển camera sang chỗ khác với góc nhìn gốc, trường nhìn sụp thành một đống pixel ba chiều; khá giống khái niệm blob ở đây, nhưng đáng ngạc nhiên là trông kém hoàn thiện hơn rất nhiều so với bài báo này
https://steelseries.com/blog/how-to-braindance-cyberpunk-207...
Splatting trong volume rendering là một kỹ thuật đã khá lâu đời. Có bài báo tháng 7/1991 của Westover, Lee Alan, “SPLATTING: A Parallel, Feed-Forward Volume Rendering Algorithm”
Vế sau thì có vẻ không ai cố che giấu, còn vế trước thì có vẻ không đúng
Tôi không biết trực giác đó đến từ đâu, nhưng hồi đó tôi sống gần Boston và có con nhỏ
Tôi mong chờ bản triển khai WebGPU native được tối ưu hóa đầu tiên cho rendering 3DGS
Cũng tò mò họ sẽ nén và giải nén dữ liệu cảnh một cách hiệu quả ra sao
Tôi đã để lại vài ghi chú về câu hỏi này trong một thread Zulip: https://xi.zulipchat.com/#narrow/stream/197075-gpu/topic/Gau...
Gần đây tôi đã xem một video chỉ cách dùng Gaussian splatting: Getting Started With 3D Gaussian Splats for Windows (Beginner Guide) - https://www.youtube.com/watch?v=UXtuigy_wYc
Tò mò về trình độ hiện tại của khôi phục cấu trúc từ chuyển động
Khi có video của một không gian nào đó, tôi muốn biết hiện nay thực tế người ta biến nó thành cảnh 3D như thế nào
Đó chính là đầu vào của quy trình tái dựng cảnh được mô tả trong bài báo này
Theo tôi biết, cách tiếp cận cơ bản của SfM trong khoảng 10 năm qua không thay đổi nhiều, có thể tóm tắt là trích xuất đặc trưng ảnh như SIFT, ghép cặp bằng heuristic, bundle adjustment và loại bỏ ngoại lệ
Phép đo ảnh thông thường là câu trả lời, và sự quan tâm cũng như tính thực dụng của các cách tiếp cận kiểu NeRF cũng đang dần tăng lên
Tuy nhiên, thật đáng ngạc nhiên là những quan hệ không gian bổ sung có thể suy ra chỉ từ việc đó là video lại không được chú ý hơn. Có vẻ có thể dùng ràng buộc rằng camera giữa các khung hình chỉ có thể di chuyển theo một số cách nhất định để ước lượng tư thế camera
Có ý tưởng chạy marching cubes trên các Gaussian đã được splat để trích xuất mesh, nhưng có vẻ tôi vẫn chưa thấy trường hợp nào làm điều đó trong thực tế
Cuối thập niên 90, tôi đã render đẳng mặt voxel bằng blob
Tôi quét các voxel bề mặt trong toàn bộ mảng voxel 3D, tính pháp tuyến bằng gradient mật độ cục bộ rồi lượng tử hóa thành một trong 240 giá trị
Sau đó tôi dùng bảng vector dịch chuyển để tạo chuỗi voxel bề mặt; phần lớn voxel chỉ chiếm 2 byte, gồm chỉ số dịch chuyển từ voxel trước đó và chỉ số vector pháp tuyến
Ánh sáng cho 240 vector pháp tuyến được tính trước và đưa vào bảng tra cứu, nhờ đó phần mềm có thể tô các vòng tròn màu nhỏ vào z-buffer rất nhanh
Điều đáng tiếc lớn lúc đó là không thể dùng phối cảnh. Vì các vector dịch chuyển được biến đổi sang không gian màn hình cho từng khung hình, nên quy trình là tô blob, dịch offset, tra màu rồi lại tô tiếp. Có một giá trị dịch chuyển dùng để đánh dấu điểm kết thúc chuỗi và vị trí tuyệt đối tiếp theo, nhưng phần lớn voxel chỉ chiếm 2 byte