opensportslib 0.3.0.dev3__tar.gz → 0.3.0.dev5__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 (184) hide show
  1. {opensportslib-0.3.0.dev3/opensportslib.egg-info → opensportslib-0.3.0.dev5}/PKG-INFO +1 -1
  2. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/apis/localization.py +2 -1
  3. opensportslib-0.3.0.dev5/opensportslib/configs/localization/h5_header_skeleton.yaml +65 -0
  4. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/loader.py +36 -10
  5. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/data.py +67 -0
  6. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/load_annotations.py +119 -2
  7. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/localization_dataset.py +412 -2
  8. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/utils/tracking.py +172 -0
  9. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/metrics/localization_metric.py +4 -0
  10. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/backbones/builder.py +44 -1
  11. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/e2e.py +36 -13
  12. opensportslib-0.3.0.dev5/opensportslib/models/base/rule_based.py +1144 -0
  13. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5/opensportslib.egg-info}/PKG-INFO +1 -1
  14. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib.egg-info/SOURCES.txt +4 -0
  15. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/pyproject.toml +1 -1
  16. opensportslib-0.3.0.dev5/scripts/run_header_spotting_eval.py +495 -0
  17. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_config_architecture.py +15 -1
  18. opensportslib-0.3.0.dev5/tests/test_h5_header_skeleton_spotter.py +305 -0
  19. opensportslib-0.3.0.dev5/tests/test_localization_hf_backend_override.py +205 -0
  20. opensportslib-0.3.0.dev3/opensportslib/models/base/rule_based.py +0 -579
  21. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/LICENSE +0 -0
  22. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/LICENSE-COMMERCIAL +0 -0
  23. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/MANIFEST.in +0 -0
  24. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/README.md +0 -0
  25. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/examples/quickstart/basic_classification.py +0 -0
  26. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/examples/quickstart/basic_localization.py +0 -0
  27. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/examples/quickstart/basic_vqa.py +0 -0
  28. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/__init__.py +0 -0
  29. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/apis/__init__.py +0 -0
  30. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/apis/base_task_model.py +0 -0
  31. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/apis/classification.py +0 -0
  32. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/apis/vqa.py +0 -0
  33. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/cli.py +0 -0
  34. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/classification/default.yaml +0 -0
  35. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
  36. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
  37. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/classification/video.yaml +0 -0
  38. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/default.yaml +0 -0
  39. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
  40. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/default.yaml +0 -0
  41. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/h5_header_distance.yaml +0 -0
  42. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/h5_header_distance_angle.yaml +0 -0
  43. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/h5_header_distance_speed.yaml +0 -0
  44. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/h5_header_distance_speed_angle.yaml +0 -0
  45. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/h5_header_rule.yaml +0 -0
  46. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
  47. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/video_dali.yaml +0 -0
  48. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/localization/video_ocv.yaml +0 -0
  49. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/vqa/default.yaml +0 -0
  50. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/vqa/qwen.yaml +0 -0
  51. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/vqa/qwen3_vl_native.yaml +0 -0
  52. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/vqa/qwen_lora.yaml +0 -0
  53. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/vqa/qwen_sngar_frames.yaml +0 -0
  54. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/configs/vqa/xvars.yaml +0 -0
  55. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/__init__.py +0 -0
  56. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/__init__.py +0 -0
  57. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/accessors.py +0 -0
  58. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/conflicts.py +0 -0
  59. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/migrate.py +0 -0
  60. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/migrations/__init__.py +0 -0
  61. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
  62. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/runtime_adapter.py +0 -0
  63. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/schema.py +0 -0
  64. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/schemas/__init__.py +0 -0
  65. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
  66. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
  67. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/config/validate.py +0 -0
  68. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/loss/__init__.py +0 -0
  69. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/loss/builder.py +0 -0
  70. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/loss/calf.py +0 -0
  71. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/loss/ce.py +0 -0
  72. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/loss/combine.py +0 -0
  73. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/loss/nll.py +0 -0
  74. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/optimizer/__init__.py +0 -0
  75. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/optimizer/builder.py +0 -0
  76. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/sampler/weighted_sampler.py +0 -0
  77. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/scheduler/__init__.py +0 -0
  78. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/scheduler/builder.py +0 -0
  79. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/trainer/__init__.py +0 -0
  80. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/trainer/classification_trainer.py +0 -0
  81. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/trainer/localization_trainer.py +0 -0
  82. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/trainer/vqa_trainer.py +0 -0
  83. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/checkpoint.py +0 -0
  84. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/config.py +0 -0
  85. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/config_normalize.py +0 -0
  86. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/ddp.py +0 -0
  87. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/default_args.py +0 -0
  88. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/hf_runtime.py +0 -0
  89. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/lightning.py +0 -0
  90. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/seed.py +0 -0
  91. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/video_processing.py +0 -0
  92. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/core/utils/wandb.py +0 -0
  93. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/__init__.py +0 -0
  94. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/builder.py +0 -0
  95. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/classification_dataset.py +0 -0
  96. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/utils/__init__.py +0 -0
  97. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/utils/h5_tracking.py +0 -0
  98. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/datasets/vqa_dataset.py +0 -0
  99. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/classification.yaml +0 -0
  100. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
  101. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
  102. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
  103. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/localization.yaml +0 -0
  104. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
  105. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
  106. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/metrics/classification_metric.py +0 -0
  107. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/metrics/vqa_metric.py +0 -0
  108. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/__init__.py +0 -0
  109. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/contextaware.py +0 -0
  110. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/learnablepooling.py +0 -0
  111. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/qwen_vl_native.py +0 -0
  112. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/qwen_xvars.py +0 -0
  113. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/tracking.py +0 -0
  114. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/vars.py +0 -0
  115. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/video.py +0 -0
  116. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
  117. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/video_mae.py +0 -0
  118. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/base/xvars_videochatgpt.py +0 -0
  119. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/builder.py +0 -0
  120. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/heads/builder.py +0 -0
  121. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/neck/builder.py +0 -0
  122. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/common.py +0 -0
  123. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/impl/__init__.py +0 -0
  124. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/impl/asformer.py +0 -0
  125. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/impl/calf.py +0 -0
  126. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/impl/gsm.py +0 -0
  127. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/impl/gtad.py +0 -0
  128. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/impl/tsm.py +0 -0
  129. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/litebase.py +0 -0
  130. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/modules.py +0 -0
  131. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/shift.py +0 -0
  132. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/utils.py +0 -0
  133. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
  134. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/vqa_prompting.py +0 -0
  135. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/models/utils/xvars_clip_index.py +0 -0
  136. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/setup/setup.py +0 -0
  137. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/tools/__init__.py +0 -0
  138. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/tools/_common.py +0 -0
  139. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/tools/hf_transfer.py +0 -0
  140. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/tools/osl_json_to_parquet.py +0 -0
  141. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib/tools/parquet_to_osl_json.py +0 -0
  142. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib.egg-info/dependency_links.txt +0 -0
  143. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib.egg-info/entry_points.txt +0 -0
  144. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib.egg-info/requires.txt +0 -0
  145. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/opensportslib.egg-info/top_level.txt +0 -0
  146. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/scripts/run_h5_header_rule_inference.py +0 -0
  147. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/setup.cfg +0 -0
  148. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/conftest.py +0 -0
  149. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_classification_dataset_paths.py +0 -0
  150. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_classification_trainer_dataloader.py +0 -0
  151. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_config_split_override_sync.py +0 -0
  152. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_config_utils_smoke.py +0 -0
  153. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_conversion_tools.py +0 -0
  154. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_extract_xvars_features.py +0 -0
  155. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_h5_header_rule_spotter.py +0 -0
  156. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_h5_tracking_dataset.py +0 -0
  157. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_hf_transfer_tools.py +0 -0
  158. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_localization_dali_filenames.py +0 -0
  159. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_package_smoke.py +0 -0
  160. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_pretrained_config_merge_policy.py +0 -0
  161. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_public_apis_smoke.py +0 -0
  162. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_setup_cli.py +0 -0
  163. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_subset_train_infer_integration.py +0 -0
  164. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_task_model_api_contract.py +0 -0
  165. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_vqa_api.py +0 -0
  166. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_vqa_metrics_semantic.py +0 -0
  167. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_vqa_qwen_xvars.py +0 -0
  168. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_vqa_training_lora.py +0 -0
  169. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tests/test_vqa_xvars_videochatgpt.py +0 -0
  170. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/build_sn_vqa_2026_vqa.py +0 -0
  171. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/build_soccernet_gar.py +0 -0
  172. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
  173. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/build_soccernet_gar_vqa.py +0 -0
  174. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/build_xvars_indexes.py +0 -0
  175. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/extract_xvars_clip_features.py +0 -0
  176. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
  177. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
  178. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/download/download_hf_repo.py +0 -0
  179. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/download/download_osl_hf.py +0 -0
  180. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/download/upload_osl_hf.py +0 -0
  181. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/training/classification.py +0 -0
  182. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/training/localization.py +0 -0
  183. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/training/vqa.py +0 -0
  184. {opensportslib-0.3.0.dev3 → opensportslib-0.3.0.dev5}/tools/upload/upload_model_hf.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensportslib
3
- Version: 0.3.0.dev3
3
+ Version: 0.3.0.dev5
4
4
  Summary: OpenSportsLib is the professional library, designed for advanced video understanding in sports. It provides state-of-the-art tools for action recognition, spotting, retrieval, and captioning, making it ideal for researchers, analysts, and developers working with sports video data.
5
5
  Author: Jeet Vora
6
6
  Requires-Python: >=3.12
@@ -19,6 +19,7 @@ from opensportslib.core.config.accessors import (
19
19
  get_model_family,
20
20
  )
21
21
  from opensportslib.core.utils.config import expand
22
+ from opensportslib.core.config.loader import _dali_available
22
23
 
23
24
 
24
25
  class LocalizationModel(BaseTaskModel):
@@ -126,7 +127,7 @@ class LocalizationModel(BaseTaskModel):
126
127
  from opensportslib.core.utils.config import select_device
127
128
 
128
129
  device = select_device(self.config.SYSTEM)
129
- backend = "dali" if self._device_type(device) == "cuda" else "opencv"
130
+ backend = "dali" if self._device_type(device) == "cuda" and _dali_available() else "opencv"
130
131
  current_backend = get_loader_backend(self.config)
131
132
  set_loader_backend(self.config, backend)
132
133
 
@@ -0,0 +1,65 @@
1
+ TASK: localization
2
+ VERSION: 2
3
+
4
+ SYSTEM:
5
+ paths:
6
+ work_dir: ./outputs/header_spotting_skeleton
7
+ device: cpu
8
+ gpu:
9
+ count: 0
10
+
11
+ DATA:
12
+ common:
13
+ dataset_name: h5_headers
14
+ data_root: /home/giancos/FIFA_data/128083
15
+ classes:
16
+ - header
17
+ splits:
18
+ test:
19
+ type: H5OSLJsonSpotting
20
+ # Manifest listing the joints/ball h5 pair and the scan window; the
21
+ # eval scripts generate one per run under their own work dir.
22
+ annotation_path: ./outputs/header_wc22/manifest.json
23
+ source_path: /home/giancos/FIFA_data/128083
24
+ dataloader:
25
+ batch_size: 1
26
+ shuffle: false
27
+ num_workers: 0
28
+ pin_memory: false
29
+ inputs:
30
+ tracking:
31
+ modality: player_joints_h5
32
+ representation: raw
33
+ source:
34
+ format: h5
35
+ sampling: {}
36
+ transform: {}
37
+ augmentations: {}
38
+ params: {}
39
+
40
+ MODEL:
41
+ metadata:
42
+ family: RuleBased
43
+ runner:
44
+ type: runner_h5_header_rule
45
+ components:
46
+ rule:
47
+ kind: algorithm
48
+ source:
49
+ provider: opensportslib
50
+ registry: rule_based
51
+ name: h5_header_skeleton
52
+ # Thresholds default to DEFAULT_SKELETON_RULE_PARAMS in
53
+ # opensportslib/models/base/rule_based.py. Override here only what this
54
+ # run needs to differ — restating a default pins it, so later tuning of
55
+ # the defaults would silently not reach this config.
56
+ params:
57
+ label: header
58
+ head_name: action
59
+ topology: []
60
+
61
+ TRAIN:
62
+ trainer:
63
+ type: trainer_rule_based
64
+ execution:
65
+ enabled: false
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import importlib.util
5
6
  import json
6
7
  from copy import deepcopy
7
8
  from pathlib import Path
@@ -135,12 +136,36 @@ def load_raw_config(path: str | Path) -> dict[str, Any]:
135
136
  raise ValueError("Unsupported config format. Use YAML or JSON.")
136
137
 
137
138
 
138
- def _normalize_cpu_loader_backend(payload: dict[str, Any]) -> dict[str, Any]:
139
+ def _torch_cuda_available() -> bool:
140
+ try:
141
+ import torch
142
+ except Exception:
143
+ return False
144
+ return bool(torch.cuda.is_available())
145
+
146
+
147
+ def _dali_available() -> bool:
148
+ return importlib.util.find_spec("nvidia.dali") is not None
149
+
150
+
151
+ def _preferred_loader_backend(payload: dict[str, Any]) -> str | None:
139
152
  system = payload.get("SYSTEM", {})
140
153
  if not isinstance(system, dict):
141
- return payload
154
+ return None
142
155
 
143
- if str(system.get("device", "auto")).lower() != "cpu":
156
+ mode = str(system.get("device", "auto")).lower()
157
+ if mode == "cpu":
158
+ return "opencv"
159
+ if mode == "cuda":
160
+ return "dali" if _dali_available() else "opencv"
161
+ if mode == "auto":
162
+ return "dali" if (_torch_cuda_available() and _dali_available()) else "opencv"
163
+ return None
164
+
165
+
166
+ def _normalize_cpu_loader_backend(payload: dict[str, Any]) -> dict[str, Any]:
167
+ preferred_backend = _preferred_loader_backend(payload)
168
+ if preferred_backend is None:
144
169
  return payload
145
170
 
146
171
  data = payload.get("DATA", {})
@@ -155,18 +180,19 @@ def _normalize_cpu_loader_backend(payload: dict[str, Any]) -> dict[str, Any]:
155
180
  if not isinstance(runtime, dict):
156
181
  runtime = {}
157
182
  common["runtime"] = runtime
158
- runtime["loader_backend"] = "opencv"
183
+ runtime["loader_backend"] = preferred_backend
159
184
 
160
185
  splits = common.get("splits", {})
161
186
  if not isinstance(splits, dict):
162
187
  return payload
163
188
 
164
- for split_cfg in splits.values():
165
- if not isinstance(split_cfg, dict):
166
- continue
167
- split_type = split_cfg.get("type")
168
- if split_type in _CPU_OPENCV_SPLIT_TYPES:
169
- split_cfg["type"] = _CPU_OPENCV_SPLIT_TYPES[split_type]
189
+ if preferred_backend == "opencv":
190
+ for split_cfg in splits.values():
191
+ if not isinstance(split_cfg, dict):
192
+ continue
193
+ split_type = split_cfg.get("type")
194
+ if split_type in _CPU_OPENCV_SPLIT_TYPES:
195
+ split_cfg["type"] = _CPU_OPENCV_SPLIT_TYPES[split_type]
170
196
 
171
197
  return payload
172
198
 
@@ -83,6 +83,73 @@ def tracking_collate_fn(batch):
83
83
  'id': [item['id'] for item in batch],
84
84
  }
85
85
 
86
+
87
+ def _flatten_graphs_to_batch(list_of_graph_lists):
88
+ """Flatten a batch of per-sample per-frame graph lists into one PyG Batch.
89
+
90
+ Args:
91
+ list_of_graph_lists: list of length B, each a list of T
92
+ torch_geometric.data.Data objects (one per frame in the clip).
93
+
94
+ Returns:
95
+ A torch_geometric.data.Batch of all B*T graphs, with a plain int
96
+ `.seq_len` attribute (T) attached so a graph_conv_seq backbone can
97
+ reshape the pooled per-frame embeddings back to (B, T, H). Plain
98
+ int attributes survive Batch.to(device).
99
+ """
100
+ try:
101
+ from torch_geometric.data import Batch
102
+ except ImportError as exc:
103
+ raise ImportError(
104
+ "torch-geometric is required for tracking spotting collate functions. "
105
+ "Run: `opensportslib setup --pyg` to install the correct version "
106
+ "based on your system (PyTorch & CUDA compatible)."
107
+ ) from exc
108
+
109
+ seq_len = len(list_of_graph_lists[0])
110
+ all_graphs = [g for graphs in list_of_graph_lists for g in graphs]
111
+ batched = Batch.from_data_list(all_graphs)
112
+ batched.seq_len = seq_len
113
+ return batched
114
+
115
+
116
+ def tracking_spotting_collate_fn(batch):
117
+ """
118
+ Collate function for tracking-based action-spotting training clips.
119
+ Flattens the B*T per-frame graphs of a batch into one PyG Batch (see
120
+ _flatten_graphs_to_batch) and stacks the dense per-frame labels into
121
+ (B, T).
122
+ """
123
+ frame = _flatten_graphs_to_batch([item["graphs"] for item in batch])
124
+ labels = torch.as_tensor(
125
+ np.stack([item["label"] for item in batch]), dtype=torch.long
126
+ )
127
+ return {
128
+ "frame": frame,
129
+ "label": labels,
130
+ "contains_event": torch.tensor(
131
+ [item["contains_event"] for item in batch], dtype=torch.long
132
+ ),
133
+ }
134
+
135
+
136
+ def tracking_spotting_eval_collate_fn(batch):
137
+ """
138
+ Collate function for tracking-based action-spotting sliding-window eval
139
+ clips. Requires dataloader batch_size=1 (mirrors how the E2E inferer
140
+ reads clip["frame"][0] for RGB datasets): wraps the single clip's
141
+ flattened PyG Batch in a 1-element list under "frame" so that indexing
142
+ keeps working unmodified.
143
+ """
144
+ assert len(batch) == 1, "tracking spotting eval requires dataloader batch_size=1"
145
+ item = batch[0]
146
+ frame = _flatten_graphs_to_batch([item["graphs"]])
147
+ return {
148
+ "video": [item["video"]],
149
+ "start": torch.tensor([item["start"]]),
150
+ "frame": [frame],
151
+ }
152
+
86
153
  def mixup_data(x, y, alpha=0.2):
87
154
  """blend pairs of samples and their labels for mixup augmentation."""
88
155
  lam = np.random.beta(alpha, alpha) if alpha > 0 else 1.0
@@ -4,6 +4,7 @@ import tqdm
4
4
  import logging
5
5
  import cv2
6
6
  import math
7
+ import numpy as np
7
8
  import torch
8
9
  from opensportslib.core.utils.video_processing import get_stride, read_fps, get_num_frames
9
10
  from opensportslib.core.utils.config import load_json
@@ -302,6 +303,116 @@ def annotationstoe2eformat(
302
303
 
303
304
  return labels_e2e, task_name_list[0]
304
305
 
306
+
307
+ def annotationstoe2eformat_tracking(label_files, video_dirs, extract_fps):
308
+ """
309
+ Adapt tracking-parquet action-spotting annotations to E2E format.
310
+
311
+ Mirrors annotationstoe2eformat's output schema, but reads a whole-match
312
+ tracking parquet (via the per-game cache built by
313
+ opensportslib.datasets.utils.tracking.load_or_build_game_cache) instead
314
+ of a video file. Each event's position_ms is mapped to a native frame
315
+ index via a searchsorted lookup on the cached videoTimeMs column (the
316
+ absolute match clock, which lines up directly with position_ms) rather
317
+ than the from-scratch fps computation the video path uses, then
318
+ converted to a decimated (extract_fps) frame index the same way
319
+ FrameReader converts native video frames.
320
+
321
+ Args:
322
+ label_files (str | list[str]): Annotation JSON files.
323
+ video_dirs (str | list[str]): Root directories containing the
324
+ tracking parquets referenced by each annotation file.
325
+ extract_fps (float): Target fps to decimate the native tracking
326
+ stream to. A non-positive value keeps every native frame.
327
+
328
+ Returns:
329
+ (labels_e2e, task_name): labels_e2e is a list of dicts with the
330
+ same keys as annotationstoe2eformat's output (events/fps/
331
+ num_frames/num_frames_base/video/path/num_events), plus a
332
+ "stride" field (native rows per decimated frame) that dataset
333
+ classes use to slice windows out of the cached native features.
334
+ """
335
+ from opensportslib.datasets.utils.tracking import load_or_build_game_cache
336
+
337
+ if not isinstance(label_files, list):
338
+ label_files = [label_files]
339
+ if not isinstance(video_dirs, list):
340
+ video_dirs = [video_dirs]
341
+ assert len(label_files) == len(video_dirs)
342
+
343
+ labels_e2e = []
344
+ classes_by_label_dir = []
345
+ task_name_list = []
346
+
347
+ for label_path, video_dir in zip(label_files, video_dirs):
348
+ logging.info(f"Processing {label_path} to e2e format (tracking)")
349
+
350
+ annotations = load_json(label_path)
351
+
352
+ for task_name, task_data in annotations["labels"].items():
353
+ labels = task_data.get("labels", {})
354
+ task_name_list.append(task_name)
355
+ classes_by_label_dir.append(labels)
356
+
357
+ videos = annotations["data"]
358
+
359
+ for video in tqdm.tqdm(videos):
360
+ video_input = video["inputs"][0]
361
+ video_path = video_input["path"]
362
+ full_video_path = os.path.join(video_dir, video_path)
363
+ assert os.path.isfile(full_video_path), full_video_path
364
+
365
+ _, times, _ = load_or_build_game_cache(full_video_path)
366
+ num_frames = len(times)
367
+
368
+ native_fps = video_input.get("fps")
369
+ if not native_fps:
370
+ native_fps = 1000.0 / float(np.median(np.diff(times)))
371
+
372
+ target_fps = (
373
+ extract_fps if (extract_fps and extract_fps < native_fps) else native_fps
374
+ )
375
+ sample_fps = read_fps(native_fps, target_fps)
376
+ stride = get_stride(native_fps, target_fps)
377
+ num_frames_after = get_num_frames(num_frames, native_fps, target_fps)
378
+
379
+ events = []
380
+ for ann in video.get("events", []):
381
+ position_ms = float(ann["position_ms"])
382
+ native_idx = int(np.searchsorted(times, position_ms))
383
+ native_idx = min(max(native_idx, 0), num_frames - 1)
384
+ adj_frame = native_idx // stride
385
+
386
+ if adj_frame == 0:
387
+ adj_frame = 1
388
+
389
+ events.append({
390
+ "frame": int(adj_frame),
391
+ "label": ann["label"],
392
+ })
393
+
394
+ events.sort(key=lambda x: x["frame"])
395
+
396
+ labels_e2e.append({
397
+ "events": events,
398
+ "fps": sample_fps,
399
+ "num_frames": num_frames_after,
400
+ "num_frames_base": num_frames,
401
+ "num_events": len(events),
402
+ "video": full_video_path,
403
+ "path": video_path,
404
+ "stride": stride,
405
+ })
406
+
407
+ base_classes = classes_by_label_dir[0]
408
+ for c in classes_by_label_dir:
409
+ assert c == base_classes
410
+
411
+ labels_e2e.sort(key=lambda x: x["video"])
412
+
413
+ return labels_e2e, task_name_list[0]
414
+
415
+
305
416
  # def annotationstoe2eformat(label_files, video_dirs, input_fps, extract_fps, dali):
306
417
  # """Adapt annotations jsons to e2e format.
307
418
 
@@ -496,7 +607,7 @@ def check_config(cfg, split="train"):
496
607
  if get_loader_backend(cfg) == "dali":
497
608
  cfg.TRAIN.execution.repartitions = get_repartition_gpu(cfg.SYSTEM.gpu.count)
498
609
  primary_modality = get_data_modality(cfg)
499
- assert primary_modality in ["rgb", "video"]
610
+ assert primary_modality in ["rgb", "video", "tracking_parquet"]
500
611
  backbone_type = get_component_name_by_kind(cfg, "encoder")
501
612
  assert backbone_type in [
502
613
  # From torchvision
@@ -513,6 +624,8 @@ def check_config(cfg, split="train"):
513
624
  "rny008",
514
625
  "rny008_tsm",
515
626
  "rny008_gsm",
627
+ # tracking graph encoder, sequence output (see models/backbones/builder.py)
628
+ "graph_conv_seq",
516
629
  # From timm
517
630
  "convnextt",
518
631
  "convnextt_tsm",
@@ -588,7 +701,11 @@ def whether_infer_split(cfg):
588
701
  return True
589
702
  else:
590
703
  return False
591
- elif split_type == "VideoGameWithOpencvVideo" or split_type == "VideoGameWithDaliVideo":
704
+ elif split_type in (
705
+ "VideoGameWithOpencvVideo",
706
+ "VideoGameWithDaliVideo",
707
+ "TrackingActionSpotVideo",
708
+ ):
592
709
  if annotation_path and annotation_path.endswith(".json"):
593
710
  return True
594
711
  else: