opensfm/actions/create_tracks.py (47 lines of code) (raw):
from timeit import default_timer as timer
from opensfm import io
from opensfm import tracking
from opensfm.dataset_base import DataSetBase
def run_dataset(data: DataSetBase) -> None:
"""Link matches pair-wise matches into tracks."""
start = timer()
features, colors, segmentations, instances = tracking.load_features(
data, data.images()
)
features_end = timer()
matches = tracking.load_matches(data, data.images())
matches_end = timer()
tracks_manager = tracking.create_tracks_manager(
features,
colors,
segmentations,
instances,
matches,
data.config["min_track_length"],
)
tracks_end = timer()
data.save_tracks_manager(tracks_manager)
write_report(
data,
tracks_manager,
features_end - start,
matches_end - features_end,
tracks_end - matches_end,
)
def write_report(
data: DataSetBase, tracks_manager, features_time, matches_time, tracks_time
) -> None:
view_graph = [
(k[0], k[1], v) for k, v in tracks_manager.get_all_pairs_connectivity().items()
]
report = {
"wall_times": {
"load_features": features_time,
"load_matches": matches_time,
"compute_tracks": tracks_time,
},
"wall_time": features_time + matches_time + tracks_time,
"num_images": tracks_manager.num_shots(),
"num_tracks": tracks_manager.num_tracks(),
"view_graph": view_graph,
}
data.save_report(io.json_dumps(report), "tracks.json")