sleap-nn 0.1.0a0__tar.gz → 0.1.0a1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/PKG-INFO +1 -1
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/config.md +13 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/__init__.py +4 -2
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/get_config.py +5 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/trainer_config.py +5 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/custom_datasets.py +53 -11
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/train.py +5 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/training/model_trainer.py +30 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn.egg-info/PKG-INFO +1 -1
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/config/test_trainer_config.py +46 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_cli.py +44 -7
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.claude/commands/coverage.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.claude/commands/lint.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.claude/commands/pr-description.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.claude/skills/investigation/SKILL.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.dockerignore +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.github/workflows/build.yml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.github/workflows/ci.yml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.github/workflows/codespell.yml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.github/workflows/docs.yml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/.gitignore +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/CLAUDE.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/CONTRIBUTING.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/LICENSE +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/README.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/codecov.yml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/assets/favicon.ico +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/assets/sleap-logo.png +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/cli.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/colab_notebooks/Training_with_sleap_nn_on_colab.ipynb +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/colab_notebooks/index.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/core_components.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/example_notebooks.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/index.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/inference.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/installation.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/models.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_bottomup_convnext.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_bottomup_unet_large_rf.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_bottomup_unet_medium_rf.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_centroid_swint.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_centroid_unet.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_multi_class_bottomup_unet.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_single_instance_unet_large_rf.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_single_instance_unet_medium_rf.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_topdown_centered_instance_unet_large_rf.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_topdown_centered_instance_unet_medium_rf.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_topdown_multi_class_centered_instance_unet.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/step_by_step_tutorial.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/training.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/example_notebooks/README.md +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/example_notebooks/augmentation_guide.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/example_notebooks/receptive_field_guide.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/example_notebooks/training_demo.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/mkdocs.yml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/pyproject.toml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/scripts/cov_summary.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/scripts/gen_changelog.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/scripts/gen_ref_pages.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/setup.cfg +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/.DS_Store +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/common.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/convnext.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/encoder_decoder.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/heads.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/model.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/swint.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/unet.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/architectures/utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/cli.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/data_config.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/model_config.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/training_job_config.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/config/utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/augmentation.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/confidence_maps.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/edge_maps.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/identity.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/instance_centroids.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/instance_cropping.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/normalization.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/providers.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/resizing.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/data/utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/evaluation.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/bottomup.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/identity.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/paf_grouping.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/peak_finding.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/predictors.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/provenance.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/single_instance.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/topdown.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/inference/utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/legacy_models.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/predict.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/system_info.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/candidates/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/candidates/fixed_window.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/candidates/local_queues.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/track_instance.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/tracker.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/tracking/utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/training/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/training/callbacks.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/training/lightning_modules.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/training/losses.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn/training/utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn.egg-info/SOURCES.txt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn.egg-info/dependency_links.txt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn.egg-info/entry_points.txt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn.egg-info/requires.txt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/sleap_nn.egg-info/top_level.txt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_architecture_utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_common.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_convnext.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_encoder_decoder.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_heads.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_model.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_swint.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/architectures/test_unet.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/datasets/centered_pair_small.mp4 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/datasets/minimal_instance.pkg.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/datasets/small_robot.mp4 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/datasets/small_robot_minimal.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/inference/minimal_bboxes.pt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/inference/minimal_cms.pt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/get_dummy_activations.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/best_model.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/initial_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/best_model.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/initial_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/best_model.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/initial_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_pr.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_pr.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/metrics.train.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/metrics.val.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/best_model.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/initial_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_pr.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_pr.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/metrics.train.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/metrics.val.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/best_model.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/initial_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_pr.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_pr.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/metrics.train.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/metrics.val.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_instance.UNet.centroid/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/best_model.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/initial_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/bottomup_multiclass_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/bottomup_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/centered_instance_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/centered_instance_with_scaling_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/centroid_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/single_instance_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/legacy_sleap_json_configs/topdown_training_config.json +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_bottomup/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_bottomup/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_bottomup/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_bottomup/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_bottomup/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_bottomup/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centered_instance/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centered_instance/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centered_instance/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centered_instance/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centered_instance/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centered_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centroid/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centroid/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centroid/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centroid/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centroid/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_centroid/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_single_instance/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_single_instance/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_single_instance/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_single_instance/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_single_instance/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/minimal_instance_single_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/best.ckpt +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/pred_test.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/pred_train_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/pred_val_0.slp +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/test_pred_metrics.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/train_0_pred_metrics.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/training_config.yaml +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/training_log.csv +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/assets/model_ckpts/single_instance_with_metrics/val_0_pred_metrics.npz +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/config/test_config_utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/config/test_data_config.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/config/test_model_config.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/config/test_training_job_config.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/conftest.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_augmentation.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_confmaps.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_custom_datasets.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_edge_maps.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_identity.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_instance_centroids.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_instance_cropping.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_normalization.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_providers.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_resizing.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/data/test_utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/fixtures/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/fixtures/datasets.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/fixtures/inference.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/fixtures/legacy_models.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/fixtures/legacy_sleap_json_configs.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/fixtures/model_ckpts.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/__init__.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_bottomup.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_paf_grouping.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_peak_finding.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_predictors.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_provenance.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_single_instance.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_topdown.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/inference/test_utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_evaluation.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_legacy_models.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_predict.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_system_info.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_train.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/test_version.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/tracking/candidates/test_fixed_window.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/tracking/candidates/test_local_queues.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/tracking/test_tracker.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/training/test_callbacks.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/training/test_lightning_modules.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/training/test_model_trainer.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/tests/training/test_training_utils.py +0 -0
- {sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sleap-nn
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a1
|
|
4
4
|
Summary: Neural network backend for training and inference for animal pose estimation.
|
|
5
5
|
Author-email: Divya Seshadri Murali <dimurali@salk.edu>, Elizabeth Berrigan <eberrigan@salk.edu>, Vincent Tu <vitu@ucsd.edu>, Liezl Maree <lmaree@salk.edu>, David Samy <davidasamy@gmail.com>, Talmo Pereira <talmo@salk.edu>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -845,6 +845,7 @@ trainer_config:
|
|
|
845
845
|
- `wandb_mode`: (str) "offline" if only local logging is required. **Default**: `"None"`
|
|
846
846
|
- `prv_runid`: (str) Previous run ID if training should be resumed from a previous ckpt. **Default**: `None`
|
|
847
847
|
- `group`: (str) Group name for the run.
|
|
848
|
+
- `delete_local_logs`: (bool, optional) If `True`, delete local wandb logs folder (`wandb/`) after training completes. If `False`, keep the folder. If `None` (default), automatically delete if logging online (`wandb_mode` != "offline") and keep if logging offline. This can save significant disk space since wandb local logs can be several GB. **Default**: `None`
|
|
848
849
|
|
|
849
850
|
**Example WandB configurations:**
|
|
850
851
|
|
|
@@ -876,6 +877,18 @@ trainer_config:
|
|
|
876
877
|
group: "continued_experiments"
|
|
877
878
|
```
|
|
878
879
|
|
|
880
|
+
**Keep local wandb logs (override auto-delete):**
|
|
881
|
+
```yaml
|
|
882
|
+
trainer_config:
|
|
883
|
+
use_wandb: true
|
|
884
|
+
wandb:
|
|
885
|
+
entity: "your_username"
|
|
886
|
+
project: "sleap_nn_experiments"
|
|
887
|
+
name: "training_run"
|
|
888
|
+
wandb_mode: "online"
|
|
889
|
+
delete_local_logs: false # Keep local logs even when syncing online
|
|
890
|
+
```
|
|
891
|
+
|
|
879
892
|
**No WandB logging:**
|
|
880
893
|
```yaml
|
|
881
894
|
trainer_config:
|
|
@@ -41,14 +41,16 @@ def _safe_print(msg):
|
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
# Add logger with the custom filter
|
|
44
|
+
# Disable colorization to avoid ANSI codes in captured output
|
|
44
45
|
logger.add(
|
|
45
46
|
_safe_print,
|
|
46
47
|
level="DEBUG",
|
|
47
48
|
filter=_should_log,
|
|
48
|
-
format="{time:YYYY-MM-DD HH:mm:ss} | {
|
|
49
|
+
format="{time:YYYY-MM-DD HH:mm:ss} | {message}",
|
|
50
|
+
colorize=False,
|
|
49
51
|
)
|
|
50
52
|
|
|
51
|
-
__version__ = "0.1.
|
|
53
|
+
__version__ = "0.1.0a1"
|
|
52
54
|
|
|
53
55
|
# Public API
|
|
54
56
|
from sleap_nn.evaluation import load_metrics
|
|
@@ -677,6 +677,7 @@ def get_trainer_config(
|
|
|
677
677
|
wandb_save_viz_imgs_wandb: bool = False,
|
|
678
678
|
wandb_resume_prv_runid: Optional[str] = None,
|
|
679
679
|
wandb_group_name: Optional[str] = None,
|
|
680
|
+
wandb_delete_local_logs: Optional[bool] = None,
|
|
680
681
|
optimizer: str = "Adam",
|
|
681
682
|
learning_rate: float = 1e-3,
|
|
682
683
|
amsgrad: bool = False,
|
|
@@ -746,6 +747,9 @@ def get_trainer_config(
|
|
|
746
747
|
wandb_resume_prv_runid: Previous run ID if training should be resumed from a previous
|
|
747
748
|
ckpt. Default: None
|
|
748
749
|
wandb_group_name: Group name for the wandb run. Default: None.
|
|
750
|
+
wandb_delete_local_logs: If True, delete local wandb logs folder after training.
|
|
751
|
+
If False, keep the folder. If None (default), automatically delete if logging
|
|
752
|
+
online (wandb_mode != "offline") and keep if logging offline. Default: None.
|
|
749
753
|
optimizer: Optimizer to be used. One of ["Adam", "AdamW"]. Default: "Adam".
|
|
750
754
|
learning_rate: Learning rate of type float. Default: 1e-3.
|
|
751
755
|
amsgrad: Enable AMSGrad with the optimizer. Default: False.
|
|
@@ -846,6 +850,7 @@ def get_trainer_config(
|
|
|
846
850
|
save_viz_imgs_wandb=wandb_save_viz_imgs_wandb,
|
|
847
851
|
prv_runid=wandb_resume_prv_runid,
|
|
848
852
|
group=wandb_group_name,
|
|
853
|
+
delete_local_logs=wandb_delete_local_logs,
|
|
849
854
|
),
|
|
850
855
|
save_ckpt=save_ckpt,
|
|
851
856
|
ckpt_dir=ckpt_dir,
|
|
@@ -90,6 +90,10 @@ class WandBConfig:
|
|
|
90
90
|
viz_box_size: (float) Size of keypoint boxes in pixels (for viz_boxes). *Default*: `5.0`.
|
|
91
91
|
viz_confmap_threshold: (float) Threshold for confidence map masks (for viz_masks). *Default*: `0.1`.
|
|
92
92
|
log_viz_table: (bool) If True, also log images to a wandb.Table for backwards compatibility. *Default*: `False`.
|
|
93
|
+
delete_local_logs: (bool, optional) If True, delete local wandb logs folder after
|
|
94
|
+
training. If False, keep the folder. If None (default), automatically delete
|
|
95
|
+
if logging online (wandb_mode != "offline") and keep if logging offline.
|
|
96
|
+
*Default*: `None`.
|
|
93
97
|
"""
|
|
94
98
|
|
|
95
99
|
entity: Optional[str] = None
|
|
@@ -107,6 +111,7 @@ class WandBConfig:
|
|
|
107
111
|
viz_box_size: float = 5.0
|
|
108
112
|
viz_confmap_threshold: float = 0.1
|
|
109
113
|
log_viz_table: bool = False
|
|
114
|
+
delete_local_logs: Optional[bool] = None
|
|
110
115
|
|
|
111
116
|
|
|
112
117
|
@define
|
|
@@ -13,6 +13,14 @@ from omegaconf import DictConfig, OmegaConf
|
|
|
13
13
|
import numpy as np
|
|
14
14
|
from PIL import Image
|
|
15
15
|
from loguru import logger
|
|
16
|
+
from rich.progress import (
|
|
17
|
+
Progress,
|
|
18
|
+
SpinnerColumn,
|
|
19
|
+
TextColumn,
|
|
20
|
+
BarColumn,
|
|
21
|
+
TimeElapsedColumn,
|
|
22
|
+
)
|
|
23
|
+
from rich.console import Console
|
|
16
24
|
import torch
|
|
17
25
|
import torchvision.transforms as T
|
|
18
26
|
from torch.utils.data import Dataset, DataLoader, DistributedSampler
|
|
@@ -215,17 +223,51 @@ class BaseDataset(Dataset):
|
|
|
215
223
|
def _fill_cache(self, labels: List[sio.Labels]):
|
|
216
224
|
"""Load all samples to cache."""
|
|
217
225
|
# TODO: Implement parallel processing (using threads might cause error with MediaVideo backend)
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
226
|
+
import os
|
|
227
|
+
import sys
|
|
228
|
+
|
|
229
|
+
total_samples = len(self.lf_idx_list)
|
|
230
|
+
cache_type = "disk" if self.cache_img == "disk" else "memory"
|
|
231
|
+
|
|
232
|
+
# Check for NO_COLOR env var or non-interactive terminal
|
|
233
|
+
no_color = (
|
|
234
|
+
os.environ.get("NO_COLOR") is not None
|
|
235
|
+
or os.environ.get("FORCE_COLOR") == "0"
|
|
236
|
+
)
|
|
237
|
+
use_progress = sys.stdout.isatty() and not no_color
|
|
238
|
+
|
|
239
|
+
def process_samples(progress=None, task=None):
|
|
240
|
+
for sample in self.lf_idx_list:
|
|
241
|
+
labels_idx = sample["labels_idx"]
|
|
242
|
+
lf_idx = sample["lf_idx"]
|
|
243
|
+
img = labels[labels_idx][lf_idx].image
|
|
244
|
+
if img.shape[-1] == 1:
|
|
245
|
+
img = np.squeeze(img)
|
|
246
|
+
if self.cache_img == "disk":
|
|
247
|
+
f_name = f"{self.cache_img_path}/sample_{labels_idx}_{lf_idx}.jpg"
|
|
248
|
+
Image.fromarray(img).save(f_name, format="JPEG")
|
|
249
|
+
if self.cache_img == "memory":
|
|
250
|
+
self.cache[(labels_idx, lf_idx)] = img
|
|
251
|
+
if progress is not None:
|
|
252
|
+
progress.update(task, advance=1)
|
|
253
|
+
|
|
254
|
+
if use_progress:
|
|
255
|
+
with Progress(
|
|
256
|
+
SpinnerColumn(),
|
|
257
|
+
TextColumn("[progress.description]{task.description}"),
|
|
258
|
+
BarColumn(),
|
|
259
|
+
TextColumn("{task.completed}/{task.total}"),
|
|
260
|
+
TimeElapsedColumn(),
|
|
261
|
+
console=Console(force_terminal=True),
|
|
262
|
+
transient=True,
|
|
263
|
+
) as progress:
|
|
264
|
+
task = progress.add_task(
|
|
265
|
+
f"Caching images to {cache_type}", total=total_samples
|
|
266
|
+
)
|
|
267
|
+
process_samples(progress, task)
|
|
268
|
+
else:
|
|
269
|
+
logger.info(f"Caching {total_samples} images to {cache_type}...")
|
|
270
|
+
process_samples()
|
|
229
271
|
|
|
230
272
|
def __len__(self) -> int:
|
|
231
273
|
"""Return the number of samples in the dataset."""
|
|
@@ -175,6 +175,7 @@ def train(
|
|
|
175
175
|
wandb_save_viz_imgs_wandb: bool = False,
|
|
176
176
|
wandb_resume_prv_runid: Optional[str] = None,
|
|
177
177
|
wandb_group_name: Optional[str] = None,
|
|
178
|
+
wandb_delete_local_logs: Optional[bool] = None,
|
|
178
179
|
optimizer: str = "Adam",
|
|
179
180
|
learning_rate: float = 1e-3,
|
|
180
181
|
amsgrad: bool = False,
|
|
@@ -353,6 +354,9 @@ def train(
|
|
|
353
354
|
wandb_resume_prv_runid: Previous run ID if training should be resumed from a previous
|
|
354
355
|
ckpt. Default: None
|
|
355
356
|
wandb_group_name: Group name for the wandb run. Default: None.
|
|
357
|
+
wandb_delete_local_logs: If True, delete local wandb logs folder after training.
|
|
358
|
+
If False, keep the folder. If None (default), automatically delete if logging
|
|
359
|
+
online (wandb_mode != "offline") and keep if logging offline. Default: None.
|
|
356
360
|
optimizer: Optimizer to be used. One of ["Adam", "AdamW"]. Default: "Adam".
|
|
357
361
|
learning_rate: Learning rate of type float. Default: 1e-3.
|
|
358
362
|
amsgrad: Enable AMSGrad with the optimizer. Default: False.
|
|
@@ -456,6 +460,7 @@ def train(
|
|
|
456
460
|
wandb_save_viz_imgs_wandb=wandb_save_viz_imgs_wandb,
|
|
457
461
|
wandb_resume_prv_runid=wandb_resume_prv_runid,
|
|
458
462
|
wandb_group_name=wandb_group_name,
|
|
463
|
+
wandb_delete_local_logs=wandb_delete_local_logs,
|
|
459
464
|
optimizer=optimizer,
|
|
460
465
|
learning_rate=learning_rate,
|
|
461
466
|
amsgrad=amsgrad,
|
|
@@ -898,6 +898,17 @@ class ModelTrainer:
|
|
|
898
898
|
)
|
|
899
899
|
loggers.append(wandb_logger)
|
|
900
900
|
|
|
901
|
+
# Log message about wandb local logs cleanup
|
|
902
|
+
should_delete_wandb_logs = wandb_config.delete_local_logs is True or (
|
|
903
|
+
wandb_config.delete_local_logs is None
|
|
904
|
+
and wandb_config.wandb_mode != "offline"
|
|
905
|
+
)
|
|
906
|
+
if should_delete_wandb_logs:
|
|
907
|
+
logger.info(
|
|
908
|
+
"WandB local logs will be deleted after training completes. "
|
|
909
|
+
"To keep logs, set trainer_config.wandb.delete_local_logs=false"
|
|
910
|
+
)
|
|
911
|
+
|
|
901
912
|
# Learning rate monitor callback - logs LR at each step for dynamic schedulers
|
|
902
913
|
# Only added when wandb is enabled since it requires a logger
|
|
903
914
|
callbacks.append(LearningRateMonitor(logging_interval="step"))
|
|
@@ -1314,6 +1325,25 @@ class ModelTrainer:
|
|
|
1314
1325
|
if self.trainer.global_rank == 0 and self.config.trainer_config.use_wandb:
|
|
1315
1326
|
wandb.finish()
|
|
1316
1327
|
|
|
1328
|
+
# Delete local wandb logs if configured
|
|
1329
|
+
wandb_config = self.config.trainer_config.wandb
|
|
1330
|
+
should_delete_wandb_logs = wandb_config.delete_local_logs is True or (
|
|
1331
|
+
wandb_config.delete_local_logs is None
|
|
1332
|
+
and wandb_config.wandb_mode != "offline"
|
|
1333
|
+
)
|
|
1334
|
+
if should_delete_wandb_logs:
|
|
1335
|
+
wandb_dir = (
|
|
1336
|
+
Path(self.config.trainer_config.ckpt_dir)
|
|
1337
|
+
/ self.config.trainer_config.run_name
|
|
1338
|
+
/ "wandb"
|
|
1339
|
+
)
|
|
1340
|
+
if wandb_dir.exists():
|
|
1341
|
+
logger.info(
|
|
1342
|
+
f"Deleting local wandb logs at {wandb_dir}... "
|
|
1343
|
+
"(set trainer_config.wandb.delete_local_logs=false to disable)"
|
|
1344
|
+
)
|
|
1345
|
+
shutil.rmtree(wandb_dir, ignore_errors=True)
|
|
1346
|
+
|
|
1317
1347
|
# delete image disk caching
|
|
1318
1348
|
if (
|
|
1319
1349
|
self.config.data_config.data_pipeline_fw
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sleap-nn
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a1
|
|
4
4
|
Summary: Neural network backend for training and inference for animal pose estimation.
|
|
5
5
|
Author-email: Divya Seshadri Murali <dimurali@salk.edu>, Elizabeth Berrigan <eberrigan@salk.edu>, Vincent Tu <vitu@ucsd.edu>, Liezl Maree <lmaree@salk.edu>, David Samy <davidasamy@gmail.com>, Talmo Pereira <talmo@salk.edu>
|
|
6
6
|
License: BSD-3-Clause
|
|
@@ -123,6 +123,52 @@ def test_wandb_config():
|
|
|
123
123
|
assert custom_conf.project == "test_project"
|
|
124
124
|
|
|
125
125
|
|
|
126
|
+
def test_wandb_config_delete_local_logs():
|
|
127
|
+
"""Test delete_local_logs field in WandBConfig.
|
|
128
|
+
|
|
129
|
+
Verifies default value and auto-detection logic.
|
|
130
|
+
"""
|
|
131
|
+
# Check default value is None
|
|
132
|
+
conf = OmegaConf.structured(WandBConfig)
|
|
133
|
+
assert conf.delete_local_logs is None
|
|
134
|
+
|
|
135
|
+
# Test explicit True
|
|
136
|
+
custom_conf = OmegaConf.structured(WandBConfig(delete_local_logs=True))
|
|
137
|
+
assert custom_conf.delete_local_logs is True
|
|
138
|
+
|
|
139
|
+
# Test explicit False
|
|
140
|
+
custom_conf = OmegaConf.structured(WandBConfig(delete_local_logs=False))
|
|
141
|
+
assert custom_conf.delete_local_logs is False
|
|
142
|
+
|
|
143
|
+
# Test auto-detection logic: online mode (wandb_mode=None) should delete
|
|
144
|
+
config = WandBConfig(wandb_mode=None)
|
|
145
|
+
should_delete = config.delete_local_logs is True or (
|
|
146
|
+
config.delete_local_logs is None and config.wandb_mode != "offline"
|
|
147
|
+
)
|
|
148
|
+
assert should_delete is True
|
|
149
|
+
|
|
150
|
+
# Test auto-detection logic: offline mode should keep
|
|
151
|
+
config = WandBConfig(wandb_mode="offline")
|
|
152
|
+
should_delete = config.delete_local_logs is True or (
|
|
153
|
+
config.delete_local_logs is None and config.wandb_mode != "offline"
|
|
154
|
+
)
|
|
155
|
+
assert should_delete is False
|
|
156
|
+
|
|
157
|
+
# Test explicit True overrides offline mode
|
|
158
|
+
config = WandBConfig(wandb_mode="offline", delete_local_logs=True)
|
|
159
|
+
should_delete = config.delete_local_logs is True or (
|
|
160
|
+
config.delete_local_logs is None and config.wandb_mode != "offline"
|
|
161
|
+
)
|
|
162
|
+
assert should_delete is True
|
|
163
|
+
|
|
164
|
+
# Test explicit False overrides online mode
|
|
165
|
+
config = WandBConfig(wandb_mode=None, delete_local_logs=False)
|
|
166
|
+
should_delete = config.delete_local_logs is True or (
|
|
167
|
+
config.delete_local_logs is None and config.wandb_mode != "offline"
|
|
168
|
+
)
|
|
169
|
+
assert should_delete is False
|
|
170
|
+
|
|
171
|
+
|
|
126
172
|
def test_optimizer_config(caplog):
|
|
127
173
|
"""optimizer_config tests.
|
|
128
174
|
|
|
@@ -323,6 +323,22 @@ def sample_config(tmp_path, minimal_instance):
|
|
|
323
323
|
return config_data
|
|
324
324
|
|
|
325
325
|
|
|
326
|
+
def _strip_ansi_codes(text: str) -> str:
|
|
327
|
+
"""Remove ANSI escape codes from text.
|
|
328
|
+
|
|
329
|
+
This is necessary because some libraries (PyTorch Lightning, Rich, tqdm)
|
|
330
|
+
emit ANSI codes even when NO_COLOR is set, which breaks YAML parsing.
|
|
331
|
+
"""
|
|
332
|
+
import re
|
|
333
|
+
|
|
334
|
+
# Pattern matches ANSI escape sequences including:
|
|
335
|
+
# - CSI sequences: \x1b[...X (e.g., colors, cursor movement)
|
|
336
|
+
# - Private mode sequences: \x1b[?...X (e.g., cursor show/hide)
|
|
337
|
+
# - OSC sequences: \x1b]...X (e.g., window title)
|
|
338
|
+
ansi_pattern = re.compile(r"\x1b\[[?0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07")
|
|
339
|
+
return ansi_pattern.sub("", text)
|
|
340
|
+
|
|
341
|
+
|
|
326
342
|
def test_main_cli(sample_config, tmp_path):
|
|
327
343
|
cmd = [
|
|
328
344
|
"uv",
|
|
@@ -351,6 +367,12 @@ def test_main_cli(sample_config, tmp_path):
|
|
|
351
367
|
)
|
|
352
368
|
OmegaConf.save(sample_config, (Path(tmp_path) / "test_config.yaml").as_posix())
|
|
353
369
|
|
|
370
|
+
import os
|
|
371
|
+
import re
|
|
372
|
+
|
|
373
|
+
# Environment to disable color output from rich/loguru/lightning
|
|
374
|
+
no_color_env = {**os.environ, "NO_COLOR": "1", "FORCE_COLOR": "0"}
|
|
375
|
+
|
|
354
376
|
cmd = [
|
|
355
377
|
"uv",
|
|
356
378
|
"run",
|
|
@@ -368,13 +390,19 @@ def test_main_cli(sample_config, tmp_path):
|
|
|
368
390
|
cmd,
|
|
369
391
|
capture_output=True,
|
|
370
392
|
text=True,
|
|
393
|
+
env=no_color_env,
|
|
371
394
|
)
|
|
372
395
|
# Exit code should be 0
|
|
373
396
|
assert result.returncode == 0
|
|
374
397
|
# Try to parse the output back into the yaml, truncate the beginning (starts with "data_config")
|
|
375
|
-
# Only keep stdout starting from "data_config"
|
|
376
|
-
|
|
377
|
-
|
|
398
|
+
# Only keep stdout starting from "data_config" and ending at the next log timestamp
|
|
399
|
+
# Strip ANSI codes first as some libraries emit them even with NO_COLOR
|
|
400
|
+
stdout_clean = _strip_ansi_codes(result.stdout)
|
|
401
|
+
stripped_out = stdout_clean[stdout_clean.find("data_config") :].strip()
|
|
402
|
+
# Find the next log line (timestamp pattern: YYYY-MM-DD HH:MM:SS |)
|
|
403
|
+
match = re.search(r"\n\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \|", stripped_out)
|
|
404
|
+
if match:
|
|
405
|
+
stripped_out = stripped_out[: match.start()]
|
|
378
406
|
output = OmegaConf.create(stripped_out)
|
|
379
407
|
assert output == sample_config
|
|
380
408
|
|
|
@@ -400,11 +428,15 @@ def test_main_cli(sample_config, tmp_path):
|
|
|
400
428
|
cmd,
|
|
401
429
|
capture_output=True,
|
|
402
430
|
text=True,
|
|
431
|
+
env=no_color_env,
|
|
403
432
|
)
|
|
404
433
|
# Exit code should be 0
|
|
405
434
|
assert result.returncode == 0
|
|
406
|
-
|
|
407
|
-
stripped_out =
|
|
435
|
+
stdout_clean = _strip_ansi_codes(result.stdout)
|
|
436
|
+
stripped_out = stdout_clean[stdout_clean.find("data_config") :].strip()
|
|
437
|
+
match = re.search(r"\n\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \|", stripped_out)
|
|
438
|
+
if match:
|
|
439
|
+
stripped_out = stripped_out[: match.start()]
|
|
408
440
|
output = OmegaConf.create(stripped_out)
|
|
409
441
|
assert output == sample_config
|
|
410
442
|
|
|
@@ -429,6 +461,7 @@ def test_main_cli(sample_config, tmp_path):
|
|
|
429
461
|
cmd,
|
|
430
462
|
capture_output=True,
|
|
431
463
|
text=True,
|
|
464
|
+
env=no_color_env,
|
|
432
465
|
)
|
|
433
466
|
assert (
|
|
434
467
|
Path(f"{sample_config.trainer_config.ckpt_dir}")
|
|
@@ -440,8 +473,12 @@ def test_main_cli(sample_config, tmp_path):
|
|
|
440
473
|
# Exit code should be 0
|
|
441
474
|
assert result.returncode == 0
|
|
442
475
|
# Check that overrides are applied
|
|
443
|
-
|
|
444
|
-
stripped_out =
|
|
476
|
+
stdout_clean = _strip_ansi_codes(result.stdout)
|
|
477
|
+
stripped_out = stdout_clean[stdout_clean.find("data_config") :].strip()
|
|
478
|
+
# Find the next log line (timestamp pattern: YYYY-MM-DD HH:MM:SS |)
|
|
479
|
+
match = re.search(r"\n\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} \|", stripped_out)
|
|
480
|
+
if match:
|
|
481
|
+
stripped_out = stripped_out[: match.start()]
|
|
445
482
|
output = OmegaConf.create(stripped_out)
|
|
446
483
|
assert output.trainer_config.max_epochs == 3
|
|
447
484
|
assert output.data_config.preprocessing.scale == 1.5
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/colab_notebooks/Training_with_sleap_nn_on_colab.ipynb
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_bottomup_unet_large_rf.yaml
RENAMED
|
File without changes
|
{sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_bottomup_unet_medium_rf.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_multi_class_bottomup_unet.yaml
RENAMED
|
File without changes
|
{sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_single_instance_unet_large_rf.yaml
RENAMED
|
File without changes
|
{sleap_nn-0.1.0a0 → sleap_nn-0.1.0a1}/docs/sample_configs/config_single_instance_unet_medium_rf.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|