Rendering sudut pandang bebas foto-realistis dari pemandangan dunia nyata menggunakan teknik grafis komputer klasik merupakan masalah yang menantang karena memerlukan langkah sulit dalam menangkap tampilan detail dan model geometri. Render saraf adalah bidang baru yang menggunakan jaringan saraf dalam untuk secara implisit mempelajari representasi pemandangan yang merangkum geometri dan tampilan dari pengamatan 2D dengan atau tanpa geometri kasar. Namun, pendekatan yang ada di bidang ini sering kali menunjukkan rendering yang buram atau proses rendering yang lambat. Kami mengusulkan Neural Sparse Voxel Fields (NSVF), representasi pemandangan saraf baru untuk rendering sudut pandang bebas yang cepat dan berkualitas tinggi.
Berikut adalah repo resmi untuk makalah tersebut:
Kami juga menyediakan implementasi tidak resmi kami untuk:
Kode ini diimplementasikan di PyTorch menggunakan kerangka fairseq.
Kode telah diuji pada sistem berikut:
Hanya pembelajaran dan rendering pada GPU yang didukung.
Untuk menginstal, clone dulu repo ini dan instal semua dependensinya:
pip install -r requirements.txt
Lalu, lari
pip install --editable ./
Atau jika Anda ingin memasang kode secara lokal, jalankan:
python setup.py build_ext --inplace
Anda dapat mengunduh kumpulan data sintetis dan nyata yang telah diproses sebelumnya yang digunakan dalam makalah kami. Harap kutip juga makalah asli jika Anda menggunakannya dalam karya Anda.
Kumpulan data | Tautan Unduh | Catatan tentang Pemisahan Kumpulan Data |
---|---|---|
Sintetis-NSVF | unduh (.zip) | 0_* (pelatihan) 1_* (validasi) 2_* (pengujian) |
Sintetis-NeRF | unduh (.zip) | 0_* (pelatihan) 1_* (validasi) 2_* (pengujian) |
CampuranMVS | unduh (.zip) | 0_* (pelatihan) 1_* (pengujian) |
Tank & Kuil | unduh (.zip) | 0_* (pelatihan) 1_* (pengujian) |
Untuk menyiapkan kumpulan data baru dari satu adegan untuk pelatihan dan pengujian, ikuti struktur datanya:
< dataset_name >
| -- bbox.txt # bounding-box file
| -- intrinsics.txt # 4x4 camera intrinsics
| -- rgb
| -- 0.png # target image for each view
| -- 1.png
...
| -- pose
| -- 0.txt # camera pose for each view (4x4 matrices)
| -- 1.txt
...
[optional]
| -- test_traj.txt # camera pose for free-view rendering demonstration (4N x 4)
di mana file bbox.txt
berisi baris yang menjelaskan kotak pembatas awal dan ukuran voxel:
x_min y_min z_min x_max y_max z_max initial_voxel_size
Perhatikan bahwa nama file gambar target dan file pose kamera yang bersangkutan tidak harus sama persis. Namun, urutan kedua jenis file ini (diurutkan berdasarkan string) harus cocok. Kumpulan data dibagi dengan indeks tampilan. Misalnya, " train (0..100)
, valid (100..200)
dan test (200..400)
" berarti 100 penayangan pertama untuk pelatihan, penayangan ke-100-199 untuk validasi, dan penayangan ke-200-399 untuk pengujian .
Mengingat kumpulan data satu adegan ( {DATASET}
), kami menggunakan perintah berikut untuk melatih model NSVF guna mensintesis tampilan baru pada 800x800
piksel, dengan ukuran batch 4
gambar per GPU dan 2048
sinar per gambar. Secara default, kode tersebut akan secara otomatis mendeteksi semua GPU yang tersedia.
Dalam contoh berikut, kami menggunakan arsitektur nsvf_base
yang telah ditentukan sebelumnya dengan argumen spesifik:
--no-sampling-at-reader
, model hanya mengambil sampel piksel di wilayah gambar yang diproyeksikan dari voxel jarang untuk pelatihan.1/8 (0.125)
dari ukuran voxel yang biasanya dijelaskan dalam file bbox.txt
.--use-octree
adalah opsional. Ini akan membangun oktree voxel yang jarang untuk mempercepat perpotongan sinar-voxel terutama ketika jumlah voxel lebih besar dari 10000
.--pruning-every-steps
sebagai 2500
, model akan melakukan pemangkasan mandiri pada setiap 2500
langkah.--half-voxel-size-at
dan --reduce-step-size-at
sebagai 5000,25000,75000
, ukuran voxel dan ukuran langkah dibelah dua menjadi 5k
, 25k
dan 75k
, masing-masing.Perhatikan bahwa, meskipun pengaturan parameter di atas digunakan untuk sebagian besar eksperimen di makalah ini, parameter ini dapat disesuaikan untuk mencapai kualitas yang lebih baik. Selain parameter di atas, parameter lainnya juga bisa menggunakan pengaturan default.
Selain arsitektur nsvf_base
, Anda dapat memeriksa arsitektur lain atau menentukan arsitektur Anda sendiri di file fairnr/models/nsvf.py
.
python -u train.py ${DATASET}
--user-dir fairnr
--task single_object_rendering
--train-views " 0..100 " --view-resolution " 800x800 "
--max-sentences 1 --view-per-batch 4 --pixel-per-view 2048
--no-preload
--sampling-on-mask 1.0 --no-sampling-at-reader
--valid-views " 100..200 " --valid-view-resolution " 400x400 "
--valid-view-per-batch 1
--transparent-background " 1.0,1.0,1.0 " --background-stop-gradient
--arch nsvf_base
--initial-boundingbox ${DATASET} /bbox.txt
--use-octree
--raymarching-stepsize-ratio 0.125
--discrete-regularization
--color-weight 128.0 --alpha-weight 1.0
--optimizer " adam " --adam-betas " (0.9, 0.999) "
--lr 0.001 --lr-scheduler " polynomial_decay " --total-num-update 150000
--criterion " srn_loss " --clip-norm 0.0
--num-workers 0
--seed 2
--save-interval-updates 500 --max-update 150000
--virtual-epoch-steps 5000 --save-interval 1
--half-voxel-size-at " 5000,25000,75000 "
--reduce-step-size-at " 5000,25000,75000 "
--pruning-every-steps 2500
--keep-interval-updates 5 --keep-last-epochs 5
--log-format simple --log-interval 1
--save-dir ${SAVE}
--tensorboard-logdir ${SAVE} /tensorboard
| tee -a $SAVE /train.log
Pos pemeriksaan disimpan di {SAVE}
. Anda dapat meluncurkan tensorboard untuk memeriksa kemajuan pelatihan:
tensorboard --logdir= ${SAVE} /tensorboard --port=10000
Masih banyak lagi contoh skrip pelatihan untuk mereproduksi hasil makalah kami di bawah contoh.
Setelah model dilatih, perintah berikut digunakan untuk mengevaluasi kualitas rendering pada tampilan pengujian dengan {MODEL_PATH}
.
python validate.py ${DATASET}
--user-dir fairnr
--valid-views " 200..400 "
--valid-view-resolution " 800x800 "
--no-preload
--task single_object_rendering
--max-sentences 1
--valid-view-per-batch 1
--path ${MODEL_PATH}
--model-overrides ' {"chunk_size":512,"raymarching_tolerance":0.01,"tensorboard_logdir":"","eval_lpips":True} '
Perhatikan bahwa kami mengganti raymarching_tolerance
menjadi 0.01
untuk mengaktifkan penghentian dini guna mempercepat rendering.
Render sudut pandang bebas dapat dicapai setelah model dilatih dan lintasan rendering ditentukan. Misalnya perintah berikut untuk rendering dengan lintasan lingkaran (kecepatan sudut 3 derajat/frame, 15 frame per GPU). Ini menghasilkan gambar yang dirender per tampilan dan menggabungkan gambar menjadi video .mp4
di ${SAVE}/output
sebagai berikut:
Secara default, kode tersebut dapat mendeteksi semua GPU yang tersedia.
python render.py ${DATASET}
--user-dir fairnr
--task single_object_rendering
--path ${MODEL_PATH}
--model-overrides ' {"chunk_size":512,"raymarching_tolerance":0.01} '
--render-beam 1 --render-angular-speed 3 --render-num-frames 15
--render-save-fps 24
--render-resolution " 800x800 "
--render-path-style " circle "
--render-path-args " {'radius': 3, 'h': 2, 'axis': 'z', 't0': -2, 'r':-1} "
--render-output ${SAVE} /output
--render-output-types " color " " depth " " voxel " " normal " --render-combine-output
--log-format " simple "
Kode kami juga mendukung rendering untuk pose kamera tertentu. Misalnya, perintah berikut untuk rendering dengan pose kamera yang ditentukan dalam file ke-200-399 di bawah folder ${DATASET}/pose
:
python render.py ${DATASET}
--user-dir fairnr
--task single_object_rendering
--path ${MODEL_PATH}
--model-overrides ' {"chunk_size":512,"raymarching_tolerance":0.01} '
--render-save-fps 24
--render-resolution " 800x800 "
--render-camera-poses ${DATASET} /pose
--render-views " 200..400 "
--render-output ${SAVE} /output
--render-output-types " color " " depth " " voxel " " normal " --render-combine-output
--log-format " simple "
Kode ini juga mendukung rendering dengan pose kamera yang ditentukan dalam file .txt
. Silakan lihat contoh ini.
Kami juga mendukung menjalankan kubus berbaris untuk mengekstrak permukaan iso sebagai jerat segitiga dari model NSVF terlatih dan disimpan sebagai {SAVE}/{NAME}.ply
.
python extract.py
--user-dir fairnr
--path ${MODEL_PATH}
--output ${SAVE}
--name ${NAME}
--format ' mc_mesh '
--mc-threshold 0.5
--mc-num-samples-per-halfvoxel 5
Dimungkinkan juga untuk mengekspor voxel renggang yang dipelajari dengan mengatur --format 'voxel_mesh'
. File keluaran .ply
dapat dibuka dengan penampil 3D apa pun seperti MeshLab.
NSVF berlisensi MIT. Lisensi ini juga berlaku untuk model terlatih.
Silakan kutip sebagai
@article { liu2020neural ,
title = { Neural Sparse Voxel Fields } ,
author = { Liu, Lingjie and Gu, Jiatao and Lin, Kyaw Zaw and Chua, Tat-Seng and Theobalt, Christian } ,
journal = { NeurIPS } ,
year = { 2020 }
}