Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
e7e5a74
doc and renamed gaussian splatting
May 29, 2024
a959c64
modified mvsnet for plugin
May 29, 2024
903e591
massive reorganisation
May 29, 2024
0cfb4e8
updated meshroomPlugins.json
May 29, 2024
b80b9f9
Update .gitmodules
mh0g May 29, 2024
649cdfb
typo
May 30, 2024
1c8d2fe
updated setup.py to only install core lib, cleanup and renaming for core
Jun 3, 2024
631c50e
moved pipelines
Jun 3, 2024
e08b839
modified relative import in benchmark
Jun 3, 2024
e42b3ae
moved back and started cleanup in deep feature matching
Jun 6, 2024
c5a1fad
changed blender folder
Jun 10, 2024
b150a72
calibration comparison cli
Jun 17, 2024
d671305
fixed reality capture for new plugin system
Jun 17, 2024
029c2f3
prepared depth map comparison
Jun 17, 2024
38f5615
ported load dataset
Jun 18, 2024
9c53d64
ported meshcomparison
Jun 18, 2024
c838f21
cleanup colmap and blender
Jun 18, 2024
49d6fd8
added blender
Jun 18, 2024
183ef3b
cosmetics
Jun 18, 2024
43ec97c
added try catch to avoid meshroom import crash
Jun 18, 2024
9a96cb5
added deep feature
Jun 18, 2024
22580b9
added gpu flag
Jun 18, 2024
99512ae
added flag
Jun 18, 2024
80a3819
port colmap
Jul 25, 2024
ee52dcd
continued on refacto
Jul 31, 2024
17476b4
fixed deep_feature
Jul 31, 2024
e688db9
util fixes
Jul 31, 2024
53f1df7
fixes
Jul 31, 2024
0424b5a
fixes extrinsics and export xmp
Sep 26, 2024
86f6919
fix xmp
Sep 30, 2024
04340a5
added deep image matching things (roma experiments)
Jan 28, 2025
bdbadea
added nodes to prune matches and create tracks
Jan 28, 2025
ee33faf
save because we may close
Feb 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 2 additions & 8 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -1,9 +1,3 @@
[submodule "mrrs/deep_mvs/robust_mvd/robustmvd"]
path = mrrs/deep_mvs/robust_mvd/robustmvd
url = https://github.com/lmb-freiburg/robustmvd
[submodule "mrrs/implicit_mesh/instant_ngp/instant-ngp"]
path = mrrs/implicit_mesh/instant_ngp/instant-ngp
url = https://github.com/NVlabs/instant-ngp.git
[submodule "mrrs/depth_maps/vismvsnet/Vis-MVSNet"]
path = mrrs/depth_maps/vismvsnet/Vis-MVSNet
[submodule "mrrs/deep_depth_map/Vis-MVSNet"]
path = mrrs/deep_depth_map/Vis-MVSNet
url = https://github.com/jzhangbs/Vis-MVSNet
13 changes: 7 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,10 +91,11 @@ pip install -e ./MeshroomResearch

Contributions to Meshroom-Research are welcomed! Here's a quick overview of the project structure:

- `mrrs/core`: Basic IOs, utilities, and common geometrical functions.
- `mrrs/pipeline`: Meshroom pipeline files.
- `mrrs/scripts`: Scripts, including benchmarking tools.
- `mrrs/nodes`: Interface nodes for integration into Meshroom.
- `mrrs/<feature>`: Code related to specific features.
- `mrrs/core`: The library side of MRRS, it contains basic IOs, utilities, and common geometrical functions to be used in other plugins. /!\ Your plugin needs to handle the install and the dependencies.
- `mrrs/<feature_plugin>`: Contains the code and the nodes related to a plugin feature.
- `mrrs/meshrooPlugin.json`: Contains the list of plugins in this collection.

Utilize Meshroom's nodal UI for seamless integration, and refer to the [Meshroom's repo](https://github.com/alicevision/Meshroom) for creating custom nodes. We've introduced new types of node (eg. PluginNode and DockerNode), which automates environment management for your convenience.

See meshroom's [plugin documentation](https://github.com/alicevision/Meshroom/tree/dev/plugin_system/meshroom/core) to leanrn how to make your own plugins.

Utilize Meshroom's nodal UI for seamless integration, and refer to the [Meshroom's repo](https://github.com/alicevision/Meshroom) for creating custom nodes. We've introduced a new type of node, CondaNode, which automates Conda environment management for your convenience.
53 changes: 53 additions & 0 deletions meshroomPlugin.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
[
{
"pluginName":"3DR_Benchmark",
"nodesFolder":"mrrs/3DR_benchmark",
"pipelineFolder":"mrrs/3DR_benchmark/pipelines"
},
{
"pluginName":"Blender",
"nodesFolder":"mrrs/blender"
},
{
"pluginName":"Colmap",
"nodesFolder":"mrrs/colmap",
"pipelineFolder":"mrrs/colmap/pipelines"
},
{
"pluginName":"Gaussian_Splatting",
"nodesFolder":"mrrs/gaussian_splatting"
},
{
"pluginName":"Deep_Depth_Maps",
"nodesFolder":"mrrs/deep_depth_map"
},
{
"pluginName":"Deep_Feature_Matching",
"nodesFolder":"mrrs/deep_feature_matching"
},
{
"pluginName":"Deep_Image_Matching",
"nodesFolder":"mrrs/deep_image_matching"
},
{
"pluginName":"Nerf_studio",
"nodesFolder":"mrrs/nerf"
},
{
"pluginName":"Reality_Capture",
"nodesFolder":"mrrs/reality_capture",
"pipelineFolder":"mrrs/reality_capture/pipelines"
},
{
"pluginName":"Stereo_Photometry",
"nodesFolder":"mrrs/stereo_photometry"
},
{
"pluginName":"Utils",
"nodesFolder":"mrrs/utils"
},
{
"pluginName":"Gaussian_Splatting_Inpaint",
"nodesFolder":"mrrs/gs_inpaint"
}
]
102 changes: 102 additions & 0 deletions mrrs/3DR_benchmark/CalibrationComparison.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
"""
This node runs comparison between two input calibration.
"""
__version__ = "3.0"


import os

from meshroom.core import desc
from meshroom.core.plugin import PluginCommandLineNode, EnvType

class CalibrationComparison(PluginCommandLineNode):
category = 'MRRS - Benchmark'

documentation = '''For each camera, compare its estimated parameters with a given groud truth.'''

commandLine = 'python "'+os.path.join(os.path.dirname(__file__), "calibration_comparison.py")+'" {allParams}'

envFile = os.path.join(os.path.dirname(__file__), "general_env.yaml")
envType = EnvType.CONDA

inputs = [
desc.File(
name='inputSfM',
label='SfMData',
description='SfMData file.',
value='',
),

desc.File(
name='inputSfMGT',
label='GtSfMData',
description='Ground Truth SfMData file.',
value='',
),

desc.ChoiceParam(
name='metrics',
label='Metrics',
description='Metrics to be used in the comparison.',
value=['MSECameraCenter'],
values=['MSECameraCenter','AngleBetweenRotations','MSEFocal', 'MSEPrincipalPoint', 'validCams'],
exclusive=False,
joinChar=',',
),

desc.StringParam(
name='csvName',
label='CsvName',
description='Name for the csv file to be used.',
value="calibration_comparison.csv",
group=""
),

desc.ChoiceParam(
name='verboseLevel',
label='Verbose Level',
description='''verbosity level (fatal, error, warning, info, debug, trace).''',
value='info',
values=['fatal', 'error', 'warning', 'info', 'debug', 'trace'],
exclusive=True,
),
]

outputs = [
desc.File(
name='outputFolder',
label='Output Folder',
description='Output folder for generated results.',
group="",
value=desc.Node.internalFolder,
),
desc.StringParam(
name='outputCsv',
label='Output Csv',
description='Output file to generated results.',
value=lambda attr: os.path.join(desc.Node.internalFolder, attr.node.csvName.value),
)
]

def check_inputs(self, chunk):
"""
Checks that all inputs are properly set.
"""
if not chunk.node.inputSfM.value:
chunk.logger.warning('No inputSfM in node, skipping')
return False
if not chunk.node.inputSfMGT.value:
chunk.logger.warning('No inputSfMGT in node, skipping')
return False
return True

def processChunk(self, chunk):
"""
Computes the different metrics on the input and groud truth depth maps.
"""
chunk.logManager.start(chunk.node.verboseLevel.value)
if not self.check_inputs(chunk):
raise RuntimeError("Missing arguments")
super().processChunk(chunk)
chunk.logger.info('Calib comparison ends')
chunk.logManager.end()
100 changes: 100 additions & 0 deletions mrrs/3DR_benchmark/DepthMapComparison.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
__version__ = "3.0"

import os
from meshroom.core import desc
from meshroom.core.plugin import PluginCommandLineNode, EnvType

class DepthMapComparison(PluginCommandLineNode):

category = 'MRRS - Benchmark'

documentation = '''For each camera, compare its depth maps to a given ground truth.
The names of the original inputSfM file is used to retrieve the GT file, therefore must match.
The depth maps are assumed to be estimated with the same inputSfM poses.
Autorescale may be used otherwise but it is far from ideal.
'''

commandLine = 'python "'+os.path.join(os.path.dirname(__file__), "depth_map_comparison.py")+'" {allParams}'

envFile = os.path.join(os.path.dirname(__file__), "general_env.yaml")
envType = EnvType.CONDA

inputs = [
desc.File(
name='inputSfM',
label='SfMData',
description='SfMData file.',
value='',
),

desc.File(
name="depthMapsFolder",
label="DepthMaps Folder",
description="Input depth maps folder.",
value="",
),

desc.File(
name="depthMapsFolderGT",
label="GT DepthMaps Folder",
description="Input ground truth depth maps folder.",
value="",
),

desc.ChoiceParam(
name='metrics',
label='Metrics',
description='Metrics to be used in the comparison.',
value=['RMSE', 'MAE', 'validity_ratio'],
values=['RMSE', 'MAE', 'validity_ratio'],
exclusive=False,
joinChar=',',
),

desc.BoolParam(
name='autoRescale',
label='Auto Rescale',
description='''Will attempt to find a scale factor between GT depth maps and estimated depth maps. To be used when the depth maps have not been estimated from the same camera coordinate system.''',
value=False,
),

desc.StringParam(
name='maskValue',
label='Mask Value',
description='''If this is not None, will mask the pixels with value bellow this (in gt and estimated).''',
value='0',
),

desc.StringParam(
name='csv_name',
label='CsvName',
description='Name for the csv file to be used.',
value="depth_map_comparison.csv",
group="0"
),

desc.ChoiceParam(
name='verboseLevel',
label='Verbose Level',
description='''Verbosity level (fatal, error, warning, info, debug, trace).''',
value='info',
values=['fatal', 'error', 'warning', 'info', 'debug', 'trace'],
exclusive=True,
),
]

outputs = [
desc.File(
name='output',
label='Output',
description='Output folder for generated results.',
value=desc.Node.internalFolder,
),

desc.File(
name='outputCsv',
label='Output Csv',
description='Output file to generated results.',
value=lambda attr: os.path.join(desc.Node.internalFolder, attr.node.csv_name.value),
)
]
Loading