From b5db7b189574eb8212589ec121ef8a6e3f1dcb2d Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Wed, 4 Nov 2020 16:31:05 +0100 Subject: [PATCH 01/12] [nodes] PanoramaInit: add direction in comment --- meshroom/nodes/aliceVision/PanoramaInit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshroom/nodes/aliceVision/PanoramaInit.py b/meshroom/nodes/aliceVision/PanoramaInit.py index a24e112a44..740f791a11 100644 --- a/meshroom/nodes/aliceVision/PanoramaInit.py +++ b/meshroom/nodes/aliceVision/PanoramaInit.py @@ -93,7 +93,7 @@ class PanoramaInit(desc.CommandLineNode): desc.ChoiceParam( name='inputAngle', label='input Angle offset', - description='Add a rotation to the input XML given poses.', + description='Add a rotation to the input XML given poses (CCW).', value='None', values=['None', 'rotate90', 'rotate180', 'rotate270'], exclusive=True, From 9d6f94bacacc372e2c555966ce29c1377c003802 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Wed, 4 Nov 2020 16:31:30 +0100 Subject: [PATCH 02/12] [nodes] Add new FeatureRepeatability node --- .../nodes/aliceVision/FeatureRepeatability.py | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 meshroom/nodes/aliceVision/FeatureRepeatability.py diff --git a/meshroom/nodes/aliceVision/FeatureRepeatability.py b/meshroom/nodes/aliceVision/FeatureRepeatability.py new file mode 100644 index 0000000000..fffcddf34f --- /dev/null +++ b/meshroom/nodes/aliceVision/FeatureRepeatability.py @@ -0,0 +1,130 @@ +__version__ = "1.1" + +from meshroom.core import desc + + +class FeatureRepeatability(desc.CommandLineNode): + commandLine = 'aliceVision_samples_repeatabilityDataset {allParams}' + size = desc.DynamicNodeSize('input') + # parallelization = desc.Parallelization(blockSize=40) + # commandLineRange = '--rangeStart {rangeStart} --rangeSize {rangeBlockSize}' + + documentation = ''' +''' + + inputs = [ + desc.File( + name='input', + label='Input Folder', + description='Input Folder with evaluation datasets.', + value='', + uid=[0], + ), + desc.ChoiceParam( + name='describerTypes', + label='Describer Types', + description='Describer types used to describe an image.', + value=['sift'], + values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + exclusive=False, + uid=[0], + joinChar=',', + ), + desc.ChoiceParam( + name='describerPreset', + label='Describer Density', + description='Control the ImageDescriber density (low, medium, normal, high, ultra).\n' + 'Warning: Use ULTRA only on small datasets.', + value='normal', + values=['low', 'medium', 'normal', 'high', 'ultra'], + exclusive=True, + uid=[0], + ), + desc.ChoiceParam( + name='describerQuality', + label='Describer Quality', + description='Control the ImageDescriber quality (low, medium, normal, high, ultra).', + value='normal', + values=['low', 'medium', 'normal', 'high', 'ultra'], + exclusive=True, + uid=[0], + ), + desc.ChoiceParam( + name='contrastFiltering', + label='Contrast Filtering', + description="Contrast filtering method to ignore features with too low contrast that can be considered as noise:\n" + "* Static: Fixed threshold.\n" + "* AdaptiveToMedianVariance: Based on image content analysis.\n" + "* NoFiltering: Disable contrast filtering.\n" + "* GridSortOctaves: Grid Sort but per octaves (and only per scale at the end).\n" + "* GridSort: Grid sort per octaves and at the end (scale * peakValue).\n" + "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n", + value='Static', + values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps'], + exclusive=True, + advanced=True, + uid=[0], + ), + desc.FloatParam( + name='relativePeakThreshold', + label='Relative Peak Threshold', + description='Peak Threshold relative to median of gradiants.', + value=0.01, + range=(0.01, 1.0, 0.001), + advanced=True, + uid=[0], + enabled=lambda node: (node.contrastFiltering.value == 'AdaptiveToMedianVariance'), + ), + desc.BoolParam( + name='gridFiltering', + label='Grid Filtering', + description='Enable grid filtering. Highly recommended to ensure usable number of features.', + value=True, + advanced=True, + uid=[0], + ), + desc.BoolParam( + name='forceCpuExtraction', + label='Force CPU Extraction', + description='Use only CPU feature extraction.', + value=True, + uid=[], + advanced=True, + ), + desc.IntParam( + name='invalidate', + label='Invalidate', + description='Invalidate.', + value=0, + range=(0, 10000, 1), + group="", + uid=[0], + ), + desc.StringParam( + name="comments", + label="Comments", + description="Comments", + value="", + group="", + uid=[], + ), + 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, + uid=[], + ) + ] + + outputs = [ + desc.File( + name='output', + label='Output Folder', + description='Output path for the features and descriptors files (*.feat, *.desc).', + value=desc.Node.internalFolder, + uid=[], + ), + ] From 4340634ef5f1fc853eed36bfa1f024791e3e8fe6 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Wed, 4 Nov 2020 16:32:12 +0100 Subject: [PATCH 03/12] [nodes] FeatureExtraction: expose more options --- .../nodes/aliceVision/FeatureExtraction.py | 65 ++++++++++++++++++- 1 file changed, 63 insertions(+), 2 deletions(-) diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index a18537787a..a73381f26a 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -49,13 +49,57 @@ class FeatureExtraction(desc.CommandLineNode): ), desc.ChoiceParam( name='describerPreset', - label='Describer Preset', - description='Control the ImageDescriber configuration (low, medium, normal, high, ultra). Configuration "ultra" can take long time !', + label='Describer Density', + description='Control the ImageDescriber density (low, medium, normal, high, ultra).\n' + 'Warning: Use ULTRA only on small datasets.', value='normal', values=['low', 'medium', 'normal', 'high', 'ultra'], exclusive=True, uid=[0], ), + desc.ChoiceParam( + name='describerQuality', + label='Describer Quality', + description='Control the ImageDescriber quality (low, medium, normal, high, ultra).', + value='normal', + values=['low', 'medium', 'normal', 'high', 'ultra'], + exclusive=True, + uid=[0], + ), + desc.ChoiceParam( + name='contrastFiltering', + label='Contrast Filtering', + description="Contrast filtering method to ignore features with too low contrast that can be considered as noise:\n" + "* Static: Fixed threshold.\n" + "* AdaptiveToMedianVariance: Based on image content analysis.\n" + "* NoFiltering: Disable contrast filtering.\n" + "* GridSortOctaves: Grid Sort but per octaves (and only per scale at the end).\n" + "* GridSort: Grid sort per octaves and at the end (scale * peakValue).\n" + "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n", + value='Static', + values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps'], + exclusive=True, + advanced=True, + uid=[0], + ), + desc.FloatParam( + name='relativePeakThreshold', + label='Relative Peak Threshold', + description='Peak Threshold relative to median of gradiants.', + value=0.01, + range=(0.01, 1.0, 0.001), + advanced=True, + uid=[0], + enabled=lambda node: (node.contrastFiltering.value == 'AdaptiveToMedianVariance'), + ), + desc.BoolParam( + name='gridFiltering', + label='Grid Filtering', + description='Enable grid filtering. Highly recommended to ensure usable number of features.', + value=True, + advanced=True, + uid=[0], + ), desc.BoolParam( name='forceCpuExtraction', label='Force CPU Extraction', @@ -73,6 +117,23 @@ class FeatureExtraction(desc.CommandLineNode): uid=[], advanced=True, ), + desc.IntParam( + name='invalidate', + label='Invalidate', + description='Invalidate.', + value=0, + range=(0, 10000, 1), + group="", + uid=[0], + ), + desc.StringParam( + name="comments", + label="Comments", + description="Comments", + value="", + group="", + uid=[], + ), desc.ChoiceParam( name='verboseLevel', label='Verbose Level', From 4e5bef2a809f034cc6cfd9f07f78d2bc5db9d573 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Fri, 20 Nov 2020 17:40:49 +0100 Subject: [PATCH 04/12] [core] allow lambda on "group" property --- meshroom/core/node.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/meshroom/core/node.py b/meshroom/core/node.py index 17e7ffcfb6..3c7b439505 100644 --- a/meshroom/core/node.py +++ b/meshroom/core/node.py @@ -10,6 +10,7 @@ import re import shutil import time +import types import uuid from collections import defaultdict, namedtuple from enum import Enum @@ -561,15 +562,15 @@ def _computeUids(self): def _buildCmdVars(self): def _buildAttributeCmdVars(cmdVars, name, attr): if attr.enabled: - if attr.attributeDesc.group is not None: + group = attr.attributeDesc.group(attr.node) if isinstance(attr.attributeDesc.group, types.FunctionType) else attr.attributeDesc.group + if group is not None: # if there is a valid command line "group" v = attr.getValueStr() cmdVars[name] = '--{name} {value}'.format(name=name, value=v) cmdVars[name + 'Value'] = str(v) if v: - cmdVars[attr.attributeDesc.group] = cmdVars.get(attr.attributeDesc.group, '') + \ - ' ' + cmdVars[name] + cmdVars[group] = cmdVars.get(group, '') + ' ' + cmdVars[name] elif isinstance(attr, GroupAttribute): assert isinstance(attr.value, DictModel) # if the GroupAttribute is not set in a single command line argument, From dfaa19e5e28554ef7035a7fbfee0de5004ef9ec3 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Fri, 20 Nov 2020 18:00:22 +0100 Subject: [PATCH 05/12] [nodes] add feature type: dsp-sift --- meshroom/nodes/aliceVision/FeatureExtraction.py | 2 +- meshroom/nodes/aliceVision/FeatureMatching.py | 2 +- meshroom/nodes/aliceVision/FeatureRepeatability.py | 2 +- meshroom/nodes/aliceVision/GlobalSfM.py | 2 +- meshroom/nodes/aliceVision/StructureFromMotion.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index a73381f26a..34a9b2fd18 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -42,7 +42,7 @@ class FeatureExtraction(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/FeatureMatching.py b/meshroom/nodes/aliceVision/FeatureMatching.py index 9ffcca0045..addc6c3204 100644 --- a/meshroom/nodes/aliceVision/FeatureMatching.py +++ b/meshroom/nodes/aliceVision/FeatureMatching.py @@ -63,7 +63,7 @@ class FeatureMatching(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/FeatureRepeatability.py b/meshroom/nodes/aliceVision/FeatureRepeatability.py index fffcddf34f..c0dd167b66 100644 --- a/meshroom/nodes/aliceVision/FeatureRepeatability.py +++ b/meshroom/nodes/aliceVision/FeatureRepeatability.py @@ -25,7 +25,7 @@ class FeatureRepeatability(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/GlobalSfM.py b/meshroom/nodes/aliceVision/GlobalSfM.py index fb06535161..49410fea08 100644 --- a/meshroom/nodes/aliceVision/GlobalSfM.py +++ b/meshroom/nodes/aliceVision/GlobalSfM.py @@ -52,7 +52,7 @@ class GlobalSfM(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], diff --git a/meshroom/nodes/aliceVision/StructureFromMotion.py b/meshroom/nodes/aliceVision/StructureFromMotion.py index 7fa6c194a1..878db32b89 100644 --- a/meshroom/nodes/aliceVision/StructureFromMotion.py +++ b/meshroom/nodes/aliceVision/StructureFromMotion.py @@ -97,7 +97,7 @@ class StructureFromMotion(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', From 54ee8af198c346ec96f5e670ce45bd61c8c51537 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Fri, 20 Nov 2020 18:01:37 +0100 Subject: [PATCH 06/12] [nodes] FeatureExtraction: add NonExtremaFiltering filtering --- meshroom/nodes/aliceVision/FeatureExtraction.py | 5 +++-- meshroom/nodes/aliceVision/FeatureRepeatability.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index 34a9b2fd18..88bbe36808 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -75,9 +75,10 @@ class FeatureExtraction(desc.CommandLineNode): "* NoFiltering: Disable contrast filtering.\n" "* GridSortOctaves: Grid Sort but per octaves (and only per scale at the end).\n" "* GridSort: Grid sort per octaves and at the end (scale * peakValue).\n" - "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n", + "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n" + "* NonExtremaFiltering: Filter non-extrema peakValues.\n", value='Static', - values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps'], + values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps', 'NonExtremaFiltering'], exclusive=True, advanced=True, uid=[0], diff --git a/meshroom/nodes/aliceVision/FeatureRepeatability.py b/meshroom/nodes/aliceVision/FeatureRepeatability.py index c0dd167b66..746ba551a0 100644 --- a/meshroom/nodes/aliceVision/FeatureRepeatability.py +++ b/meshroom/nodes/aliceVision/FeatureRepeatability.py @@ -58,9 +58,10 @@ class FeatureRepeatability(desc.CommandLineNode): "* NoFiltering: Disable contrast filtering.\n" "* GridSortOctaves: Grid Sort but per octaves (and only per scale at the end).\n" "* GridSort: Grid sort per octaves and at the end (scale * peakValue).\n" - "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n", + "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n" + "* NonExtremaFiltering: Filter non-extrema peakValues.\n", value='Static', - values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps'], + values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps', 'NonExtremaFiltering'], exclusive=True, advanced=True, uid=[0], From 83f85df9e0a1d2f664d31cee1df192e9fcf23563 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Fri, 20 Nov 2020 18:03:02 +0100 Subject: [PATCH 07/12] [nodes] FeatureExtraction: add custom maxNbFeatures option --- meshroom/nodes/aliceVision/FeatureExtraction.py | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index 88bbe36808..06feadce60 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -53,9 +53,20 @@ class FeatureExtraction(desc.CommandLineNode): description='Control the ImageDescriber density (low, medium, normal, high, ultra).\n' 'Warning: Use ULTRA only on small datasets.', value='normal', - values=['low', 'medium', 'normal', 'high', 'ultra'], + values=['low', 'medium', 'normal', 'high', 'ultra', 'custom'], exclusive=True, uid=[0], + group=lambda node: 'allParams' if node.describerPreset.value != 'custom' else None, + ), + desc.IntParam( + name='maxNbFeatures', + label='Max Nb Features', + description='Max number of features extracted (0 means default value based on Describer Density).', + value=0, + range=(0, 100000, 1000), + uid=[0], + advanced=True, + enabled=lambda node: (node.describerPreset.value == 'custom'), ), desc.ChoiceParam( name='describerQuality', From 24e6ee582f57631d08857c6acea3b4d76b069ff4 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Mon, 23 Nov 2020 15:23:41 +0100 Subject: [PATCH 08/12] [nodes] add dspsift on all nodes using features --- meshroom/nodes/aliceVision/CameraLocalization.py | 2 +- meshroom/nodes/aliceVision/CameraRigCalibration.py | 2 +- meshroom/nodes/aliceVision/ConvertSfMFormat.py | 2 +- meshroom/nodes/aliceVision/ExportMatches.py | 2 +- meshroom/nodes/aliceVision/PanoramaEstimation.py | 2 +- meshroom/nodes/aliceVision/SfMTransform.py | 8 ++++---- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/meshroom/nodes/aliceVision/CameraLocalization.py b/meshroom/nodes/aliceVision/CameraLocalization.py index 0900282747..08a14e412c 100644 --- a/meshroom/nodes/aliceVision/CameraLocalization.py +++ b/meshroom/nodes/aliceVision/CameraLocalization.py @@ -41,7 +41,7 @@ class CameraLocalization(desc.CommandLineNode): label='Match Desc Types', description='''Describer types to use for the matching.''', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/CameraRigCalibration.py b/meshroom/nodes/aliceVision/CameraRigCalibration.py index 67ea8730f5..fe189d082f 100644 --- a/meshroom/nodes/aliceVision/CameraRigCalibration.py +++ b/meshroom/nodes/aliceVision/CameraRigCalibration.py @@ -48,7 +48,7 @@ class CameraRigCalibration(desc.CommandLineNode): label='Match Describer Types', description='''The describer types to use for the matching''', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/ConvertSfMFormat.py b/meshroom/nodes/aliceVision/ConvertSfMFormat.py index 2ffc80225b..687ad5c496 100644 --- a/meshroom/nodes/aliceVision/ConvertSfMFormat.py +++ b/meshroom/nodes/aliceVision/ConvertSfMFormat.py @@ -35,7 +35,7 @@ class ConvertSfMFormat(desc.CommandLineNode): label='Describer Types', description='Describer types to keep.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv', 'unknown'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv', 'unknown'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/ExportMatches.py b/meshroom/nodes/aliceVision/ExportMatches.py index 8df3b39181..53525165df 100644 --- a/meshroom/nodes/aliceVision/ExportMatches.py +++ b/meshroom/nodes/aliceVision/ExportMatches.py @@ -20,7 +20,7 @@ class ExportMatches(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], joinChar=',', diff --git a/meshroom/nodes/aliceVision/PanoramaEstimation.py b/meshroom/nodes/aliceVision/PanoramaEstimation.py index 23dac100cc..b89ae370da 100644 --- a/meshroom/nodes/aliceVision/PanoramaEstimation.py +++ b/meshroom/nodes/aliceVision/PanoramaEstimation.py @@ -51,7 +51,7 @@ class PanoramaEstimation(desc.CommandLineNode): label='Describer Types', description='Describer types used to describe an image.', value=['sift'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], exclusive=False, uid=[0], diff --git a/meshroom/nodes/aliceVision/SfMTransform.py b/meshroom/nodes/aliceVision/SfMTransform.py index 18b0324e66..3bd2f006d0 100644 --- a/meshroom/nodes/aliceVision/SfMTransform.py +++ b/meshroom/nodes/aliceVision/SfMTransform.py @@ -112,8 +112,8 @@ class SfMTransform(desc.CommandLineNode): joinChar="," ), desc.FloatParam( - name="manualScale", - label="Scale", + name="manualScale", + label="Scale", description="Uniform Scale.", value=1.0, uid=[0], @@ -127,8 +127,8 @@ class SfMTransform(desc.CommandLineNode): name='landmarksDescriberTypes', label='Landmarks Describer Types', description='Image describer types used to compute the mean of the point cloud. (only for "landmarks" method).', - value=['sift', 'akaze'], - values=['sift', 'sift_float', 'sift_upright', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv'], + value=['sift', 'dspsift', 'akaze'], + values=['sift', 'sift_float', 'sift_upright', 'dspsift', 'akaze', 'akaze_liop', 'akaze_mldb', 'cctag3', 'cctag4', 'sift_ocv', 'akaze_ocv', 'unknown'], exclusive=False, uid=[0], joinChar=',', From 7f98314bb6fa7832dc1137a0bd73849f0f382549 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Mon, 23 Nov 2020 19:25:01 +0100 Subject: [PATCH 09/12] [ui] init folder when opening new project --- meshroom/ui/qml/main.qml | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/meshroom/ui/qml/main.qml b/meshroom/ui/qml/main.qml index 2cf65039e2..5902d667a9 100755 --- a/meshroom/ui/qml/main.qml +++ b/meshroom/ui/qml/main.qml @@ -352,7 +352,12 @@ ApplicationWindow { id: openActionItem text: "Open" shortcut: "Ctrl+O" - onTriggered: ensureSaved(function() { openFileDialog.open() }) + onTriggered: ensureSaved(function() { + if(_reconstruction.graph && _reconstruction.graph.filepath) { + openFileDialog.folder = Filepath.stringToUrl(Filepath.dirname(_reconstruction.graph.filepath)) + } + openFileDialog.open() + }) } Menu { id: openRecentMenu @@ -405,7 +410,15 @@ ApplicationWindow { text: "Save" shortcut: "Ctrl+S" enabled: (_reconstruction.graph && !_reconstruction.graph.filepath) || !_reconstruction.undoStack.clean - onTriggered: _reconstruction.graph.filepath ? _reconstruction.save() : saveFileDialog.open() + onTriggered: { + if(_reconstruction.graph.filepath) { + _reconstruction.save() + } + else + { + saveFileDialog.open() + } + } } Action { id: saveAsAction From 98f8bf5e3bc35303920e6042f4148f31990bbfdb Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Mon, 23 Nov 2020 22:17:40 +0100 Subject: [PATCH 10/12] [nodes] FeatureExtraction: GridSort filtering by default --- meshroom/nodes/aliceVision/FeatureExtraction.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index 06feadce60..f534c6a4af 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -88,7 +88,7 @@ class FeatureExtraction(desc.CommandLineNode): "* GridSort: Grid sort per octaves and at the end (scale * peakValue).\n" "* GridSortScaleSteps: Grid sort per octaves and at the end (scale and then peakValue).\n" "* NonExtremaFiltering: Filter non-extrema peakValues.\n", - value='Static', + value='GridSort', values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps', 'NonExtremaFiltering'], exclusive=True, advanced=True, From 3daf4a26f373b21b49553f9cfc6125afdd61ce6c Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Mon, 23 Nov 2020 22:17:55 +0100 Subject: [PATCH 11/12] [nodes] FeatureExtraction: remove dev params --- meshroom/nodes/aliceVision/FeatureExtraction.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/meshroom/nodes/aliceVision/FeatureExtraction.py b/meshroom/nodes/aliceVision/FeatureExtraction.py index f534c6a4af..923ed7ee9f 100644 --- a/meshroom/nodes/aliceVision/FeatureExtraction.py +++ b/meshroom/nodes/aliceVision/FeatureExtraction.py @@ -129,23 +129,6 @@ class FeatureExtraction(desc.CommandLineNode): uid=[], advanced=True, ), - desc.IntParam( - name='invalidate', - label='Invalidate', - description='Invalidate.', - value=0, - range=(0, 10000, 1), - group="", - uid=[0], - ), - desc.StringParam( - name="comments", - label="Comments", - description="Comments", - value="", - group="", - uid=[], - ), desc.ChoiceParam( name='verboseLevel', label='Verbose Level', From 715348f68d39e4e47242de3c88175e7e366d4291 Mon Sep 17 00:00:00 2001 From: Fabien Castan Date: Tue, 24 Nov 2020 11:21:57 +0100 Subject: [PATCH 12/12] [multiview] Panorama: change default parameters Use describerQuality=high as it improves quality on many challenging panorama datasets (in particular for the challenging matching between fisheye images) and the number of images to process on a panorama is usually reasonable. --- meshroom/multiview.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/meshroom/multiview.py b/meshroom/multiview.py index b6c6f02885..616e4d044d 100644 --- a/meshroom/multiview.py +++ b/meshroom/multiview.py @@ -180,6 +180,10 @@ def panoramaFisheyeHdr(inputImages=None, inputViewpoints=None, inputIntrinsics=N panoramaHdr(inputImages, inputViewpoints, inputIntrinsics, output, graph) for panoramaInit in graph.nodesByType("PanoramaInit"): panoramaInit.attribute("useFisheye").value = True + # when using fisheye images, the overlap between images can be small + # and thus requires many features to get enough correspondances for cameras estimation + for featureExtraction in graph.nodesByType("FeatureExtraction"): + featureExtraction.attribute("describerPreset").value = 'high' return graph def panoramaHdrPipeline(graph): @@ -214,7 +218,7 @@ def panoramaHdrPipeline(graph): featureExtraction = graph.addNewNode('FeatureExtraction', input=ldr2hdrMerge.outSfMData, - describerPreset='high') + describerQuality='high') panoramaInit = graph.addNewNode('PanoramaInit', input=featureExtraction.input,