Skip to content

Commit d298608

Browse files
committed
Add parmeters for frameviewer (+make its TSDF settings configurable)
1 parent 0be88c3 commit d298608

12 files changed

+91
-132
lines changed

apps/train.py

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
from settings.model import get_saved_model
2323

2424
if __name__ == "__main__":
25-
process_arguments()
25+
args = process_arguments()
2626
torch.set_num_threads(Parameters.training.num_threads.value)
2727
torch.backends.cudnn.benchmark = False
2828

@@ -48,11 +48,6 @@
4848
print("validation_labels_name ", validation_labels_name)
4949
print()
5050

51-
# use_current_hyper = query.query_yes_no("\nThe above hyperparameters will be used. Do you wish to continue?", "yes")
52-
# if not use_current_hyper:
53-
# print("Exiting. Please modify settings_general.py and run this script again.")
54-
# exit()
55-
5651
#####################################################################################
5752
# Creating tf writer and folders
5853
#####################################################################################
@@ -71,8 +66,8 @@
7166
val_writer = SummaryWriter(val_log_dir)
7267

7368
# Copy the current options to the log directory.
74-
options_file_in = os.path.abspath(os.path.join(os.path.dirname(__file__), "../settings/settings_general.py"))
75-
options_file_out = os.path.join(log_dir, "settings.py")
69+
options_file_in = args.settings_file
70+
options_file_out = os.path.join(log_dir, "settings.yaml")
7671
copyfile(options_file_in, options_file_out)
7772

7873
# Creation of alignment dir.

run_evaluate.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
# Specify the dataset split for which to run evaluation
3-
SPLIT="val"
3+
SPLIT="VALIDATION"
44

55
export PYTHONPATH="$(pwd):$PYTHONPATH"
6-
python3 apps/evaluate.py --split=${SPLIT}
6+
python3 apps/evaluate.py --evaluate_split=${SPLIT}

run_frameviewer.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,39 @@
11
#!/usr/bin/python3
2+
from pathlib import Path
3+
24
import sys
3-
import argparse
4-
from apps.frameviewer.frameviewer import FrameViewerApp
5-
from settings import settings_general
5+
from apps.frameviewer.frameviewer import FrameViewerApp, CameraProjection
6+
from data.camera import load_intrinsic_matrix_entries_from_text_4x4_matrix
7+
from settings.frameviewer import FrameviewerParameters
8+
from ext_argparse import process_arguments
69
import os.path
710

811
PROGRAM_EXIT_SUCCESS = 0
912
PROGRAM_EXIT_FAILURE = -1
1013

1114

1215
def main():
13-
parser = argparse.ArgumentParser("App for visualizing RGB-D frame data.")
14-
parser.add_argument("--input", "-i", type=str, help="Path to folder with frame data",
15-
default=os.path.join(settings_general.dataset_base_directory, "train/seq070"))
16-
parser.add_argument("--output", "-o", type=str, help="Path to output folder",
17-
default=settings_general.default_output_directory)
18-
args = parser.parse_args()
19-
print("Reading data from ", args.input)
20-
21-
app = FrameViewerApp(args.input, args.output, 0)
16+
default_configuration_path = os.path.join(Path(__file__).parent.resolve(), "configuration_files/frameviewer_parameters.yaml")
17+
process_arguments(FrameviewerParameters, "An app to view a masked RGB-D sequence frame-by-frame and analyze target"
18+
"hash blocks for the surface (in a spatially-hashed voxel volume)."
19+
"Also allows to determine the optimal threshold for masking. ",
20+
default_settings_file=default_configuration_path,
21+
generate_default_settings_if_missing=True)
22+
print("Reading data from ", FrameviewerParameters.input.value)
23+
24+
FrameViewerApp.VOXEL_BLOCK_SIZE_METERS = \
25+
FrameviewerParameters.tsdf.voxel_size.value * FrameviewerParameters.tsdf.block_resolution.value
26+
FrameViewerApp.VOXEL_BLOCK_SIZE_VOXELS = FrameviewerParameters.tsdf.block_resolution.value
27+
FrameViewerApp.VOXEL_SIZE = FrameviewerParameters.tsdf.voxel_size.value
28+
29+
fx, fy, cx, cy = load_intrinsic_matrix_entries_from_text_4x4_matrix(os.path.join(FrameviewerParameters.input.value, "intrinsics.txt"))
30+
FrameViewerApp.PROJECTION = CameraProjection(fx, fy, cx, cy)
31+
32+
app = FrameViewerApp(FrameviewerParameters.input.value, FrameviewerParameters.output.value, 0)
2233
app.launch()
2334

2435
return PROGRAM_EXIT_SUCCESS
2536

2637

27-
# Warning: not currently supported and most-likely, broken!
2838
if __name__ == "__main__":
2939
sys.exit(main())

run_generate_and_evaluate.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#!/bin/bash
2-
SPLIT="test"
2+
SPLIT="TEST"
33

44
export PYTHONPATH="$(pwd):$PYTHONPATH"
55

66
echo
77
echo "GENERATE..."
8-
python3 apps/generate.py --split=${SPLIT}
8+
python3 apps/generate.py --generate_split=${SPLIT} --deform_net.no-threshold_mask_predictions --deform_net.gn_max_matches_eval=100000
99

1010
echo
1111
echo "EVALUATE..."
12-
python3 apps/evaluate.py --split=${SPLIT}
12+
python3 apps/evaluate.py --evaluate_split=${SPLIT}

run_visualizer.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,19 @@
33
import os
44
import argparse
55

6-
from settings import settings_general
6+
from settings import PathParameters, process_arguments
77
from apps.visualizer.visualizerapp import VisualizerApp
88

99
PROGRAM_EXIT_SUCCESS = 0
1010
PROGRAM_EXIT_FAILURE = -1
1111

1212

1313
def main():
14+
process_arguments()
1415
parser = argparse.ArgumentParser("App for visualizing block allocation and generated mesh alignment.")
1516
run_output_folder = "21-08-09-18-22-01_BERLIN_advanced_pc"
1617
parser.add_argument("--output", "-o", type=str, help="Path to output folder",
17-
default=os.path.join(settings_general.output_directory, run_output_folder, "frame_output"))
18+
default=os.path.join(PathParameters.output_directory.value, run_output_folder, "frame_output"))
1819
parser.add_argument("--initial_frame", "-i", type=int, help="Index of the first frame to process",
1920
default=-1)
2021
args = parser.parse_args()

settings/__init__.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,18 @@ class Parameters(ParameterEnum):
2424
fusion: Type[FusionParameters] = FusionParameters
2525
training: Type[TrainingParameters] = TrainingParameters
2626
graph: Type[GraphParameters] = GraphParameters
27+
2728
generate_split = Parameter(default=Split.VALIDATION, arg_type=Split,
28-
arg_help="Specify the dataset split for which to generate predictions")
29+
arg_help="Specify the dataset split for which to generate predictions.")
30+
evaluate_split = Parameter(default=Split.VALIDATION, arg_type=Split,
31+
arg_help="Specify the dataset split for which to compute evaluation metrics. Assumes predictions have been generated.")
32+
2933

3034

3135
def process_arguments(help_header="A Neural Non-Rigid Fusion Application"):
3236
import ext_argparse
3337
default_configuration_path = os.path.join(Path(__file__).parent.parent.resolve(), "configuration_files/nnrt_fusion_parameters.yaml")
34-
ext_argparse.process_arguments(Parameters, help_header, default_settings_file=default_configuration_path,
35-
generate_default_settings_if_missing=True)
38+
return ext_argparse.process_arguments(Parameters, help_header, default_settings_file=default_configuration_path,
39+
generate_default_settings_if_missing=True)
40+
41+

settings/frameviewer.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
# ================================================================
2+
# Created by Gregory Kramida (https://github.com/Algomorph) on 9/24/21.
3+
# Copyright (c) 2021 Gregory Kramida
4+
# Licensed under the Apache License, Version 2.0 (the "License");
5+
# you may not use this file except in compliance with the License.
6+
# You may obtain a copy of the License at
7+
8+
# http://www.apache.org/licenses/LICENSE-2.0
9+
10+
# Unless required by applicable law or agreed to in writing, software
11+
# distributed under the License is distributed on an "AS IS" BASIS,
12+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
# See the License for the specific language governing permissions and
14+
# limitations under the License.
15+
# ================================================================
16+
17+
from ext_argparse import ParameterEnum, Parameter
18+
from typing import Type
19+
20+
from settings.tsdf import TsdfParameters
21+
22+
23+
class FrameviewerParameters(ParameterEnum):
24+
input = \
25+
Parameter(default="datasets/DeepDeform/train/seq070", arg_type=str,
26+
arg_help="Path to folder with frame data.")
27+
output = \
28+
Parameter(default="output/train/seq070", arg_type=str,
29+
arg_help="Path to folder with output generated from the sequence (optional).")
30+
31+
tsdf: Type[TsdfParameters] = TsdfParameters

subprocedure_examples/opengl_rendering_test.py

Lines changed: 0 additions & 88 deletions
This file was deleted.

tests/data_generation/animate_berlin_x_offset.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
import data.presets as presets
1313
import tsdf_management.default_voxel_grid
1414
import data.camera
15-
from settings import settings_general
15+
from settings import process_arguments, PathParameters, DeformNetParameters
1616

1717
PROGRAM_EXIT_SUCCESS = 0
1818

1919

2020
def main():
21+
process_arguments()
2122
frame_dataset: StandaloneFrameDataset = presets.StandaloneFramePreset.BERLIN_0.value
2223

2324
device = o3c.Device("cuda:0")
@@ -30,7 +31,7 @@ def main():
3031
intrinsics_open3d_cuda = o3d.core.Tensor(intrinsics_open3d_cpu.intrinsic_matrix, o3d.core.Dtype.Float32, device)
3132
extrinsics_open3d_cuda = o3d.core.Tensor.eye(4, o3d.core.Dtype.Float32, device)
3233

33-
volume.integrate(depth_image, color_image, intrinsics_open3d_cuda, extrinsics_open3d_cuda, settings_general.depth_scale, 3.0)
34+
volume.integrate(depth_image, color_image, intrinsics_open3d_cuda, extrinsics_open3d_cuda, DeformNetParameters.depth_scale.value, 3.0)
3435
original_mesh: o3d.geometry.TriangleMesh = volume.extract_surface_mesh(-1, 0).to_legacy_triangle_mesh()
3536
renderer = PyTorch3DRenderer((depth_image.rows, depth_image.columns), device, intrinsics_open3d_cuda)
3637

@@ -45,7 +46,7 @@ def offset_mesh_plus_x(mesh: o3d.geometry.TriangleMesh, offset: float) -> o3d.ge
4546
return _offset_mesh
4647

4748
# prepare folders
48-
root_output_directory = os.path.join(settings_general.output_directory, "berlin_x_offset_sequence")
49+
root_output_directory = os.path.join(PathParameters.output_directory.value, "berlin_x_offset_sequence")
4950
depth_output_directory = os.path.join(root_output_directory, "depth")
5051
if not os.path.exists(depth_output_directory):
5152
os.makedirs(depth_output_directory)

tests/data_generation/animate_berlin_y_stretch.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
import data.presets as presets
1313
import tsdf_management.default_voxel_grid
1414
import data.camera
15-
from settings import settings_general
15+
from settings import process_arguments, PathParameters, DeformNetParameters
1616

1717
PROGRAM_EXIT_SUCCESS = 0
1818

1919

2020
def main():
21+
process_arguments()
2122
frame_dataset: StandaloneFrameDataset = presets.StandaloneFramePreset.BERLIN_0.value
2223

2324
device = o3c.Device("cuda:0")
@@ -30,7 +31,7 @@ def main():
3031
intrinsics_open3d_cuda = o3d.core.Tensor(intrinsics_open3d_cpu.intrinsic_matrix, o3d.core.Dtype.Float32, device)
3132
extrinsics_open3d_cuda = o3d.core.Tensor.eye(4, o3d.core.Dtype.Float32, device)
3233

33-
volume.integrate(depth_image, color_image, intrinsics_open3d_cuda, extrinsics_open3d_cuda, settings_general.depth_scale, 3.0)
34+
volume.integrate(depth_image, color_image, intrinsics_open3d_cuda, extrinsics_open3d_cuda, DeformNetParameters.depth_scale.value, 3.0)
3435
original_mesh: o3d.geometry.TriangleMesh = volume.extract_surface_mesh(-1, 0).to_legacy_triangle_mesh()
3536
renderer = PyTorch3DRenderer((depth_image.rows, depth_image.columns), device, intrinsics_open3d_cuda)
3637

@@ -50,7 +51,7 @@ def scale_mesh_y(mesh: o3d.geometry.TriangleMesh, factor: float) -> o3d.geometry
5051
return _scaled_mesh
5152

5253
# prepare folders
53-
root_output_directory = os.path.join(settings_general.output_directory, "berlin_y_stretch_sequence")
54+
root_output_directory = os.path.join(PathParameters.output_directory.value, "berlin_y_stretch_sequence")
5455
depth_output_directory = os.path.join(root_output_directory, "depth")
5556
if not os.path.exists(depth_output_directory):
5657
os.makedirs(depth_output_directory)

0 commit comments

Comments
 (0)