Source code for wormpose.commands.export_results
#!/usr/bin/env python
"""
Exporting WormPose results to another format, for example the WCON format for a Tierpsy dataset
"""
import glob
import logging
import os
from argparse import Namespace
import h5py
from wormpose.commands import _log_parameters
from wormpose.config import default_paths
from wormpose.config.default_paths import RESULTS_FILENAME, CONFIG_FILENAME
from wormpose.config.experiment_config import load_config, add_config_argument
from wormpose.dataset import get_dataset_name, load_dataset
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
def _parse_arguments(dataset_path: str, kwargs: dict):
if kwargs.get("work_dir") is None:
kwargs["work_dir"] = default_paths.WORK_DIR
if kwargs.get("video_names") is None:
kwargs["video_names"] = None
dataset_name = get_dataset_name(dataset_path)
kwargs["experiment_dir"] = os.path.join(kwargs["work_dir"], dataset_name)
if kwargs.get("config") is None:
kwargs["config"] = os.path.join(kwargs["experiment_dir"], CONFIG_FILENAME)
_log_parameters(logger.info, {"dataset_path": dataset_path})
_log_parameters(logger.info, kwargs)
return Namespace(**kwargs)
[docs]def export(dataset_path: str, **kwargs):
"""
Export WormPose results into another format, depending on the dataset
:param dataset_path: Root path of the dataset containing videos of worm
"""
args = _parse_arguments(dataset_path, kwargs)
results_root_dir = os.path.join(args.experiment_dir, default_paths.RESULTS_DIR)
results_files = glob.glob(os.path.join(results_root_dir, "*", RESULTS_FILENAME))
if len(results_files) == 0:
raise FileNotFoundError(f"No results files found in path: '{results_root_dir}'")
config = load_config(args.config)
dataset = load_dataset(config.dataset_loader, dataset_path, selected_video_names=args.video_names)
for results_file in results_files:
try:
with h5py.File(results_file, "r") as f:
results_skeletons = f["resolved"]["skeletons"][:]
except Exception:
logger.error(f"Couldn't read results in file {results_file}")
continue
video_name = os.path.basename(os.path.dirname(results_file))
logger.info(f'Exporting: "{video_name}"')
dataset.results_exporter.export(
dataset=dataset,
video_name=video_name,
results_skeletons=results_skeletons,
out_dir=os.path.dirname(results_file),
)
def main():
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("dataset_path", type=str)
parser.add_argument("--work_dir", type=str, help="Root folder for all experiments")
parser.add_argument(
"--video_names",
type=str,
nargs="+",
help="Only analyze a subset of videos. If not set, will analyze all videos in dataset_path.",
)
add_config_argument(parser)
args = parser.parse_args()
export(**vars(args))
if __name__ == "__main__":
main()