WorldView Multi-View Stereo Processing: SpaceNet Atlanta Example#

This notebook processes three same-pass WorldView-2 scenes over Hartsfield–Jackson Atlanta International Airport (2009-12-22, SpaceNet AOI 6) two ways:

  1. A joint 3-scene multi-view stereo (MVS) run — one parallel_stereo call with all three images, triangulating every pixel from up to three rays.

  2. The three pairwise stereo runs merged with dem_mosaic — the workflow the ASP documentation recommends over MVS.

The final sections compare the two DEMs directly: coverage, DEM-to-DEM difference, and residuals against ICESat-2 ATL06-SR altimetry.

Scenes#

All five downloaded scenes are from the same 2009-12-22 pass (the SpaceNet “off-nadir” collect names give the nominal look angle). The three-scene subset used for stereo was chosen with the companion scene-selection notebook; the two extra scenes strengthen the bundle adjustment network:

catid

tile

SpaceNet collect

off-nadir (°)

GSD (m)

role

1030010002B7D800

P002

nadir13

14.0

0.49

MVS reference + stereo

1030010003CAF100

P002

nadir10

10.6

0.48

stereo

1030010002649200

P001

nadir16

18.1

0.51

stereo

10300100023BC100

P001

nadir8

~8

0.48

bundle adjustment only

1030010003127500

P001

nadir21

~21

0.52

bundle adjustment only

Pairwise geometry of the stereo trio (from StereopairMetadataParser):

  • nadir13–nadir10: 21.8° convergence, B:H 0.38, asymmetry 2.6° — the strong pair used by the retired two-scene Atlanta example

  • nadir10–nadir16: 27.1° convergence, B:H 0.48, asymmetry 5.0° — the strongest pair (the two scenes look at the ground from opposite sides of nadir)

  • nadir13–nadir16: 5.3° convergence, B:H 0.09, asymmetry 15.9° — a weak pair on its own

That mix is deliberate: the joint MVS triangulation can exploit the weak pair’s rays alongside the strong ones, while in the pairwise workflow the weak pair produces a noisy standalone DEM that dem_mosaic blends in.


Processing Overview#

  • Data Retrieval — Download the five WorldView-2 PAN tiles from AWS S3

  • Stereo Geometry Analysis — N-scene overview + per-pair geometry from the camera XMLs

  • CCD Artifact Correction — wv_correct on every scene

  • Bundle Adjustment — one 5-scene network, shared by every stereo run below

  • Multi-View Stereo — 3-scene parallel_stereo (nadir13 reference) + point2dem

  • Pairwise Stereo + dem_mosaic — the three pairs, same bundle adjustment and crops, merged into a second DEM

  • Comparison — coverage, DEM difference, and ICESat-2 residuals, MVS vs. pairwise mosaic

  • Report — the standard asp_plot PDF report for the multi-view run


Data Retrieval#

The SpaceNet Atlanta raw L1B images are public at s3://spacenet-dataset/AOIs/AOI_6_Atlanta/metadata/<CATID>/<workorder>_<PXXX>_PAN/ (~2 GB per PAN tile). Each CATID is delivered as multiple tiles (P001, P002, P003) and the tiling differs between collects — the tile listed in the table above is the one whose ground coverage contains the airport ROI for that CATID. Download one <catid> <tile> pair at a time:

$ mkdir -p atlanta_mvs && cd atlanta_mvs

# Repeat for each <catid> <tile> row of the scene table:
#   1030010002B7D800 P002, 1030010003CAF100 P002, 1030010002649200 P001,
#   10300100023BC100 P001, 1030010003127500 P001
$ aws s3 --no-sign-request sync \
    s3://spacenet-dataset/AOIs/AOI_6_Atlanta/metadata/<catid>/ \
    images/aws/<catid>/ \
    --exclude "*" --include "*<tile>_PAN/*"

# Copy the TIF and XML to the working directory with short names
$ cp images/aws/<catid>/*<tile>_PAN/*P1BS*<tile>.TIF <catid>_<tile>.tif
$ cp images/aws/<catid>/*<tile>_PAN/*P1BS*<tile>.XML <catid>_<tile>.xml

Stereo Geometry Analysis#

Before processing, analyze the acquisition geometry of the stereo trio directly from the camera XMLs. With more than two scenes, asp_plot produces an N-scene overview figure plus one figure per pair, each titled with that pair’s convergence, B:H, bisector-elevation, and asymmetry angles. Passing the three XMLs as explicit inputs scopes the analysis to the stereo scenes (the directory also holds the two bundle-adjustment-only scenes):

# Set the base directory for your processing
directory = "~/Desktop/asp-plot-examples/atlanta_mvs/"

from asp_plot.stereo_geometry import StereoGeometryPlotter

map_crs = "EPSG:32616"  # UTM 16N for Atlanta

sgp = StereoGeometryPlotter(
    inputs=[
        f"{directory}1030010002B7D800_P002.xml",
        f"{directory}1030010003CAF100_P002.xml",
        f"{directory}1030010002649200_P001.xml",
    ]
)

_ = sgp.stereo_geom_plot()
../../_images/2a5589a467e720e05ad93df59e114de78778df8a4189ca2007efa2d4e994efe0.png ../../_images/43b38ab3a55b777a9d4d78a35e2685fe9c8e482f6c240ba5670e44bfb40b640e.png ../../_images/6fa7c23385cf6e1d439ffa8873257a3437d1dd1cd36eb4c820197f6e71315e4c.png ../../_images/85eaf484c15220e8dae24ceda144cc34ef0d8a36028682a6b3ef87dbd62aa493.png

The skyplot makes the geometry mix obvious: nadir13 and nadir16 sit close together north of zenith (hence their weak 5.3° convergence), while nadir10 looks from the south side, giving both of its pairs strong convergence.

Satellite Position and Orientation Data#

The XML camera metadata also contains ephemeris (position/velocity) and attitude (orientation quaternion) data reported by the satellite during acquisition, plus their covariances. Visualizing this data can help assess the quality of the raw metadata before ASP processing — with N scenes the plot draws one column per scene:

sgp.satellite_position_orientation_plot()
../../_images/59465eea1ecf732b65eca116ac33fc1cb5c187c975fb8249dd12501d28021e39.png

CCD Artifact Correction#

WorldView-2 imagery has subpixel CCD boundary misalignments. The SpaceNet Atlanta data was processed in 2019 (before the May 2022 improvement), so wv_correct is required for every scene:

$ cd atlanta_mvs

$ for scene in 1030010002B7D800_P002 1030010003CAF100_P002 1030010002649200_P001 \
               10300100023BC100_P001 1030010003127500_P001; do
    wv_correct ${scene}.tif ${scene}.xml ${scene}_corr.tif
  done

The *_corr.tif corrected images are used for all subsequent processing steps.


Bundle Adjustment#

Bundle adjust all five scenes together into one self-consistent camera network. Every stereo run below — the multi-view run and each pairwise run — uses this same ba/run prefix, so the cameras are identical across the two workflows and any DEM differences come from the stereo strategy, not the cameras. The two extra scenes (nadir8, nadir21) add rays that strengthen the network:

$ cd atlanta_mvs

$ bundle_adjust \
    --threads 8 \
    --ip-per-image 10000 \
    --tri-weight 0.1 \
    --tri-robust-threshold 0.1 \
    --camera-weight 0 \
    1030010002B7D800_P002_corr.tif 10300100023BC100_P001_corr.tif \
    1030010003CAF100_P002_corr.tif 1030010002649200_P001_corr.tif \
    1030010003127500_P001_corr.tif \
    1030010002B7D800_P002.xml 10300100023BC100_P001.xml \
    1030010003CAF100_P002.xml 1030010002649200_P001.xml \
    1030010003127500_P001.xml \
    -o ba/run

Bundle Adjustment Results#

Visualize the residuals to verify the optimization reduced reprojection errors (median residual drops from 1.17 px to 0.21 px):

import contextily as ctx
from asp_plot.bundle_adjust import ReadBundleAdjustFiles, PlotBundleAdjustFiles

bundle_adjust_directory = "ba/"
stereo_directory = "stereo_mvs3/"

ctx_kwargs = {
    "crs": map_crs,
    "source": ctx.providers.Esri.WorldImagery,
    "attribution_size": 0,
    "alpha": 0.5,
}

ba_files = ReadBundleAdjustFiles(directory, bundle_adjust_directory)
resid_initial_gdf, resid_final_gdf = ba_files.get_initial_final_residuals_gdfs(residuals_in_meters=True)

plotter = PlotBundleAdjustFiles(
    [resid_initial_gdf, resid_final_gdf],
    lognorm=True,
    title="Bundle Adjust Initial and Final Residuals",
)
plotter.plot_n_gdfs(
    column_name="mean_residual",
    cbar_label="Mean residual (px)",
    map_crs=map_crs,
    **ctx_kwargs,
)
WARNING:asp_plot.bundle_adjust:

Could not read stereopair metadata to get mean GSD. Residuals will remain in pixels.
WARNING:asp_plot.bundle_adjust:

Could not read stereopair metadata to get mean GSD. Residuals will remain in pixels.
../../_images/b31b9073d9ca3e280757f560ee351ad996b2fc4e072048d679f6be1ff1edcde6.png

Camera Position and Orientation Changes#

The residual maps show how well the tie points reproject after the solve; this figure shows what the solve did to the five cameras themselves, read from the ba/ folder alone (the *.adjust translation and rotation per camera, camera_offsets.txt, and triangulation_offsets.txt — no original cameras needed). The same figure is produced by the bundle_adjust_cameras command-line tool and is a page of the asp_report PDF.

With --camera-weight 0 the cameras were free to move, and they did: 24–70 m horizontally, with rotations of 0.002–0.005°. Those two numbers are the same correction seen twice — at ~770 km altitude a 0.005° rotation sweeps the footprint by ~67 m, so a camera can slide sideways and tilt back with almost no change to where its rays land. The bottom row confirms it: the triangulated points moved by a median of 0.8–1.0 m per image, not tens of meters. Compare the two-scene UCSD example, where the same figure shows sub-meter camera shifts.

from asp_plot.bundle_adjust import ReadBundleAdjustCameras, PlotBundleAdjustCameras

cam_gdf = ReadBundleAdjustCameras(directory, bundle_adjust_directory).get_camera_optimization_gdf(
    map_crs=int(map_crs.split(":")[-1])
)
fig = PlotBundleAdjustCameras(cam_gdf, title="Camera changes from bundle_adjust (Atlanta, 5-scene WorldView-2)").summary_plot()
../../_images/75556dc6ba8c4a04025d2df7bc95230fb262b2ce0d4c8e7a93252581d8c5c71e.png

Multi-View Stereo: Three Scenes#

ASP supports true multi-view stereo: pass N images and N cameras, and the first image is the reference — disparities are computed from it to every other image, followed by a joint triangulation into a single point cloud. Here nadir13 is the reference. (The ASP documentation discourages this mode in favor of pairwise runs merged with dem_mosaic — which is exactly the alternative we build and compare below. A same-pass collect is the best case for MVS: identical illumination and rigid relative geometry.)

The full scenes are large, so we restrict correlation to an airport ROI with --left-image-crop-win (pixel coordinates on the reference image). The window was derived by inverse-projecting the four corners of the airport’s UTM box 735685 3722295 741350 3727695 (EPSG:32616) through the reference tile’s RPC model — the original .tif carries RPC metadata; the wv_correct output does not — with a 500 px buffer:

from osgeo import gdal, osr

gdal.UseExceptions()

utm = osr.SpatialReference(); utm.ImportFromEPSG(32616)
geo = osr.SpatialReference(); geo.ImportFromEPSG(4326)
for srs in (utm, geo):
    srs.SetAxisMappingStrategy(osr.OAMS_TRADITIONAL_GIS_ORDER)
ct = osr.CoordinateTransformation(utm, geo)

ds = gdal.Open("1030010002B7D800_P002.tif")  # has RPC metadata
tx = gdal.Transformer(ds, None, ["METHOD=RPC", "RPC_HEIGHT=300"])

xs, ys = [], []
for x, y in [(735685, 3722295), (741350, 3722295),
             (741350, 3727695), (735685, 3727695)]:
    lon, lat, _ = ct.TransformPoint(x, y)
    _, (px, py, _) = tx.TransformPoint(1, lon, lat, 300.0)
    xs.append(px); ys.append(py)

ulx, uly = int(min(xs)) - 500, int(min(ys)) - 500
lrx, lry = int(max(xs)) + 500, int(max(ys)) + 500
print(f"--left-image-crop-win {ulx} {uly} {lrx - ulx} {lry - uly}")
# => --left-image-crop-win 5879 13107 12981 11894

Run the multi-view stereo (non-mapprojected images, --alignment-method affineepipolar) and grid the joint point cloud at ~4× the input GSD:

$ cd atlanta_mvs

$ parallel_stereo \
    --stereo-algorithm asp_mgm --subpixel-mode 9 \
    --alignment-method affineepipolar \
    --left-image-crop-win 5879 13107 12981 11894 \
    --bundle-adjust-prefix ba/run \
    1030010002B7D800_P002_corr.tif 1030010003CAF100_P002_corr.tif 1030010002649200_P001_corr.tif \
    1030010002B7D800_P002.xml 1030010003CAF100_P002.xml 1030010002649200_P001.xml \
    stereo_mvs3/run

$ point2dem --tr 1.9 --t_srs EPSG:32616 --errorimage stereo_mvs3/run-PC.tif

Multi-View Results#

ASP keeps the per-pair intermediate products of a multi-view run (aligned scenes, match points, disparity maps) in run-pair*/ subdirectories, with only the joint products (point cloud, DEM, triangulation error) at the top level. asp_plot detects this layout and renders the scenes, match points, and disparity one figure per pair — the reference image is the same in every pair:

from asp_plot.scenes import ScenePlotter

scene_plotter = ScenePlotter(directory, stereo_directory, title="Input Scenes")
scene_plotter.plot_scenes()
[]
../../_images/163403a9d5e5394426e1b26c97ccca4b933534c4de77c91ec464978a9112323e.png ../../_images/54b3af8dc45e2093d1c7e9babe054a414afc54353528cc69b0dcd0eea5a4bf6d.png
from asp_plot.stereo import StereoPlotter

stereo_plotter = StereoPlotter(directory, stereo_directory)
stereo_plotter.title = "Stereo Match Points"
stereo_plotter.plot_match_points()
WARNING:asp_plot.stereo:

No reference DEM found in log files. Please supply the reference DEM you used during stereo processing (or another reference DEM) if you would like to see some difference maps.
ASP DEM: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM.tif
[]
../../_images/f2738629128ad00abacb41d6e9f23277ffdada55f7e79d6fc722c8a81acea3e0.png ../../_images/5ee8c21e7303d62f9c3dc901e756e12510bbae8c7bf5b59d9e5f0a2c680352d2.png
stereo_plotter.title = "Disparity (pixels)"
stereo_plotter.plot_disparity(unit="pixels", quiver=True)
[]
../../_images/f0b66bb14e28aa26d1cb01553198d974d176cf7a0e6763e61dbdd7de937a063f.png ../../_images/e4237514a2b05bd38b16df47047208ed87e02f06b3f38552358c0809f614b9b1.png

The joint products of the multi-view run — the DEM with triangulation error, and detailed hillshades:

stereo_plotter.title = "Multi-View Stereo DEM Results (nadir13 reference, 3 scenes)"
stereo_plotter.plot_dem_results()
Plotting DEM results. This can take a minute for large inputs.
WARNING:asp_plot.stereo:

Found a DEM of difference: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM_cop30_atlanta_wgs84_utm_diff.tif.
Using that for difference map plotting.
../../_images/4426461020c93719cdc7213e0346cbd131358fbd100bf06a646960307a68c4d6.png
stereo_plotter.title = "Hillshade with Details"
stereo_plotter.plot_detailed_hillshade(subset_km=1.0)
../../_images/d1b8e2105087ff80163bb36fd90d9b906edb43253b4ec0235b699121366556d5.png

Pairwise Stereo + dem_mosaic#

Now the workflow the ASP documentation recommends instead of MVS: run each of the three pairs through parallel_stereo independently — same bundle adjustment prefix, same settings — grid each point cloud with point2dem, and blend the three DEMs with dem_mosaic.

One detail needs care. --left-image-crop-win is given in left-image pixel coordinates. For the two pairs whose left image is the reference (nadir13–nadir10, nadir13–nadir16) we reuse the reference crop window above. The nadir10–nadir16 pair does not include the reference, so we derive an equivalent window on nadir10 from the bundle-adjustment clean match points: take the nadir13↔nadir10 matches, keep those whose nadir13 pixel falls inside the reference crop window, and take the bounding box of their nadir10 pixels (no RPCs needed — the match points are the mapping between the two image spaces):

import os

import numpy as np

XOFF, YOFF, W, H = 5879, 13107, 12981, 11894  # reference (nadir13) crop win

ba_match_fn = os.path.expanduser(
    f"{directory}ba/run-1030010002B7D800_P002_corr__1030010003CAF100_P002_corr-clean.match"
)

# get_match_point_df() parses ASP's binary match format into x1/y1 (nadir13)
# and x2/y2 (nadir10) pixel coordinates
match_df = stereo_plotter.get_match_point_df(match_point_fn=ba_match_fn)

inwin = match_df[
    match_df.x1.between(XOFF, XOFF + W) & match_df.y1.between(YOFF, YOFF + H)
]

pad = 100
x0, y0 = int(inwin.x2.min()) - pad, int(inwin.y2.min()) - pad
x1, y1 = int(inwin.x2.max()) + pad, int(inwin.y2.max()) + pad
print(f"{len(inwin)} of {len(match_df)} clean match points fall in the reference crop win")
print(f"nadir10 crop win: --left-image-crop-win {x0} {y0} {x1 - x0} {y1 - y0}")
775 of 4725 clean match points fall in the reference crop win
nadir10 crop win: --left-image-crop-win 5540 13223 13206 12931

Run the three pairs and mosaic the DEMs:

$ cd atlanta_mvs

$ N13=1030010002B7D800_P002; N10=1030010003CAF100_P002; N16=1030010002649200_P001

# nadir13-nadir10 and nadir13-nadir16: reference crop win
$ for right in $N10 $N16; do
    out=stereo_pair_13_$([ $right = $N10 ] && echo 10 || echo 16)
    parallel_stereo \
      --stereo-algorithm asp_mgm --subpixel-mode 9 \
      --alignment-method affineepipolar \
      --left-image-crop-win 5879 13107 12981 11894 \
      --bundle-adjust-prefix ba/run \
      ${N13}_corr.tif ${right}_corr.tif ${N13}.xml ${right}.xml ${out}/run
    point2dem --tr 1.9 --t_srs EPSG:32616 --errorimage ${out}/run-PC.tif
  done

# nadir10-nadir16: crop win derived from the match points above
$ parallel_stereo \
    --stereo-algorithm asp_mgm --subpixel-mode 9 \
    --alignment-method affineepipolar \
    --left-image-crop-win 5540 13223 13206 12931 \
    --bundle-adjust-prefix ba/run \
    ${N10}_corr.tif ${N16}_corr.tif ${N10}.xml ${N16}.xml stereo_pair_10_16/run
$ point2dem --tr 1.9 --t_srs EPSG:32616 --errorimage stereo_pair_10_16/run-PC.tif

# Blend the three pairwise DEMs (dem_mosaic averages where they overlap)
$ dem_mosaic \
    stereo_pair_13_10/run-DEM.tif stereo_pair_13_16/run-DEM.tif \
    stereo_pair_10_16/run-DEM.tif -o pairwise_mosaic
$ mv pairwise_mosaic-tile-0.tif pairwise_mosaic-DEM.tif

Comparison: MVS vs. Pairwise + Mosaic#

Both DEMs were produced from the same five-scene bundle adjustment, the same three images, the same matched ground crops, and the same correlation settings — the only difference is joint triangulation versus independent pairs blended after gridding.

DEM-to-DEM difference#

import os

import matplotlib.pyplot as plt
import numpy as np

from asp_plot.utils import Raster, nmad

mvs_dem_fn = os.path.expanduser(f"{directory}stereo_mvs3/run-DEM.tif")
pairwise_dem_fn = os.path.expanduser(f"{directory}pairwise_mosaic-DEM.tif")

# MVS minus pairwise mosaic, on the MVS grid
diff = Raster(pairwise_dem_fn).compute_difference(mvs_dem_fn)

med, spread = np.ma.median(diff), nmad(diff.compressed())
print(f"MVS - pairwise: median {med:+.2f} m, NMAD {spread:.2f} m")

fig, axes = plt.subplots(1, 2, figsize=(12, 5), width_ratios=[1.2, 1])
im = axes[0].imshow(diff, cmap="RdBu", vmin=-2, vmax=2)
fig.colorbar(im, ax=axes[0], label="MVS - pairwise mosaic (m)", shrink=0.8)
axes[0].set_title("DEM difference")
axes[0].set_axis_off()
axes[1].hist(diff.compressed(), bins=256, range=(-5, 5), color="0.4")
axes[1].axvline(0, color="k", lw=0.5)
axes[1].set_xlabel("MVS - pairwise mosaic (m)")
axes[1].set_title(f"median {med:+.2f} m, NMAD {spread:.2f} m")
fig.tight_layout()
MVS - pairwise: median +0.02 m, NMAD 0.51 m
../../_images/935d0d81dfe7204ce7291a8f604cef18d551abd207806ffd0f7ff4091d301b7a.png

Scoring every DEM against the same ICESat-2 sample#

DEMBenchmark scores any number of DEMs against one altimetry sample — here the ATL06-SR parquet cache written when the report below was first generated, so loading it replays the same points without a SlideRule request. Every DEM gets the report’s recipe (ESA WorldCover water filter, 3σ outlier cut) and a pc_align --compute-translation-only of its own, with the products kept under dem_benchmark/<label>/ rather than inside the stereo folders.

Beyond the two DEMs above, the table includes the three single pairs behind the mosaic and a five-scene multi-view run made the same way (stereo_mvs5/, adding nadir8 and nadir21 to the joint solve), so the same figure shows which pair lowers the mosaic’s accuracy and whether more scenes help. Coverage and triangulation error are measured inside the common footprint of all six DEMs. The full experiment over every scene combination and processing flow is in worldview_spacenet_benchmark.ipynb.

from asp_plot.dem_benchmark import DEMBenchmark

bench = DEMBenchmark(
    directory=directory,
    dems={
        "MVS 3-scene": mvs_dem_fn,
        "3 pairs + mosaic": pairwise_dem_fn,
        "pair 13-10 (21.8°)": f"{directory}stereo_pair_13_10/run-DEM.tif",
        "pair 13-16 (5.1°)": f"{directory}stereo_pair_13_16/run-DEM.tif",
        "pair 10-16 (26.9°)": f"{directory}stereo_pair_10_16/run-DEM.tif",
        "MVS 5-scene": f"{directory}stereo_mvs5/run-DEM.tif",
    },
    parquet=f"{directory}atl06sr_all.parquet",
    reference="MVS 3-scene",
    title="Atlanta WV2 2009-12-22: same-pass scene combinations",
)
stats = bench.run()

stats.drop(columns=["dem_fn", "gsd_m", "north_shift_m", "east_shift_m", "down_shift_m"]).round(2)
=== [1/6] MVS 3-scene: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM.tif
Reusing ICESat-2 ATL06-SR points for 'all' from: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7756 (removed 181)
  7064 altimetry points: median +0.35 m, NMAD 0.71 m
Running pc_align on /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM.tif and /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/atl06sr_for_pc_align_all.csv
Writing to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all*
--> Setting number of processing threads to: 4

Creating output directory: "/Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align".
Writing log: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all-log-pc_align-08-28-0807-79412.txt
Will use datum (for CSV files): Geodetic Datum --> Name: WGS_1984  Spheroid: WGS 84  Semi-major axis: 6378137  Semi-minor axis: 6356752.3142451793  Meridian: Greenwich at 0  Proj4 Str: +proj=longlat +datum=WGS84 +no_defs
Computing the bounding boxes of the reference and source points using 1000000 sample points.
Computation of bounding boxes took 0.607869 s
Reference points box: Min: (-84.4622, 33.6097) width: 0.068204 height: 0.055019
Source points box:    Min: (-84.4637, 33.6096) width: 0.0713481 height: 0.0553039
Intersection box:     Min: (-84.4622, 33.6097) width: 0.068204 height: 0.055019
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM.tif

--> [.............................................................] 0%
--> [.............................................................] 1%
--> [*............................................................] 2%
--> [*............................................................] 3%
--> [**...........................................................] 4%
--> [***..........................................................] 5%
--> [***..........................................................] 6%
--> [****.........................................................] 7%
--> [****.........................................................] 8%
--> [*****........................................................] 9%
--> [******.......................................................] 10%
--> [******.......................................................] 11%
--> [*******......................................................] 12%
--> [*******......................................................] 13%
--> [********.....................................................] 14%
--> [*********....................................................] 15%
--> [*********....................................................] 16%
--> [**********...................................................] 17%
--> [***********..................................................] 18%
--> [***********..................................................] 19%
--> [************.................................................] 20%
--> [************.................................................] 21%
--> [*************................................................] 22%
--> [**************...............................................] 23%
--> [**************...............................................] 24%
--> [***************..............................................] 25%
--> [***************..............................................] 26%
--> [****************.............................................] 27%
--> [*****************............................................] 28%
--> [*****************............................................] 29%
--> [******************...........................................] 30%
--> [******************...........................................] 31%
--> [*******************..........................................] 32%
--> [********************.........................................] 33%
--> [********************.........................................] 34%
--> [*********************........................................] 35%
--> [**********************.......................................] 36%
--> [**********************.......................................] 37%
--> [***********************......................................] 38%
--> [***********************......................................] 39%
--> [************************.....................................] 40%
--> [*************************....................................] 41%
--> [*************************....................................] 42%
--> [**************************...................................] 43%
--> [**************************...................................] 44%
--> [***************************..................................] 45%
--> [****************************.................................] 46%
--> [****************************.................................] 47%
--> [*****************************................................] 48%
--> [******************************...............................] 49%
--> [******************************...............................] 50%
--> [*******************************..............................] 51%
--> [*******************************..............................] 52%
--> [********************************.............................] 53%
--> [*********************************............................] 54%
--> [*********************************............................] 55%
--> [**********************************...........................] 56%
--> [**********************************...........................] 57%
--> [***********************************..........................] 58%
--> [************************************.........................] 59%
--> [************************************.........................] 60%
--> [*************************************........................] 61%
--> [*************************************........................] 62%
--> [**************************************.......................] 63%
--> [***************************************......................] 64%
--> [***************************************......................] 65%
--> [****************************************.....................] 66%
--> [*****************************************....................] 67%
--> [*****************************************....................] 68%
--> [******************************************...................] 69%
--> [******************************************...................] 70%
--> [*******************************************..................] 71%
--> [********************************************.................] 72%
--> [********************************************.................] 73%
--> [*********************************************................] 74%
--> [*********************************************................] 75%
--> [**********************************************...............] 76%
--> [***********************************************..............] 77%
--> [***********************************************..............] 78%
--> [************************************************.............] 79%
--> [*************************************************............] 80%
--> [*************************************************............] 81%
--> [**************************************************...........] 82%
--> [**************************************************...........] 83%
--> [***************************************************..........] 84%
--> [****************************************************.........] 85%
--> [****************************************************.........] 86%
--> [*****************************************************........] 87%
--> [*****************************************************........] 88%
--> [******************************************************.......] 89%
--> [*******************************************************......] 90%
--> [*******************************************************......] 91%
--> [********************************************************.....] 92%
--> [********************************************************.....] 93%
--> [*********************************************************....] 94%
--> [**********************************************************...] 95%
--> [**********************************************************...] 96%
--> [***********************************************************..] 97%
--> [************************************************************.] 98%
--> [************************************************************.] 99%
--> [*************************************************************]
Loaded points: 10178438
Loading the reference point cloud took 3.01553 s
Data shifted internally by subtracting: Vector3(516145,-5.29076e+06,3.51317e+06)
Building the reference cloud tree.
Reference point cloud processing took 1.78525 s
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/atl06sr_for_pc_align_all.csv
Loaded points: 7422
Loading the source point cloud took 0.011661 s
Filtering gross outliers
Filtering gross outliers took 0.122567 s
Reducing number of source points to: 7275
Not enough points left in the source cloud after filtering. Try loading more.
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/atl06sr_for_pc_align_all.csv
Loaded points: 7422
Loading the source point cloud (second attempt) took 0.011112 s
Filtering gross outliers
Filtering gross outliers took 0.020027 s
Reducing number of source points to: 7275
Number of errors: 7275
Input: error percentile of smallest errors (meters): 16%: 0.203278, 50%: 0.60159, 84%: 2.64319
Input: mean of smallest errors (meters): 25%: 0.158646, 50%: 0.301829, 75%: 0.526431, 100%: 1.47865
Input stats (meters): Mean: 1.47865, StdDev: 2.24615, RMSE: 2.68916, Median: 0.60159, NMAD: 0.61475
Initial error computation took 0.011801 s
Match ratio: 0.750103
Alignment took 1.81941 s
Number of errors: 7275
Output: error percentile of smallest errors (meters): 16%: 0.14227, 50%: 0.531919, 84%: 2.61358
Output: mean of smallest errors (meters): 25%: 0.111731, 50%: 0.234513, 75%: 0.465001, 100%: 1.42676
Output stats (meters): Mean: 1.42676, StdDev: 2.26257, RMSE: 2.67486, Median: 0.531919, NMAD: 0.602319
Final error computation took 0.019778 s
Alignment transform (origin is planet center):
1                    0                    0   0.4852351390291005
0                    1                    0 -0.01315723545849323
0                    0                    1  -0.3833301533013582
0                    0                    0                    1
Centroid of source points (Cartesian, meters): Vector3(517113.01,-5290683.8,3513129.2)
Centroid of source points (lat,lon,z): Vector3(33.636868,-84.417625,263.52136)

Translation vector (Cartesian, meters): Vector3(0.48523514,-0.013157236,-0.38333015)
Translation vector (North-East-Down, meters): Vector3(-0.35254739,0.48165396,0.16213596)
Translation vector magnitude (meters): 0.61852103
Maximum displacement of points between the source cloud with any initial transform applied to it and the source cloud after alignment to the reference: 0.61852103 m
Translation vector (lat,lon,z): Vector3(-3.1783808e-06,5.1913625e-06,-0.16213593)

Transform scale - 1 = 0
Euler angles (degrees): Vector3(0,-0,0)
Euler angles (North-East-Down, degrees): Vector3(2.4208134e-16,7.1833047e-16,-1.8954278e-16)
Axis of rotation and angle (degrees): Vector3(nan,nan,nan) 0
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all-inverse-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all-beg_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all-end_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/pc_align/pc_align_all-iterationInfo.csv
Saving to disk took 0.021921 s

Command executed successfully.
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_3-scene/run-DEM_pc_align_translated.tif
  after pc_align (|t| = 0.62 m): median +0.19 m, NMAD 0.71 m

=== [2/6] 3 pairs + mosaic: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/pairwise_mosaic-DEM.tif
Reusing ICESat-2 ATL06-SR points for 'all' from: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7757 (removed 180)
  7393 altimetry points: median +0.42 m, NMAD 1.02 m
Running pc_align on /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/pairwise_mosaic-DEM.tif and /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/atl06sr_for_pc_align_all.csv
Writing to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all*
--> Setting number of processing threads to: 4

Creating output directory: "/Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align".
Writing log: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all-log-pc_align-08-28-0807-79522.txt
Will use datum (for CSV files): Geodetic Datum --> Name: WGS_1984  Spheroid: WGS 84  Semi-major axis: 6378137  Semi-minor axis: 6356752.3142451793  Meridian: Greenwich at 0  Proj4 Str: +proj=longlat +datum=WGS84 +no_defs
Computing the bounding boxes of the reference and source points using 1000000 sample points.
Computation of bounding boxes took 0.623862 s
Reference points box: Min: (-84.4626, 33.6091) width: 0.069194 height: 0.0570714
Source points box:    Min: (-84.4637, 33.6096) width: 0.0713481 height: 0.0553039
Intersection box:     Min: (-84.4626, 33.6096) width: 0.069194 height: 0.0553039
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/pairwise_mosaic-DEM.tif

--> [.............................................................] 0%
--> [.............................................................] 1%
--> [*............................................................] 2%
--> [*............................................................] 3%
--> [**...........................................................] 4%
--> [***..........................................................] 5%
--> [***..........................................................] 6%
--> [****.........................................................] 7%
--> [****.........................................................] 8%
--> [*****........................................................] 9%
--> [******.......................................................] 10%
--> [******.......................................................] 11%
--> [*******......................................................] 12%
--> [********.....................................................] 13%
--> [********.....................................................] 14%
--> [*********....................................................] 15%
--> [*********....................................................] 16%
--> [**********...................................................] 17%
--> [***********..................................................] 18%
--> [***********..................................................] 19%
--> [************.................................................] 20%
--> [*************................................................] 21%
--> [*************................................................] 22%
--> [**************...............................................] 23%
--> [**************...............................................] 24%
--> [***************..............................................] 26%
--> [****************.............................................] 27%
--> [****************.............................................] 28%
--> [*****************............................................] 29%
--> [******************...........................................] 30%
--> [******************...........................................] 31%
--> [*******************..........................................] 32%
--> [*******************..........................................] 33%
--> [********************.........................................] 34%
--> [*********************........................................] 35%
--> [*********************........................................] 36%
--> [**********************.......................................] 37%
--> [***********************......................................] 38%
--> [***********************......................................] 39%
--> [************************.....................................] 40%
--> [************************.....................................] 41%
--> [*************************....................................] 42%
--> [**************************...................................] 43%
--> [**************************...................................] 44%
--> [***************************..................................] 45%
--> [****************************.................................] 46%
--> [****************************.................................] 47%
--> [*****************************................................] 48%
--> [*****************************................................] 49%
--> [******************************...............................] 50%
--> [*******************************..............................] 51%
--> [*******************************..............................] 52%
--> [********************************.............................] 53%
--> [********************************.............................] 54%
--> [*********************************............................] 55%
--> [**********************************...........................] 56%
--> [**********************************...........................] 57%
--> [***********************************..........................] 58%
--> [************************************.........................] 59%
--> [************************************.........................] 60%
--> [*************************************........................] 61%
--> [*************************************........................] 62%
--> [**************************************.......................] 63%
--> [***************************************......................] 64%
--> [***************************************......................] 65%
--> [****************************************.....................] 66%
--> [*****************************************....................] 67%
--> [*****************************************....................] 68%
--> [******************************************...................] 69%
--> [******************************************...................] 70%
--> [*******************************************..................] 71%
--> [********************************************.................] 72%
--> [********************************************.................] 73%
--> [*********************************************................] 74%
--> [**********************************************...............] 75%
--> [**********************************************...............] 77%
--> [***********************************************..............] 78%
--> [***********************************************..............] 79%
--> [************************************************.............] 80%
--> [*************************************************............] 81%
--> [*************************************************............] 82%
--> [**************************************************...........] 83%
--> [***************************************************..........] 84%
--> [***************************************************..........] 85%
--> [****************************************************.........] 86%
--> [****************************************************.........] 87%
--> [*****************************************************........] 88%
--> [******************************************************.......] 89%
--> [******************************************************.......] 90%
--> [*******************************************************......] 91%
--> [********************************************************.....] 92%
--> [********************************************************.....] 93%
--> [*********************************************************....] 94%
--> [*********************************************************....] 95%
--> [**********************************************************...] 96%
--> [***********************************************************..] 97%
--> [***********************************************************..] 98%
--> [************************************************************.] 99%
--> [************************************************************.] 100%
--> [*************************************************************]
Loaded points: 10693523
Loading the reference point cloud took 3.22355 s
Data shifted internally by subtracting: Vector3(516152,-5.29075e+06,3.51318e+06)
Building the reference cloud tree.
Reference point cloud processing took 1.90776 s
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/atl06sr_for_pc_align_all.csv
Loaded points: 7546
Loading the source point cloud took 0.011104 s
Filtering gross outliers
Filtering gross outliers took 0.139214 s
Reducing number of source points to: 7496
Not enough points left in the source cloud after filtering. Try loading more.
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/atl06sr_for_pc_align_all.csv
Loaded points: 7546
Loading the source point cloud (second attempt) took 0.011602 s
Filtering gross outliers
Filtering gross outliers took 0.021383 s
Reducing number of source points to: 7496
Number of errors: 7496
Input: error percentile of smallest errors (meters): 16%: 0.247291, 50%: 0.79211, 84%: 2.7656
Input: mean of smallest errors (meters): 25%: 0.195869, 50%: 0.37996, 75%: 0.657047, 100%: 1.57062
Input stats (meters): Mean: 1.57062, StdDev: 2.1413, RMSE: 2.65556, Median: 0.79211, NMAD: 0.796204
Initial error computation took 0.013857 s
Match ratio: 0.750133
Alignment took 1.86879 s
Number of errors: 7496
Output: error percentile of smallest errors (meters): 16%: 0.184373, 50%: 0.727229, 84%: 2.70632
Output: mean of smallest errors (meters): 25%: 0.144436, 50%: 0.314391, 75%: 0.596292, 100%: 1.51806
Output stats (meters): Mean: 1.51806, StdDev: 2.145, RMSE: 2.62784, Median: 0.727229, NMAD: 0.803959
Final error computation took 0.014033 s
Alignment transform (origin is planet center):
1                   0                   0 0.05510240391595289
0                   1                   0  0.8607307774946094
0                   0                   1  0.9106519496999681
0                   0                   0                   1
Centroid of source points (Cartesian, meters): Vector3(517096.52,-5290670.7,3513151.5)
Centroid of source points (lat,lon,z): Vector3(33.637108,-84.417788,263.73809)

Translation vector (Cartesian, meters): Vector3(0.055102404,0.86073078,0.91065195)
Translation vector (North-East-Down, meters): Vector3(1.22973,0.13856774,0.20431307)
Translation vector magnitude (meters): 1.254265
Maximum displacement of points between the source cloud with any initial transform applied to it and the source cloud after alignment to the reference: 1.254265 m
Translation vector (lat,lon,z): Vector3(1.1086594e-05,1.4935152e-06,-0.20431295)

Transform scale - 1 = 0
Euler angles (degrees): Vector3(0,-0,0)
Euler angles (North-East-Down, degrees): Vector3(2.9715829e-16,2.8952532e-15,-6.9274699e-16)
Axis of rotation and angle (degrees): Vector3(nan,nan,nan) 0
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all-inverse-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all-beg_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all-end_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pc_align/pc_align_all-iterationInfo.csv
Saving to disk took 0.025438 s

Command executed successfully.
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/3_pairs_mosaic/pairwise_mosaic-DEM_pc_align_translated.tif
  after pc_align (|t| = 1.25 m): median +0.21 m, NMAD 1.02 m
=== [3/6] pair 13-10 (21.8°): /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_13_10/run-DEM.tif
Reusing ICESat-2 ATL06-SR points for 'all' from: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7760 (removed 177)
  6947 altimetry points: median +0.29 m, NMAD 0.71 m
Running pc_align on /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_13_10/run-DEM.tif and /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/atl06sr_for_pc_align_all.csv
Writing to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all*
--> Setting number of processing threads to: 4

Creating output directory: "/Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align".
Writing log: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all-log-pc_align-08-28-0807-79661.txt
Will use datum (for CSV files): Geodetic Datum --> Name: WGS_1984  Spheroid: WGS 84  Semi-major axis: 6378137  Semi-minor axis: 6356752.3142451793  Meridian: Greenwich at 0  Proj4 Str: +proj=longlat +datum=WGS84 +no_defs
Computing the bounding boxes of the reference and source points using 1000000 sample points.
Computation of bounding boxes took 1.34501 s
Reference points box: Min: (-84.4621, 33.6097) width: 0.0681619 height: 0.0550867
Source points box:    Min: (-84.4637, 33.6096) width: 0.0713481 height: 0.0553039
Intersection box:     Min: (-84.4621, 33.6097) width: 0.0681619 height: 0.0550867
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_13_10/run-DEM.tif

--> [.............................................................] 0%
--> [.............................................................] 1%
--> [*............................................................] 2%
--> [*............................................................] 3%
--> [**...........................................................] 4%
--> [***..........................................................] 5%
--> [***..........................................................] 6%
--> [****.........................................................] 7%
--> [****.........................................................] 8%
--> [*****........................................................] 9%
--> [******.......................................................] 10%
--> [******.......................................................] 11%
--> [*******......................................................] 12%
--> [*******......................................................] 13%
--> [********.....................................................] 14%
--> [*********....................................................] 15%
--> [*********....................................................] 16%
--> [**********...................................................] 17%
--> [***********..................................................] 18%
--> [***********..................................................] 19%
--> [************.................................................] 20%
--> [************.................................................] 21%
--> [*************................................................] 22%
--> [**************...............................................] 23%
--> [**************...............................................] 24%
--> [***************..............................................] 25%
--> [***************..............................................] 26%
--> [****************.............................................] 27%
--> [*****************............................................] 28%
--> [*****************............................................] 29%
--> [******************...........................................] 30%
--> [*******************..........................................] 31%
--> [*******************..........................................] 32%
--> [********************.........................................] 33%
--> [********************.........................................] 34%
--> [*********************........................................] 35%
--> [**********************.......................................] 36%
--> [**********************.......................................] 37%
--> [***********************......................................] 38%
--> [***********************......................................] 39%
--> [************************.....................................] 40%
--> [*************************....................................] 41%
--> [*************************....................................] 42%
--> [**************************...................................] 43%
--> [**************************...................................] 44%
--> [***************************..................................] 45%
--> [****************************.................................] 46%
--> [****************************.................................] 47%
--> [*****************************................................] 48%
--> [******************************...............................] 49%
--> [******************************...............................] 50%
--> [*******************************..............................] 51%
--> [*******************************..............................] 52%
--> [********************************.............................] 53%
--> [*********************************............................] 54%
--> [*********************************............................] 55%
--> [**********************************...........................] 56%
--> [**********************************...........................] 57%
--> [***********************************..........................] 58%
--> [************************************.........................] 59%
--> [************************************.........................] 60%
--> [*************************************........................] 61%
--> [**************************************.......................] 62%
--> [**************************************.......................] 63%
--> [***************************************......................] 64%
--> [***************************************......................] 65%
--> [****************************************.....................] 66%
--> [*****************************************....................] 67%
--> [*****************************************....................] 68%
--> [******************************************...................] 69%
--> [******************************************...................] 70%
--> [*******************************************..................] 71%
--> [********************************************.................] 72%
--> [********************************************.................] 73%
--> [*********************************************................] 74%
--> [**********************************************...............] 75%
--> [**********************************************...............] 76%
--> [***********************************************..............] 77%
--> [***********************************************..............] 78%
--> [************************************************.............] 79%
--> [*************************************************............] 80%
--> [*************************************************............] 81%
--> [**************************************************...........] 82%
--> [**************************************************...........] 83%
--> [***************************************************..........] 84%
--> [****************************************************.........] 85%
--> [****************************************************.........] 86%
--> [*****************************************************........] 87%
--> [*****************************************************........] 88%
--> [******************************************************.......] 90%
--> [*******************************************************......] 91%
--> [*******************************************************......] 92%
--> [********************************************************.....] 93%
--> [*********************************************************....] 94%
--> [*********************************************************....] 95%
--> [**********************************************************...] 96%
--> [**********************************************************...] 97%
--> [***********************************************************..] 98%
--> [************************************************************.] 99%
--> [************************************************************.] 100%
--> [*************************************************************]
Loaded points: 10059063
Loading the reference point cloud took 3.05831 s
Data shifted internally by subtracting: Vector3(516151,-5.29076e+06,3.51317e+06)
Building the reference cloud tree.
Reference point cloud processing took 1.87825 s
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/atl06sr_for_pc_align_all.csv
Loaded points: 7420
Loading the source point cloud took 0.011972 s
Filtering gross outliers
Filtering gross outliers took 0.15435 s
Reducing number of source points to: 7239
Not enough points left in the source cloud after filtering. Try loading more.
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/atl06sr_for_pc_align_all.csv
Loaded points: 7420
Loading the source point cloud (second attempt) took 0.011719 s
Filtering gross outliers
Filtering gross outliers took 0.021295 s
Reducing number of source points to: 7239
Number of errors: 7239
Input: error percentile of smallest errors (meters): 16%: 0.182158, 50%: 0.596069, 84%: 2.86529
Input: mean of smallest errors (meters): 25%: 0.142732, 50%: 0.285163, 75%: 0.516108, 100%: 1.56949
Input stats (meters): Mean: 1.56949, StdDev: 2.48702, RMSE: 2.94085, Median: 0.596069, NMAD: 0.632485
Initial error computation took 0.016137 s
Match ratio: 0.750104
Alignment took 2.01268 s
Number of errors: 7239
Output: error percentile of smallest errors (meters): 16%: 0.143686, 50%: 0.541902, 84%: 2.83032
Output: mean of smallest errors (meters): 25%: 0.114725, 50%: 0.243825, 75%: 0.475543, 100%: 1.53663
Output stats (meters): Mean: 1.53663, StdDev: 2.50284, RMSE: 2.93691, Median: 0.541902, NMAD: 0.61377
Final error computation took 0.014478 s
Alignment transform (origin is planet center):
1                    0                    0   0.4950664489297196
0                    1                    0 -0.04485032148659229
0                    0                    1  -0.3570535168983042
0                    0                    0                    1
Centroid of source points (Cartesian, meters): Vector3(517119.04,-5290683.1,3513129.4)
Centroid of source points (lat,lon,z): Vector3(33.63687,-84.417559,263.53378)

Translation vector (Cartesian, meters): Vector3(0.49506645,-0.044850321,-0.35705352)
Translation vector (North-East-Down, meters): Vector3(-0.34867284,0.48835553,0.12052252)
Translation vector magnitude (meters): 0.61203722
Maximum displacement of points between the source cloud with any initial transform applied to it and the source cloud after alignment to the reference: 0.61203722 m
Translation vector (lat,lon,z): Vector3(-3.1434499e-06,5.2635935e-06,-0.12052249)

Transform scale - 1 = 0
Euler angles (degrees): Vector3(0,-0,0)
Euler angles (North-East-Down, degrees): Vector3(-2.8981398e-16,-2.7225385e-16,-6.7435754e-17)
Axis of rotation and angle (degrees): Vector3(nan,nan,nan) 0
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all-inverse-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all-beg_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all-end_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/pc_align/pc_align_all-iterationInfo.csv
Saving to disk took 0.025431 s

Command executed successfully.
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-10_21.8/run-DEM_pc_align_translated.tif
  after pc_align (|t| = 0.61 m): median +0.17 m, NMAD 0.72 m
=== [4/6] pair 13-16 (5.1°): /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_13_16/run-DEM.tif
Reusing ICESat-2 ATL06-SR points for 'all' from: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7779 (removed 158)
  7013 altimetry points: median +0.49 m, NMAD 1.54 m
Running pc_align on /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_13_16/run-DEM.tif and /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/atl06sr_for_pc_align_all.csv
Writing to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all*
--> Setting number of processing threads to: 4

Creating output directory: "/Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align".
Writing log: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all-log-pc_align-08-28-0807-79787.txt
Will use datum (for CSV files): Geodetic Datum --> Name: WGS_1984  Spheroid: WGS 84  Semi-major axis: 6378137  Semi-minor axis: 6356752.3142451793  Meridian: Greenwich at 0  Proj4 Str: +proj=longlat +datum=WGS84 +no_defs
Computing the bounding boxes of the reference and source points using 1000000 sample points.
Computation of bounding boxes took 0.65652 s
Reference points box: Min: (-84.4622, 33.6097) width: 0.0682126 height: 0.055115
Source points box:    Min: (-84.4637, 33.6096) width: 0.0713481 height: 0.0553039
Intersection box:     Min: (-84.4622, 33.6097) width: 0.0682126 height: 0.055115
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_13_16/run-DEM.tif

--> [.............................................................] 0%
--> [.............................................................] 1%
--> [*............................................................] 2%
--> [*............................................................] 3%
--> [**...........................................................] 4%
--> [***..........................................................] 5%
--> [***..........................................................] 6%
--> [****.........................................................] 7%
--> [****.........................................................] 8%
--> [*****........................................................] 9%
--> [******.......................................................] 10%
--> [******.......................................................] 11%
--> [*******......................................................] 12%
--> [*******......................................................] 13%
--> [********.....................................................] 14%
--> [*********....................................................] 15%
--> [*********....................................................] 16%
--> [**********...................................................] 17%
--> [***********..................................................] 18%
--> [***********..................................................] 19%
--> [************.................................................] 20%
--> [************.................................................] 21%
--> [*************................................................] 22%
--> [**************...............................................] 23%
--> [**************...............................................] 24%
--> [***************..............................................] 25%
--> [***************..............................................] 26%
--> [****************.............................................] 27%
--> [*****************............................................] 28%
--> [*****************............................................] 29%
--> [******************...........................................] 30%
--> [*******************..........................................] 31%
--> [*******************..........................................] 32%
--> [********************.........................................] 33%
--> [********************.........................................] 34%
--> [*********************........................................] 35%
--> [**********************.......................................] 36%
--> [**********************.......................................] 37%
--> [***********************......................................] 38%
--> [***********************......................................] 39%
--> [************************.....................................] 40%
--> [*************************....................................] 41%
--> [*************************....................................] 42%
--> [**************************...................................] 43%
--> [**************************...................................] 44%
--> [***************************..................................] 45%
--> [****************************.................................] 46%
--> [****************************.................................] 47%
--> [*****************************................................] 48%
--> [******************************...............................] 49%
--> [******************************...............................] 50%
--> [*******************************..............................] 51%
--> [*******************************..............................] 52%
--> [********************************.............................] 53%
--> [*********************************............................] 54%
--> [*********************************............................] 55%
--> [**********************************...........................] 56%
--> [**********************************...........................] 57%
--> [***********************************..........................] 58%
--> [************************************.........................] 59%
--> [************************************.........................] 60%
--> [*************************************........................] 61%
--> [**************************************.......................] 62%
--> [**************************************.......................] 63%
--> [***************************************......................] 64%
--> [***************************************......................] 65%
--> [****************************************.....................] 66%
--> [*****************************************....................] 67%
--> [*****************************************....................] 68%
--> [******************************************...................] 69%
--> [******************************************...................] 70%
--> [*******************************************..................] 71%
--> [********************************************.................] 72%
--> [********************************************.................] 73%
--> [*********************************************................] 74%
--> [*********************************************................] 75%
--> [**********************************************...............] 76%
--> [***********************************************..............] 77%
--> [***********************************************..............] 78%
--> [************************************************.............] 79%
--> [*************************************************............] 80%
--> [*************************************************............] 81%
--> [**************************************************...........] 82%
--> [**************************************************...........] 83%
--> [***************************************************..........] 84%
--> [****************************************************.........] 85%
--> [****************************************************.........] 86%
--> [*****************************************************........] 87%
--> [*****************************************************........] 88%
--> [******************************************************.......] 89%
--> [*******************************************************......] 90%
--> [*******************************************************......] 91%
--> [********************************************************.....] 92%
--> [*********************************************************....] 93%
--> [*********************************************************....] 94%
--> [**********************************************************...] 95%
--> [**********************************************************...] 96%
--> [***********************************************************..] 97%
--> [************************************************************.] 98%
--> [************************************************************.] 99%
--> [*************************************************************]
Loaded points: 10053873
Loading the reference point cloud took 3.02691 s
Data shifted internally by subtracting: Vector3(516146,-5.29076e+06,3.51317e+06)
Building the reference cloud tree.
Reference point cloud processing took 1.90607 s
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/atl06sr_for_pc_align_all.csv
Loaded points: 7444
Loading the source point cloud took 0.011122 s
Filtering gross outliers
Filtering gross outliers took 0.123059 s
Reducing number of source points to: 7281
Not enough points left in the source cloud after filtering. Try loading more.
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/atl06sr_for_pc_align_all.csv
Loaded points: 7444
Loading the source point cloud (second attempt) took 0.011587 s
Filtering gross outliers
Filtering gross outliers took 0.02375 s
Reducing number of source points to: 7281
Number of errors: 7281
Input: error percentile of smallest errors (meters): 16%: 0.337285, 50%: 1.17298, 84%: 3.21136
Input: mean of smallest errors (meters): 25%: 0.2664, 50%: 0.555197, 75%: 0.919032, 100%: 1.90493
Input stats (meters): Mean: 1.90493, StdDev: 2.30717, RMSE: 2.99195, Median: 1.17298, NMAD: 1.12739
Initial error computation took 0.016006 s
Match ratio: 0.750034
Alignment took 1.73527 s
Number of errors: 7281
Output: error percentile of smallest errors (meters): 16%: 0.319874, 50%: 1.11489, 84%: 3.14147
Output: mean of smallest errors (meters): 25%: 0.252643, 50%: 0.523977, 75%: 0.875953, 100%: 1.86294
Output stats (meters): Mean: 1.86294, StdDev: 2.31176, RMSE: 2.96897, Median: 1.11489, NMAD: 1.0856
Final error computation took 0.014345 s
Alignment transform (origin is planet center):
1                     0                     0    0.4249587656813674
0                     1                     0 -0.007778051309287548
0                     0                     1   -0.4649613909423351
0                     0                     0                     1
Centroid of source points (Cartesian, meters): Vector3(517112.11,-5290683.3,3513130)
Centroid of source points (lat,lon,z): Vector3(33.636877,-84.417634,263.54215)

Translation vector (Cartesian, meters): Vector3(0.42495877,-0.0077780513,-0.46496139)
Translation vector (North-East-Down, meters): Vector3(-0.41429713,0.42218673,0.21669287)
Translation vector magnitude (meters): 0.62995202
Maximum displacement of points between the source cloud with any initial transform applied to it and the source cloud after alignment to the reference: 0.62995202 m
Translation vector (lat,lon,z): Vector3(-3.7350838e-06,4.5504133e-06,-0.21669285)

Transform scale - 1 = 0
Euler angles (degrees): Vector3(0,-0,0)
Euler angles (North-East-Down, degrees): Vector3(-2.6042977e-16,3.2603757e-16,4.4537716e-16)
Axis of rotation and angle (degrees): Vector3(nan,nan,nan) 0
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all-inverse-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all-beg_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all-end_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/pc_align/pc_align_all-iterationInfo.csv
Saving to disk took 0.021692 s

Command executed successfully.
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_13-16_5.1/run-DEM_pc_align_translated.tif
  after pc_align (|t| = 0.63 m): median +0.27 m, NMAD 1.54 m
=== [5/6] pair 10-16 (26.9°): /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_10_16/run-DEM.tif
Reusing ICESat-2 ATL06-SR points for 'all' from: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7761 (removed 176)
  6940 altimetry points: median +0.40 m, NMAD 0.64 m
Running pc_align on /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_10_16/run-DEM.tif and /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/atl06sr_for_pc_align_all.csv
Writing to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all*
--> Setting number of processing threads to: 4

Creating output directory: "/Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align".
Writing log: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all-log-pc_align-08-28-0808-79885.txt
Will use datum (for CSV files): Geodetic Datum --> Name: WGS_1984  Spheroid: WGS 84  Semi-major axis: 6378137  Semi-minor axis: 6356752.3142451793  Meridian: Greenwich at 0  Proj4 Str: +proj=longlat +datum=WGS84 +no_defs
Computing the bounding boxes of the reference and source points using 1000000 sample points.
Computation of bounding boxes took 0.634668 s
Reference points box: Min: (-84.4626, 33.6091) width: 0.069194 height: 0.0570714
Source points box:    Min: (-84.4637, 33.6096) width: 0.0713481 height: 0.0553039
Intersection box:     Min: (-84.4626, 33.6096) width: 0.069194 height: 0.0553039
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_pair_10_16/run-DEM.tif

--> [.............................................................] 0%
--> [.............................................................] 1%
--> [*............................................................] 2%
--> [*............................................................] 3%
--> [**...........................................................] 4%
--> [***..........................................................] 5%
--> [***..........................................................] 6%
--> [****.........................................................] 7%
--> [****.........................................................] 8%
--> [*****........................................................] 9%
--> [******.......................................................] 10%
--> [******.......................................................] 11%
--> [*******......................................................] 12%
--> [********.....................................................] 13%
--> [********.....................................................] 14%
--> [*********....................................................] 15%
--> [*********....................................................] 16%
--> [**********...................................................] 17%
--> [***********..................................................] 18%
--> [***********..................................................] 19%
--> [************.................................................] 20%
--> [*************................................................] 21%
--> [*************................................................] 22%
--> [**************...............................................] 23%
--> [**************...............................................] 24%
--> [***************..............................................] 26%
--> [****************.............................................] 27%
--> [****************.............................................] 28%
--> [*****************............................................] 29%
--> [******************...........................................] 30%
--> [******************...........................................] 31%
--> [*******************..........................................] 32%
--> [*******************..........................................] 33%
--> [********************.........................................] 34%
--> [*********************........................................] 35%
--> [*********************........................................] 36%
--> [**********************.......................................] 37%
--> [***********************......................................] 38%
--> [***********************......................................] 39%
--> [************************.....................................] 40%
--> [************************.....................................] 41%
--> [*************************....................................] 42%
--> [**************************...................................] 43%
--> [**************************...................................] 44%
--> [***************************..................................] 45%
--> [****************************.................................] 46%
--> [****************************.................................] 47%
--> [*****************************................................] 48%
--> [*****************************................................] 49%
--> [******************************...............................] 50%
--> [*******************************..............................] 51%
--> [*******************************..............................] 52%
--> [********************************.............................] 53%
--> [********************************.............................] 54%
--> [*********************************............................] 55%
--> [**********************************...........................] 56%
--> [**********************************...........................] 57%
--> [***********************************..........................] 58%
--> [************************************.........................] 59%
--> [************************************.........................] 60%
--> [*************************************........................] 61%
--> [*************************************........................] 62%
--> [**************************************.......................] 63%
--> [***************************************......................] 64%
--> [***************************************......................] 65%
--> [****************************************.....................] 66%
--> [*****************************************....................] 67%
--> [*****************************************....................] 68%
--> [******************************************...................] 69%
--> [******************************************...................] 70%
--> [*******************************************..................] 71%
--> [********************************************.................] 72%
--> [********************************************.................] 73%
--> [*********************************************................] 74%
--> [**********************************************...............] 75%
--> [**********************************************...............] 77%
--> [***********************************************..............] 78%
--> [***********************************************..............] 79%
--> [************************************************.............] 80%
--> [*************************************************............] 81%
--> [*************************************************............] 82%
--> [**************************************************...........] 83%
--> [***************************************************..........] 84%
--> [***************************************************..........] 85%
--> [****************************************************.........] 86%
--> [****************************************************.........] 87%
--> [*****************************************************........] 88%
--> [******************************************************.......] 89%
--> [******************************************************.......] 90%
--> [*******************************************************......] 91%
--> [********************************************************.....] 92%
--> [********************************************************.....] 93%
--> [*********************************************************....] 94%
--> [*********************************************************....] 95%
--> [**********************************************************...] 96%
--> [***********************************************************..] 97%
--> [***********************************************************..] 98%
--> [************************************************************.] 99%
--> [************************************************************.] 100%
--> [*************************************************************]
Loaded points: 10302586
Loading the reference point cloud took 3.15721 s
Data shifted internally by subtracting: Vector3(516137,-5.29074e+06,3.51319e+06)
Building the reference cloud tree.
Reference point cloud processing took 1.9622 s
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/atl06sr_for_pc_align_all.csv
Loaded points: 7550
Loading the source point cloud took 0.011921 s
Filtering gross outliers
Filtering gross outliers took 0.149511 s
Reducing number of source points to: 7399
Not enough points left in the source cloud after filtering. Try loading more.
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/atl06sr_for_pc_align_all.csv
Loaded points: 7550
Loading the source point cloud (second attempt) took 0.012115 s
Filtering gross outliers
Filtering gross outliers took 0.05814 s
Reducing number of source points to: 7399
Number of errors: 7399
Input: error percentile of smallest errors (meters): 16%: 0.21539, 50%: 0.640608, 84%: 3.02318
Input: mean of smallest errors (meters): 25%: 0.167667, 50%: 0.318456, 75%: 0.555679, 100%: 1.69126
Input stats (meters): Mean: 1.69126, StdDev: 2.7068, RMSE: 3.19173, Median: 0.640608, NMAD: 0.642821
Initial error computation took 0.040193 s
Match ratio: 0.750101
Alignment took 1.87626 s
Number of errors: 7399
Output: error percentile of smallest errors (meters): 16%: 0.125936, 50%: 0.510979, 84%: 2.94864
Output: mean of smallest errors (meters): 25%: 0.097888, 50%: 0.216302, 75%: 0.458827, 100%: 1.60475
Output stats (meters): Mean: 1.60475, StdDev: 2.7267, RMSE: 3.16387, Median: 0.510979, NMAD: 0.601957
Final error computation took 0.015012 s
Alignment transform (origin is planet center):
1                   0                   0  0.4543888206244446
0                   1                   0 0.04285294003784657
0                   0                   1 -0.4409191734157503
0                   0                   0                   1
Centroid of source points (Cartesian, meters): Vector3(517082.69,-5290658.8,3513171.8)
Centroid of source points (lat,lon,z): Vector3(33.637327,-84.417924,263.96012)

Translation vector (Cartesian, meters): Vector3(0.45438882,0.04285294,-0.44091917)
Translation vector (North-East-Down, meters): Vector3(-0.36795016,0.45640243,0.24295019)
Translation vector magnitude (meters): 0.63459853
Maximum displacement of points between the source cloud with any initial transform applied to it and the source cloud after alignment to the reference: 0.63459853 m
Translation vector (lat,lon,z): Vector3(-3.3172436e-06,4.9192223e-06,-0.24295016)

Transform scale - 1 = 0
Euler angles (degrees): Vector3(0,-0,0)
Euler angles (North-East-Down, degrees): Vector3(-4.6807856e-16,-4.0947807e-15,-2.1151047e-16)
Axis of rotation and angle (degrees): Vector3(nan,nan,nan) 0
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all-inverse-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all-beg_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all-end_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/pc_align/pc_align_all-iterationInfo.csv
Saving to disk took 0.023536 s

Command executed successfully.
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/pair_10-16_26.9/run-DEM_pc_align_translated.tif
  after pc_align (|t| = 0.63 m): median +0.16 m, NMAD 0.64 m
=== [6/6] MVS 5-scene: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs5/run-DEM.tif
Reusing ICESat-2 ATL06-SR points for 'all' from: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7756 (removed 181)
  7043 altimetry points: median +0.12 m, NMAD 0.68 m
Running pc_align on /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs5/run-DEM.tif and /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/atl06sr_for_pc_align_all.csv
Writing to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all*
--> Setting number of processing threads to: 4

Creating output directory: "/Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align".
Writing log: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all-log-pc_align-08-28-0808-80024.txt
Will use datum (for CSV files): Geodetic Datum --> Name: WGS_1984  Spheroid: WGS 84  Semi-major axis: 6378137  Semi-minor axis: 6356752.3142451793  Meridian: Greenwich at 0  Proj4 Str: +proj=longlat +datum=WGS84 +no_defs
Computing the bounding boxes of the reference and source points using 1000000 sample points.
Computation of bounding boxes took 0.629058 s
Reference points box: Min: (-84.4622, 33.6097) width: 0.0682235 height: 0.055075
Source points box:    Min: (-84.4637, 33.6096) width: 0.0713481 height: 0.0553039
Intersection box:     Min: (-84.4622, 33.6097) width: 0.0682235 height: 0.055075
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs5/run-DEM.tif

--> [.............................................................] 0%
--> [.............................................................] 1%
--> [*............................................................] 2%
--> [*............................................................] 3%
--> [**...........................................................] 4%
--> [***..........................................................] 5%
--> [***..........................................................] 6%
--> [****.........................................................] 7%
--> [****.........................................................] 8%
--> [*****........................................................] 9%
--> [******.......................................................] 10%
--> [******.......................................................] 11%
--> [*******......................................................] 12%
--> [*******......................................................] 13%
--> [********.....................................................] 14%
--> [*********....................................................] 15%
--> [*********....................................................] 16%
--> [**********...................................................] 17%
--> [***********..................................................] 18%
--> [***********..................................................] 19%
--> [************.................................................] 20%
--> [************.................................................] 21%
--> [*************................................................] 22%
--> [**************...............................................] 23%
--> [**************...............................................] 24%
--> [***************..............................................] 25%
--> [***************..............................................] 26%
--> [****************.............................................] 27%
--> [*****************............................................] 28%
--> [*****************............................................] 29%
--> [******************...........................................] 30%
--> [******************...........................................] 31%
--> [*******************..........................................] 32%
--> [********************.........................................] 33%
--> [********************.........................................] 34%
--> [*********************........................................] 35%
--> [**********************.......................................] 36%
--> [**********************.......................................] 37%
--> [***********************......................................] 38%
--> [***********************......................................] 39%
--> [************************.....................................] 40%
--> [*************************....................................] 41%
--> [*************************....................................] 42%
--> [**************************...................................] 43%
--> [**************************...................................] 44%
--> [***************************..................................] 45%
--> [****************************.................................] 46%
--> [****************************.................................] 47%
--> [*****************************................................] 48%
--> [******************************...............................] 49%
--> [******************************...............................] 50%
--> [*******************************..............................] 51%
--> [*******************************..............................] 52%
--> [********************************.............................] 53%
--> [*********************************............................] 54%
--> [*********************************............................] 55%
--> [**********************************...........................] 56%
--> [**********************************...........................] 57%
--> [***********************************..........................] 58%
--> [************************************.........................] 59%
--> [************************************.........................] 60%
--> [*************************************........................] 61%
--> [*************************************........................] 62%
--> [**************************************.......................] 63%
--> [***************************************......................] 64%
--> [***************************************......................] 65%
--> [****************************************.....................] 66%
--> [*****************************************....................] 67%
--> [*****************************************....................] 68%
--> [******************************************...................] 69%
--> [******************************************...................] 70%
--> [*******************************************..................] 71%
--> [********************************************.................] 72%
--> [********************************************.................] 73%
--> [*********************************************................] 74%
--> [*********************************************................] 75%
--> [**********************************************...............] 76%
--> [***********************************************..............] 77%
--> [***********************************************..............] 78%
--> [************************************************.............] 79%
--> [*************************************************............] 80%
--> [*************************************************............] 81%
--> [**************************************************...........] 82%
--> [**************************************************...........] 83%
--> [***************************************************..........] 84%
--> [****************************************************.........] 85%
--> [****************************************************.........] 86%
--> [*****************************************************........] 87%
--> [*****************************************************........] 88%
--> [******************************************************.......] 89%
--> [*******************************************************......] 90%
--> [*******************************************************......] 91%
--> [********************************************************.....] 92%
--> [********************************************************.....] 93%
--> [*********************************************************....] 94%
--> [**********************************************************...] 95%
--> [**********************************************************...] 96%
--> [***********************************************************..] 97%
--> [************************************************************.] 98%
--> [************************************************************.] 99%
--> [*************************************************************]
Loaded points: 10167528
Loading the reference point cloud took 3.08422 s
Data shifted internally by subtracting: Vector3(516143,-5.29076e+06,3.51317e+06)
Building the reference cloud tree.
Reference point cloud processing took 1.94931 s
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/atl06sr_for_pc_align_all.csv
Loaded points: 7423
Loading the source point cloud took 0.011725 s
Filtering gross outliers
Filtering gross outliers took 0.124803 s
Reducing number of source points to: 7269
Not enough points left in the source cloud after filtering. Try loading more.
Reading: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/atl06sr_for_pc_align_all.csv
Loaded points: 7423
Loading the source point cloud (second attempt) took 0.012653 s
Filtering gross outliers
Filtering gross outliers took 0.022462 s
Reducing number of source points to: 7269
Number of errors: 7269
Input: error percentile of smallest errors (meters): 16%: 0.122165, 50%: 0.481479, 84%: 2.63357
Input: mean of smallest errors (meters): 25%: 0.0963304, 50%: 0.209673, 75%: 0.427136, 100%: 1.38836
Input stats (meters): Mean: 1.38836, StdDev: 2.24836, RMSE: 2.64248, Median: 0.481479, NMAD: 0.553407
Initial error computation took 0.013213 s
Match ratio: 0.750034
Alignment took 1.81481 s
Number of errors: 7269
Output: error percentile of smallest errors (meters): 16%: 0.14767, 50%: 0.50767, 84%: 2.61177
Output: mean of smallest errors (meters): 25%: 0.115436, 50%: 0.232941, 75%: 0.446397, 100%: 1.40537
Output stats (meters): Mean: 1.40537, StdDev: 2.24727, RMSE: 2.65053, Median: 0.50767, NMAD: 0.558147
Final error computation took 0.0155 s
Alignment transform (origin is planet center):
1                   0                   0  0.4920689598657191
0                   1                   0 -0.2188177313655615
0                   0                   1 -0.2654945249669254
0                   0                   0                   1
Centroid of source points (Cartesian, meters): Vector3(517114.36,-5290685.4,3513126.6)
Centroid of source points (lat,lon,z): Vector3(33.63684,-84.417612,263.51766)

Translation vector (Cartesian, meters): Vector3(0.49206896,-0.21881773,-0.26549453)
Translation vector (North-East-Down, meters): Vector3(-0.36819052,0.46844932,-0.074103824)
Translation vector magnitude (meters): 0.60041686
Maximum displacement of points between the source cloud with any initial transform applied to it and the source cloud after alignment to the reference: 0.60041686 m
Translation vector (lat,lon,z): Vector3(-3.3194109e-06,5.0490385e-06,0.074103853)

Transform scale - 1 = 0
Euler angles (degrees): Vector3(0,-0,0)
Euler angles (North-East-Down, degrees): Vector3(-4.3830662e-16,5.1207447e-15,-6.0506373e-16)
Axis of rotation and angle (degrees): Vector3(nan,nan,nan) 0
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all-inverse-transform.txt
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all-beg_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all-end_errors.csv
Writing: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/pc_align/pc_align_all-iterationInfo.csv
Saving to disk took 0.023442 s

Command executed successfully.
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/dem_benchmark/MVS_5-scene/run-DEM_pc_align_translated.tif
  after pc_align (|t| = 0.60 m): median +0.19 m, NMAD 0.68 m
label valid_pct valid_area_km2 ie_median_m ie_nmad_m n_points dh_median_m dh_nmad_m dh_rmse_m translation_m dh_aligned_median_m dh_aligned_nmad_m dh_aligned_rmse_m vs_ref_median_m vs_ref_nmad_m
0 MVS 3-scene 96.60 36.74 0.13 0.07 7064 0.35 0.71 2.30 0.62 0.19 0.71 2.29 0.00 0.00
1 3 pairs + mosaic 98.61 37.50 NaN NaN 7393 0.42 1.02 2.46 1.25 0.21 1.02 2.44 -0.02 0.51
2 pair 13-10 (21.8°) 95.46 36.31 0.11 0.09 6947 0.29 0.71 2.32 0.61 0.17 0.72 2.35 0.03 0.29
3 pair 13-16 (5.1°) 95.40 36.28 0.07 0.06 7013 0.49 1.54 2.63 0.63 0.27 1.54 2.61 -0.04 1.07
4 pair 10-16 (26.9°) 94.90 36.09 0.08 0.07 6940 0.40 0.64 2.23 0.63 0.16 0.64 2.19 -0.07 0.29
5 MVS 5-scene 96.50 36.70 0.19 0.06 7043 0.12 0.68 2.22 0.60 0.19 0.68 2.23 0.23 0.20
_ = bench.summary_plot()
_ = bench.histogram_plot()
../../_images/84d8f1d3fb75b80636aa31974a0e43dc2b8ab3098c06ff6f40e9d45bdb461216.png ../../_images/c7266fb241397f4af84155943074fc447ef7ad80efa4eae7379306de84d55561.png
# The per-DEM Altimetry objects are kept, so the report's per-landcover view is one call away
for label in ("MVS 3-scene", "3 pairs + mosaic"):
    print(f"--- {label} ---")
    bench.altimetry[label].histogram_by_landcover(key="all")
--- MVS 3-scene ---
--- 3 pairs + mosaic ---
../../_images/a1c6b46119d844bb5320b834d69028ed64772d5be6b353cfad02ffc3594e43ef.png ../../_images/cfa6dd2da4251d6e52bc79a57100a769ff24e75a4eb6dddff75edad8829fda3b.png

Takeaways#

  • Agreement: the two workflows are nearly unbiased against each other (median +0.02 m) and agree to 0.51 m NMAD; the differences concentrate over buildings, tree canopy, and the areas where the weak 5.1° pair dominates the mosaic.

  • Coverage: inside the common footprint the mosaic fills slightly more (98.6% vs. 96.6% valid), because where correlation fails in one pair another usually covers it, at the cost of averaging in each pair’s errors.

  • ICESat-2: the multi-view DEM has a lower NMAD than the mosaic, 0.71 m vs. 1.02 m (≈30% lower), and a smaller median bias (+0.35 vs. +0.42 m). The single pairs explain the difference: the two strong pairs score 0.64 m (26.9°) and 0.72 m (21.8°), the 5.1° pair 1.54 m, and dem_mosaic averages all three, so the mosaic is worse than either good pair alone.

  • Five scenes: adding nadir8 and nadir21 to the joint solve improves the bias (+0.12 m) more than the spread (0.68 m); it has the best median but not the best NMAD, and its triangulation error (0.19 m median, five rays) is higher than any pair’s. The rays of a narrow pair barely diverge, so a small IntersectionErr does not indicate a good DEM; read it together with the residual panels.

  • Alignment: a pc_align translation (≈0.6 m for every run except the mosaic, 1.25 m) brings every median to +0.16–0.27 m and leaves NMAD unchanged by construction, so the MVS advantage over the best single pair is bias, and the mosaic’s disadvantage is noise that no translation removes.

On this same-pass set, joint multi-view triangulation is more accurate than the pairwise mosaic, and the mosaic has slightly more coverage; the strongest single pair is close on spread. Whether this holds across other scene combinations, and how much the five-scene run improves on three, is tested in worldview_spacenet_benchmark.ipynb.


Full Report Generation#

Generate the standard asp_plot PDF report for the multi-view run. The Input Scenes, Match Points, and Disparity sections contain one figure per run-pair*/ pair, the Stereo Geometry section is scoped to the run’s three cameras, and the ICESat-2 altimetry comparison (including pc_align) runs automatically for Earth data.

See the resulting report.#

!asp_report \
    --directory $directory \
    --bundle-adjust-prefix ba/ \
    --stereo-directory stereo_mvs3/ \
    --report-filename ../../reports/WorldView_Atlanta_MVS-asp-report.pdf
Processing ASP files in /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/

WARNING:asp_plot.stereo:

No reference DEM found in log files. Please supply the reference DEM you used during stereo processing (or another reference DEM) if you would like to see some difference maps.



ASP DEM: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM.tif


Using map projection from DEM: EPSG:32616
WARNING:asp_plot.utils:Could not find ('*.[Xx][Mm][Ll]',) in /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/. Some plots may be missing.
WARNING:asp_plot.utils:Could not find ('*.[Xx][Mm][Ll]',) in /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/ba/. Some plots may be missing.
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/00_pair1.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/00_pair2.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/01_overview.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/01_1030010002649200_1030010002B7D800.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/01_1030010002649200_1030010003CAF100.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/01_1030010002B7D800_1030010003CAF100.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/02_pair1.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/02_pair2.png
WARNING:asp_plot.bundle_adjust:

Could not read stereopair metadata to get mean GSD. Residuals will remain in pixels.
WARNING:asp_plot.bundle_adjust:

Could not read stereopair metadata to get mean GSD. Residuals will remain in pixels.
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/03.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/04.png
WARNING:asp_plot.utils:Could not find ('*-mapproj_match_offsets.txt',) in /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/ba/. Some plots may be missing.


Skipping map-projected residuals plot: 

MapProj Residuals TXT file not found.




WARNING:asp_plot.bundle_adjust:

No reference DEM found in bundle_adjust log. This would only exist if you ran bundle_adjust with the advanced `--mapproj-dem ref_dem.tif` flag. Cannot generate geodiff for /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/ba/run-initial_residuals_pointmap.csv.




Skipping geodiff plots (requires --mapproj-dem flag in bundle_adjust): 

Geodiff file /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/ba/run-initial_residuals_pointmap-diff.csv could not be generated. Check that geodiff is installed and a reference DEM was used in bundle_adjust.
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/05_pair1.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/05_pair2.png
Plotting DEM results. This can take a minute for large inputs.
WARNING:asp_plot.stereo:

Found a DEM of difference: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM_cop30_atlanta_wgs84_utm_diff.tif.
Using that for difference map plotting.
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/06.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/07.png

Detected planetary body: earth
WARNING:sliderule.sliderule:Warning, this environment is using an outdated client (v5.3.1). The code will run but some functionality supported by the server (v5.4.4) may not be available.
Time filter: 2018-10-14T00:00:00Z to 2026-07-24T00:00:00Z (all available)

ICESat-2 ATL06 request processing for: all
{'poly': [{'lon': -84.46346594122846, 'lat': 33.6097860749748}, {'lon': -84.46346594122846, 'lat': 33.66465839694338}, {'lon': -84.39259571158408, 'lat': 33.66465839694338}, {'lon': -84.39259571158408, 'lat': 33.6097860749748}, {'lon': -84.46346594122846, 'lat': 33.6097860749748}], 't0': '2018-10-14T00:00:00Z', 't1': '2026-07-24T00:00:00Z', 'res': 20, 'len': 40, 'ats': 20, 'fit': {'maxi': 6}, 'cnf': 'atl03_high', 'srt': -1, 'cnt': 10}
Existing file found, reading in: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/atl06sr_all.parquet
Parameters don't match request. Regenerating...
  Sampling ESA WorldCover for 8594 points (1 tile(s))...
  WorldCover: 8594/8594 points sampled
Filtering ATL06-SR all
  Outlier filter (3σ): all 7937 → 7756 (removed 181)
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/08.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/09.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/10.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/11.png
Writing out: /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM_pc_align_translated.tif
Wrote out all aligned DEM to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/stereo_mvs3/run-DEM_pc_align_translated.tif
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/12.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/13.png
Figure saved to /Users/ben/Desktop/asp-plot-examples/atlanta_mvs/tmp_asp_report_plots/14.png
Figure selections saved to ../../reports/WorldView_Atlanta_MVS-asp-report_figure_selections.yml



Report saved to ../../reports/WorldView_Atlanta_MVS-asp-report.pdf

Next Steps#