sleap-nn 0.1.0a3__tar.gz → 0.1.0a4__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.0a3 → sleap_nn-0.1.0a4}/.github/workflows/docs.yml +1 -1
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/PKG-INFO +2 -1
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/pyproject.toml +1 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/__init__.py +1 -1
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/convnext.py +5 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/encoder_decoder.py +25 -6
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/swint.py +8 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/cli.py +132 -39
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/peak_finding.py +47 -17
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/predictors.py +213 -106
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/predict.py +6 -7
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/callbacks.py +7 -2
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/model_trainer.py +32 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/PKG-INFO +2 -1
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/SOURCES.txt +1 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/requires.txt +1 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/conftest.py +1 -0
- sleap_nn-0.1.0a4/tests/fixtures/predictors.py +86 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_peak_finding.py +79 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_cli.py +7 -7
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_predict.py +36 -90
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_train.py +69 -57
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_callbacks.py +32 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_lightning_modules.py +27 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_model_trainer.py +24 -8
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/uv.lock +2 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/commands/coverage.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/commands/lint.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/commands/pr-description.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/skills/investigation/SKILL.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.dockerignore +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/build.yml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/ci.yml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/codespell.yml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.gitignore +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/CLAUDE.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/CONTRIBUTING.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/LICENSE +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/README.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/codecov.yml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/assets/favicon.ico +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/assets/sleap-logo.png +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/cli.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/colab_notebooks/Training_with_sleap_nn_on_colab.ipynb +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/colab_notebooks/index.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/config.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/core_components.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/example_notebooks.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/export.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/index.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/inference.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/installation.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/models.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_bottomup_convnext.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_bottomup_unet_large_rf.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_bottomup_unet_medium_rf.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_centroid_swint.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_centroid_unet.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_multi_class_bottomup_unet.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_single_instance_unet_large_rf.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_single_instance_unet_medium_rf.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_topdown_centered_instance_unet_large_rf.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_topdown_centered_instance_unet_medium_rf.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_topdown_multi_class_centered_instance_unet.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/step_by_step_tutorial.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/training.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/README.md +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/augmentation_guide.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/receptive_field_guide.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/training_demo.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/mkdocs.yml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/scripts/cov_summary.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/scripts/gen_changelog.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/scripts/gen_ref_pages.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/setup.cfg +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/.DS_Store +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/common.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/heads.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/model.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/unet.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/data_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/get_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/model_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/trainer_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/training_job_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/augmentation.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/confidence_maps.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/custom_datasets.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/edge_maps.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/identity.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/instance_centroids.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/instance_cropping.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/normalization.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/providers.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/resizing.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/evaluation.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/cli.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/exporters/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/exporters/onnx_exporter.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/exporters/tensorrt_exporter.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/metadata.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/base.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/onnx.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/tensorrt.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/base.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/bottomup.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/bottomup_multiclass.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/centered_instance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/centroid.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/single_instance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/topdown.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/topdown_multiclass.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/bottomup.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/identity.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/paf_grouping.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/postprocessing.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/provenance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/single_instance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/topdown.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/legacy_models.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/system_info.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/candidates/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/candidates/fixed_window.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/candidates/local_queues.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/track_instance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/tracker.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/train.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/lightning_modules.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/losses.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/dependency_links.txt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/entry_points.txt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/top_level.txt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_architecture_utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_common.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_convnext.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_encoder_decoder.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_heads.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_model.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_swint.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_unet.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/centered_pair_small.mp4 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/minimal_instance.pkg.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/small_robot.mp4 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/small_robot_minimal.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/inference/minimal_bboxes.pt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/inference/minimal_cms.pt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/get_dummy_activations.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/best_model.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/initial_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.bottomup_multiclass/training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/best_model.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/initial_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/min_tracks_2node.UNet.topdown_multiclass/training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/best_model.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/initial_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_pr.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_pr.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/metrics.train.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/metrics.val.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/best_model.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/initial_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_pr.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/labels_pr.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/metrics.train.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/metrics.val.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/best_model.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/initial_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_pr.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_pr.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/metrics.train.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/metrics.val.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/best_model.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/dummy_activations.h5 +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/initial_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/labels_gt.train.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/labels_gt.val.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/bottomup_multiclass_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/bottomup_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/centered_instance_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/centered_instance_with_scaling_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/centroid_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/single_instance_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/topdown_training_config.json +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/best.ckpt +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/initial_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/labels_train_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/labels_val_gt_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/pred_test.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/pred_train_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/pred_val_0.slp +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/test_pred_metrics.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/train_0_pred_metrics.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/training_config.yaml +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/training_log.csv +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/val_0_pred_metrics.npz +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_config_utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_data_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_model_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_trainer_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_training_job_config.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_augmentation.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_confmaps.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_custom_datasets.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_edge_maps.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_identity.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_instance_centroids.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_instance_cropping.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_normalization.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_providers.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_resizing.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/conftest.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_cli.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_gpu.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_metadata.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_onnx_export.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_onnx_predictor.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_predictor_factory.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_wrappers.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/datasets.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/inference.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/legacy_models.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/legacy_sleap_json_configs.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/model_ckpts.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/__init__.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_bottomup.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_paf_grouping.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_postprocessing.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_predictors.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_provenance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_single_instance.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_topdown.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_utils.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_evaluation.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_legacy_models.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_system_info.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_version.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/tracking/candidates/test_fixed_window.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/tracking/candidates/test_local_queues.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/tracking/test_tracker.py +0 -0
- {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_training_utils.py +0 -0
|
@@ -57,7 +57,7 @@ jobs:
|
|
|
57
57
|
env:
|
|
58
58
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
59
59
|
run: |
|
|
60
|
-
uv run mike deploy --allow-empty --push "${{ github.event.release.tag_name }}"
|
|
60
|
+
uv run mike deploy --update-aliases --allow-empty --push "${{ github.event.release.tag_name }}" prerelease
|
|
61
61
|
|
|
62
62
|
- name: Build and upload docs (dev)
|
|
63
63
|
if: ${{ github.event_name == 'push' }}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: sleap-nn
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.0a4
|
|
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
|
|
@@ -32,6 +32,7 @@ Requires-Dist: hydra-core
|
|
|
32
32
|
Requires-Dist: jupyter
|
|
33
33
|
Requires-Dist: jupyterlab
|
|
34
34
|
Requires-Dist: pyzmq
|
|
35
|
+
Requires-Dist: rich-click>=1.9.5
|
|
35
36
|
Provides-Extra: torch
|
|
36
37
|
Requires-Dist: torch; extra == "torch"
|
|
37
38
|
Requires-Dist: torchvision>=0.20.0; extra == "torch"
|
|
@@ -281,6 +281,10 @@ class ConvNextWrapper(nn.Module):
|
|
|
281
281
|
# Keep the block output filters the same
|
|
282
282
|
x_in_shape = int(self.arch["channels"][-1] * filters_rate)
|
|
283
283
|
|
|
284
|
+
# Encoder channels for skip connections (reversed to match decoder order)
|
|
285
|
+
# The forward pass uses enc_output[::2][::-1] for skip features
|
|
286
|
+
encoder_channels = self.arch["channels"][::-1]
|
|
287
|
+
|
|
284
288
|
self.dec = Decoder(
|
|
285
289
|
x_in_shape=x_in_shape,
|
|
286
290
|
current_stride=self.current_stride,
|
|
@@ -293,6 +297,7 @@ class ConvNextWrapper(nn.Module):
|
|
|
293
297
|
block_contraction=self.block_contraction,
|
|
294
298
|
output_stride=self.output_stride,
|
|
295
299
|
up_interpolate=up_interpolate,
|
|
300
|
+
encoder_channels=encoder_channels,
|
|
296
301
|
)
|
|
297
302
|
|
|
298
303
|
if len(self.dec.decoder_stack):
|
|
@@ -25,7 +25,7 @@ classes.
|
|
|
25
25
|
See the `EncoderDecoder` base class for requirements for creating new architectures.
|
|
26
26
|
"""
|
|
27
27
|
|
|
28
|
-
from typing import List, Text, Tuple, Union
|
|
28
|
+
from typing import List, Optional, Text, Tuple, Union
|
|
29
29
|
from collections import OrderedDict
|
|
30
30
|
import torch
|
|
31
31
|
from torch import nn
|
|
@@ -391,10 +391,18 @@ class SimpleUpsamplingBlock(nn.Module):
|
|
|
391
391
|
transpose_convs_activation: Text = "relu",
|
|
392
392
|
feat_concat: bool = True,
|
|
393
393
|
prefix: Text = "",
|
|
394
|
+
skip_channels: Optional[int] = None,
|
|
394
395
|
) -> None:
|
|
395
396
|
"""Initialize the class."""
|
|
396
397
|
super().__init__()
|
|
397
398
|
|
|
399
|
+
# Determine skip connection channels
|
|
400
|
+
# If skip_channels is provided, use it; otherwise fall back to refine_convs_filters
|
|
401
|
+
# This allows ConvNext/SwinT to specify actual encoder channels
|
|
402
|
+
self.skip_channels = (
|
|
403
|
+
skip_channels if skip_channels is not None else refine_convs_filters
|
|
404
|
+
)
|
|
405
|
+
|
|
398
406
|
self.x_in_shape = x_in_shape
|
|
399
407
|
self.current_stride = current_stride
|
|
400
408
|
self.upsampling_stride = upsampling_stride
|
|
@@ -469,13 +477,13 @@ class SimpleUpsamplingBlock(nn.Module):
|
|
|
469
477
|
first_conv_in_channels = refine_convs_filters
|
|
470
478
|
else:
|
|
471
479
|
if self.up_interpolate:
|
|
472
|
-
# With interpolation, input is x_in_shape +
|
|
473
|
-
#
|
|
474
|
-
first_conv_in_channels = x_in_shape +
|
|
480
|
+
# With interpolation, input is x_in_shape + skip_channels
|
|
481
|
+
# skip_channels may differ from refine_convs_filters for ConvNext/SwinT
|
|
482
|
+
first_conv_in_channels = x_in_shape + self.skip_channels
|
|
475
483
|
else:
|
|
476
|
-
# With transpose conv, input is transpose_conv_output +
|
|
484
|
+
# With transpose conv, input is transpose_conv_output + skip_channels
|
|
477
485
|
first_conv_in_channels = (
|
|
478
|
-
|
|
486
|
+
self.skip_channels + transpose_convs_filters
|
|
479
487
|
)
|
|
480
488
|
else:
|
|
481
489
|
if not self.feat_concat:
|
|
@@ -582,6 +590,7 @@ class Decoder(nn.Module):
|
|
|
582
590
|
block_contraction: bool = False,
|
|
583
591
|
up_interpolate: bool = True,
|
|
584
592
|
prefix: str = "dec",
|
|
593
|
+
encoder_channels: Optional[List[int]] = None,
|
|
585
594
|
) -> None:
|
|
586
595
|
"""Initialize the class."""
|
|
587
596
|
super().__init__()
|
|
@@ -598,6 +607,7 @@ class Decoder(nn.Module):
|
|
|
598
607
|
self.block_contraction = block_contraction
|
|
599
608
|
self.prefix = prefix
|
|
600
609
|
self.stride_to_filters = {}
|
|
610
|
+
self.encoder_channels = encoder_channels
|
|
601
611
|
|
|
602
612
|
self.current_strides = []
|
|
603
613
|
self.residuals = 0
|
|
@@ -624,6 +634,13 @@ class Decoder(nn.Module):
|
|
|
624
634
|
|
|
625
635
|
next_stride = current_stride // 2
|
|
626
636
|
|
|
637
|
+
# Determine skip channels for this decoder block
|
|
638
|
+
# If encoder_channels provided, use actual encoder channels
|
|
639
|
+
# Otherwise fall back to computed filters (for UNet compatibility)
|
|
640
|
+
skip_channels = None
|
|
641
|
+
if encoder_channels is not None and block < len(encoder_channels):
|
|
642
|
+
skip_channels = encoder_channels[block]
|
|
643
|
+
|
|
627
644
|
if self.stem_blocks > 0 and block >= down_blocks + self.stem_blocks:
|
|
628
645
|
# This accounts for the case where we dont have any more down block features to concatenate with.
|
|
629
646
|
# In this case, add a simple upsampling block with a conv layer and with no concatenation
|
|
@@ -642,6 +659,7 @@ class Decoder(nn.Module):
|
|
|
642
659
|
transpose_convs_batch_norm=False,
|
|
643
660
|
feat_concat=False,
|
|
644
661
|
prefix=f"{self.prefix}{block}_s{current_stride}_to_s{next_stride}",
|
|
662
|
+
skip_channels=skip_channels,
|
|
645
663
|
)
|
|
646
664
|
)
|
|
647
665
|
else:
|
|
@@ -659,6 +677,7 @@ class Decoder(nn.Module):
|
|
|
659
677
|
transpose_convs_filters=block_filters_out,
|
|
660
678
|
transpose_convs_batch_norm=False,
|
|
661
679
|
prefix=f"{self.prefix}{block}_s{current_stride}_to_s{next_stride}",
|
|
680
|
+
skip_channels=skip_channels,
|
|
662
681
|
)
|
|
663
682
|
)
|
|
664
683
|
|
|
@@ -309,6 +309,13 @@ class SwinTWrapper(nn.Module):
|
|
|
309
309
|
self.stem_patch_stride * (2**3) * 2
|
|
310
310
|
) # stem_stride * down_blocks_stride * final_max_pool_stride
|
|
311
311
|
|
|
312
|
+
# Encoder channels for skip connections (reversed to match decoder order)
|
|
313
|
+
# SwinT channels: embed * 2^i for each stage i, then reversed
|
|
314
|
+
num_stages = len(self.arch["depths"])
|
|
315
|
+
encoder_channels = [
|
|
316
|
+
self.arch["embed"] * (2 ** (num_stages - 1 - i)) for i in range(num_stages)
|
|
317
|
+
]
|
|
318
|
+
|
|
312
319
|
self.dec = Decoder(
|
|
313
320
|
x_in_shape=block_filters,
|
|
314
321
|
current_stride=self.current_stride,
|
|
@@ -321,6 +328,7 @@ class SwinTWrapper(nn.Module):
|
|
|
321
328
|
block_contraction=self.block_contraction,
|
|
322
329
|
output_stride=output_stride,
|
|
323
330
|
up_interpolate=up_interpolate,
|
|
331
|
+
encoder_channels=encoder_channels,
|
|
324
332
|
)
|
|
325
333
|
|
|
326
334
|
if len(self.dec.decoder_stack):
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
"""Unified CLI for SLEAP-NN using
|
|
1
|
+
"""Unified CLI for SLEAP-NN using rich-click for styled output."""
|
|
2
2
|
|
|
3
|
-
import click
|
|
3
|
+
import rich_click as click
|
|
4
|
+
from click import Command
|
|
4
5
|
from loguru import logger
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
from omegaconf import OmegaConf, DictConfig
|
|
@@ -13,7 +14,36 @@ from sleap_nn.train import run_training
|
|
|
13
14
|
from sleap_nn import __version__
|
|
14
15
|
import hydra
|
|
15
16
|
import sys
|
|
16
|
-
|
|
17
|
+
|
|
18
|
+
# Rich-click configuration for styled help
|
|
19
|
+
click.rich_click.TEXT_MARKUP = "markdown"
|
|
20
|
+
click.rich_click.SHOW_ARGUMENTS = True
|
|
21
|
+
click.rich_click.GROUP_ARGUMENTS_OPTIONS = True
|
|
22
|
+
click.rich_click.STYLE_ERRORS_SUGGESTION = "magenta italic"
|
|
23
|
+
click.rich_click.ERRORS_EPILOGUE = (
|
|
24
|
+
"Try 'sleap-nn [COMMAND] --help' for more information."
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def is_config_path(arg: str) -> bool:
|
|
29
|
+
"""Check if an argument looks like a config file path.
|
|
30
|
+
|
|
31
|
+
Returns True if the arg ends with .yaml or .yml.
|
|
32
|
+
"""
|
|
33
|
+
return arg.endswith(".yaml") or arg.endswith(".yml")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def split_config_path(config_path: str) -> tuple:
|
|
37
|
+
"""Split a full config path into (config_dir, config_name).
|
|
38
|
+
|
|
39
|
+
Args:
|
|
40
|
+
config_path: Full path to a config file.
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Tuple of (config_dir, config_name) where config_dir is an absolute path.
|
|
44
|
+
"""
|
|
45
|
+
path = Path(config_path).resolve()
|
|
46
|
+
return path.parent.as_posix(), path.name
|
|
17
47
|
|
|
18
48
|
|
|
19
49
|
def print_version(ctx, param, value):
|
|
@@ -66,38 +96,77 @@ def cli():
|
|
|
66
96
|
|
|
67
97
|
|
|
68
98
|
def show_training_help():
|
|
69
|
-
"""Display training help information."""
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
99
|
+
"""Display training help information with rich formatting."""
|
|
100
|
+
from rich.console import Console
|
|
101
|
+
from rich.panel import Panel
|
|
102
|
+
from rich.markdown import Markdown
|
|
103
|
+
|
|
104
|
+
console = Console()
|
|
105
|
+
|
|
106
|
+
help_md = """
|
|
107
|
+
## Usage
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
sleap-nn train <config.yaml> [overrides]
|
|
111
|
+
sleap-nn train --config <path/to/config.yaml> [overrides]
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Common Overrides
|
|
115
|
+
|
|
116
|
+
| Override | Description |
|
|
117
|
+
|----------|-------------|
|
|
118
|
+
| `trainer_config.max_epochs=100` | Set maximum training epochs |
|
|
119
|
+
| `trainer_config.batch_size=32` | Set batch size |
|
|
120
|
+
| `trainer_config.save_ckpt=true` | Enable checkpoint saving |
|
|
121
|
+
|
|
122
|
+
## Examples
|
|
123
|
+
|
|
124
|
+
**Start a new training run:**
|
|
125
|
+
```bash
|
|
126
|
+
sleap-nn train path/to/config.yaml
|
|
127
|
+
sleap-nn train --config path/to/config.yaml
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
**With overrides:**
|
|
131
|
+
```bash
|
|
132
|
+
sleap-nn train config.yaml trainer_config.max_epochs=100
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
**Resume training:**
|
|
136
|
+
```bash
|
|
137
|
+
sleap-nn train config.yaml trainer_config.resume_ckpt_path=/path/to/ckpt
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Legacy usage (still supported):**
|
|
141
|
+
```bash
|
|
142
|
+
sleap-nn train --config-dir /path/to/dir --config-name myrun
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## Tips
|
|
146
|
+
|
|
147
|
+
- Use `-m/--multirun` for sweeps; outputs go under `hydra.sweep.dir`
|
|
148
|
+
- For Hydra flags and completion, use `--hydra-help`
|
|
149
|
+
- Config documentation: https://nn.sleap.ai/config/
|
|
93
150
|
"""
|
|
94
|
-
|
|
151
|
+
console.print(
|
|
152
|
+
Panel(
|
|
153
|
+
Markdown(help_md),
|
|
154
|
+
title="[bold cyan]sleap-nn train[/bold cyan]",
|
|
155
|
+
subtitle="Train SLEAP models from a config YAML file",
|
|
156
|
+
border_style="cyan",
|
|
157
|
+
)
|
|
158
|
+
)
|
|
95
159
|
|
|
96
160
|
|
|
97
161
|
@cli.command(cls=TrainCommand)
|
|
98
|
-
@click.option("--config-name", "-c", type=str, help="Configuration file name")
|
|
99
162
|
@click.option(
|
|
100
|
-
"--config
|
|
163
|
+
"--config",
|
|
164
|
+
type=str,
|
|
165
|
+
help="Path to configuration file (e.g., path/to/config.yaml)",
|
|
166
|
+
)
|
|
167
|
+
@click.option("--config-name", "-c", type=str, help="Configuration file name (legacy)")
|
|
168
|
+
@click.option(
|
|
169
|
+
"--config-dir", "-d", type=str, default=".", help="Configuration directory (legacy)"
|
|
101
170
|
)
|
|
102
171
|
@click.option(
|
|
103
172
|
"--video-paths",
|
|
@@ -130,25 +199,43 @@ For a detailed list of all available config options, please refer to https://nn.
|
|
|
130
199
|
'Example: --prefix-map "/old/server/path" "/new/local/path"',
|
|
131
200
|
)
|
|
132
201
|
@click.argument("overrides", nargs=-1, type=click.UNPROCESSED)
|
|
133
|
-
def train(
|
|
202
|
+
def train(
|
|
203
|
+
config, config_name, config_dir, video_paths, video_path_map, prefix_map, overrides
|
|
204
|
+
):
|
|
134
205
|
"""Run training workflow with Hydra config overrides.
|
|
135
206
|
|
|
136
207
|
Examples:
|
|
137
|
-
sleap-nn train
|
|
208
|
+
sleap-nn train path/to/config.yaml
|
|
209
|
+
sleap-nn train --config path/to/config.yaml trainer_config.max_epochs=100
|
|
138
210
|
sleap-nn train -c myconfig -d /path/to/config_dir/ trainer_config.max_epochs=100
|
|
139
|
-
sleap-nn train -c myconfig -d /path/to/config_dir/ +experiment=new_model
|
|
140
211
|
"""
|
|
141
|
-
#
|
|
142
|
-
|
|
212
|
+
# Convert overrides to a mutable list
|
|
213
|
+
overrides = list(overrides)
|
|
214
|
+
|
|
215
|
+
# Check if the first positional arg is a config path (not a Hydra override)
|
|
216
|
+
config_from_positional = None
|
|
217
|
+
if overrides and is_config_path(overrides[0]):
|
|
218
|
+
config_from_positional = overrides.pop(0)
|
|
219
|
+
|
|
220
|
+
# Resolve config path with priority:
|
|
221
|
+
# 1. Positional config path (e.g., sleap-nn train config.yaml)
|
|
222
|
+
# 2. --config flag (e.g., sleap-nn train --config config.yaml)
|
|
223
|
+
# 3. Legacy --config-dir/--config-name flags
|
|
224
|
+
if config_from_positional:
|
|
225
|
+
config_dir, config_name = split_config_path(config_from_positional)
|
|
226
|
+
elif config:
|
|
227
|
+
config_dir, config_name = split_config_path(config)
|
|
228
|
+
elif config_name:
|
|
229
|
+
config_dir = Path(config_dir).resolve().as_posix()
|
|
230
|
+
else:
|
|
231
|
+
# No config provided - show help
|
|
143
232
|
show_training_help()
|
|
144
233
|
return
|
|
145
234
|
|
|
146
|
-
# Initialize Hydra manually
|
|
147
|
-
# resolve the path to the config directory (hydra expects absolute path)
|
|
148
|
-
config_dir = Path(config_dir).resolve().as_posix()
|
|
235
|
+
# Initialize Hydra manually (config_dir is already an absolute path)
|
|
149
236
|
with hydra.initialize_config_dir(config_dir=config_dir, version_base=None):
|
|
150
237
|
# Compose config with overrides
|
|
151
|
-
cfg = hydra.compose(config_name=config_name, overrides=
|
|
238
|
+
cfg = hydra.compose(config_name=config_name, overrides=overrides)
|
|
152
239
|
|
|
153
240
|
# Validate config
|
|
154
241
|
if not hasattr(cfg, "model_config") or not cfg.model_config:
|
|
@@ -581,6 +668,12 @@ def train(config_name, config_dir, video_paths, video_path_map, prefix_map, over
|
|
|
581
668
|
default=0,
|
|
582
669
|
help="IOU to use when culling instances *after* tracking. (default: 0)",
|
|
583
670
|
)
|
|
671
|
+
@click.option(
|
|
672
|
+
"--gui",
|
|
673
|
+
is_flag=True,
|
|
674
|
+
default=False,
|
|
675
|
+
help="Output JSON progress for GUI integration instead of Rich progress bar.",
|
|
676
|
+
)
|
|
584
677
|
def track(**kwargs):
|
|
585
678
|
"""Run Inference and Tracking workflow."""
|
|
586
679
|
# Convert model_paths from tuple to list
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
from typing import Optional, Tuple
|
|
4
4
|
|
|
5
5
|
import kornia as K
|
|
6
|
-
import numpy as np
|
|
7
6
|
import torch
|
|
8
|
-
|
|
7
|
+
import torch.nn.functional as F
|
|
9
8
|
|
|
10
9
|
from sleap_nn.data.instance_cropping import make_centered_bboxes
|
|
11
10
|
|
|
@@ -13,7 +12,11 @@ from sleap_nn.data.instance_cropping import make_centered_bboxes
|
|
|
13
12
|
def crop_bboxes(
|
|
14
13
|
images: torch.Tensor, bboxes: torch.Tensor, sample_inds: torch.Tensor
|
|
15
14
|
) -> torch.Tensor:
|
|
16
|
-
"""Crop bounding boxes from a batch of images.
|
|
15
|
+
"""Crop bounding boxes from a batch of images using fast tensor indexing.
|
|
16
|
+
|
|
17
|
+
This uses tensor unfold operations to extract patches, which is significantly
|
|
18
|
+
faster than kornia's crop_and_resize (17-51x speedup) as it avoids perspective
|
|
19
|
+
transform computations.
|
|
17
20
|
|
|
18
21
|
Args:
|
|
19
22
|
images: Tensor of shape (samples, channels, height, width) of a batch of images.
|
|
@@ -27,7 +30,7 @@ def crop_bboxes(
|
|
|
27
30
|
box should be cropped from.
|
|
28
31
|
|
|
29
32
|
Returns:
|
|
30
|
-
A tensor of shape (n_bboxes, crop_height, crop_width
|
|
33
|
+
A tensor of shape (n_bboxes, channels, crop_height, crop_width) of the same
|
|
31
34
|
dtype as the input image. The crop size is inferred from the bounding box
|
|
32
35
|
coordinates.
|
|
33
36
|
|
|
@@ -42,26 +45,53 @@ def crop_bboxes(
|
|
|
42
45
|
|
|
43
46
|
See also: `make_centered_bboxes`
|
|
44
47
|
"""
|
|
48
|
+
n_crops = bboxes.shape[0]
|
|
49
|
+
if n_crops == 0:
|
|
50
|
+
# Return empty tensor; use default crop size since we can't infer from bboxes
|
|
51
|
+
return torch.empty(
|
|
52
|
+
0, images.shape[1], 0, 0, device=images.device, dtype=images.dtype
|
|
53
|
+
)
|
|
54
|
+
|
|
45
55
|
# Compute bounding box size to use for crops.
|
|
46
|
-
height = abs(bboxes[0, 3, 1] - bboxes[0, 0, 1])
|
|
47
|
-
width = abs(bboxes[0, 1, 0] - bboxes[0, 0, 0])
|
|
48
|
-
box_size = tuple(torch.round(torch.Tensor((height + 1, width + 1))).to(torch.int32))
|
|
56
|
+
height = int(abs(bboxes[0, 3, 1] - bboxes[0, 0, 1]).item()) + 1
|
|
57
|
+
width = int(abs(bboxes[0, 1, 0] - bboxes[0, 0, 0]).item()) + 1
|
|
49
58
|
|
|
50
59
|
# Store original dtype for conversion back after cropping.
|
|
51
60
|
original_dtype = images.dtype
|
|
61
|
+
device = images.device
|
|
62
|
+
n_samples, channels, img_h, img_w = images.shape
|
|
63
|
+
half_h, half_w = height // 2, width // 2
|
|
52
64
|
|
|
53
|
-
#
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
images_to_crop = images_to_crop.float()
|
|
57
|
-
|
|
58
|
-
# Crop.
|
|
59
|
-
crops = crop_and_resize(
|
|
60
|
-
images_to_crop, # (n_boxes, channels, height, width)
|
|
61
|
-
boxes=bboxes,
|
|
62
|
-
size=box_size,
|
|
65
|
+
# Pad images for edge handling.
|
|
66
|
+
images_padded = F.pad(
|
|
67
|
+
images.float(), (half_w, half_w, half_h, half_h), mode="constant", value=0
|
|
63
68
|
)
|
|
64
69
|
|
|
70
|
+
# Extract all possible patches using unfold (creates a view, no copy).
|
|
71
|
+
# Shape after unfold: (n_samples, channels, img_h, img_w, height, width)
|
|
72
|
+
patches = images_padded.unfold(2, height, 1).unfold(3, width, 1)
|
|
73
|
+
|
|
74
|
+
# Get crop centers from bboxes.
|
|
75
|
+
# The bbox top-left is at index 0, with (x, y) coordinates.
|
|
76
|
+
# We need the center of the crop (peak location), which is top-left + half_size.
|
|
77
|
+
# Ensure bboxes are on the same device as images for index computation.
|
|
78
|
+
bboxes_on_device = bboxes.to(device)
|
|
79
|
+
crop_x = (bboxes_on_device[:, 0, 0] + half_w).to(torch.long)
|
|
80
|
+
crop_y = (bboxes_on_device[:, 0, 1] + half_h).to(torch.long)
|
|
81
|
+
|
|
82
|
+
# Clamp indices to valid bounds to handle edge cases where centroids
|
|
83
|
+
# might be at or beyond image boundaries.
|
|
84
|
+
crop_x = torch.clamp(crop_x, 0, patches.shape[3] - 1)
|
|
85
|
+
crop_y = torch.clamp(crop_y, 0, patches.shape[2] - 1)
|
|
86
|
+
|
|
87
|
+
# Select crops using advanced indexing.
|
|
88
|
+
# Convert sample_inds to tensor if it's a list.
|
|
89
|
+
if not isinstance(sample_inds, torch.Tensor):
|
|
90
|
+
sample_inds = torch.tensor(sample_inds, device=device)
|
|
91
|
+
sample_inds_long = sample_inds.to(device=device, dtype=torch.long)
|
|
92
|
+
crops = patches[sample_inds_long, :, crop_y, crop_x]
|
|
93
|
+
# Shape: (n_crops, channels, height, width)
|
|
94
|
+
|
|
65
95
|
# Cast back to original dtype and return.
|
|
66
96
|
crops = crops.to(original_dtype)
|
|
67
97
|
return crops
|