opensportslib 0.2.0.dev3__tar.gz → 0.3.0__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.
- {opensportslib-0.2.0.dev3/opensportslib.egg-info → opensportslib-0.3.0}/PKG-INFO +3 -3
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/README.md +2 -2
- opensportslib-0.3.0/examples/quickstart/basic_vqa.py +37 -0
- opensportslib-0.3.0/opensportslib/configs/vqa/default.yaml +172 -0
- opensportslib-0.3.0/opensportslib/configs/vqa/xvars.yaml +58 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0/opensportslib.egg-info}/PKG-INFO +3 -3
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib.egg-info/SOURCES.txt +6 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/pyproject.toml +1 -1
- opensportslib-0.3.0/tests/test_setup_cli.py +101 -0
- opensportslib-0.3.0/tests/test_vqa_api.py +240 -0
- opensportslib-0.3.0/tests/test_vqa_qwen_xvars.py +251 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/LICENSE +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/LICENSE-COMMERCIAL +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/MANIFEST.in +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/examples/quickstart/basic_classification.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/examples/quickstart/basic_localization.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/apis/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/apis/base_task_model.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/apis/classification.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/apis/localization.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/apis/vqa.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/cli.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/classification/default.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/classification/video.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/default.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/localization/default.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/localization/video_dali.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/localization/video_ocv.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/configs/vqa/qwen.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/accessors.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/conflicts.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/loader.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/migrate.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/migrations/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/runtime_adapter.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/schema.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/schemas/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/config/validate.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/loss/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/loss/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/loss/calf.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/loss/ce.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/loss/combine.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/loss/nll.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/optimizer/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/optimizer/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/sampler/weighted_sampler.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/scheduler/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/scheduler/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/trainer/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/trainer/classification_trainer.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/trainer/localization_trainer.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/trainer/vqa_trainer.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/checkpoint.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/config.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/config_normalize.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/data.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/ddp.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/default_args.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/hf_runtime.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/lightning.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/load_annotations.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/seed.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/video_processing.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/core/utils/wandb.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/classification_dataset.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/localization_dataset.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/utils/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/utils/tracking.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/datasets/vqa_dataset.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/classification.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/localization.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/metrics/classification_metric.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/metrics/localization_metric.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/metrics/vqa_metric.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/backbones/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/contextaware.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/e2e.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/learnablepooling.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/qwen_xvars.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/tracking.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/vars.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/video.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/video_mae.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/base/xvars_videochatgpt.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/heads/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/neck/builder.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/common.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/impl/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/impl/asformer.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/impl/calf.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/impl/gsm.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/impl/gtad.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/impl/tsm.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/litebase.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/modules.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/shift.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/utils.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/vqa_prompting.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/models/utils/xvars_clip_index.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/setup/setup.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/tools/__init__.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/tools/_common.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/tools/hf_transfer.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/tools/osl_json_to_parquet.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib/tools/parquet_to_osl_json.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib.egg-info/dependency_links.txt +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib.egg-info/entry_points.txt +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib.egg-info/requires.txt +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/opensportslib.egg-info/top_level.txt +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/setup.cfg +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/conftest.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_classification_dataset_paths.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_classification_trainer_dataloader.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_config_architecture.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_config_split_override_sync.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_config_utils_smoke.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_conversion_tools.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_extract_xvars_features.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_hf_transfer_tools.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_localization_dali_filenames.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_package_smoke.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_pretrained_config_merge_policy.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_public_apis_smoke.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_subset_train_infer_integration.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_task_model_api_contract.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_vqa_metrics_semantic.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_vqa_training_lora.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tests/test_vqa_xvars_videochatgpt.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/convert/build_soccernet_gar.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/convert/build_xvars_indexes.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/convert/extract_xvars_clip_features.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/download/download_hf_repo.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/download/download_osl_hf.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/download/upload_osl_hf.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/training/classification.py +0 -0
- {opensportslib-0.2.0.dev3 → opensportslib-0.3.0}/tools/training/localization.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
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
|
|
@@ -324,8 +324,8 @@ backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
|
|
|
324
324
|
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
325
325
|
when available and falls back to extracting CLIP features from raw video during
|
|
326
326
|
`infer()`. Pre-extracted features remain the preferred path for parity, speed,
|
|
327
|
-
and reproducibility. See [docs/
|
|
328
|
-
|
|
327
|
+
and reproducibility. See [docs/tools/vqa.md](docs/tools/vqa.md) for the full
|
|
328
|
+
VQA setup workflow.
|
|
329
329
|
|
|
330
330
|
|
|
331
331
|
---
|
|
@@ -289,8 +289,8 @@ backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
|
|
|
289
289
|
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
290
290
|
when available and falls back to extracting CLIP features from raw video during
|
|
291
291
|
`infer()`. Pre-extracted features remain the preferred path for parity, speed,
|
|
292
|
-
and reproducibility. See [docs/
|
|
293
|
-
|
|
292
|
+
and reproducibility. See [docs/tools/vqa.md](docs/tools/vqa.md) for the full
|
|
293
|
+
VQA setup workflow.
|
|
294
294
|
|
|
295
295
|
|
|
296
296
|
---
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
from opensportslib.apis import VQAModel
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def main():
|
|
5
|
+
"""
|
|
6
|
+
Minimal VQA example.
|
|
7
|
+
Update config, question, and dataset paths before running.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
my_model = VQAModel(
|
|
11
|
+
config="examples/configs/vqa_qwen.yaml",
|
|
12
|
+
weights=None, # optional: path or Hugging Face model ID
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
predictions = my_model.infer(
|
|
16
|
+
test_set="/path/to/test_annotations.json",
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
print(predictions)
|
|
20
|
+
|
|
21
|
+
single_prediction = my_model.infer(
|
|
22
|
+
video_path="/path/to/video.mp4",
|
|
23
|
+
question="What card would you give? Why?",
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
print(single_prediction)
|
|
27
|
+
|
|
28
|
+
metrics = my_model.evaluate(
|
|
29
|
+
test_set="/path/to/test_annotations.json",
|
|
30
|
+
predictions=predictions,
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
print(metrics)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
main()
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
TASK: vqa
|
|
2
|
+
VERSION: 2
|
|
3
|
+
|
|
4
|
+
SYSTEM:
|
|
5
|
+
paths:
|
|
6
|
+
save_dir: ./checkpoints_vqa
|
|
7
|
+
work_dir: ${SYSTEM.paths.save_dir}
|
|
8
|
+
device: cuda
|
|
9
|
+
gpu:
|
|
10
|
+
count: 1
|
|
11
|
+
id: 0
|
|
12
|
+
reproducibility:
|
|
13
|
+
use_seed: true
|
|
14
|
+
seed: 42
|
|
15
|
+
|
|
16
|
+
DATA:
|
|
17
|
+
common:
|
|
18
|
+
dataset_name: OSL-XFoul
|
|
19
|
+
data_root: /home/vorajv/dataset/OSL-XFoul
|
|
20
|
+
feature_index: /home/vorajv/dataset/OSL-XFoul/feature_index.json
|
|
21
|
+
prediction_index: /home/vorajv/dataset/OSL-XFoul/prediction_index.json
|
|
22
|
+
runtime:
|
|
23
|
+
loader_backend: opencv
|
|
24
|
+
splits:
|
|
25
|
+
train:
|
|
26
|
+
annotation_path: /home/vorajv/dataset/OSL-XFoul/train.json
|
|
27
|
+
source_path: /home/vorajv/dataset/OSL-XFoul
|
|
28
|
+
dataloader:
|
|
29
|
+
batch_size: 1
|
|
30
|
+
shuffle: true
|
|
31
|
+
num_workers: 0
|
|
32
|
+
pin_memory: false
|
|
33
|
+
mp_context: spawn
|
|
34
|
+
persistent_workers: false
|
|
35
|
+
valid:
|
|
36
|
+
annotation_path: /home/vorajv/dataset/OSL-XFoul/valid.json
|
|
37
|
+
source_path: /home/vorajv/dataset/OSL-XFoul
|
|
38
|
+
dataloader:
|
|
39
|
+
batch_size: 1
|
|
40
|
+
shuffle: false
|
|
41
|
+
num_workers: 0
|
|
42
|
+
pin_memory: false
|
|
43
|
+
mp_context: spawn
|
|
44
|
+
persistent_workers: false
|
|
45
|
+
test:
|
|
46
|
+
annotation_path: /home/vorajv/dataset/OSL-XFoul/test.json
|
|
47
|
+
source_path: /home/vorajv/dataset/OSL-XFoul
|
|
48
|
+
dataloader:
|
|
49
|
+
batch_size: 1
|
|
50
|
+
shuffle: false
|
|
51
|
+
num_workers: 0
|
|
52
|
+
pin_memory: false
|
|
53
|
+
mp_context: spawn
|
|
54
|
+
persistent_workers: false
|
|
55
|
+
inputs:
|
|
56
|
+
video:
|
|
57
|
+
modality: video
|
|
58
|
+
representation: raw
|
|
59
|
+
source:
|
|
60
|
+
format: mp4
|
|
61
|
+
sampling:
|
|
62
|
+
num_frames: 100
|
|
63
|
+
input_fps: 25
|
|
64
|
+
target_fps: 17
|
|
65
|
+
start_frame: 63
|
|
66
|
+
end_frame: 87
|
|
67
|
+
transform: {}
|
|
68
|
+
augmentations: {}
|
|
69
|
+
params: {}
|
|
70
|
+
question:
|
|
71
|
+
modality: text
|
|
72
|
+
representation: raw
|
|
73
|
+
source:
|
|
74
|
+
format: json
|
|
75
|
+
sampling: {}
|
|
76
|
+
transform: {}
|
|
77
|
+
augmentations: {}
|
|
78
|
+
params: {}
|
|
79
|
+
|
|
80
|
+
MODEL:
|
|
81
|
+
runtime:
|
|
82
|
+
dtype: fp16
|
|
83
|
+
device: auto
|
|
84
|
+
compile: false
|
|
85
|
+
freeze: false
|
|
86
|
+
load:
|
|
87
|
+
checkpoint_path: null
|
|
88
|
+
pretrained: false
|
|
89
|
+
strict: true
|
|
90
|
+
map_location: null
|
|
91
|
+
format: auto
|
|
92
|
+
topology:
|
|
93
|
+
- from: video_encoder
|
|
94
|
+
to: mm_projector
|
|
95
|
+
- from: mm_projector
|
|
96
|
+
to: llm_decoder
|
|
97
|
+
|
|
98
|
+
IO:
|
|
99
|
+
inputs:
|
|
100
|
+
video: video_encoder
|
|
101
|
+
question: llm_decoder
|
|
102
|
+
outputs:
|
|
103
|
+
answer_text: llm_decoder
|
|
104
|
+
explanation_text: llm_decoder
|
|
105
|
+
|
|
106
|
+
TRAIN:
|
|
107
|
+
trainer:
|
|
108
|
+
type: vqa
|
|
109
|
+
epochs: 3
|
|
110
|
+
criterion:
|
|
111
|
+
type: CrossEntropyLoss
|
|
112
|
+
optimizer:
|
|
113
|
+
type: AdamW
|
|
114
|
+
lr: 0.0002
|
|
115
|
+
weight_decay: 0.001
|
|
116
|
+
scheduler:
|
|
117
|
+
type: constant
|
|
118
|
+
execution:
|
|
119
|
+
enabled: true
|
|
120
|
+
training_backend: xvars_videochatgpt_lora
|
|
121
|
+
feature_backend: xvars_clip
|
|
122
|
+
view_sampling_policy: random_train_deterministic_eval
|
|
123
|
+
acc_grad_iter: 8
|
|
124
|
+
log_interval: 1
|
|
125
|
+
dry_run: false
|
|
126
|
+
xvars:
|
|
127
|
+
feature_mode: strict_xvars
|
|
128
|
+
projection_path: null
|
|
129
|
+
prompt:
|
|
130
|
+
style: detailed
|
|
131
|
+
include_priors: true
|
|
132
|
+
prediction_prior_adapter: xvars_referee
|
|
133
|
+
prior_fields: [action, offence, contact, bodypart]
|
|
134
|
+
video_token_len: 300
|
|
135
|
+
generation:
|
|
136
|
+
max_new_tokens: 128
|
|
137
|
+
temperature: 0.0
|
|
138
|
+
eval_profile:
|
|
139
|
+
metric_set: [exact_match, contains_match, token_f1, referee_semantic]
|
|
140
|
+
aggregation: mean
|
|
141
|
+
exclusions: []
|
|
142
|
+
sft:
|
|
143
|
+
max_seq_length: 480
|
|
144
|
+
include_video_tokens: true
|
|
145
|
+
disable_tqdm: false
|
|
146
|
+
reference_mode: all
|
|
147
|
+
append_eos_token: true
|
|
148
|
+
gradient_checkpointing: true
|
|
149
|
+
save_strategy: epoch
|
|
150
|
+
lora:
|
|
151
|
+
r: 16
|
|
152
|
+
alpha: 32
|
|
153
|
+
dropout: 0.05
|
|
154
|
+
bias: none
|
|
155
|
+
prepare_kbit: true
|
|
156
|
+
target_modules: [mm_projector, upsample_features, up_proj, down_proj, gate_proj, k_proj, q_proj, v_proj, o_proj]
|
|
157
|
+
exclude_modules: '^base_lm\.model\.mm_projector$'
|
|
158
|
+
quantization:
|
|
159
|
+
enabled: false
|
|
160
|
+
load_in_4bit: true
|
|
161
|
+
bnb_4bit_quant_type: nf4
|
|
162
|
+
compute_dtype: float16
|
|
163
|
+
bnb_4bit_use_double_quant: true
|
|
164
|
+
checkpoint:
|
|
165
|
+
save_adapter: true
|
|
166
|
+
merge_and_save: false
|
|
167
|
+
selection:
|
|
168
|
+
monitor: loss
|
|
169
|
+
mode: min
|
|
170
|
+
checkpoint:
|
|
171
|
+
save_every: 1
|
|
172
|
+
save_best: true
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
SYSTEM:
|
|
2
|
+
paths:
|
|
3
|
+
save_dir: ./checkpoints_vqa_lora
|
|
4
|
+
gpu:
|
|
5
|
+
count: 4
|
|
6
|
+
|
|
7
|
+
MODEL:
|
|
8
|
+
components:
|
|
9
|
+
video_encoder:
|
|
10
|
+
kind: encoder
|
|
11
|
+
source:
|
|
12
|
+
provider: opensportslib
|
|
13
|
+
# XVARS-trained classifier weights to load into that architecture
|
|
14
|
+
load:
|
|
15
|
+
weights_path: /home/vorajv/X-VARS/weights/14_model.pth.tar
|
|
16
|
+
params:
|
|
17
|
+
# CLIP architecture and image processor to instantiate.
|
|
18
|
+
feature_source: indexed_or_raw_clip
|
|
19
|
+
vision_tower: openai/clip-vit-large-patch14
|
|
20
|
+
feature_dim: 1024
|
|
21
|
+
overrides: {}
|
|
22
|
+
mm_projector:
|
|
23
|
+
kind: projector
|
|
24
|
+
source:
|
|
25
|
+
provider: opensportslib
|
|
26
|
+
params:
|
|
27
|
+
input_dim: 1024
|
|
28
|
+
overrides: {}
|
|
29
|
+
llm_decoder:
|
|
30
|
+
kind: decoder
|
|
31
|
+
source:
|
|
32
|
+
provider: opensportslib
|
|
33
|
+
params:
|
|
34
|
+
repo_id: /home/vorajv/X-VARS/weights/base_model_videoChatGPT
|
|
35
|
+
overrides: {}
|
|
36
|
+
metadata:
|
|
37
|
+
backend: xvars_videochatgpt
|
|
38
|
+
|
|
39
|
+
TRAIN:
|
|
40
|
+
execution:
|
|
41
|
+
prompt:
|
|
42
|
+
system_prompt: You are Video-ChatGPT, a large vision-language assistant. You are able to understand the video content that the user provides, and assist the user with a variety of tasks using natural language.Follow the instructions carefully and explain your answers in detail based on the provided video.
|
|
43
|
+
|
|
44
|
+
# Optional XFoul-only generated-answer smoke test.
|
|
45
|
+
# During LoRA training, this runs generation on one known training sample and
|
|
46
|
+
# checks that the answer still contains referee-domain terms and avoids known
|
|
47
|
+
# code-like failure strings. Disable or replace these values for non-XFoul data.
|
|
48
|
+
generated_validation:
|
|
49
|
+
enabled: true
|
|
50
|
+
sample_id: action_0
|
|
51
|
+
every_steps: 25
|
|
52
|
+
max_new_tokens: 128
|
|
53
|
+
require_relevance: true
|
|
54
|
+
required_terms: [foul, card, challenge, spa, dogso, advantage]
|
|
55
|
+
forbidden_terms: [get_children, django, httpclient, "```python", "```php"]
|
|
56
|
+
|
|
57
|
+
hf:
|
|
58
|
+
tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
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
|
|
@@ -324,8 +324,8 @@ backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
|
|
|
324
324
|
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
325
325
|
when available and falls back to extracting CLIP features from raw video during
|
|
326
326
|
`infer()`. Pre-extracted features remain the preferred path for parity, speed,
|
|
327
|
-
and reproducibility. See [docs/
|
|
328
|
-
|
|
327
|
+
and reproducibility. See [docs/tools/vqa.md](docs/tools/vqa.md) for the full
|
|
328
|
+
VQA setup workflow.
|
|
329
329
|
|
|
330
330
|
|
|
331
331
|
---
|
|
@@ -5,6 +5,7 @@ README.md
|
|
|
5
5
|
pyproject.toml
|
|
6
6
|
examples/quickstart/basic_classification.py
|
|
7
7
|
examples/quickstart/basic_localization.py
|
|
8
|
+
examples/quickstart/basic_vqa.py
|
|
8
9
|
opensportslib/__init__.py
|
|
9
10
|
opensportslib/cli.py
|
|
10
11
|
opensportslib.egg-info/PKG-INFO
|
|
@@ -28,7 +29,9 @@ opensportslib/configs/localization/default.yaml
|
|
|
28
29
|
opensportslib/configs/localization/netvladpp_resnetpca512.yaml
|
|
29
30
|
opensportslib/configs/localization/video_dali.yaml
|
|
30
31
|
opensportslib/configs/localization/video_ocv.yaml
|
|
32
|
+
opensportslib/configs/vqa/default.yaml
|
|
31
33
|
opensportslib/configs/vqa/qwen.yaml
|
|
34
|
+
opensportslib/configs/vqa/xvars.yaml
|
|
32
35
|
opensportslib/core/__init__.py
|
|
33
36
|
opensportslib/core/config/__init__.py
|
|
34
37
|
opensportslib/core/config/accessors.py
|
|
@@ -135,9 +138,12 @@ tests/test_localization_dali_filenames.py
|
|
|
135
138
|
tests/test_package_smoke.py
|
|
136
139
|
tests/test_pretrained_config_merge_policy.py
|
|
137
140
|
tests/test_public_apis_smoke.py
|
|
141
|
+
tests/test_setup_cli.py
|
|
138
142
|
tests/test_subset_train_infer_integration.py
|
|
139
143
|
tests/test_task_model_api_contract.py
|
|
144
|
+
tests/test_vqa_api.py
|
|
140
145
|
tests/test_vqa_metrics_semantic.py
|
|
146
|
+
tests/test_vqa_qwen_xvars.py
|
|
141
147
|
tests/test_vqa_training_lora.py
|
|
142
148
|
tests/test_vqa_xvars_videochatgpt.py
|
|
143
149
|
tools/convert/build_soccernet_gar.py
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "opensportslib"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.3.0"
|
|
8
8
|
description = "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."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.12"
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from opensportslib import cli
|
|
4
|
+
from opensportslib.setup import setup as setup_lib
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_cli_setup_forwards_xvars_flag(monkeypatch):
|
|
8
|
+
captured: dict[str, object] = {}
|
|
9
|
+
|
|
10
|
+
def fake_setup(*, dali: bool, pyg: bool, vqa_xvars: bool, vqa_qwen: bool):
|
|
11
|
+
captured["dali"] = dali
|
|
12
|
+
captured["pyg"] = pyg
|
|
13
|
+
captured["vqa_xvars"] = vqa_xvars
|
|
14
|
+
captured["vqa_qwen"] = vqa_qwen
|
|
15
|
+
|
|
16
|
+
monkeypatch.setattr(cli, "setup", fake_setup)
|
|
17
|
+
|
|
18
|
+
rc = cli.main(["setup", "--vqa_xvars", "--dali"])
|
|
19
|
+
|
|
20
|
+
assert rc == 0
|
|
21
|
+
assert captured == {"dali": True, "pyg": False, "vqa_xvars": True, "vqa_qwen": False}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def test_cli_setup_forwards_qwen_flag(monkeypatch):
|
|
25
|
+
captured: dict[str, object] = {}
|
|
26
|
+
|
|
27
|
+
def fake_setup(*, dali: bool, pyg: bool, vqa_xvars: bool, vqa_qwen: bool):
|
|
28
|
+
captured["dali"] = dali
|
|
29
|
+
captured["pyg"] = pyg
|
|
30
|
+
captured["vqa_xvars"] = vqa_xvars
|
|
31
|
+
captured["vqa_qwen"] = vqa_qwen
|
|
32
|
+
|
|
33
|
+
monkeypatch.setattr(cli, "setup", fake_setup)
|
|
34
|
+
|
|
35
|
+
rc = cli.main(["setup", "--vqa_qwen", "--pyg"])
|
|
36
|
+
|
|
37
|
+
assert rc == 0
|
|
38
|
+
assert captured == {"dali": False, "pyg": True, "vqa_xvars": False, "vqa_qwen": True}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def test_install_xvars_dependencies_uninstalls_then_reinstalls(monkeypatch):
|
|
42
|
+
calls: list[tuple[str, list[str]]] = []
|
|
43
|
+
|
|
44
|
+
def fake_call(cmd: list[str]):
|
|
45
|
+
calls.append(("call", cmd))
|
|
46
|
+
return 0
|
|
47
|
+
|
|
48
|
+
def fake_check_call(cmd: list[str]):
|
|
49
|
+
calls.append(("check_call", cmd))
|
|
50
|
+
return 0
|
|
51
|
+
|
|
52
|
+
monkeypatch.setattr(setup_lib.subprocess, "call", fake_call)
|
|
53
|
+
monkeypatch.setattr(setup_lib.subprocess, "check_call", fake_check_call)
|
|
54
|
+
monkeypatch.setattr(setup_lib.sys, "executable", "/usr/bin/python3")
|
|
55
|
+
|
|
56
|
+
setup_lib.install_xvars_dependencies(setup_lib.XVARS_DEPENDENCY_PINS)
|
|
57
|
+
|
|
58
|
+
assert calls == [
|
|
59
|
+
(
|
|
60
|
+
"call",
|
|
61
|
+
[
|
|
62
|
+
"/usr/bin/python3",
|
|
63
|
+
"-m",
|
|
64
|
+
"pip",
|
|
65
|
+
"uninstall",
|
|
66
|
+
"-y",
|
|
67
|
+
"transformers",
|
|
68
|
+
"peft",
|
|
69
|
+
"tokenizers",
|
|
70
|
+
"accelerate",
|
|
71
|
+
"trl",
|
|
72
|
+
],
|
|
73
|
+
),
|
|
74
|
+
(
|
|
75
|
+
"check_call",
|
|
76
|
+
[
|
|
77
|
+
"/usr/bin/python3",
|
|
78
|
+
"-m",
|
|
79
|
+
"pip",
|
|
80
|
+
"install",
|
|
81
|
+
"transformers==4.38.2",
|
|
82
|
+
"peft==0.9.0",
|
|
83
|
+
"tokenizers==0.15.2",
|
|
84
|
+
"accelerate==0.27.2",
|
|
85
|
+
"trl==0.10.1",
|
|
86
|
+
],
|
|
87
|
+
),
|
|
88
|
+
]
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def test_setup_skips_vqa_dependency_install_when_flags_are_false(monkeypatch):
|
|
92
|
+
calls: list[str] = []
|
|
93
|
+
|
|
94
|
+
monkeypatch.setattr(setup_lib, "install_extras", lambda dali=False, pyg=False: calls.append(f"extras:{dali}:{pyg}"))
|
|
95
|
+
monkeypatch.setattr(setup_lib, "install_xvars_dependencies", lambda pins: calls.append(f"deps:{sorted(pins)}"))
|
|
96
|
+
monkeypatch.setattr(setup_lib, "verify", lambda: calls.append("verify"))
|
|
97
|
+
monkeypatch.setattr(setup_lib, "install_torch", lambda: calls.append("torch"))
|
|
98
|
+
|
|
99
|
+
setup_lib.setup(dali=True, pyg=False, vqa_xvars=False, vqa_qwen=False)
|
|
100
|
+
|
|
101
|
+
assert calls == ["torch", "extras:True:False", "verify"]
|