>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Python

Jak zamienić zdjęcia pomieszczeń w czyste siatki 3D z teksturami, bez bałaganu ani dziur

Jeśli próbowaliście rekonstruować wnętrza klasyczną fotogrametrią lub za pomocą NeRF i Gaussian Splatting, wiecie, gdzie są ich słabe punkty. Fotogrametria regularnie zawodzi na białych ścianach i błyszczących stołach, tworząc dziury w siatce. Gaussy dają piękny obraz w viewport, ale wyodrębnienie właściwej poligonalnej siatki z materiałami PBR dla Unreal Engine czy Blendera jest wciąż boleśnie trudne.

Naukowcy z Politechniki Monachijskiej (TUM) i Huawei opublikowali GenRecon, projekt próbujący rozwiązać ten problem w inny sposób. Połączyli generatywne modele obiektów 3D z rekonstrukcją scen.

GenRecon Teaser

Idea

Zamiast budować geometrię od zera na podstawie dopasowywania pikseli, autorzy wykorzystali generatywny model TRELLIS firmy Microsoft. Sam w sobie TRELLIS potrafi generować wysokiej jakości izolowane obiekty 3D z obrazów. Ale nie można zastosować go bezpośrednio do całego pomieszczenia: rozdzielczość i kontekst są niewystarczające.

GenRecon dzieli przestrzeń pomieszczenia na nakładające się fragmenty przestrzenne (sześciany). Dla każdego fragmentu sieć projektuje cechy z obrazów z kamer bezpośrednio w przestrzeń 3D i przekazuje je do generatywnego potoku dyfuzyjnego.

Model wie, jak zazwyczaj wyglądają krzesła, sofy, ściany i szafki. Więc w miejscach, gdzie zdjęcia pokazują odblaski lub brakujące kąty, generator ostrożnie rekonstruuje poprawną geometrię i materiały. W testach autorów dokładność geometrii wzrosła o 16% w porównaniu ze standardowymi metodami.

Jak działa potok

Proces generacji jest podzielony na trzy etapy:

  1. Sparse Structure (SS). Model określa ogólną zgrubną strukturę i zajętość vokseli w przestrzeni fragmentu.
  2. Shape SLat. Generator udoskonala gładką geometrię powierzchni poprzez reprezentacje latentne (Structured Latents).
  3. Texture SLat. Tekstury PBR są nakładane na geometrię z uwzględnieniem oświetlenia i oryginalnych zdjęć.

Po tym wszystkie fragmenty są zszywane, a osobny skrypt zapisuje wynik w pojedynczym pliku scene.glb z odpowiednimi mapami tekstur. Siatka jest od razu gotowa do zaimportowania do dowolnego silnika gry lub edytora 3D.

Czego potrzebujesz do uruchomienia

Build jest wymagający. Potrzebujesz najnowszej wersji PyTorch, CUDA 12.x i karty GPU z architekturą Ampere lub nowszą (RTX 3090, 4090, A100), ponieważ Flash-Attention i masa niestandardowych rozszerzeń CUDA działają pod spodem.

Sklonuj repozytorium z submodułami:

git clone -b main https://github.com/kasothaphie/GenRecon.git --recursive
cd GenRecon

Do konfiguracji środowiska deweloperzy udostępnili skrypt setup.sh. Przed uruchomieniem ustaw ścieżki do CUDA i architektury chipa:

export CUDA_HOME=/usr/local/cuda
export TORCH_CUDA_ARCH_LIST="8.9" # укажите свою архитектуру, например 8.9 для RTX 4090
. ./setup.sh --new-env --basic --flash-attn --nvdiffrast --nvdiffrec --cumesh --o-voxel --flexgemm

Jeśli skrypt utknie przy kompilacji flash-attn, autorzy sugerują zainstalowanie prekompilowanego wheel binary z Dao-AILab releases dla Twojej kombinacji Pythona i PyTorch.

Wstępnie wytrenowane wagi dla wszystkich trzech etapów są pobierane bezpośrednio:

wget https://kaldir.vc.cit.tum.de/genrecon/sparse_structure.pt
wget https://kaldir.vc.cit.tum.de/genrecon/shape_slat.pt
wget https://kaldir.vc.cit.tum.de/genrecon/texture_slat.pt

Rekonstrukcja scen

Jeśli chcesz przetworzyć wideo z iPhone'a lub aparatu, najpierw musisz obliczyć pozycje kamer za pomocą COLMAP. Gdy pozycje są gotowe, uruchom wnioskowanie:

python reconstruct_scene.py \
  --mode Iphone \
  --path "${WORK_ROOT}" \
  --output_path "${OUT_DIR}" \
  --ss_ckpt "sparse_structure.pt" \
  --shape_ckpt "shape_slat.pt" \
  --tex_ckpt "texture_slat.pt" \
  --num_imgs_per_scene 999 \
  --chunk_size_factor 1.08 \
  --stat_std_ratio 3.0 \
  --radius_nb_points 7 \
  --radius_m 0.2 \
  --pipeline_config configs/pipelines/texture.json \
  --proj_batch_voxels 2048

Skrypt zapisuje pośrednie tensory fragmentów. Aby złożyć je w końcowy plik .glb, wywołaj konwerter:

python chunked_to_glb.py \
    --inputs "${OUT_DIR}/to_glb_inputs.pt" \
    --chunk_inputs "${OUT_DIR}/chunk_inputs.pt" \
    --output_dir "${OUT_DIR}"

Kod zawiera również gotowe profile dla benchmarku ScanNet++, jeśli chcesz odtworzyć pomiary naukowe z artykułu.

Na co zwrócić uwagę

Kod GenRecon to repozytorium akademickie ze wszystkim, co się z tym wiąże. Nie ma tu eleganckiego GUI ani wygodnego interfejsu webowego — wszystkie pokrętła kręcisz przez argumenty konsolowe i pliki konfiguracyjne JSON.

Przygotowanie własnych danych do fine-tuningu wymaga wstępnego renderowania i konwersji scen do reprezentacji O-Voxel. Nie będziesz w stanie uruchomić treningu na słabym sprzęcie ani GPU z 8-12 GB VRAM; wnioskowanie również wymaga sporej ilości pamięci wideo z powodu gęstej siatki vokseli.

Dla kogo to będzie przydatne

Projekt warto sprawdzić specjalistom 3D, deweloperom gier i badaczom widzenia komputerowego. Jeśli masz dość ręcznego czyszczenia zaszumionych skanów pomieszczeń i ponownego wypalania UV unwrapów, podejście GenRecon polegające na generacji przez gotowe fragmenty wygląda na jeden z najbardziej praktycznych sposobów na uzyskanie edytowalnej siatki wnętrza.

Powiązane projekty