Trouble with 3D Building and Boundaries

Good Evening everyone!

I’m fairly new to WebODM, but have been running as many different datasets as I can to get better and explore the functionality.

I am running WebODM Desktop on a Dell XPS with 16 GB RAM, Windows 11 x64, and I used the paid installer. I am installing Build 47 as we speak, although the projects described below were run on a previous (but relatively recent) Build. I know I had at least Build 43, but may have had a more recent one than that. All of it used a Lightning node.

I have 500-600 images of a friend’s house that I am working on turning into a nice 3D product for him to explore, but have been trouble getting a usable product.

First, I used 622 of the images (all drone images, taken with a Mavic 2 Pro both at nadir with DJI GSP and manually, unfortunately at pretty low light) on the “3D Model” preset (auto-boundary: true, camera-lens: brown, dsm: true, dtm: true, mesh-octree-depth: 12, mesh-size: 300000, pc-geometric: true, pc-quality: high, use-3dmesh: true).
This created a very impressive point cloud, but with two major issues: first, most of his garage is cut off, likely because of the drone path, although I could have sworn I flew farther behind the garage.
image

Second, the roof shows some significant errors both in the point cloud
image
as well as in the textured model
image

even though there is lots of lots of overlapping imagery of the rooftop from various angles.

Next, to fix the issue with cropping out the garage, I ran the same dataset without cropping. However, this produced a model with lots of random points pulled from the background of the images – likely because of the house’s location high on a hill, it is almost impossible to get oblique images without capturing points behind. This was so bad that I couldn’t even zoom close enough to examine the house.
image

So, I tried running it again, this time on the “Buildings” preset, but with cropping set to 9 (crop: 9, dem-gapfill-steps: 4, dem-resolution: 4, dsm: true, mesh-octree-depth: 12, mesh-size: 300000, pc-geometric: true, pc-quality: high). This was better, but still had a good amount of stretched out background points.
image

After that, I decided to go through the dataset and remove any images that had more than a little bit of background or horizon in them, and removed anything that was even slightly blurry. All in all I removed 100 images, mostly blurry ones (due to the low light and slow shutter). I then re-ran these 522 remaining images on the “Buildings” preset with Crop:3 (camera-lens: brown, crop: 3, dem-gapfill-steps: 4, dem-resolution: 3, depthmap-resolution: 900, dsm: true, dtm: true, mesh-octree-depth: 12, mesh-size: 300000, orthophoto-resolution: 4, pc-geometric: true, pc-quality: high), and obtained even more distant points.
image

After that, I decided I couldn’t leave it auto-cropped due to the background points, and I can’t use auto-boundary because it cuts off the garage, so I’d better use a JSON boundary. I used ArcGIS Pro to draw a circle around the property and exported that as GeoJSON, and ran the pared-down dataset with the following settings:
Options: boundary: {“type”:“FeatureCollection”,“crs”:{“type”:“name”,“properties”:{“name”:“EPSG:3857”}},“features”:[{“type”:“Feature”,“id”:3,“geometry”:{“type”:“Polygon”,“coordinates”:[[[-13565822.9439,4530499.822800003],[-13565815.762944307,4530501.661919829],[-13565808.813567009,4530504.241579028],[-13565802.171906939,4530507.533514313],[-13565795.910731515,4530511.501658554],[-13565790.098639484,4530516.10253593],[-13565784.799309343,4530521.285738267],[-13565780.070801662,4530526.994477315],[-13565775.96492296,4530533.1662069345],[-13565772.526658107,4530539.733308365],[-13565769.793677446,4530546.623831068],[-13565767.79592409,4530553.762281035],[-13565766.55528584,4530561.070447915],[-13565766.08535539,4530568.468261901],[-13565766.391281396,4530575.874670996],[-13565767.469712067,4530583.208529033],[-13565769.308831893,4530590.389484726],[-13565771.888491092,4530597.338862024],[-13565775.180426378,4530603.980522093],[-13565779.148570618,4530610.241697518],[-13565783.749447994,4530616.0537895495],[-13565788.932650331,4530621.35311969],[-13565794.64138938,4530626.081627371],[-13565800.813119,4530630.187506072],[-13565807.38022043,4530633.625770927],[-13565814.270743132,4530636.358751587],[-13565821.4091931,4530638.356504943],[-13565828.717359979,4530639.597143193],[-13565836.115173966,4530640.067073643],[-13565843.521583062,4530639.761147638],[-13565850.855441097,4530638.682716966],[-13565858.03639679,4530636.843597139],[-13565864.985774089,4530634.263937941],[-13565871.627434159,4530630.972002655],[-13565877.888609583,4530627.0038584145],[-13565883.700701613,4530622.402981038],[-13565889.000031754,4530617.219778702],[-13565893.728539435,4530611.511039654],[-13565897.834418137,4530605.339310034],[-13565901.27268299,4530598.772208604],[-13565904.005663652,4530591.8816859005],[-13565906.003417008,4530584.743235934],[-13565907.244055258,4530577.435069053],[-13565907.713985708,4530570.037255067],[-13565907.408059701,4530562.630845972],[-13565906.32962903,4530555.296987936],[-13565904.490509205,4530548.116032243],[-13565901.910850005,4530541.166654944],[-13565898.61891472,4530534.524994875],[-13565894.65077048,4530528.2638194505],[-13565890.049893104,4530522.451727419],[-13565884.866690766,4530517.152397279],[-13565879.157951718,4530512.423889598],[-13565872.986222098,4530508.318010896],[-13565866.419120668,4530504.879746041],[-13565859.528597966,4530502.146765382],[-13565852.390147997,4530500.149012025],[-13565845.081981119,4530498.908373776],[-13565837.684167132,4530498.438443325],[-13565830.277758036,4530498.744369331],[-13565822.9439,4530499.822800003]]]},“properties”:{“OBJECTID”:3,“Shape_Length”:444.96676674211153,“Shape_Area”:15755.97518019132}}]}, camera-lens: brown, crop: 0, dem-gapfill-steps: 4, dem-resolution: 3, depthmap-resolution: 990, dsm: true, dtm: true, mesh-octree-depth: 12, mesh-size: 300000, pc-geometric: true, pc-quality: high, use-3dmesh: true

This time, the processing failed, with the following Task Output:
Launching… please wait! This can take up to 5 minutes.
[INFO] ==============
[INFO] auto_boundary: False
[INFO] boundary: {‘type’: ‘FeatureCollection’, ‘crs’: {‘type’: ‘name’, ‘properties’: {‘name’: ‘EPSG:3857’}}, ‘features’: [{‘type’: ‘Feature’, ‘id’: 3, ‘geometry’: {‘type’: ‘Polygon’, ‘coordinates’: [[[-13565822.9439, 4530499.822800003], [-13565815.762944307, 4530501.661919829], [-13565808.813567009, 4530504.241579028], [-13565802.171906939, 4530507.533514313], [-13565795.910731515, 4530511.501658554], [-13565790.098639484, 4530516.10253593], [-13565784.799309343, 4530521.285738267], [-13565780.070801662, 4530526.994477315], [-13565775.96492296, 4530533.1662069345], [-13565772.526658107, 4530539.733308365], [-13565769.793677446, 4530546.623831068], [-13565767.79592409, 4530553.762281035], [-13565766.55528584, 4530561.070447915], [-13565766.08535539, 4530568.468261901], [-13565766.391281396, 4530575.874670996], [-13565767.469712067, 4530583.208529033], [-13565769.308831893, 4530590.389484726], [-13565771.888491092, 4530597.338862024], [-13565775.180426378, 4530603.980522093], [-13565779.148570618, 4530610.241697518], [-13565783.749447994, 4530616.0537895495], [-13565788.932650331, 4530621.35311969], [-13565794.64138938, 4530626.081627371], [-13565800.813119, 4530630.187506072], [-13565807.38022043, 4530633.625770927], [-13565814.270743132, 4530636.358751587], [-13565821.4091931, 4530638.356504943], [-13565828.717359979, 4530639.597143193], [-13565836.115173966, 4530640.067073643], [-13565843.521583062, 4530639.761147638], [-13565850.855441097, 4530638.682716966], [-13565858.03639679, 4530636.843597139], [-13565864.985774089, 4530634.263937941], [-13565871.627434159, 4530630.972002655], [-13565877.888609583, 4530627.0038584145], [-13565883.700701613, 4530622.402981038], [-13565889.000031754, 4530617.219778702], [-13565893.728539435, 4530611.511039654], [-13565897.834418137, 4530605.339310034], [-13565901.27268299, 4530598.772208604], [-13565904.005663652, 4530591.8816859005], [-13565906.003417008, 4530584.743235934], [-13565907.244055258, 4530577.435069053], [-13565907.713985708, 4530570.037255067], [-13565907.408059701, 4530562.630845972], [-13565906.32962903, 4530555.296987936], [-13565904.490509205, 4530548.116032243], [-13565901.910850005, 4530541.166654944], [-13565898.61891472, 4530534.524994875], [-13565894.65077048, 4530528.2638194505], [-13565890.049893104, 4530522.451727419], [-13565884.866690766, 4530517.152397279], [-13565879.157951718, 4530512.423889598], [-13565872.986222098, 4530508.318010896], [-13565866.419120668, 4530504.879746041], [-13565859.528597966, 4530502.146765382], [-13565852.390147997, 4530500.149012025], [-13565845.081981119, 4530498.908373776], [-13565837.684167132, 4530498.438443325], [-13565830.277758036, 4530498.744369331], [-13565822.9439, 4530499.822800003]]]}, ‘properties’: {‘OBJECTID’: 3, ‘Shape_Length’: 444.96676674211153, ‘Shape_Area’: 15755.97518019132}}]}
[INFO] build_overviews: False
[INFO] camera_lens: brown
[INFO] cameras: {}
[INFO] cog: True
[INFO] copy_to: None
[INFO] crop: 0.0
[INFO] debug: False
[INFO] dem_decimation: 1
[INFO] dem_euclidean_map: False
[INFO] dem_gapfill_steps: 4
[INFO] dem_resolution: 3.0
[INFO] depthmap_resolution: 990.0
[INFO] dsm: True
[INFO] dtm: True
[INFO] end_with: odm_postprocess
[INFO] fast_orthophoto: False
[INFO] feature_quality: high
[INFO] feature_type: sift
[INFO] force_gps: False
[INFO] gcp: None
[INFO] geo: None
[INFO] gps_accuracy: 10
[INFO] ignore_gsd: False
[INFO] matcher_distance: 0
[INFO] matcher_neighbors: 8
[INFO] matcher_type: flann
[INFO] max_concurrency: 16
[INFO] merge: all
[INFO] mesh_octree_depth: 12
[INFO] mesh_size: 300000
[INFO] min_num_features: 8000
[INFO] name: 0e3365ea-f2ea-4239-a194-1ffac40f4b07
[INFO] optimize_disk_space: True
[INFO] orthophoto_compression: DEFLATE
[INFO] orthophoto_cutline: False
[INFO] orthophoto_kmz: False
[INFO] orthophoto_no_tiled: False
[INFO] orthophoto_png: False
[INFO] orthophoto_resolution: 2.0
[INFO] pc_classify: True
[INFO] pc_csv: False
[INFO] pc_ept: True
[INFO] pc_filter: 2.5
[INFO] pc_geometric: True
[INFO] pc_las: False
[INFO] pc_quality: high
[INFO] pc_rectify: False
[INFO] pc_sample: 0.01
[INFO] pc_tile: False
[INFO] primary_band: auto
[INFO] project_path: /var/www/data
[INFO] radiometric_calibration: none
[INFO] rerun: None
[INFO] rerun_all: False
[INFO] rerun_from: None
[INFO] resize_to: 2048
[INFO] skip_3dmodel: False
[INFO] skip_band_alignment: False
[INFO] skip_report: False
[INFO] sm_cluster: None
[INFO] smrf_scalar: 1.25
[INFO] smrf_slope: 0.15
[INFO] smrf_threshold: 0.5
[INFO] smrf_window: 18.0
[INFO] split: 999999
[INFO] split_image_groups: None
[INFO] split_overlap: 150
[INFO] texturing_data_term: gmi
[INFO] texturing_keep_unseen_faces: False
[INFO] texturing_outlier_removal_type: gauss_clamping
[INFO] texturing_skip_global_seam_leveling: False
[INFO] texturing_skip_local_seam_leveling: False
[INFO] texturing_tone_mapping: none
[INFO] tiles: False
[INFO] time: False
[INFO] use_3dmesh: True
[INFO] use_exif: False
[INFO] use_fixed_camera_params: False
[INFO] use_hybrid_bundle_adjustment: False
[INFO] verbose: False
[INFO] ==============
[INFO] Running dataset stage
[INFO] Loading dataset from: /var/www/data/0e3365ea-f2ea-4239-a194-1ffac40f4b07/images
[INFO] Loading 522 images
[INFO] Wrote images database: /var/www/data/0e3365ea-f2ea-4239-a194-1ffac40f4b07/images.json
[INFO] Found 522 usable images
[INFO] Parsing SRS header: WGS84 UTM 10N
Traceback (most recent call last):
File “/code/run.py”, line 53, in
retcode = app.execute()
File “/code/stages/odm_app.py”, line 130, in execute
raise e
File “/code/stages/odm_app.py”, line 94, in execute
self.first_stage.run()
File “/code/opendm/types.py”, line 327, in run
self.process(self.args, outputs)
File “/code/stages/dataset.py”, line 161, in process
outputs[‘boundary’] = boundary.load_boundary(args.boundary, reconstruction.get_proj_srs())
File “/code/opendm/boundary.py”, line 50, in load_boundary
geom = src[0][‘geometry’]
TypeError: ‘NoneType’ object is not subscriptable

Can anyone offer me any advice, either on reducing the processed area, healing the errors in the rooftop, or on why the GeoJSON is failing? I really appreciate how great the community is here in helping and working with everyone to create the best products and improve the program itself.

Thanks very much,
Conor

1 Like

Can you attach that GeoJSON? I think WebODM may not like the extra attributes ArcGIS Pro is adding.

Also, --auto-boundary should not drop actual features, so it should be safe to leave on, especially with your full/original dataset. It should only remove extraneous background points.

Keeping --crop 0 is good, however.

Can you maybe try raising:
--min-num-features 16000
matcher-neighbors 16
--resize-to -1
--pc-filter 1

1 Like

Thanks for the reply! I re-exported the GeoJSON to ensure it was in WGS1984, but had the same issue. Here’s the file: Hub

It does look like --auto-boundary did actually clip some of the target feature. Looking at the Orthophoto from the non-boundaried, non-cropped attempt, you can see the entire detached garage on the right side, at the top of the driveway:
image

But the version with --auto-boundary cuts off most of that garage:

image

I’m re-running it now with your recommended setting updates (and the newest Build), so I’ll keep you posted!

Thanks so much for the help,
Conor

3 Likes

Can you try with this stripped GeoJSON?:

{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "id": 3,
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              -121.86386092164652,
              37.652844683625915
            ],
            [
              -121.86380339851024,
              37.65286297707909
            ],
            [
              -121.86374844274806,
              37.652887945576
            ],
            [
              -121.8636968258184,
              37.65291923861368
            ],
            [
              -121.8636492723098,
              37.65295641690648
            ],
            [
              -121.86360644976928,
              37.65299895855266
            ],
            [
              -121.86356895933146,
              37.65304626636077
            ],
            [
              -121.8635373272799,
              37.65309767623287
            ],
            [
              -121.86351199765926,
              37.65315246648706
            ],
            [
              -121.8634933260419,
              37.65320986798826
            ],
            [
              -121.8634815745364,
              37.653269074945236
            ],
            [
              -121.86347690810811,
              37.65332925622208
            ],
            [
              -121.86347939226349,
              37.65338956700559
            ],
            [
              -121.86348899213041,
              37.653449160664564
            ],
            [
              -121.86350557294782,
              37.65350720063467
            ],
            [
              -121.86352890195735,
              37.65356287216195
            ],
            [
              -121.86355865167087,
              37.65361539374019
            ],
            [
              -121.86359440446762,
              37.653664028081565
            ],
            [
              -121.86363565845669,
              37.65370809246652
            ],
            [
              -121.8636818345225,
              37.653746968327695
            ],
            [
              -121.8637322844543,
              37.65378010993321
            ],
            [
              -121.86378630004566,
              37.65380705204757
            ],
            [
              -121.86384312303606,
              37.65382741646254
            ],
            [
              -121.86390195575528,
              37.65384091730639
            ],
            [
              -121.86396197232091,
              37.65384736505685
            ],
            [
              -121.86402233023192,
              37.65384666920165
            ],
            [
              -121.86408218219555,
              37.653838839509056
            ],
            [
              -121.86414068802141,
              37.65382398589081
            ],
            [
              -121.86419702641597,
              37.653802316859135
            ],
            [
              -121.86425040651166,
              37.65377413659974
            ],
            [
              -121.86430007896895,
              37.653739840701704
            ],
            [
              -121.86434534649543,
              37.65369991060425
            ],
            [
              -121.86438557363424,
              37.653654906838426
            ],
            [
              -121.86442019568453,
              37.65360546115844
            ],
            [
              -121.86444872662862,
              37.65355226767327
            ],
            [
              -121.8644707659546,
              37.653496073102836
            ],
            [
              -121.86448600427862,
              37.65343766629573
            ],
            [
              -121.86449422768803,
              37.65337786715549
            ],
            [
              -121.86449532074418,
              37.653317515130965
            ],
            [
              -121.86448926810297,
              37.6532574574323
            ],
            [
              -121.8644761547302,
              37.65319853713791
            ],
            [
              -121.8644561647089,
              37.65314158135959
            ],
            [
              -121.86442957865512,
              37.65308738963162
            ],
            [
              -121.86439676977879,
              37.65303672268708
            ],
            [
              -121.86435819864464,
              37.65299029177878
            ],
            [
              -121.86431440670681,
              37.65294874869491
            ],
            [
              -121.86426600870813,
              37.65291267660931
            ],
            [
              -121.86421368405041,
              37.652882581894985
            ],
            [
              -121.86415816725716,
              37.65285888701575
            ],
            [
              -121.86410023766244,
              37.65284192459578
            ],
            [
              -121.86404070847078,
              37.652831932750274
            ],
            [
              -121.86398041534156,
              37.65282905174282
            ],
            [
              -121.86392020465813,
              37.65283332201646
            ],
            [
              -121.86386092164652,
              37.652844683625915
            ]
          ]
        ]
      },
      "properties": {}
    }
  ]
}

That change in boundary looks way too aggressive to be --auto-boundary. That looks more like the behavior of --crop.

1 Like

That worked great! The --auto-boundary was much more generous/reasonable this time
image

and the updated settings seem to have healed almost all of the gaps in the rooftop!
image

I’ll try it again with the simplified GeoJSON, but with --auto-boundary working better now, it likely won’t be necessary. Thanks!

For future reference, is there anything I can do to reduce the gaps in the roof? Maybe a different collection technique?

Thanks again,
Conor

2 Likes

Glad it is looking better :slight_smile:
What were your overlap/sidelap?

Directly at nadir can be tough. Sometimes something like 75-85deg can be better.

Also, what did your rooftop images look like? Were there spots that were “blown out” solid white? If so, that’s borderline impossible to reconstruct.

I did a grid pattern at nadir with 80% overlap and 80% sidelap, and then I did a partial circle POI at about 80 degree gimbal angle, and then I did a lot of manual flights at all sorts of angle. Some were a little washed out, especially at nadir, but there were more that appear to have good detail of the roof, including the corner that had the most gaps in the pointcloud.
DJI_0253
DJI_0283
image
image

1 Like

Can you raise overlap to 85+? It should be “cheap” as all it costs you is storage space. Sidelap shoud be okay at 80%.

And your latest re-process has all of the images together, including the circle-survey at 80degish and the other manual shots?

Sure, I won’t have the opportunity to re-fly this project as I’m out of state, but I’ll change 85-90% overlap to the new default for the future.

Yep, it has all of the images I have with the exception of the 100 blurry images I removed. All of the ones I posted above and similar ones were included in the latest re-process.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.