More memory resiliant openmvs

pull/1550/head
Piero Toffanin 2022-11-07 12:53:37 -05:00
rodzic 70d2b76c78
commit c7e93e18dd
2 zmienionych plików z 21 dodań i 7 usunięć

Wyświetl plik

@ -29,7 +29,7 @@ class GCPFile:
if line != "" and line[0] != "#": if line != "" and line[0] != "#":
parts = line.split() parts = line.split()
if len(parts) >= 6: if len(parts) >= 6:
self.entries.append(line) self.entries.append(line)
else: else:
log.ODM_WARNING("Malformed GCP line: %s" % line) log.ODM_WARNING("Malformed GCP line: %s" % line)

Wyświetl plik

@ -103,7 +103,6 @@ class ODMOpenMVSStage(types.ODM_Stage):
system.run('"%s" "%s" %s' % (context.omvs_densify_path, system.run('"%s" "%s" %s' % (context.omvs_densify_path,
openmvs_scene_file, openmvs_scene_file,
' '.join(config + gpu_config + extra_config))) ' '.join(config + gpu_config + extra_config)))
try: try:
run_densify() run_densify()
except system.SubprocessException as e: except system.SubprocessException as e:
@ -113,6 +112,11 @@ class ODMOpenMVSStage(types.ODM_Stage):
log.ODM_WARNING("OpenMVS failed with GPU, is your graphics card driver up to date? Falling back to CPU.") log.ODM_WARNING("OpenMVS failed with GPU, is your graphics card driver up to date? Falling back to CPU.")
gpu_config = ["--cuda-device -2"] gpu_config = ["--cuda-device -2"]
run_densify() run_densify()
elif (e.errorCode == 137 or e.errorCode == 3221226505) and not args.pc_tile:
log.ODM_WARNING("OpenMVS ran out of memory, we're going to turn on tiling to see if we can process this.")
args.pc_tile = True
config.append("--fusion-mode 1")
run_densify()
else: else:
raise e raise e
@ -198,6 +202,12 @@ class ODMOpenMVSStage(types.ODM_Stage):
# Merge # Merge
fast_merge_ply(scene_ply_files, tree.openmvs_model) fast_merge_ply(scene_ply_files, tree.openmvs_model)
else: else:
def skip_filtering():
# Just rename
scene_dense_ply = os.path.join(tree.openmvs, 'scene_dense.ply')
log.ODM_INFO("Skipped filtering, %s --> %s" % (scene_dense_ply, tree.openmvs_model))
os.rename(scene_dense_ply, tree.openmvs_model)
# Filter all at once # Filter all at once
if args.pc_filter > 0: if args.pc_filter > 0:
if os.path.exists(scene_dense): if os.path.exists(scene_dense):
@ -206,14 +216,18 @@ class ODMOpenMVSStage(types.ODM_Stage):
'-i "%s"' % scene_dense, '-i "%s"' % scene_dense,
"-v 0" "-v 0"
] ]
system.run('"%s" %s' % (context.omvs_densify_path, ' '.join(config + gpu_config + extra_config))) try:
system.run('"%s" %s' % (context.omvs_densify_path, ' '.join(config + gpu_config + extra_config)))
except system.SubprocessException as e:
if e.errorCode == 137 or e.errorCode == 3221226505:
log.ODM_WARNING("OpenMVS filtering ran out of memory, visibility checks will be skipped.")
skip_filtering()
else:
raise e
else: else:
raise system.ExitException("Cannot find scene_dense.mvs, dense reconstruction probably failed. Exiting...") raise system.ExitException("Cannot find scene_dense.mvs, dense reconstruction probably failed. Exiting...")
else: else:
# Just rename skip_filtering()
scene_dense_ply = os.path.join(tree.openmvs, 'scene_dense.ply')
log.ODM_INFO("Skipped filtering, %s --> %s" % (scene_dense_ply, tree.openmvs_model))
os.rename(scene_dense_ply, tree.openmvs_model)
self.update_progress(95) self.update_progress(95)