Ricerca nel sito web

Come costruire una pipeline di fotogrammetria su una gocciolina GPU


Introduzione

La fotogrammetria è il processo di creazione di modelli 3D da immagini 2D. Scattando più fotografie da diverse angolazioni, possiamo ricostruire la geometria 3D di un oggetto o di una scena. Questo metodo estrae informazioni 3D dalle fotografie determinandone le relazioni spaziali. La fotogrammetria è ampiamente utilizzata in vari campi, come l'architettura, l'archeologia, la topografia, i giochi e il settore immobiliare.

In questo tutorial imparerai a configurare una pipeline di fotogrammetria utilizzando COLMAP, uno strumento di fotogrammetria, su un Droplet GPU Ubuntu 24.04. Elaborerai il famoso set di dati del South Building per generare un modello 3D utilizzando Structure from Motion (SfM) e la ricostruzione densa, e infine visualizzerai il modello utilizzando un visualizzatore 3D.

GPU Droplet accelera la fotogrammetria gestendo rapidamente attività come la ricostruzione densa e la fusione stereo. Ciò rende il processo più efficiente e riduce il tempo necessario per il completamento.

Prerequisiti

Per seguire questo tutorial avrai bisogno di:

  • Un account DigitalOcean Cloud.
  • Un droplet GPU con Ubuntu 24.04. I Droplet GPU sono attualmente disponibili in anticipo, ma puoi richiedere l'accesso qui.
  • Familiarità con la riga di comando di Linux. Per saperne di più, puoi visitare questa guida sul primer della riga di comando di Linux.

Passaggio 1: configurare il droplet GPU

1.Crea un nuovo progetto: dovrai creare un nuovo progetto dal pannello di controllo cloud e collegarlo a un Droplet GPU.

2.Crea un droplet GPU: accedi al tuo account DigitalOcean, crea un nuovo droplet GPU e scegli Ubuntu 24.04 come sistema operativo. Puoi fare riferimento alla nostra documentazione ufficiale su come creare un Droplet GPU.

3.Aggiungi una chiave SSH per l'autenticazione: è necessaria una chiave SSH per l'autenticazione con GPU Droplet e aggiungendo la chiave SSH, puoi accedere a GPU Droplet dal tuo terminale.

4.Finalizza e crea il droplet GPU: una volta completati tutti i passaggi precedenti, finalizza e crea un nuovo droplet GPU.

Passaggio 2: installare i driver NVIDIA e CUDA

In questo passaggio, accedi al tuo GPU Droplet dalla console web o dal tuo terminale tramite SSH.

root@<GPU_droplet_public_ip>

Innanzitutto, aggiorniamo il repository dei pacchetti e installiamo i prerequisiti:

sudo apt update
sudo apt install build-essential dkms

Ora aggiungi il repository dei pacchetti NVIDIA:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

Successivamente, installiamo i driver NVIDIA:

sudo apt install nvidia-driver-535 nvidia-dkms-535

Ora installiamo il toolkit CUDA:

sudo apt-get install -y \
    nvidia-cuda-toolkit \
    nvidia-cuda-toolkit-gcc

Sarà necessario riavviare GPU Droplet, dopo l'installazione dei driver NVIDIA e del toolkit CUDA:

sudo reboot

Una volta riavviato il sistema, puoi verificare l'installazione del driver NVIDIA e della versione CUDA con:

nvidia-smi

Questo comando dovrebbe visualizzare i dettagli della tua GPU NVIDIA e la versione del driver.

+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.183.01             Driver Version: 535.183.01   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
|                                         |                      |               MIG M. |
|=========================================+======================+======================|
|   0  NVIDIA H100 80GB HBM3          Off | 00000000:00:09.0 Off |                    0 |
| N/A   28C    P0              67W / 700W |      0MiB / 81559MiB |      0%      Default |
|                                         |                      |             Disabled |
+-----------------------------------------+----------------------+----------------------+
                                                                                         
+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+

Verifica l'installazione di CUDA:

nvcc --version

Dovresti vedere le informazioni sulla versione installata di CUDA.

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Fri_Jan__6_16:45:21_PST_2023
Cuda compilation tools, release 12.0, V12.0.140
Build cuda_12.0.r12.0/compiler.32267302_0

Nota: dagli output sopra, assicurati che la versione CUDA dall'output del comando nvidia-smi e del comando nvcc -v partite.

Passaggio 3: installare COLMAP

COLMAP è una pipeline Structure-from-Motion (SfM) e Multi-View Stereo (MVS) per scopi generici con un'interfaccia grafica e a riga di comando. Offre un'ampia gamma di funzionalità per la ricostruzione di raccolte di immagini ordinate e non ordinate.

Per impostazione predefinita, COLMAP esegue un thread di estrazione/corrispondenza delle funzionalità per GPU abilitata CUDA e questo in genere offre le migliori prestazioni rispetto all'esecuzione di più thread sulla stessa GPU.

Innanzitutto, installa le dipendenze per COLMAP:

sudo apt-get install \
    git \
    cmake \
    ninja-build \
    build-essential \
    libboost-program-options-dev \
    libboost-filesystem-dev \
    libboost-graph-dev \
    libboost-system-dev \
    libeigen3-dev \
    libflann-dev \
    libfreeimage-dev \
    libmetis-dev \
    libgoogle-glog-dev \
    libgtest-dev \
    libgmock-dev \
    libsqlite3-dev \
    libglew-dev \
    qtbase5-dev \
    libqt5opengl5-dev \
    libcgal-dev \
    libceres-dev

Ora cloniamo il repository COLMAP da GitHub per configurare e compilare COLMAP:

git clone https://github.com/colmap/colmap.git
cd colmap
mkdir build
cd build
cmake .. -GNinja
ninja
sudo ninja install

Verificare che COLMAP sia installato eseguendo:

colmap -h

Dovresti vedere le informazioni della guida di COLMAP.

COLMAP 3.11.0.dev0 -- Structure-from-Motion and Multi-View Stereo
(Commit 4ae4a88b on 2024-10-04 with CUDA)

Usage:
  colmap [command] [options]

Documentation:
  https://colmap.github.io/

Example usage:
  colmap help [ -h, --help ]
  colmap gui
  colmap gui -h [ --help ]
  colmap automatic_reconstructor -h [ --help ]
  colmap automatic_reconstructor --image_path IMAGES --workspace_path WORKSPACE
  colmap feature_extractor --image_path IMAGES --database_path DATABASE
  colmap exhaustive_matcher --database_path DATABASE
  colmap mapper --image_path IMAGES --database_path DATABASE --output_path MODEL
  ...

Available commands:
  help
  gui
  automatic_reconstructor
  bundle_adjuster
  color_extractor
  database_cleaner
  database_creator
  database_merger
  delaunay_mesher
  exhaustive_matcher
  feature_extractor
  feature_importer
  hierarchical_mapper
  image_deleter
  image_filterer
  image_rectifier
  image_registrator
  image_undistorter
  image_undistorter_standalone
  mapper
  matches_importer
  model_aligner
  model_analyzer
  model_comparer
  model_converter
  model_cropper
  model_merger
  model_orientation_aligner
  model_splitter
  model_transformer
  patch_match_stereo
  point_filtering
  point_triangulator
  pose_prior_mapper
  poisson_mesher
  project_generator
  rig_bundle_adjuster
  sequential_matcher
  spatial_matcher
  stereo_fusion
  transitive_matcher
  vocab_tree_builder
  vocab_tree_matcher
  vocab_tree_retriever

Passaggio 4: scaricare il set di dati dell'edificio sud

Utilizzerai il set di dati South Building dalla pagina dei set di dati COLMAP.

Creiamo una directory per il set di dati:

mkdir -p /root/datasets/
cd /root/datasets/

Ora scarica il set di dati South Building (0,42 GB):

wget https://demuc.de/colmap/datasets/south-building.zip
unzip south-building.zip

Nota: questo set di dati contiene già alcuni file necessari che vengono generati durante il processo di fotogrammetria come eseguirai di seguito. Puoi rimuoverli in modo proattivo per evitare eventuali problemi durante i passaggi seguenti:

rm /root/datasets/south-building/database.db
rm -rf /root/datasets/south-building/dense

Questo estrarrà le immagini all'interno della directory /root/datasets/south-building.

Passaggio 5: creazione di una pipeline di fotogrammetria COLMAP

Ora puoi iniziare a elaborare le immagini utilizzando gli eseguibili e le funzioni della riga di comando di COLMAP. La pipeline COLMAP è composta da diversi passaggi chiave. In questo passaggio imparerai ciascuno di questi passaggi e cosa fanno.

Innanzitutto impostiamo il percorso del set di dati dell'immagine come variabile di ambiente poiché ne avrai bisogno nei seguenti passaggi:

DATASET_PATH=/root/datasets/south-building

Verifica il valore della variabile DATASET_PATH:

echo $DATASET_PATH
/root/datasets/south-building

Estrazione di caratteristiche

Il primo passo nella pipeline COLMAP è l'estrazione delle funzionalità. Durante questo passaggio, COLMAP rileva i punti chiave in ciascuna immagine utilizzando l'algoritmo SIFT (Scale-Invariant Feature Transform).

Utilizzare il seguente comando:

colmap feature_extractor \
   --database_path $DATASET_PATH/features.db \
   --image_path $DATASET_PATH/images

Questo passaggio rileva i punti chiave in ciascuna immagine e li memorizza nel file features.db, che questo comando genererà automaticamente dopo il completamento del processo.

Nel comando sopra:

  • --database_path: specifica dove verranno archiviate le funzionalità e le corrispondenze (un database SQLite).
  • --image_path: il percorso della cartella contenente le immagini del set di dati South Building.

Dovresti osservare il seguente output:

Output
============================================================================== Feature extraction ============================================================================== I20241007 10:26:29.778565 112692 feature_extraction.cc:258] Processed file [126/128] I20241007 10:26:29.778585 112692 feature_extraction.cc:261] Name: P1180345.JPG I20241007 10:26:29.778592 112692 feature_extraction.cc:270] Dimensions: 3072 x 2304 I20241007 10:26:29.778601 112692 feature_extraction.cc:273] Camera: #1 - SIMPLE_RADIAL I20241007 10:26:29.778609 112692 feature_extraction.cc:276] Focal Length: 2457.60px (Prior) I20241007 10:26:29.778620 112692 feature_extraction.cc:280] Features: 12917 I20241007 10:26:29.806203 112692 feature_extraction.cc:258] Processed file [127/128] I20241007 10:26:29.806223 112692 feature_extraction.cc:261] Name: P1180346.JPG I20241007 10:26:29.806231 112692 feature_extraction.cc:270] Dimensions: 3072 x 2304 I20241007 10:26:29.806238 112692 feature_extraction.cc:273] Camera: #1 - SIMPLE_RADIAL I20241007 10:26:29.806245 112692 feature_extraction.cc:276] Focal Length: 2457.60px (Prior) I20241007 10:26:29.806254 112692 feature_extraction.cc:280] Features: 10936 I20241007 10:26:29.837088 112692 feature_extraction.cc:258] Processed file [128/128] I20241007 10:26:29.837108 112692 feature_extraction.cc:261] Name: P1180347.JPG I20241007 10:26:29.837116 112692 feature_extraction.cc:270] Dimensions: 3072 x 2304 I20241007 10:26:29.837123 112692 feature_extraction.cc:273] Camera: #1 - SIMPLE_RADIAL I20241007 10:26:29.837132 112692 feature_extraction.cc:276] Focal Length: 2457.60px (Prior) I20241007 10:26:29.837141 112692 feature_extraction.cc:280] Features: 14988 I20241007 10:26:29.851410 112670 timer.cc:91] Elapsed time: 0.111 [minutes]

Il passo successivo è abbinare le caratteristiche delle immagini.

Corrispondenza delle immagini

In questo passaggio eseguirai la corrispondenza delle immagini, in cui COLMAP abbina le caratteristiche tra coppie di immagini.

colmap exhaustive_matcher \
   --database_path $DATASET_PATH/features.db

Nel comando sopra:

  • --database_path: è il percorso del database creato durante il passaggio precedente di estrazione delle funzionalità. Questo database contiene le caratteristiche estratte da ciascuna immagine.

Il matcher esaustivo confronta ogni immagine con ogni altra immagine per trovare punti di corrispondenza tra di loro, il che è fondamentale per il processo di ricostruzione 3D.

Dovresti osservare il seguente output:

Output
============================================================================== Feature matching ============================================================================== I20241007 10:39:56.524787 112923 sift.cc:1426] Creating SIFT GPU feature matcher I20241007 10:39:56.679742 112922 pairing.cc:168] Generating exhaustive image pairs... I20241007 10:39:56.679785 112922 pairing.cc:201] Matching block [1/3, 1/3] I20241007 10:39:59.968668 112922 feature_matching.cc:46] in 3.289s I20241007 10:39:59.973086 112922 pairing.cc:201] Matching block [1/3, 2/3] I20241007 10:40:03.933087 112922 feature_matching.cc:46] in 3.960s I20241007 10:40:03.934145 112922 pairing.cc:201] Matching block [1/3, 3/3] I20241007 10:40:04.890079 112922 feature_matching.cc:46] in 0.956s I20241007 10:40:04.893419 112922 pairing.cc:201] Matching block [2/3, 1/3] I20241007 10:40:11.315909 112922 feature_matching.cc:46] in 6.423s I20241007 10:40:11.317560 112922 pairing.cc:201] Matching block [2/3, 2/3] I20241007 10:40:15.306492 112922 feature_matching.cc:46] in 3.989s I20241007 10:40:15.321022 112922 pairing.cc:201] Matching block [2/3, 3/3] I20241007 10:40:16.576953 112922 feature_matching.cc:46] in 1.256s I20241007 10:40:16.577368 112922 pairing.cc:201] Matching block [3/3, 1/3] I20241007 10:40:19.138069 112922 feature_matching.cc:46] in 2.561s I20241007 10:40:19.139942 112922 pairing.cc:201] Matching block [3/3, 2/3] I20241007 10:40:21.759231 112922 feature_matching.cc:46] in 2.619s I20241007 10:40:21.766156 112922 pairing.cc:201] Matching block [3/3, 3/3] I20241007 10:40:22.669615 112922 feature_matching.cc:46] in 0.903s I20241007 10:40:22.670549 112922 timer.cc:91] Elapsed time: 0.436 [minutes]

Ricostruzione sparsa (struttura dal movimento)

Una volta completata la corrispondenza dell'immagine, eseguirai Structure from Motion (SfM) per generare una nuvola di punti 3D sparsa. Questo passaggio calcola le pose della fotocamera e ricostruisce una nuvola di punti sparsa in base alle caratteristiche abbinate.

La struttura dal movimento (SfM) è il processo di stima della struttura 3D di una scena da una serie di immagini 2D. SfM viene utilizzato in molte applicazioni, come la scansione 3D, la realtà aumentata e la localizzazione e mappatura visiva simultanea (vSLAM).

mkdir -p $DATASET_PATH/sparse
colmap mapper \
    --database_path $DATASET_PATH/features.db \
    --image_path $DATASET_PATH/images \
    --output_path $DATASET_PATH/sparse

Nel comando sopra:

  • --database_path: percorso del database contenente le corrispondenze della funzionalità.
  • --image_path: percorso delle immagini del set di dati.
  • --output_path: directory in cui verrà salvata la ricostruzione 3D sparsa.

Questo passaggio genera una nuvola di punti sparsa e la archivia nella directory sparse/. Fornisce inoltre le pose stimate della fotocamera e la struttura della scena.

Dovresti osservare il seguente output:

I20241007 10:48:07.338281 112969 incremental_mapper.cc:237] Loading database
I20241007 10:48:07.339139 112969 database_cache.cc:66] Loading cameras...
I20241007 10:48:07.339165 112969 database_cache.cc:76]  1 in 0.000s
I20241007 10:48:07.339171 112969 database_cache.cc:84] Loading matches...
I20241007 10:48:07.352996 112969 database_cache.cc:90]  2575 in 0.014s
I20241007 10:48:07.353032 112969 database_cache.cc:106] Loading images...
I20241007 10:48:07.391850 112969 database_cache.cc:156]  128 in 0.039s (connected 128)
I20241007 10:48:07.391886 112969 database_cache.cc:167] Loading pose priors...
I20241007 10:48:07.392081 112969 database_cache.cc:178]  0 in 0.000s
I20241007 10:48:07.392092 112969 database_cache.cc:187] Building correspondence graph...
I20241007 10:48:07.574220 112969 database_cache.cc:216]  in 0.182s (ignored 0)
I20241007 10:48:07.574483 112969 timer.cc:91] Elapsed time: 0.004 [minutes]
I20241007 10:48:07.585919 112969 incremental_mapper.cc:282] Finding good initial image pair
I20241007 10:48:07.979120 112969 incremental_mapper.cc:306] Initializing with image pair #71 and #68
I20241007 10:50:36.104980 112969 incremental_mapper.cc:390] Registering image #13 (126)
I20241007 10:50:36.105013 112969 incremental_mapper.cc:393] => Image sees 439 / 1047 points
I20241007 10:50:36.420789 112969 incremental_mapper.cc:390] Registering image #116 (127)
I20241007 10:50:36.420820 112969 incremental_mapper.cc:393] => Image sees 409 / 1342 points
I20241007 10:50:36.721102 112969 incremental_mapper.cc:390] Registering image #14 (128)
I20241007 10:50:36.721136 112969 incremental_mapper.cc:393] => Image sees 519 / 1340 points
I20241007 10:50:36.997920 112969 incremental_mapper.cc:42] Retriangulation and Global bundle adjustment
I20241007 10:50:43.497357 112969 timer.cc:91] Elapsed time: 2.603 [minutes]

Non distorsione dell'immagine

Prima di procedere alla ricostruzione densa, le immagini devono essere non distorte per rimuovere eventuali distorsioni dell'obiettivo della fotocamera.

Questo passaggio prepara le immagini per la ricostruzione densa non distorcendole e salvandole nella directory dense/.

mkdir $DATASET_PATH/dense
colmap image_undistorter \
    --image_path $DATASET_PATH/images \
    --input_path $DATASET_PATH/sparse/0 \
    --output_path $DATASET_PATH/dense \
    --output_type COLMAP \
    --max_image_size 2000

Nel comando sopra:

  • --image_path: percorso delle immagini originali.
  • --input_path: percorso dell'output della ricostruzione sparsa.
  • --output_path: directory in cui verranno archiviate le immagini non distorte.
  • --output_type COLMAP: specifica che il formato di output deve essere compatibile con COLMAP.
  • --max_image_size 2000: questa opzione imposta la dimensione massima (in pixel) per la dimensione più grande (larghezza o altezza) delle immagini durante il processo di non distorsione.

Dovresti osservare il seguente output:

I20241007 10:56:45.911012 118982 misc.cc:44] 
==============================================================================
Reading reconstruction
==============================================================================
I20241007 10:56:46.049121 118982 image.cc:347] => Reconstruction with 128 images and 84534 points
I20241007 10:56:46.049175 118982 misc.cc:44] 
==============================================================================
Image undistortion
==============================================================================
I20241007 10:56:48.766614 118982 undistortion.cc:214] Undistorting image [59/128]
I20241007 10:56:48.768337 118982 undistortion.cc:214] Undistorting image [60/128]
I20241007 10:56:48.856706 118982 undistortion.cc:214] Undistorting image [61/128]
I20241007 10:56:49.596917 118982 undistortion.cc:214] Undistorting image [62/128]
I20241007 10:56:49.597055 118982 undistortion.cc:214] Undistorting image [63/128]
I20241007 10:56:49.597066 118982 undistortion.cc:214] Undistorting image [64/128]
I20241007 10:56:49.597074 118982 undistortion.cc:214] Undistorting image [65/128]
I20241007 10:56:49.597185 118982 undistortion.cc:214] Undistorting image [66/128]
I20241007 10:56:49.600149 118982 undistortion.cc:214] Undistorting image [67/128]
I20241007 10:56:49.601222 118982 undistortion.cc:214] Undistorting image [68/128]
I20241007 10:56:49.605536 118982 undistortion.cc:214] Undistorting image [69/128]
I20241007 10:56:49.609879 118982 undistortion.cc:214] Undistorting image [70/128]
I20241007 10:56:49.612232 118982 undistortion.cc:214] Undistorting image [71/128]
I20241007 10:56:49.612267 118982 undistortion.cc:214] Undistorting image [72/128]
I20241007 10:56:49.612289 118982 undistortion.cc:214] Undistorting image [73/128]
I20241007 10:56:49.612311 118982 undistortion.cc:214] Undistorting image [74/128]
I20241007 10:56:49.612334 118982 undistortion.cc:214] Undistorting image [75/128]
I20241007 10:56:49.612357 118982 undistortion.cc:214] Undistorting image [76/128]
I20241007 10:56:49.616092 118982 undistortion.cc:214] Undistorting image [77/128]
I20241007 10:56:49.616670 118982 undistortion.cc:214] Undistorting image [78/128]
I20241007 10:56:49.642452 118982 undistortion.cc:214] Undistorting image [79/128]
I20241007 10:56:49.644358 118982 undistortion.cc:214] Undistorting image [80/128]
I20241007 10:56:49.732167 118982 undistortion.cc:214] Undistorting image [81/128]
I20241007 10:56:50.469224 118982 undistortion.cc:214] Undistorting image [82/128]
I20241007 10:56:50.482945 118982 undistortion.cc:214] Undistorting image [83/128]
I20241007 10:56:50.482987 118982 undistortion.cc:214] Undistorting image [84/128]
I20241007 10:56:50.482996 118982 undistortion.cc:214] Undistorting image [85/128]
I20241007 10:56:50.483004 118982 undistortion.cc:214] Undistorting image [86/128]
I20241007 10:56:50.483011 118982 undistortion.cc:214] Undistorting image [87/128]
I20241007 10:56:50.483019 118982 undistortion.cc:214] Undistorting image [88/128]
I20241007 10:56:50.483026 118982 undistortion.cc:214] Undistorting image [89/128]
I20241007 10:56:50.484054 118982 undistortion.cc:214] Undistorting image [90/128]
I20241007 10:56:50.488268 118982 undistortion.cc:214] Undistorting image [91/128]
I20241007 10:56:50.493851 118982 undistortion.cc:214] Undistorting image [92/128]
I20241007 10:56:50.493881 118982 undistortion.cc:214] Undistorting image [93/128]
I20241007 10:56:50.493891 118982 undistortion.cc:214] Undistorting image [94/128]
I20241007 10:56:50.493899 118982 undistortion.cc:214] Undistorting image [95/128]
I20241007 10:56:50.493903 118982 undistortion.cc:214] Undistorting image [96/128]
I20241007 10:56:50.499060 118982 undistortion.cc:214] Undistorting image [97/128]
I20241007 10:56:50.499075 118982 undistortion.cc:214] Undistorting image [98/128]
I20241007 10:56:50.519201 118982 undistortion.cc:214] Undistorting image [99/128]
I20241007 10:56:50.520592 118982 undistortion.cc:214] Undistorting image [100/128]
I20241007 10:56:50.607587 118982 undistortion.cc:214] Undistorting image [101/128]
I20241007 10:56:51.344902 118982 undistortion.cc:214] Undistorting image [102/128]
I20241007 10:56:51.352843 118982 undistortion.cc:214] Undistorting image [103/128]
I20241007 10:56:51.358783 118982 undistortion.cc:214] Undistorting image [104/128]
I20241007 10:56:51.358808 118982 undistortion.cc:214] Undistorting image [105/128]
I20241007 10:56:51.361234 118982 undistortion.cc:214] Undistorting image [106/128]
I20241007 10:56:51.361248 118982 undistortion.cc:214] Undistorting image [107/128]
I20241007 10:56:51.361255 118982 undistortion.cc:214] Undistorting image [108/128]
I20241007 10:56:51.382604 118982 undistortion.cc:214] Undistorting image [109/128]
I20241007 10:56:51.382679 118982 undistortion.cc:214] Undistorting image [110/128]
I20241007 10:56:51.382704 118982 undistortion.cc:214] Undistorting image [111/128]
I20241007 10:56:51.382725 118982 undistortion.cc:214] Undistorting image [112/128]
I20241007 10:56:51.385625 118982 undistortion.cc:214] Undistorting image [113/128]
I20241007 10:56:51.385653 118982 undistortion.cc:214] Undistorting image [114/128]
I20241007 10:56:51.385674 118982 undistortion.cc:214] Undistorting image [115/128]
I20241007 10:56:51.385700 118982 undistortion.cc:214] Undistorting image [116/128]
I20241007 10:56:51.385722 118982 undistortion.cc:214] Undistorting image [117/128]
I20241007 10:56:51.385749 118982 undistortion.cc:214] Undistorting image [118/128]
I20241007 10:56:51.408337 118982 undistortion.cc:214] Undistorting image [119/128]
I20241007 10:56:51.408371 118982 undistortion.cc:214] Undistorting image [120/128]
I20241007 10:56:51.488456 118982 undistortion.cc:214] Undistorting image [128/128]
I20241007 10:56:52.245260 118982 undistortion.cc:227] Writing reconstruction...
I20241007 10:56:52.518358 118982 undistortion.cc:232] Writing configuration...
I20241007 10:56:52.518687 118982 undistortion.cc:236] Writing scripts...
I20241007 10:56:52.518774 118982 timer.cc:91] Elapsed time: 0.108 [minutes]

Ricostruzione densa

Successivamente, eseguiamo una ricostruzione densa, che genera una densa nuvola di punti 3D dalle immagini.

Il comando seguente calcola una nuvola di punti densa utilizzando l'algoritmo PatchMatch Stereo.

colmap patch_match_stereo \
    --workspace_path $DATASET_PATH/dense \
    --workspace_format COLMAP \
    --PatchMatchStereo.geom_consistency true

Dovresti osservare il seguente output:

Output
============================================================================== Processing view 128 / 128 for P1180347.JPG ============================================================================== I20241007 12:22:59.582113 119102 patch_match.cc:490] Reading inputs... I20241007 12:23:00.053587 119102 misc.cc:51] PatchMatch::Problem ------------------- I20241007 12:23:00.053635 119102 patch_match.cc:82] ref_image_idx: 0 I20241007 12:23:00.053645 119102 patch_match.cc:84] src_image_idxs: I20241007 12:23:00.053653 119102 patch_match.cc:87] 53 I20241007 12:23:00.053660 119102 patch_match.cc:87] 125 I20241007 12:23:00.053666 119102 patch_match.cc:87] 54 I20241007 12:23:00.053673 119102 patch_match.cc:87] 30 I20241007 12:23:00.053681 119102 patch_match.cc:87] 59 I20241007 12:23:00.053689 119102 patch_match.cc:87] 56 I20241007 12:23:00.053695 119102 patch_match.cc:87] 27 I20241007 12:23:00.053704 119102 patch_match.cc:87] 122 I20241007 12:23:00.053714 119102 patch_match.cc:87] 51 I20241007 12:23:00.053722 119102 patch_match.cc:87] 123 I20241007 12:23:00.053730 119102 patch_match.cc:87] 52 I20241007 12:23:00.053736 119102 patch_match.cc:87] 57 I20241007 12:23:00.053745 119102 patch_match.cc:87] 28 I20241007 12:23:00.053751 119102 patch_match.cc:87] 127 I20241007 12:23:00.053766 119102 patch_match.cc:87] 124 I20241007 12:23:00.053774 119102 patch_match.cc:87] 126 I20241007 12:23:00.053782 119102 patch_match.cc:87] 26 I20241007 12:23:00.053789 119102 patch_match.cc:87] 55 I20241007 12:23:00.053797 119102 patch_match.cc:87] 58 I20241007 12:23:00.053803 119102 patch_match.cc:89] 29 I20241007 12:23:00.053813 119102 misc.cc:51] PatchMatchOptions ----------------- I20241007 12:23:00.053828 119102 patch_match.cc:54] max_image_size: -1 I20241007 12:23:00.053836 119102 patch_match.cc:55] gpu_index: 0 I20241007 12:23:00.053844 119102 patch_match.cc:56] depth_min: 0.69764 I20241007 12:23:00.053859 119102 patch_match.cc:57] depth_max: 2.41436 I20241007 12:23:00.053867 119102 patch_match.cc:58] window_radius: 5 I20241007 12:23:00.053875 119102 patch_match.cc:59] window_step: 1 I20241007 12:23:00.053882 119102 patch_match.cc:60] sigma_spatial: 5 I20241007 12:23:00.053892 119102 patch_match.cc:61] sigma_color: 0.2 I20241007 12:23:00.053900 119102 patch_match.cc:62] num_samples: 15 I20241007 12:23:00.053910 119102 patch_match.cc:63] ncc_sigma: 0.6 I20241007 12:23:00.053921 119102 patch_match.cc:64] min_triangulation_angle: 1 I20241007 12:23:00.053929 119102 patch_match.cc:65] incident_angle_sigma: 0.9 I20241007 12:23:00.053937 119102 patch_match.cc:66] num_iterations: 5 I20241007 12:23:00.053946 119102 patch_match.cc:67] geom_consistency: 1 I20241007 12:23:00.053956 119102 patch_match.cc:68] geom_consistency_regularizer: 0.3 I20241007 12:23:00.053964 119102 patch_match.cc:69] geom_consistency_max_cost: 3 I20241007 12:23:00.053975 119102 patch_match.cc:70] filter: 1 I20241007 12:23:00.053985 119102 patch_match.cc:71] filter_min_ncc: 0.1 I20241007 12:23:00.053993 119102 patch_match.cc:72] filter_min_triangulation_angle: 3 I20241007 12:23:00.054003 119102 patch_match.cc:73] filter_min_num_consistent: 2 I20241007 12:23:00.054011 119102 patch_match.cc:74] filter_geom_consistency_max_cost: 1 I20241007 12:23:00.054020 119102 patch_match.cc:75] write_consistency_graph: 0 I20241007 12:23:00.054028 119102 patch_match.cc:76] allow_missing_files: 0 I20241007 12:23:00.054037 119102 misc.cc:51] PatchMatch::Run --------------- I20241007 12:23:00.376771 119102 cudacc.cc:51] Initialization: 0.1175s I20241007 12:23:01.043998 119102 cudacc.cc:51] Sweep 1: 0.6672s I20241007 12:23:01.944828 119102 cudacc.cc:51] Sweep 2: 0.9008s I20241007 12:23:02.594894 119102 cudacc.cc:51] Sweep 3: 0.6500s I20241007 12:23:03.478672 119102 cudacc.cc:51] Sweep 4: 0.8837s I20241007 12:23:03.478729 119102 cudacc.cc:51] Iteration 1: 3.1019s I20241007 12:23:04.118643 119102 cudacc.cc:51] Sweep 1: 0.6399s I20241007 12:23:04.971732 119102 cudacc.cc:51] Sweep 2: 0.8530s I20241007 12:23:05.600572 119102 cudacc.cc:51] Sweep 3: 0.6288s I20241007 12:23:06.439204 119102 cudacc.cc:51] Sweep 4: 0.8386s I20241007 12:23:06.439258 119102 cudacc.cc:51] Iteration 2: 2.9605s I20241007 12:23:07.050969 119102 cudacc.cc:51] Sweep 1: 0.6117s I20241007 12:23:07.862507 119102 cudacc.cc:51] Sweep 2: 0.8115s I20241007 12:23:08.464685 119102 cudacc.cc:51] Sweep 3: 0.6021s I20241007 12:23:09.266883 119102 cudacc.cc:51] Sweep 4: 0.8021s I20241007 12:23:09.266938 119102 cudacc.cc:51] Iteration 3: 2.8277s I20241007 12:23:09.861644 119102 cudacc.cc:51] Sweep 1: 0.5947s I20241007 12:23:10.642392 119102 cudacc.cc:51] Sweep 2: 0.7807s I20241007 12:23:11.225575 119102 cudacc.cc:51] Sweep 3: 0.5831s I20241007 12:23:11.996281 119102 cudacc.cc:51] Sweep 4: 0.7707s I20241007 12:23:11.996337 119102 cudacc.cc:51] Iteration 4: 2.7294s I20241007 12:23:12.577554 119102 cudacc.cc:51] Sweep 1: 0.5812s I20241007 12:23:13.330368 119102 cudacc.cc:51] Sweep 2: 0.7528s I20241007 12:23:13.900084 119102 cudacc.cc:51] Sweep 3: 0.5697s I20241007 12:23:14.721855 119102 cudacc.cc:51] Sweep 4: 0.8217s I20241007 12:23:14.721902 119102 cudacc.cc:51] Iteration 5: 2.7256s I20241007 12:23:14.721928 119102 cudacc.cc:51] Total: 14.4629s I20241007 12:23:14.721940 119102 patch_match.cc:533] Writing geometric output for P1180347.JPG I20241007 12:23:14.981747 119097 timer.cc:91] Elapsed time: 33.683 [minutes]

Nota: il completamento di questo passaggio richiederà del tempo, poiché il calcolo di una nuvola di punti densa di ogni 128 immagini è un'attività computazionalmente impegnativa.

Nel comando sopra:

  • --workspace_path: percorso delle immagini non distorte e della ricostruzione sparsa.
  • --workspace_format COLMAP: specifica il formato dell'area di lavoro per la ricostruzione densa.
  • --PatchMatchStereo.geom_consistency true: abilita il controllo della coerenza geometrica durante il denso processo di ricostruzione. Applica la coerenza multivista verificando che le mappe di profondità calcolate siano coerenti se visualizzate da diverse prospettive.

Fusione stereo (generazione mesh)

Infine, genererai una mesh 3D dalla nuvola di punti densa utilizzando la fusione stereo.

colmap stereo_fusion \
    --workspace_path $DATASET_PATH/dense \
    --workspace_format COLMAP \
    --input_type geometric \
    --output_path $DATASET_PATH/dense/fused.ply

Dovresti osservare il seguente output:

StereoFusion::Options
---------------------
I20241007 12:45:03.678233 120227 fusion.cc:90] mask_path: 
I20241007 12:45:03.678241 120227 fusion.cc:91] max_image_size: -1
I20241007 12:45:03.678244 120227 fusion.cc:92] min_num_pixels: 5
I20241007 12:45:03.678247 120227 fusion.cc:93] max_num_pixels: 10000
I20241007 12:45:03.678251 120227 fusion.cc:94] max_traversal_depth: 100
I20241007 12:45:03.678253 120227 fusion.cc:95] max_reproj_error: 2
I20241007 12:45:03.678261 120227 fusion.cc:96] max_depth_error: 0.01
I20241007 12:45:03.678265 120227 fusion.cc:97] max_normal_error: 10
I20241007 12:45:03.678268 120227 fusion.cc:98] check_num_images: 50
I20241007 12:45:03.678272 120227 fusion.cc:99] use_cache: 0
I20241007 12:45:03.678274 120227 fusion.cc:100] cache_size: 32
I20241007 12:45:03.678278 120227 fusion.cc:103] bbox_min: -3.40282e+38 -3.40282e+38 -3.40282e+38
I20241007 12:45:03.678285 120227 fusion.cc:104] bbox_max: 3.40282e+38 3.40282e+38 3.40282e+38
I20241007 12:45:03.678292 120227 fusion.cc:154] Reading workspace...
I20241007 12:45:03.832470 120227 workspace.cc:98] Loading workspace data with 20 threads...
I20241007 12:45:05.393256 120227 timer.cc:91] Elapsed time: 0.026 [minutes]
I20241007 12:45:05.393828 120227 fusion.cc:189] Reading configuration...
I20241007 12:45:05.792424 120227 fusion.cc:257] Starting fusion with 20 threads
I20241007 12:45:05.793843 120227 fusion.cc:293] Fusing image [1/128] with index 0
I20241007 12:45:07.120609 120227 fusion.cc:320]  in 1.327s (423138 points)
I20241007 12:45:57.349324 120227 fusion.cc:320]  in 0.178s (5715133 points)
I20241007 12:45:57.353614 120227 fusion.cc:293] Fusing image [127/128] with index 68
I20241007 12:45:57.518211 120227 fusion.cc:320]  in 0.165s (5715134 points)
I20241007 12:45:57.522936 120227 fusion.cc:293] Fusing image [128/128] with index 96
I20241007 12:45:57.734925 120227 fusion.cc:320]  in 0.212s (5715134 points)
I20241007 12:45:58.217330 120227 fusion.cc:347] Number of fused points: 5715134
I20241007 12:45:58.217367 120227 timer.cc:91] Elapsed time: 0.909 [minutes]
I20241007 12:45:58.767601 120227 mvs.cc:203] Writing output: /root/datasets/south-building/dense/fused.ply

Nel comando sopra:

  • --workspace_path: percorso per i risultati della ricostruzione densa.
  • --workspace_format COLMAP: specifica il formato dello spazio di lavoro.
  • --output_path: percorso per salvare il file .ply finale contenente la mesh 3D fusa.

Il modello 3D finale verrà salvato come fused.ply nella directory /root/datasets/south-building/dense.

Passaggio 6: visualizzare i risultati

Una volta completato il processo, puoi visualizzare il modello 3D utilizzando un visualizzatore 3D come MeshLab o CloudCompare. Puoi scaricare il file fused.ply sul tuo computer locale utilizzando scp:

scp root@your_droplet_ip:/root/datasets/south-building/dense/fused.ply /path/to/local/machine

Apri il file .ply in MeshLab o CloudCompare per visualizzare il modello 3D.

Conclusione

In questo tutorial hai imparato come utilizzare COLMAP per creare una pipeline di fotogrammetria per il set di dati South Building. Ciò include l'estrazione di funzionalità, la corrispondenza delle immagini, la ricostruzione sparsa e densa e la generazione di mesh utilizzando la CLI di COLMAP.

L'esecuzione della pipeline di fotogrammetria su una GPU Droplet accelera attività come la ricostruzione densa e la fusione stereo, riducendo i tempi di elaborazione e migliorando l'efficienza. Ciò è utile per settori come l'architettura, l'archeologia, i giochi, la topografia e il settore immobiliare, poiché consente la creazione rapida e accurata di modelli 3D da immagini 2D.

Articoli correlati: