sleap-nn 0.1.0a0__tar.gz → 0.1.0a1__tar.gz

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