Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[feature] sift: update default values, add new filtering and add dsp-sift variation #1164

Merged
merged 12 commits into from
Dec 1, 2020
Merged
7 changes: 4 additions & 3 deletions meshroom/core/node.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import re
import shutil
import time
import types
import uuid
from collections import defaultdict, namedtuple
from enum import Enum
Expand Down Expand Up @@ -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,
Expand Down
6 changes: 5 additions & 1 deletion meshroom/multiview.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/CameraLocalization.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=',',
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/CameraRigCalibration.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=',',
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/ConvertSfMFormat.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=',',
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/ExportMatches.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=',',
Expand Down
62 changes: 59 additions & 3 deletions meshroom/nodes/aliceVision/FeatureExtraction.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,76 @@ 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=',',
),
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', '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',
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"
"* NonExtremaFiltering: Filter non-extrema peakValues.\n",
value='GridSort',
values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps', 'NonExtremaFiltering'],
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',
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/FeatureMatching.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=',',
Expand Down
131 changes: 131 additions & 0 deletions meshroom/nodes/aliceVision/FeatureRepeatability.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
__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', 'dspsift', '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"
"* NonExtremaFiltering: Filter non-extrema peakValues.\n",
value='Static',
values=['Static', 'AdaptiveToMedianVariance', 'NoFiltering', 'GridSortOctaves', 'GridSort', 'GridSortScaleSteps', 'GridSortOctaveSteps', 'NonExtremaFiltering'],
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=[],
),
]
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/GlobalSfM.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/PanoramaEstimation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/PanoramaInit.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions meshroom/nodes/aliceVision/SfMTransform.py
Original file line number Diff line number Diff line change
Expand Up @@ -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],
Expand All @@ -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=',',
Expand Down
2 changes: 1 addition & 1 deletion meshroom/nodes/aliceVision/StructureFromMotion.py
Original file line number Diff line number Diff line change
Expand Up @@ -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=',',
Expand Down
17 changes: 15 additions & 2 deletions meshroom/ui/qml/main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down