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.
Files changed (316) hide show
  1. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/docs.yml +1 -1
  2. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/PKG-INFO +2 -1
  3. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/pyproject.toml +1 -0
  4. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/__init__.py +1 -1
  5. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/convnext.py +5 -0
  6. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/encoder_decoder.py +25 -6
  7. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/swint.py +8 -0
  8. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/cli.py +132 -39
  9. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/peak_finding.py +47 -17
  10. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/predictors.py +213 -106
  11. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/predict.py +6 -7
  12. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/callbacks.py +7 -2
  13. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/model_trainer.py +32 -0
  14. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/PKG-INFO +2 -1
  15. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/SOURCES.txt +1 -0
  16. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/requires.txt +1 -0
  17. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/conftest.py +1 -0
  18. sleap_nn-0.1.0a4/tests/fixtures/predictors.py +86 -0
  19. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_peak_finding.py +79 -0
  20. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_cli.py +7 -7
  21. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_predict.py +36 -90
  22. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_train.py +69 -57
  23. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_callbacks.py +32 -0
  24. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_lightning_modules.py +27 -0
  25. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/training/test_model_trainer.py +24 -8
  26. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/uv.lock +2 -0
  27. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/commands/coverage.md +0 -0
  28. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/commands/lint.md +0 -0
  29. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/commands/pr-description.md +0 -0
  30. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.claude/skills/investigation/SKILL.md +0 -0
  31. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.dockerignore +0 -0
  32. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/build.yml +0 -0
  33. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/ci.yml +0 -0
  34. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.github/workflows/codespell.yml +0 -0
  35. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/.gitignore +0 -0
  36. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/CLAUDE.md +0 -0
  37. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/CONTRIBUTING.md +0 -0
  38. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/LICENSE +0 -0
  39. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/README.md +0 -0
  40. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/codecov.yml +0 -0
  41. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/assets/favicon.ico +0 -0
  42. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/assets/sleap-logo.png +0 -0
  43. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/cli.md +0 -0
  44. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/colab_notebooks/Training_with_sleap_nn_on_colab.ipynb +0 -0
  45. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/colab_notebooks/index.md +0 -0
  46. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/config.md +0 -0
  47. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/core_components.md +0 -0
  48. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/example_notebooks.md +0 -0
  49. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/export.md +0 -0
  50. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/index.md +0 -0
  51. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/inference.md +0 -0
  52. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/installation.md +0 -0
  53. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/models.md +0 -0
  54. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_bottomup_convnext.yaml +0 -0
  55. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_bottomup_unet_large_rf.yaml +0 -0
  56. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_bottomup_unet_medium_rf.yaml +0 -0
  57. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_centroid_swint.yaml +0 -0
  58. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_centroid_unet.yaml +0 -0
  59. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_multi_class_bottomup_unet.yaml +0 -0
  60. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_single_instance_unet_large_rf.yaml +0 -0
  61. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_single_instance_unet_medium_rf.yaml +0 -0
  62. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_topdown_centered_instance_unet_large_rf.yaml +0 -0
  63. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_topdown_centered_instance_unet_medium_rf.yaml +0 -0
  64. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/sample_configs/config_topdown_multi_class_centered_instance_unet.yaml +0 -0
  65. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/step_by_step_tutorial.md +0 -0
  66. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/docs/training.md +0 -0
  67. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/README.md +0 -0
  68. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/augmentation_guide.py +0 -0
  69. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/receptive_field_guide.py +0 -0
  70. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/example_notebooks/training_demo.py +0 -0
  71. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/mkdocs.yml +0 -0
  72. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/scripts/cov_summary.py +0 -0
  73. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/scripts/gen_changelog.py +0 -0
  74. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/scripts/gen_ref_pages.py +0 -0
  75. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/setup.cfg +0 -0
  76. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/.DS_Store +0 -0
  77. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/__init__.py +0 -0
  78. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/common.py +0 -0
  79. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/heads.py +0 -0
  80. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/model.py +0 -0
  81. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/unet.py +0 -0
  82. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/architectures/utils.py +0 -0
  83. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/__init__.py +0 -0
  84. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/data_config.py +0 -0
  85. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/get_config.py +0 -0
  86. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/model_config.py +0 -0
  87. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/trainer_config.py +0 -0
  88. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/training_job_config.py +0 -0
  89. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/config/utils.py +0 -0
  90. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/__init__.py +0 -0
  91. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/augmentation.py +0 -0
  92. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/confidence_maps.py +0 -0
  93. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/custom_datasets.py +0 -0
  94. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/edge_maps.py +0 -0
  95. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/identity.py +0 -0
  96. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/instance_centroids.py +0 -0
  97. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/instance_cropping.py +0 -0
  98. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/normalization.py +0 -0
  99. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/providers.py +0 -0
  100. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/resizing.py +0 -0
  101. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/data/utils.py +0 -0
  102. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/evaluation.py +0 -0
  103. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/__init__.py +0 -0
  104. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/cli.py +0 -0
  105. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/exporters/__init__.py +0 -0
  106. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/exporters/onnx_exporter.py +0 -0
  107. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/exporters/tensorrt_exporter.py +0 -0
  108. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/metadata.py +0 -0
  109. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/__init__.py +0 -0
  110. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/base.py +0 -0
  111. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/onnx.py +0 -0
  112. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/predictors/tensorrt.py +0 -0
  113. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/utils.py +0 -0
  114. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/__init__.py +0 -0
  115. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/base.py +0 -0
  116. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/bottomup.py +0 -0
  117. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/bottomup_multiclass.py +0 -0
  118. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/centered_instance.py +0 -0
  119. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/centroid.py +0 -0
  120. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/single_instance.py +0 -0
  121. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/topdown.py +0 -0
  122. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/export/wrappers/topdown_multiclass.py +0 -0
  123. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/__init__.py +0 -0
  124. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/bottomup.py +0 -0
  125. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/identity.py +0 -0
  126. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/paf_grouping.py +0 -0
  127. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/postprocessing.py +0 -0
  128. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/provenance.py +0 -0
  129. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/single_instance.py +0 -0
  130. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/topdown.py +0 -0
  131. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/inference/utils.py +0 -0
  132. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/legacy_models.py +0 -0
  133. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/system_info.py +0 -0
  134. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/__init__.py +0 -0
  135. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/candidates/__init__.py +0 -0
  136. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/candidates/fixed_window.py +0 -0
  137. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/candidates/local_queues.py +0 -0
  138. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/track_instance.py +0 -0
  139. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/tracker.py +0 -0
  140. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/tracking/utils.py +0 -0
  141. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/train.py +0 -0
  142. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/__init__.py +0 -0
  143. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/lightning_modules.py +0 -0
  144. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/losses.py +0 -0
  145. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn/training/utils.py +0 -0
  146. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/dependency_links.txt +0 -0
  147. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/entry_points.txt +0 -0
  148. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/sleap_nn.egg-info/top_level.txt +0 -0
  149. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/__init__.py +0 -0
  150. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_architecture_utils.py +0 -0
  151. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_common.py +0 -0
  152. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_convnext.py +0 -0
  153. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_encoder_decoder.py +0 -0
  154. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_heads.py +0 -0
  155. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_model.py +0 -0
  156. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_swint.py +0 -0
  157. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/architectures/test_unet.py +0 -0
  158. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/centered_pair_small.mp4 +0 -0
  159. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/minimal_instance.pkg.slp +0 -0
  160. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/small_robot.mp4 +0 -0
  161. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/datasets/small_robot_minimal.slp +0 -0
  162. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/inference/minimal_bboxes.pt +0 -0
  163. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/inference/minimal_cms.pt +0 -0
  164. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/get_dummy_activations.py +0 -0
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {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
  173. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/best_model.h5 +0 -0
  174. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/dummy_activations.h5 +0 -0
  175. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/initial_config.json +0 -0
  176. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_gt.train.slp +0 -0
  177. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_gt.val.slp +0 -0
  178. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_pr.train.slp +0 -0
  179. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/labels_pr.val.slp +0 -0
  180. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/metrics.train.npz +0 -0
  181. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/metrics.val.npz +0 -0
  182. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/training_config.json +0 -0
  183. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.bottomup/training_log.csv +0 -0
  184. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/best_model.h5 +0 -0
  185. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/dummy_activations.h5 +0 -0
  186. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/initial_config.json +0 -0
  187. {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
  188. {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
  189. {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
  190. {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
  191. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/metrics.train.npz +0 -0
  192. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/metrics.val.npz +0 -0
  193. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/training_config.json +0 -0
  194. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centered_instance/training_log.csv +0 -0
  195. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/best_model.h5 +0 -0
  196. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/dummy_activations.h5 +0 -0
  197. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/initial_config.json +0 -0
  198. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_gt.train.slp +0 -0
  199. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_gt.val.slp +0 -0
  200. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_pr.train.slp +0 -0
  201. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/labels_pr.val.slp +0 -0
  202. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/metrics.train.npz +0 -0
  203. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/metrics.val.npz +0 -0
  204. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/training_config.json +0 -0
  205. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_instance.UNet.centroid/training_log.csv +0 -0
  206. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/best_model.h5 +0 -0
  207. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/dummy_activations.h5 +0 -0
  208. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/initial_config.json +0 -0
  209. {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
  210. {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
  211. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/training_config.json +0 -0
  212. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_models/minimal_robot.UNet.single_instance/training_log.csv +0 -0
  213. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/bottomup_multiclass_training_config.json +0 -0
  214. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/bottomup_training_config.json +0 -0
  215. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/centered_instance_training_config.json +0 -0
  216. {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
  217. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/centroid_training_config.json +0 -0
  218. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/single_instance_training_config.json +0 -0
  219. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/legacy_sleap_json_configs/topdown_training_config.json +0 -0
  220. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/best.ckpt +0 -0
  221. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/initial_config.yaml +0 -0
  222. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/labels_train_gt_0.slp +0 -0
  223. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/labels_val_gt_0.slp +0 -0
  224. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/training_config.yaml +0 -0
  225. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_bottomup/training_log.csv +0 -0
  226. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/best.ckpt +0 -0
  227. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/initial_config.yaml +0 -0
  228. {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
  229. {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
  230. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/training_config.yaml +0 -0
  231. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centered_instance/training_log.csv +0 -0
  232. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/best.ckpt +0 -0
  233. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/initial_config.yaml +0 -0
  234. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/labels_train_gt_0.slp +0 -0
  235. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/labels_val_gt_0.slp +0 -0
  236. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/training_config.yaml +0 -0
  237. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_centroid/training_log.csv +0 -0
  238. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/best.ckpt +0 -0
  239. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/initial_config.yaml +0 -0
  240. {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
  241. {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
  242. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/training_config.yaml +0 -0
  243. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_bottomup/training_log.csv +0 -0
  244. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/best.ckpt +0 -0
  245. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/initial_config.yaml +0 -0
  246. {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
  247. {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
  248. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/training_config.yaml +0 -0
  249. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_multiclass_centered_instance/training_log.csv +0 -0
  250. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/best.ckpt +0 -0
  251. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/initial_config.yaml +0 -0
  252. {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
  253. {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
  254. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/training_config.yaml +0 -0
  255. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/minimal_instance_single_instance/training_log.csv +0 -0
  256. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/best.ckpt +0 -0
  257. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/initial_config.yaml +0 -0
  258. {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
  259. {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
  260. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/pred_test.slp +0 -0
  261. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/pred_train_0.slp +0 -0
  262. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/pred_val_0.slp +0 -0
  263. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/test_pred_metrics.npz +0 -0
  264. {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
  265. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/training_config.yaml +0 -0
  266. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/assets/model_ckpts/single_instance_with_metrics/training_log.csv +0 -0
  267. {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
  268. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_config_utils.py +0 -0
  269. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_data_config.py +0 -0
  270. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_model_config.py +0 -0
  271. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_trainer_config.py +0 -0
  272. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/config/test_training_job_config.py +0 -0
  273. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_augmentation.py +0 -0
  274. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_confmaps.py +0 -0
  275. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_custom_datasets.py +0 -0
  276. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_edge_maps.py +0 -0
  277. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_identity.py +0 -0
  278. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_instance_centroids.py +0 -0
  279. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_instance_cropping.py +0 -0
  280. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_normalization.py +0 -0
  281. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_providers.py +0 -0
  282. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_resizing.py +0 -0
  283. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/data/test_utils.py +0 -0
  284. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/__init__.py +0 -0
  285. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/conftest.py +0 -0
  286. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_cli.py +0 -0
  287. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_gpu.py +0 -0
  288. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_metadata.py +0 -0
  289. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_onnx_export.py +0 -0
  290. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_onnx_predictor.py +0 -0
  291. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_predictor_factory.py +0 -0
  292. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_utils.py +0 -0
  293. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/export/test_wrappers.py +0 -0
  294. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/__init__.py +0 -0
  295. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/datasets.py +0 -0
  296. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/inference.py +0 -0
  297. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/legacy_models.py +0 -0
  298. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/legacy_sleap_json_configs.py +0 -0
  299. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/fixtures/model_ckpts.py +0 -0
  300. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/__init__.py +0 -0
  301. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_bottomup.py +0 -0
  302. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_paf_grouping.py +0 -0
  303. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_postprocessing.py +0 -0
  304. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_predictors.py +0 -0
  305. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_provenance.py +0 -0
  306. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_single_instance.py +0 -0
  307. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_topdown.py +0 -0
  308. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/inference/test_utils.py +0 -0
  309. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_evaluation.py +0 -0
  310. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_legacy_models.py +0 -0
  311. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_system_info.py +0 -0
  312. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/test_version.py +0 -0
  313. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/tracking/candidates/test_fixed_window.py +0 -0
  314. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/tracking/candidates/test_local_queues.py +0 -0
  315. {sleap_nn-0.1.0a3 → sleap_nn-0.1.0a4}/tests/tracking/test_tracker.py +0 -0
  316. {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.0a3
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"
@@ -48,6 +48,7 @@ dependencies = [
48
48
  "jupyter",
49
49
  "jupyterlab",
50
50
  "pyzmq",
51
+ "rich-click>=1.9.5",
51
52
  ]
52
53
  dynamic = ["version", "readme"]
53
54
 
@@ -50,7 +50,7 @@ logger.add(
50
50
  colorize=False,
51
51
  )
52
52
 
53
- __version__ = "0.1.0a3"
53
+ __version__ = "0.1.0a4"
54
54
 
55
55
  # Public API
56
56
  from sleap_nn.evaluation import load_metrics
@@ -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 + feature channels
473
- # The feature channels are the same as x_in_shape since they come from the same level
474
- first_conv_in_channels = x_in_shape + refine_convs_filters
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 + feature channels
484
+ # With transpose conv, input is transpose_conv_output + skip_channels
477
485
  first_conv_in_channels = (
478
- refine_convs_filters + transpose_convs_filters
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 Click."""
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
- from click import Command
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
- help_text = """
71
- sleap-nn train — Train SLEAP models from a config YAML file.
72
-
73
- Usage:
74
- sleap-nn train --config-dir <dir> --config-name <name> [overrides]
75
-
76
- Common overrides:
77
- trainer_config.max_epochs=100
78
- trainer_config.batch_size=32
79
-
80
- Examples:
81
- Start new run:
82
- sleap-nn train --config-dir /path/to/config_dir/ --config-name myrun
83
- Resume 20 more epochs:
84
- sleap-nn train --config-dir /path/to/config_dir/ --config-name myrun \\
85
- trainer_config.resume_ckpt_path=<path/to/ckpt> \\
86
- trainer_config.max_epochs=20
87
-
88
- Tips:
89
- - Use -m/--multirun for sweeps; outputs go under hydra.sweep.dir.
90
- - For Hydra flags and completion, use --hydra-help.
91
-
92
- For a detailed list of all available config options, please refer to https://nn.sleap.ai/config/.
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
- click.echo(help_text)
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-dir", "-d", type=str, default=".", help="Configuration directory path"
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(config_name, config_dir, video_paths, video_path_map, prefix_map, overrides):
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 --config-name myconfig --config-dir /path/to/config_dir/
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
- # Show help if no config name provided
142
- if not config_name:
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=list(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
- from kornia.geometry.transform import crop_and_resize
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, channels) of the same
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
- # Kornia's crop_and_resize requires float32 input.
54
- images_to_crop = images[sample_inds]
55
- if not torch.is_floating_point(images_to_crop):
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