opensportslib 0.2.0.dev2__tar.gz → 0.2.0.dev4__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.dev2/opensportslib.egg-info → opensportslib-0.2.0.dev4}/PKG-INFO +34 -8
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/README.md +33 -7
- opensportslib-0.2.0.dev4/examples/quickstart/basic_vqa.py +37 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/cli.py +4 -4
- opensportslib-0.2.0.dev2/opensportslib/configs/vqa/qwen.yaml → opensportslib-0.2.0.dev4/opensportslib/configs/vqa/default.yaml +3 -59
- opensportslib-0.2.0.dev4/opensportslib/configs/vqa/qwen.yaml +49 -0
- opensportslib-0.2.0.dev4/opensportslib/configs/vqa/xvars.yaml +58 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/loader.py +1 -1
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/setup/setup.py +6 -6
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4/opensportslib.egg-info}/PKG-INFO +34 -8
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib.egg-info/SOURCES.txt +6 -1
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/pyproject.toml +1 -1
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_config_architecture.py +40 -11
- opensportslib-0.2.0.dev4/tests/test_setup_cli.py +101 -0
- opensportslib-0.2.0.dev4/tests/test_vqa_api.py +240 -0
- opensportslib-0.2.0.dev4/tests/test_vqa_qwen_xvars.py +251 -0
- opensportslib-0.2.0.dev2/opensportslib/configs/vqa/xvars_lora.yaml +0 -243
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/LICENSE +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/LICENSE-COMMERCIAL +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/MANIFEST.in +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/examples/quickstart/basic_classification.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/examples/quickstart/basic_localization.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/apis/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/apis/base_task_model.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/apis/classification.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/apis/localization.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/apis/vqa.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/classification/default.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/classification/video.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/default.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/localization/default.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/localization/video_dali.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/configs/localization/video_ocv.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/accessors.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/conflicts.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/migrate.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/migrations/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/runtime_adapter.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/schema.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/schemas/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/config/validate.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/loss/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/loss/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/loss/calf.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/loss/ce.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/loss/combine.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/loss/nll.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/optimizer/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/optimizer/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/sampler/weighted_sampler.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/scheduler/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/scheduler/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/trainer/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/trainer/classification_trainer.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/trainer/localization_trainer.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/trainer/vqa_trainer.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/checkpoint.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/config.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/config_normalize.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/data.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/ddp.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/default_args.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/hf_runtime.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/lightning.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/load_annotations.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/seed.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/video_processing.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/core/utils/wandb.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/classification_dataset.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/localization_dataset.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/utils/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/utils/tracking.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/datasets/vqa_dataset.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/classification.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/localization.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/metrics/classification_metric.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/metrics/localization_metric.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/metrics/vqa_metric.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/backbones/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/contextaware.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/e2e.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/learnablepooling.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/qwen_xvars.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/tracking.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/vars.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/video.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/video_mae.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/base/xvars_videochatgpt.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/heads/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/neck/builder.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/common.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/impl/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/impl/asformer.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/impl/calf.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/impl/gsm.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/impl/gtad.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/impl/tsm.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/litebase.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/modules.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/shift.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/utils.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/vqa_prompting.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/models/utils/xvars_clip_index.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/tools/__init__.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/tools/_common.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/tools/hf_transfer.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/tools/osl_json_to_parquet.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib/tools/parquet_to_osl_json.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib.egg-info/dependency_links.txt +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib.egg-info/entry_points.txt +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib.egg-info/requires.txt +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/opensportslib.egg-info/top_level.txt +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/setup.cfg +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/conftest.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_classification_dataset_paths.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_classification_trainer_dataloader.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_config_split_override_sync.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_config_utils_smoke.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_conversion_tools.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_extract_xvars_features.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_hf_transfer_tools.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_localization_dali_filenames.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_package_smoke.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_pretrained_config_merge_policy.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_public_apis_smoke.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_subset_train_infer_integration.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_task_model_api_contract.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_vqa_metrics_semantic.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_vqa_training_lora.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tests/test_vqa_xvars_videochatgpt.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/convert/build_soccernet_gar.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/convert/build_xvars_indexes.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/convert/extract_xvars_clip_features.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/download/download_hf_repo.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/download/download_osl_hf.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/download/upload_osl_hf.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/training/classification.py +0 -0
- {opensportslib-0.2.0.dev2 → opensportslib-0.2.0.dev4}/tools/training/localization.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.2.0.
|
|
3
|
+
Version: 0.2.0.dev4
|
|
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
|
|
@@ -93,13 +93,26 @@ opensportslib setup --pyg
|
|
|
93
93
|
|
|
94
94
|
# Optional: install for DALI support
|
|
95
95
|
opensportslib setup --dali
|
|
96
|
-
|
|
96
|
+
|
|
97
|
+
# Optional: install the X-VARS-compatible VQA dependency profile
|
|
98
|
+
opensportslib setup --vqa_xvars
|
|
99
|
+
|
|
100
|
+
# Optional: install the Qwen-compatible VQA dependency profile
|
|
101
|
+
opensportslib setup --vqa_qwen
|
|
102
|
+
```
|
|
97
103
|
---
|
|
98
104
|
|
|
99
105
|
**Note:**
|
|
100
106
|
Run `opensportslib setup` to automatically configure dependencies.
|
|
101
107
|
If issues occur, manually install compatible versions of `torch`, `torchvision`, and related libraries according to your CUDA version or system compatibility.
|
|
102
108
|
|
|
109
|
+
For VQA, use exactly one backend-specific dependency profile:
|
|
110
|
+
|
|
111
|
+
- `--vqa_xvars` installs the X-VARS-compatible Hugging Face stack from `XVARS_DEPENDENCY_PINS`
|
|
112
|
+
- `--vqa_qwen` installs the Qwen-compatible Hugging Face stack from `QWEN_DEPENDENCY_PINS`
|
|
113
|
+
|
|
114
|
+
The `vqa_qwen` config supports `Qwen/Qwen2.5-7B-Instruct` and `Qwen/Qwen3.5-9B-Base`.
|
|
115
|
+
|
|
103
116
|
---
|
|
104
117
|
|
|
105
118
|
## Data and pretrained models
|
|
@@ -287,7 +300,7 @@ metrics_from_file = my_model.evaluate(
|
|
|
287
300
|
from opensportslib.apis import VQAModel
|
|
288
301
|
|
|
289
302
|
my_model = VQAModel(
|
|
290
|
-
config="/
|
|
303
|
+
config="opensportslib/configs/vqa/qwen.yaml",
|
|
291
304
|
weights=None, # optional: path or Hugging Face model ID
|
|
292
305
|
)
|
|
293
306
|
|
|
@@ -300,13 +313,20 @@ single_prediction = my_model.infer(
|
|
|
300
313
|
video_path="/path/to/video.mp4",
|
|
301
314
|
question="What card would you give? Why?",
|
|
302
315
|
)
|
|
303
|
-
|
|
304
|
-
metrics = my_model.evaluate(
|
|
305
|
-
test_set="/path/to/test_annotations.json",
|
|
306
|
-
predictions=predictions,
|
|
307
|
-
)
|
|
308
316
|
```
|
|
309
317
|
|
|
318
|
+
Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
|
|
319
|
+
for the X-VARS-compatible backend, or `opensportslib/configs/vqa/qwen.yaml` with
|
|
320
|
+
`opensportslib setup --vqa_qwen` for the Qwen-compatible backend. The Qwen
|
|
321
|
+
backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
|
|
322
|
+
`Qwen/Qwen3.5-9B-Base`.
|
|
323
|
+
|
|
324
|
+
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
325
|
+
when available and falls back to extracting CLIP features from raw video during
|
|
326
|
+
`infer()`. Pre-extracted features remain the preferred path for parity, speed,
|
|
327
|
+
and reproducibility. See [docs/tools/vqa.md](docs/tools/vqa.md) for the full
|
|
328
|
+
VQA setup workflow.
|
|
329
|
+
|
|
310
330
|
|
|
311
331
|
---
|
|
312
332
|
|
|
@@ -414,6 +434,12 @@ opensportslib setup --pyg
|
|
|
414
434
|
|
|
415
435
|
# Optional: install for DALI support
|
|
416
436
|
opensportslib setup --dali
|
|
437
|
+
|
|
438
|
+
# Optional: install the X-VARS-compatible VQA dependency profile
|
|
439
|
+
opensportslib setup --vqa_xvars
|
|
440
|
+
|
|
441
|
+
# Optional: install the Qwen-compatible VQA dependency profile
|
|
442
|
+
opensportslib setup --vqa_qwen
|
|
417
443
|
```
|
|
418
444
|
|
|
419
445
|
### Git workflow
|
|
@@ -58,13 +58,26 @@ opensportslib setup --pyg
|
|
|
58
58
|
|
|
59
59
|
# Optional: install for DALI support
|
|
60
60
|
opensportslib setup --dali
|
|
61
|
-
|
|
61
|
+
|
|
62
|
+
# Optional: install the X-VARS-compatible VQA dependency profile
|
|
63
|
+
opensportslib setup --vqa_xvars
|
|
64
|
+
|
|
65
|
+
# Optional: install the Qwen-compatible VQA dependency profile
|
|
66
|
+
opensportslib setup --vqa_qwen
|
|
67
|
+
```
|
|
62
68
|
---
|
|
63
69
|
|
|
64
70
|
**Note:**
|
|
65
71
|
Run `opensportslib setup` to automatically configure dependencies.
|
|
66
72
|
If issues occur, manually install compatible versions of `torch`, `torchvision`, and related libraries according to your CUDA version or system compatibility.
|
|
67
73
|
|
|
74
|
+
For VQA, use exactly one backend-specific dependency profile:
|
|
75
|
+
|
|
76
|
+
- `--vqa_xvars` installs the X-VARS-compatible Hugging Face stack from `XVARS_DEPENDENCY_PINS`
|
|
77
|
+
- `--vqa_qwen` installs the Qwen-compatible Hugging Face stack from `QWEN_DEPENDENCY_PINS`
|
|
78
|
+
|
|
79
|
+
The `vqa_qwen` config supports `Qwen/Qwen2.5-7B-Instruct` and `Qwen/Qwen3.5-9B-Base`.
|
|
80
|
+
|
|
68
81
|
---
|
|
69
82
|
|
|
70
83
|
## Data and pretrained models
|
|
@@ -252,7 +265,7 @@ metrics_from_file = my_model.evaluate(
|
|
|
252
265
|
from opensportslib.apis import VQAModel
|
|
253
266
|
|
|
254
267
|
my_model = VQAModel(
|
|
255
|
-
config="/
|
|
268
|
+
config="opensportslib/configs/vqa/qwen.yaml",
|
|
256
269
|
weights=None, # optional: path or Hugging Face model ID
|
|
257
270
|
)
|
|
258
271
|
|
|
@@ -265,13 +278,20 @@ single_prediction = my_model.infer(
|
|
|
265
278
|
video_path="/path/to/video.mp4",
|
|
266
279
|
question="What card would you give? Why?",
|
|
267
280
|
)
|
|
268
|
-
|
|
269
|
-
metrics = my_model.evaluate(
|
|
270
|
-
test_set="/path/to/test_annotations.json",
|
|
271
|
-
predictions=predictions,
|
|
272
|
-
)
|
|
273
281
|
```
|
|
274
282
|
|
|
283
|
+
Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
|
|
284
|
+
for the X-VARS-compatible backend, or `opensportslib/configs/vqa/qwen.yaml` with
|
|
285
|
+
`opensportslib setup --vqa_qwen` for the Qwen-compatible backend. The Qwen
|
|
286
|
+
backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
|
|
287
|
+
`Qwen/Qwen3.5-9B-Base`.
|
|
288
|
+
|
|
289
|
+
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
290
|
+
when available and falls back to extracting CLIP features from raw video during
|
|
291
|
+
`infer()`. Pre-extracted features remain the preferred path for parity, speed,
|
|
292
|
+
and reproducibility. See [docs/tools/vqa.md](docs/tools/vqa.md) for the full
|
|
293
|
+
VQA setup workflow.
|
|
294
|
+
|
|
275
295
|
|
|
276
296
|
---
|
|
277
297
|
|
|
@@ -379,6 +399,12 @@ opensportslib setup --pyg
|
|
|
379
399
|
|
|
380
400
|
# Optional: install for DALI support
|
|
381
401
|
opensportslib setup --dali
|
|
402
|
+
|
|
403
|
+
# Optional: install the X-VARS-compatible VQA dependency profile
|
|
404
|
+
opensportslib setup --vqa_xvars
|
|
405
|
+
|
|
406
|
+
# Optional: install the Qwen-compatible VQA dependency profile
|
|
407
|
+
opensportslib setup --vqa_qwen
|
|
382
408
|
```
|
|
383
409
|
|
|
384
410
|
### Git workflow
|
|
@@ -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()
|
|
@@ -11,8 +11,8 @@ def main(argv: Optional[list[str]] = None) -> int:
|
|
|
11
11
|
parser.add_argument("command", choices=["setup"])
|
|
12
12
|
parser.add_argument("--pyg", action="store_true")
|
|
13
13
|
parser.add_argument("--dali", action="store_true")
|
|
14
|
-
parser.add_argument("--
|
|
15
|
-
parser.add_argument("--
|
|
14
|
+
parser.add_argument("--vqa_xvars", action="store_true")
|
|
15
|
+
parser.add_argument("--vqa_qwen", action="store_true")
|
|
16
16
|
|
|
17
17
|
args = parser.parse_args(argv)
|
|
18
18
|
|
|
@@ -20,8 +20,8 @@ def main(argv: Optional[list[str]] = None) -> int:
|
|
|
20
20
|
setup(
|
|
21
21
|
pyg=args.pyg,
|
|
22
22
|
dali=args.dali,
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
vqa_xvars=args.vqa_xvars,
|
|
24
|
+
vqa_qwen=args.vqa_qwen
|
|
25
25
|
)
|
|
26
26
|
return 0
|
|
27
27
|
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
TASK:
|
|
1
|
+
TASK: vqa
|
|
2
2
|
VERSION: 2
|
|
3
3
|
|
|
4
4
|
SYSTEM:
|
|
5
5
|
paths:
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
work_dir: ./checkpoints_vqa_qwen
|
|
6
|
+
save_dir: ./checkpoints_vqa
|
|
7
|
+
work_dir: ${SYSTEM.paths.save_dir}
|
|
9
8
|
device: cuda
|
|
10
9
|
gpu:
|
|
11
10
|
count: 1
|
|
@@ -90,43 +89,11 @@ MODEL:
|
|
|
90
89
|
strict: true
|
|
91
90
|
map_location: null
|
|
92
91
|
format: auto
|
|
93
|
-
components:
|
|
94
|
-
video_encoder:
|
|
95
|
-
kind: encoder
|
|
96
|
-
source:
|
|
97
|
-
provider: opensportslib
|
|
98
|
-
name: xvars_clip_features
|
|
99
|
-
load:
|
|
100
|
-
weights_path: /home/vorajv/X-VARS/weights/14_model.pth.tar
|
|
101
|
-
params:
|
|
102
|
-
feature_source: indexed_or_raw_clip
|
|
103
|
-
vision_tower: openai/clip-vit-large-patch14
|
|
104
|
-
feature_dim: 1024
|
|
105
|
-
overrides: {}
|
|
106
|
-
mm_projector:
|
|
107
|
-
kind: projector
|
|
108
|
-
source:
|
|
109
|
-
provider: opensportslib
|
|
110
|
-
params:
|
|
111
|
-
input_dim: 1024
|
|
112
|
-
overrides: {}
|
|
113
|
-
llm_decoder:
|
|
114
|
-
kind: decoder
|
|
115
|
-
source:
|
|
116
|
-
provider: huggingface
|
|
117
|
-
# Qwen/Qwen2.5-7B-Instruct or Qwen/Qwen3.5-9B-Base
|
|
118
|
-
name: Qwen/Qwen3.5-9B-Base
|
|
119
|
-
params:
|
|
120
|
-
# Qwen/Qwen2.5-7B-Instruct or Qwen/Qwen3.5-9B-Base
|
|
121
|
-
repo_id: Qwen/Qwen3.5-9B-Base
|
|
122
|
-
overrides: {}
|
|
123
92
|
topology:
|
|
124
93
|
- from: video_encoder
|
|
125
94
|
to: mm_projector
|
|
126
95
|
- from: mm_projector
|
|
127
96
|
to: llm_decoder
|
|
128
|
-
metadata:
|
|
129
|
-
backend: qwen_xvars_infer
|
|
130
97
|
|
|
131
98
|
IO:
|
|
132
99
|
inputs:
|
|
@@ -139,20 +106,15 @@ IO:
|
|
|
139
106
|
TRAIN:
|
|
140
107
|
trainer:
|
|
141
108
|
type: vqa
|
|
142
|
-
|
|
143
109
|
epochs: 3
|
|
144
|
-
|
|
145
110
|
criterion:
|
|
146
111
|
type: CrossEntropyLoss
|
|
147
|
-
|
|
148
112
|
optimizer:
|
|
149
113
|
type: AdamW
|
|
150
114
|
lr: 0.0002
|
|
151
115
|
weight_decay: 0.001
|
|
152
|
-
|
|
153
116
|
scheduler:
|
|
154
117
|
type: constant
|
|
155
|
-
|
|
156
118
|
execution:
|
|
157
119
|
enabled: true
|
|
158
120
|
training_backend: xvars_videochatgpt_lora
|
|
@@ -161,28 +123,22 @@ TRAIN:
|
|
|
161
123
|
acc_grad_iter: 8
|
|
162
124
|
log_interval: 1
|
|
163
125
|
dry_run: false
|
|
164
|
-
|
|
165
126
|
xvars:
|
|
166
127
|
feature_mode: strict_xvars
|
|
167
128
|
projection_path: null
|
|
168
|
-
|
|
169
129
|
prompt:
|
|
170
130
|
style: detailed
|
|
171
|
-
system_prompt: You are a football video assistant. Answer the VQA question using the provided video context and referee priors.
|
|
172
131
|
include_priors: true
|
|
173
132
|
prediction_prior_adapter: xvars_referee
|
|
174
133
|
prior_fields: [action, offence, contact, bodypart]
|
|
175
134
|
video_token_len: 300
|
|
176
|
-
|
|
177
135
|
generation:
|
|
178
136
|
max_new_tokens: 128
|
|
179
137
|
temperature: 0.0
|
|
180
|
-
|
|
181
138
|
eval_profile:
|
|
182
139
|
metric_set: [exact_match, contains_match, token_f1, referee_semantic]
|
|
183
140
|
aggregation: mean
|
|
184
141
|
exclusions: []
|
|
185
|
-
|
|
186
142
|
sft:
|
|
187
143
|
max_seq_length: 480
|
|
188
144
|
include_video_tokens: true
|
|
@@ -191,14 +147,6 @@ TRAIN:
|
|
|
191
147
|
append_eos_token: true
|
|
192
148
|
gradient_checkpointing: true
|
|
193
149
|
save_strategy: epoch
|
|
194
|
-
|
|
195
|
-
hf:
|
|
196
|
-
tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
|
|
197
|
-
prefer_cuda: true
|
|
198
|
-
local_files_only: false
|
|
199
|
-
device_map: auto
|
|
200
|
-
offload_folder: ./hf_offload_qwen
|
|
201
|
-
|
|
202
150
|
lora:
|
|
203
151
|
r: 16
|
|
204
152
|
alpha: 32
|
|
@@ -207,22 +155,18 @@ TRAIN:
|
|
|
207
155
|
prepare_kbit: true
|
|
208
156
|
target_modules: [mm_projector, upsample_features, up_proj, down_proj, gate_proj, k_proj, q_proj, v_proj, o_proj]
|
|
209
157
|
exclude_modules: '^base_lm\.model\.mm_projector$'
|
|
210
|
-
|
|
211
158
|
quantization:
|
|
212
159
|
enabled: false
|
|
213
160
|
load_in_4bit: true
|
|
214
161
|
bnb_4bit_quant_type: nf4
|
|
215
162
|
compute_dtype: float16
|
|
216
163
|
bnb_4bit_use_double_quant: true
|
|
217
|
-
|
|
218
164
|
checkpoint:
|
|
219
165
|
save_adapter: true
|
|
220
166
|
merge_and_save: false
|
|
221
|
-
|
|
222
167
|
selection:
|
|
223
168
|
monitor: loss
|
|
224
169
|
mode: min
|
|
225
|
-
|
|
226
170
|
checkpoint:
|
|
227
171
|
save_every: 1
|
|
228
172
|
save_best: true
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
SYSTEM:
|
|
2
|
+
paths:
|
|
3
|
+
save_dir: ./checkpoints_vqa_qwen
|
|
4
|
+
|
|
5
|
+
MODEL:
|
|
6
|
+
components:
|
|
7
|
+
video_encoder:
|
|
8
|
+
kind: encoder
|
|
9
|
+
source:
|
|
10
|
+
provider: opensportslib
|
|
11
|
+
name: xvars_clip_features
|
|
12
|
+
load:
|
|
13
|
+
weights_path: /home/vorajv/X-VARS/weights/14_model.pth.tar
|
|
14
|
+
params:
|
|
15
|
+
feature_source: indexed_or_raw_clip
|
|
16
|
+
vision_tower: openai/clip-vit-large-patch14
|
|
17
|
+
feature_dim: 1024
|
|
18
|
+
overrides: {}
|
|
19
|
+
mm_projector:
|
|
20
|
+
kind: projector
|
|
21
|
+
source:
|
|
22
|
+
provider: opensportslib
|
|
23
|
+
params:
|
|
24
|
+
input_dim: 1024
|
|
25
|
+
overrides: {}
|
|
26
|
+
llm_decoder:
|
|
27
|
+
kind: decoder
|
|
28
|
+
source:
|
|
29
|
+
provider: huggingface
|
|
30
|
+
# Supported models: Qwen/Qwen2.5-7B-Instruct or Qwen/Qwen3.5-9B-Base
|
|
31
|
+
name: Qwen/Qwen3.5-9B-Base
|
|
32
|
+
params:
|
|
33
|
+
# Supported models: Qwen/Qwen2.5-7B-Instruct or Qwen/Qwen3.5-9B-Base
|
|
34
|
+
repo_id: Qwen/Qwen3.5-9B-Base
|
|
35
|
+
overrides: {}
|
|
36
|
+
metadata:
|
|
37
|
+
backend: qwen_xvars_infer
|
|
38
|
+
|
|
39
|
+
TRAIN:
|
|
40
|
+
execution:
|
|
41
|
+
prompt:
|
|
42
|
+
system_prompt: You are a football video assistant. Answer the VQA question using the provided video context and referee priors.
|
|
43
|
+
|
|
44
|
+
hf:
|
|
45
|
+
tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
|
|
46
|
+
prefer_cuda: true
|
|
47
|
+
local_files_only: false
|
|
48
|
+
device_map: auto
|
|
49
|
+
offload_folder: ./hf_offload_qwen
|
|
@@ -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}
|
|
@@ -18,7 +18,7 @@ from .migrate import migrate_config
|
|
|
18
18
|
from .runtime_adapter import maybe_namespace, namespace_to_plain_dict
|
|
19
19
|
|
|
20
20
|
_YAML_SUFFIXES = {".yaml", ".yml"}
|
|
21
|
-
_TASK_DIRS = {"classification", "localization"}
|
|
21
|
+
_TASK_DIRS = {"classification", "localization", "vqa"}
|
|
22
22
|
_INTERPOLATION_RE = re.compile(r"\$\{([^}]+)\}")
|
|
23
23
|
|
|
24
24
|
|
|
@@ -183,12 +183,12 @@ def verify():
|
|
|
183
183
|
else:
|
|
184
184
|
print("Running on CPU")
|
|
185
185
|
|
|
186
|
-
def setup(dali=False, pyg=False,
|
|
186
|
+
def setup(dali=False, pyg=False, vqa_xvars=False, vqa_qwen=False):
|
|
187
187
|
install_torch()
|
|
188
188
|
install_extras(dali=dali, pyg=pyg)
|
|
189
|
-
if
|
|
189
|
+
if vqa_xvars:
|
|
190
190
|
install_xvars_dependencies(XVARS_DEPENDENCY_PINS)
|
|
191
|
-
if
|
|
191
|
+
if vqa_qwen:
|
|
192
192
|
install_xvars_dependencies(QWEN_DEPENDENCY_PINS)
|
|
193
193
|
verify()
|
|
194
194
|
|
|
@@ -202,9 +202,9 @@ if __name__ == "__main__":
|
|
|
202
202
|
parser = argparse.ArgumentParser()
|
|
203
203
|
parser.add_argument("--dali", action="store_true")
|
|
204
204
|
parser.add_argument("--pyg", action="store_true")
|
|
205
|
-
parser.add_argument("--
|
|
206
|
-
parser.add_argument("--
|
|
205
|
+
parser.add_argument("--vqa_xvars", action="store_true")
|
|
206
|
+
parser.add_argument("--vqa_qwen", action="store_true")
|
|
207
207
|
|
|
208
208
|
args = parser.parse_args()
|
|
209
209
|
|
|
210
|
-
setup(dali=args.dali, pyg=args.pyg,
|
|
210
|
+
setup(dali=args.dali, pyg=args.pyg, vqa_xvars=args.vqa_xvars, vqa_qwen=args.vqa_qwen)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.2.0.
|
|
3
|
+
Version: 0.2.0.dev4
|
|
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
|
|
@@ -93,13 +93,26 @@ opensportslib setup --pyg
|
|
|
93
93
|
|
|
94
94
|
# Optional: install for DALI support
|
|
95
95
|
opensportslib setup --dali
|
|
96
|
-
|
|
96
|
+
|
|
97
|
+
# Optional: install the X-VARS-compatible VQA dependency profile
|
|
98
|
+
opensportslib setup --vqa_xvars
|
|
99
|
+
|
|
100
|
+
# Optional: install the Qwen-compatible VQA dependency profile
|
|
101
|
+
opensportslib setup --vqa_qwen
|
|
102
|
+
```
|
|
97
103
|
---
|
|
98
104
|
|
|
99
105
|
**Note:**
|
|
100
106
|
Run `opensportslib setup` to automatically configure dependencies.
|
|
101
107
|
If issues occur, manually install compatible versions of `torch`, `torchvision`, and related libraries according to your CUDA version or system compatibility.
|
|
102
108
|
|
|
109
|
+
For VQA, use exactly one backend-specific dependency profile:
|
|
110
|
+
|
|
111
|
+
- `--vqa_xvars` installs the X-VARS-compatible Hugging Face stack from `XVARS_DEPENDENCY_PINS`
|
|
112
|
+
- `--vqa_qwen` installs the Qwen-compatible Hugging Face stack from `QWEN_DEPENDENCY_PINS`
|
|
113
|
+
|
|
114
|
+
The `vqa_qwen` config supports `Qwen/Qwen2.5-7B-Instruct` and `Qwen/Qwen3.5-9B-Base`.
|
|
115
|
+
|
|
103
116
|
---
|
|
104
117
|
|
|
105
118
|
## Data and pretrained models
|
|
@@ -287,7 +300,7 @@ metrics_from_file = my_model.evaluate(
|
|
|
287
300
|
from opensportslib.apis import VQAModel
|
|
288
301
|
|
|
289
302
|
my_model = VQAModel(
|
|
290
|
-
config="/
|
|
303
|
+
config="opensportslib/configs/vqa/qwen.yaml",
|
|
291
304
|
weights=None, # optional: path or Hugging Face model ID
|
|
292
305
|
)
|
|
293
306
|
|
|
@@ -300,13 +313,20 @@ single_prediction = my_model.infer(
|
|
|
300
313
|
video_path="/path/to/video.mp4",
|
|
301
314
|
question="What card would you give? Why?",
|
|
302
315
|
)
|
|
303
|
-
|
|
304
|
-
metrics = my_model.evaluate(
|
|
305
|
-
test_set="/path/to/test_annotations.json",
|
|
306
|
-
predictions=predictions,
|
|
307
|
-
)
|
|
308
316
|
```
|
|
309
317
|
|
|
318
|
+
Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
|
|
319
|
+
for the X-VARS-compatible backend, or `opensportslib/configs/vqa/qwen.yaml` with
|
|
320
|
+
`opensportslib setup --vqa_qwen` for the Qwen-compatible backend. The Qwen
|
|
321
|
+
backend currently supports `Qwen/Qwen2.5-7B-Instruct` and
|
|
322
|
+
`Qwen/Qwen3.5-9B-Base`.
|
|
323
|
+
|
|
324
|
+
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
325
|
+
when available and falls back to extracting CLIP features from raw video during
|
|
326
|
+
`infer()`. Pre-extracted features remain the preferred path for parity, speed,
|
|
327
|
+
and reproducibility. See [docs/tools/vqa.md](docs/tools/vqa.md) for the full
|
|
328
|
+
VQA setup workflow.
|
|
329
|
+
|
|
310
330
|
|
|
311
331
|
---
|
|
312
332
|
|
|
@@ -414,6 +434,12 @@ opensportslib setup --pyg
|
|
|
414
434
|
|
|
415
435
|
# Optional: install for DALI support
|
|
416
436
|
opensportslib setup --dali
|
|
437
|
+
|
|
438
|
+
# Optional: install the X-VARS-compatible VQA dependency profile
|
|
439
|
+
opensportslib setup --vqa_xvars
|
|
440
|
+
|
|
441
|
+
# Optional: install the Qwen-compatible VQA dependency profile
|
|
442
|
+
opensportslib setup --vqa_qwen
|
|
417
443
|
```
|
|
418
444
|
|
|
419
445
|
### Git workflow
|
|
@@ -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,8 +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
|
|
32
|
-
opensportslib/configs/vqa/
|
|
34
|
+
opensportslib/configs/vqa/xvars.yaml
|
|
33
35
|
opensportslib/core/__init__.py
|
|
34
36
|
opensportslib/core/config/__init__.py
|
|
35
37
|
opensportslib/core/config/accessors.py
|
|
@@ -136,9 +138,12 @@ tests/test_localization_dali_filenames.py
|
|
|
136
138
|
tests/test_package_smoke.py
|
|
137
139
|
tests/test_pretrained_config_merge_policy.py
|
|
138
140
|
tests/test_public_apis_smoke.py
|
|
141
|
+
tests/test_setup_cli.py
|
|
139
142
|
tests/test_subset_train_infer_integration.py
|
|
140
143
|
tests/test_task_model_api_contract.py
|
|
144
|
+
tests/test_vqa_api.py
|
|
141
145
|
tests/test_vqa_metrics_semantic.py
|
|
146
|
+
tests/test_vqa_qwen_xvars.py
|
|
142
147
|
tests/test_vqa_training_lora.py
|
|
143
148
|
tests/test_vqa_xvars_videochatgpt.py
|
|
144
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.2.0.
|
|
7
|
+
version = "0.2.0.dev4"
|
|
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"
|