Incorrect texturing

I flew a mission over my town common to build a 3d model…When the texture was applied to the model, the branches from a tree were layered on top of the church as can be seen in the attachment… Then using the exact same image set, I ran them through Reality Capture and it applied the texture correctly… as can also be seen in the attachment…

Are there settings in ODM that would improve this kind of scenario? I really need to be able to use ODM for it’s Web interface so I can allow clients to see results… RC does not have this native option along with all of the other tools that are in the WebODM interface… measuring tools etc… Any help would be greatly appreciated! This is a wonderful piece of software and want to be able to use it correctly… Thanks!
Harold


1 Like

Try changing “texture-data-term” and/or “texture-outlier-removal-type”.

Can you please include your full processing parameters?

the only non-default values I have are Auto-boundary set to true, I added a JSON boundary file to clip the textured model and I have DTM checked off…

So you’re not using a default processing profile? If so, which one?

Mm, a tough one; I think the best approach might be to create image masks for all pictures that show the tree branches and mask the branches. Using Image Masks — OpenDroneMap 3.1.7 documentation

1 Like

Or try changing “texture-data-term” and/or “texture-outlier-removal-type”.

It might help.

1 Like

i wouldn’t want to go that route… there are going to be plenty of use cases where trees are in the shots and going through and creating masks for possible dozens/hundreds of images is not practical… it can be done correctly by some software as can be seen… must be a setting that should help.

Hi Saijin… no not using a default processing profile… I just saw the dropdown when editing the project! I just changed it to “Forest” and am running that now… Hopefully that will have the proper settings… Thanks for getting me to look… hadn’t even seen that before… I just clicked on the “Edit” button!

Update: One of the setting on that changes the “feature-quality” to ultra… then it throws a “not enough memory” error… I have 64 gig of RAM running Ubuntu with plenty of SSD space…
Any ideas? It throws the error during the initial processing of the images…

I tried running it on the the lightening site but it doesn’t appear to be the most up to date version… it doesn’t have the dropdown profile selection, or the “ultra” option for feature quality…and the “auto boundary” option isn’t there either… these are pretty important… Is the lightening site up to date?

Thanks!
Harold

2 Likes

You can certainly OOM with 64GB RAM. What’s your swap like?

You might want to add --pc-geometric. In early testing with it, I was finding it was helping palm fronds in a contributed dataset have individual fronds be defined instead of a plane around them like you’re getting.

1 Like

I used gpartition to increase my swap file to 93 gig and restarted the job…

I used the “Forest” preset and it got further but in Task manager, the main ram and swap file got eaten up fast… then it crashed with this message… I included the output back to the last image it processed:

2021-12-19 02:47:25,006 INFO: Extracting ROOT_SIFT features for image MAX_0067_ecyJnb2.JPG
Traceback (most recent call last):
2021-12-19 02:47:25,135 INFO: Extracting ROOT_SIFT features for image MAX_0044_Y2BpQbS.JPG
File “/code/SuperBuild/install/bin/opensfm/bin/opensfm_main.py”, line 15, in
commands.command_runner(
File “/code/SuperBuild/install/bin/opensfm/opensfm/commands/command_runner.py”, line 38, in command_runner
command.run(data, args)
File “/code/SuperBuild/install/bin/opensfm/opensfm/commands/command.py”, line 12, in run
self.run_impl(data, args)
File “/code/SuperBuild/install/bin/opensfm/opensfm/commands/detect_features.py”, line 11, in run_impl
detect_features.run_dataset(dataset)
File “/code/SuperBuild/install/bin/opensfm/opensfm/actions/detect_features.py”, line 68, in run_dataset
parallel_map(process, arguments, processes, 1)
File “/code/SuperBuild/install/bin/opensfm/opensfm/context.py”, line 52, in parallel_map
res = Parallel(batch_size=batch_size)(delayed(func)(arg) for arg in args)
File “/usr/local/lib/python3.9/dist-packages/joblib/parallel.py”, line 1061, in call
self.retrieve()
File “/usr/local/lib/python3.9/dist-packages/joblib/parallel.py”, line 940, in retrieve
self._output.extend(job.get(timeout=self.timeout))
File “/usr/lib/python3.9/multiprocessing/pool.py”, line 771, in get
raise self._value
File “/usr/lib/python3.9/multiprocessing/pool.py”, line 125, in worker
result = (True, func(*args, **kwds))
File “/usr/local/lib/python3.9/dist-packages/joblib/_parallel_backends.py”, line 595, in call
return self.func(*args, **kwargs)
File “/usr/local/lib/python3.9/dist-packages/joblib/parallel.py”, line 262, in call
return [func(*args, **kwargs)
File “/usr/local/lib/python3.9/dist-packages/joblib/parallel.py”, line 262, in
return [func(*args, **kwargs)
File “/code/SuperBuild/install/bin/opensfm/opensfm/actions/detect_features.py”, line 134, in process
read_images(queue, data, images, counter, expected)
File “/code/SuperBuild/install/bin/opensfm/opensfm/actions/detect_features.py”, line 157, in read_images
queue.put(args, block=True, timeout=full_queue_timeout)
File “/usr/lib/python3.9/queue.py”, line 148, in put
raise Full
queue.Full
terminate called without an active exception
/code/SuperBuild/install/bin/opensfm/bin/opensfm: line 12: 160 Aborted (core dumped) “$PYTHON” “$DIR”/opensfm_main.py “$@”

===== Dumping Info for Geeks (developers need this to fix bugs) =====
Child returned 134
Traceback (most recent call last):
File “/code/stages/odm_app.py”, line 94, in execute
self.first_stage.run()
File “/code/opendm/types.py”, line 346, in run
self.next_stage.run(outputs)
File “/code/opendm/types.py”, line 346, in run
self.next_stage.run(outputs)
File “/code/opendm/types.py”, line 346, in run
self.next_stage.run(outputs)
File “/code/opendm/types.py”, line 327, in run
self.process(self.args, outputs)
File “/code/stages/run_opensfm.py”, line 35, in process
octx.feature_matching(self.rerun())
File “/code/opendm/osfm.py”, line 301, in feature_matching
self.run(‘detect_features’)
File “/code/opendm/osfm.py”, line 34, in run
system.run(‘%s %s “%s”’ %
File “/code/opendm/system.py”, line 106, in run
raise SubprocessException(“Child returned {}”.format(retcode), retcode)
opendm.system.SubprocessException: Child returned 134

===== Done, human-readable information to follow… =====

[ERROR] Uh oh! Processing stopped because of strange values in the reconstruction. This is often a sign that the input data has some issues or the software cannot deal with it. Have you followed best practices for data acquisition? See Flying Tips — OpenDroneMap 3.1.7 documentation

Iam going to run this again without using the ultra setting… but turn on the other flag you mentioned…pc-geometric…

2 Likes

Just remembered something. You can bring the pointcloud into CloudCompare and edit out the tree and then create a orto from the remaining cloud.

If the above case is anything like the thread I’m about to create, the tree wont be in the point cloud, only in the textures.

Parts of trees is in the pointcloud.

OP says the trees appeared on the wall when textures were applied to the PC.

There’s a difference between texturing a mesh and the clolour of individual points. Shadows can’t be removed though.

Here is the result after re-running with the --pc-geometric parameter turned on as recommended earlier…

On every run where I changed the “feature quality” option to “ultra”, there was runaway memory… that’s with 64 gig of ram and a 90gig swap file! It was eaten up fast… so that had to be dialed back to “high”… The “Forest” pre-set turns the feature quality to “ultra” so that won’t work.

And the texture that is mapped to the church and the ground in the attached shots are not shadows… it’s the branches…

The Lightening site does not see to be current… the settings on their do not match the most recent settings from the latest update… No “Forest” setting and no “auto boundary” and no “ultra” option on feature quality… So I can’t compare how that would handle this…

Any other ideas? This kind of model as shown is not usable for clients and editing out trees is not a realistic option… I would love for this to work! The web interface is what I need… Reality Capture properly renders this but it doesn’t have the WebUI interface and tools…

Thanks
Harold

1 Like

Is it possible that reality capture doesn’t use the images to texture the mesh?

1 Like

oh it definitely does… It goes through an unwrapping step first and then applies the texture…

Are you also using --auto-boundary since you have so much horizon in your images? It can prevent Out-Of-Memory by preventing the reconstruction boundaries from growing so much.

1 Like