opensportslib 0.2.0.dev5__tar.gz → 0.2.0.dev7__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.dev5/opensportslib.egg-info → opensportslib-0.2.0.dev7}/PKG-INFO +21 -6
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/README.md +19 -4
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/localization.py +97 -5
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/vqa.py +59 -25
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/default.yaml +1 -1
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance_speed_angle.yaml +3 -3
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/vqa/default.yaml +1 -1
- opensportslib-0.2.0.dev7/opensportslib/configs/vqa/qwen3_vl_native.yaml +81 -0
- opensportslib-0.2.0.dev7/opensportslib/configs/vqa/qwen_lora.yaml +69 -0
- opensportslib-0.2.0.dev7/opensportslib/configs/vqa/qwen_sngar_frames.yaml +133 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/accessors.py +86 -0
- opensportslib-0.2.0.dev7/opensportslib/core/trainer/vqa_trainer.py +1726 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/vqa_dataset.py +145 -17
- opensportslib-0.2.0.dev7/opensportslib/models/base/qwen_vl_native.py +620 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/qwen_xvars.py +108 -11
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/xvars_videochatgpt.py +57 -15
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/builder.py +9 -1
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/__init__.py +3 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7/opensportslib.egg-info}/PKG-INFO +21 -6
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/SOURCES.txt +9 -1
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/requires.txt +1 -1
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/pyproject.toml +2 -2
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/conftest.py +1 -1
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_config_architecture.py +14 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_config_utils_smoke.py +37 -1
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_task_model_api_contract.py +77 -0
- opensportslib-0.2.0.dev7/tests/test_vqa_api.py +595 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_vqa_qwen_xvars.py +79 -1
- opensportslib-0.2.0.dev7/tests/test_vqa_training_lora.py +1229 -0
- opensportslib-0.2.0.dev7/tools/convert/build_sn_vqa_2026_vqa.py +7 -0
- opensportslib-0.2.0.dev7/tools/convert/build_soccernet_gar_vqa.py +7 -0
- opensportslib-0.2.0.dev7/tools/training/vqa.py +79 -0
- opensportslib-0.2.0.dev7/tools/upload/upload_model_hf.py +223 -0
- opensportslib-0.2.0.dev5/opensportslib/core/trainer/vqa_trainer.py +0 -797
- opensportslib-0.2.0.dev5/tests/test_vqa_api.py +0 -240
- opensportslib-0.2.0.dev5/tests/test_vqa_training_lora.py +0 -563
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/LICENSE +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/LICENSE-COMMERCIAL +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/MANIFEST.in +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/examples/quickstart/basic_classification.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/examples/quickstart/basic_localization.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/examples/quickstart/basic_vqa.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/base_task_model.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/apis/classification.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/cli.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/default.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/sngar_frames.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/sngar_tracking.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/classification/video.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/calf_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/default.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance_angle.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_distance_speed.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/h5_header_rule.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/netvladpp_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/video_dali.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/localization/video_ocv.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/vqa/qwen.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/configs/vqa/xvars.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/conflicts.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/loader.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/migrate.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/migrations/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/migrations/legacy_to_canonical.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/runtime_adapter.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schema.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schemas/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schemas/schema_canonical.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/schemas/schema_legacy.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/config/validate.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/calf.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/ce.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/combine.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/loss/nll.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/optimizer/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/optimizer/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/sampler/weighted_sampler.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/scheduler/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/scheduler/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/trainer/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/trainer/classification_trainer.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/trainer/localization_trainer.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/checkpoint.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/config.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/config_normalize.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/data.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/ddp.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/default_args.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/hf_runtime.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/lightning.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/load_annotations.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/seed.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/video_processing.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/core/utils/wandb.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/classification_dataset.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/localization_dataset.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/utils/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/utils/h5_tracking.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/datasets/utils/tracking.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/classification.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization-e2e-ocv.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization-json_calf_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization-json_netvlad++_resnetpca512.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/localization.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/sngar-frames.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/legacy_config/sngar-tracking.yaml +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/metrics/classification_metric.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/metrics/localization_metric.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/metrics/vqa_metric.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/backbones/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/contextaware.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/e2e.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/learnablepooling.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/rule_based.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/tracking.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/vars.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/video.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/video_chatgpt_compat.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/base/video_mae.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/heads/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/neck/builder.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/common.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/__init__.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/asformer.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/calf.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/gsm.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/gtad.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/impl/tsm.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/litebase.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/modules.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/shift.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/utils.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/vqa_prediction_priors.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/vqa_prompting.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/models/utils/xvars_clip_index.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/setup/setup.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/_common.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/hf_transfer.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/osl_json_to_parquet.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib/tools/parquet_to_osl_json.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/dependency_links.txt +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/entry_points.txt +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/opensportslib.egg-info/top_level.txt +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/scripts/run_h5_header_rule_inference.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/setup.cfg +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_classification_dataset_paths.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_classification_trainer_dataloader.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_config_split_override_sync.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_conversion_tools.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_extract_xvars_features.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_h5_header_rule_spotter.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_h5_tracking_dataset.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_hf_transfer_tools.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_localization_dali_filenames.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_package_smoke.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_pretrained_config_merge_policy.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_public_apis_smoke.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_setup_cli.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_subset_train_infer_integration.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_vqa_metrics_semantic.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tests/test_vqa_xvars_videochatgpt.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/build_soccernet_gar.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/build_soccernet_gar_action_spotting.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/build_xvars_indexes.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/extract_xvars_clip_features.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/osl_json_to_parquet_webdataset.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/convert/parquet_webdataset_to_osl_json.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/download/download_hf_repo.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/download/download_osl_hf.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/download/upload_osl_hf.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/tools/training/classification.py +0 -0
- {opensportslib-0.2.0.dev5 → opensportslib-0.2.0.dev7}/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.dev7
|
|
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
|
|
@@ -26,7 +26,7 @@ Requires-Dist: tabulate
|
|
|
26
26
|
Requires-Dist: pytorch-lightning
|
|
27
27
|
Requires-Dist: pandas
|
|
28
28
|
Requires-Dist: pyarrow
|
|
29
|
-
Requires-Dist: h5py
|
|
29
|
+
Requires-Dist: h5py==3.16.0
|
|
30
30
|
Requires-Dist: huggingface_hub
|
|
31
31
|
Requires-Dist: easydict
|
|
32
32
|
Provides-Extra: test
|
|
@@ -317,10 +317,25 @@ single_prediction = my_model.infer(
|
|
|
317
317
|
```
|
|
318
318
|
|
|
319
319
|
Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
|
|
320
|
-
for the X-VARS
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
320
|
+
for the X-VARS backend. OpenSportsLib supports three VQA options:
|
|
321
|
+
|
|
322
|
+
- `opensportslib/configs/vqa/xvars.yaml`
|
|
323
|
+
Original X-VARS / Video-ChatGPT path.
|
|
324
|
+
- CLIP features + Qwen
|
|
325
|
+
Use `opensportslib/configs/vqa/qwen.yaml` for inference and
|
|
326
|
+
`opensportslib/configs/vqa/qwen_lora.yaml` for LoRA training.
|
|
327
|
+
- `opensportslib/configs/vqa/qwen3_vl_native.yaml`
|
|
328
|
+
Full end-to-end native QwenVL path. This is the single canonical QwenVL
|
|
329
|
+
config; change `MODEL.components.llm_decoder.params.repo_id` to switch model
|
|
330
|
+
IDs.
|
|
331
|
+
|
|
332
|
+
Use `opensportslib setup --vqa_qwen` for both the CLIP+Qwen and native QwenVL
|
|
333
|
+
paths. The CLIP+Qwen configs support `Qwen/Qwen2.5-7B-Instruct` and
|
|
334
|
+
`Qwen/Qwen3.5-9B-Base`. The native QwenVL config defaults to
|
|
335
|
+
`Qwen/Qwen3-VL-8B-Instruct` and supports:
|
|
336
|
+
|
|
337
|
+
- `Qwen/Qwen3-VL-8B-Instruct`
|
|
338
|
+
- `Qwen/Qwen2.5-VL-7B-Instruct`
|
|
324
339
|
|
|
325
340
|
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
326
341
|
when available and falls back to extracting CLIP features from raw video during
|
|
@@ -281,10 +281,25 @@ single_prediction = my_model.infer(
|
|
|
281
281
|
```
|
|
282
282
|
|
|
283
283
|
Use `opensportslib/configs/vqa/xvars.yaml` with `opensportslib setup --vqa_xvars`
|
|
284
|
-
for the X-VARS
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
284
|
+
for the X-VARS backend. OpenSportsLib supports three VQA options:
|
|
285
|
+
|
|
286
|
+
- `opensportslib/configs/vqa/xvars.yaml`
|
|
287
|
+
Original X-VARS / Video-ChatGPT path.
|
|
288
|
+
- CLIP features + Qwen
|
|
289
|
+
Use `opensportslib/configs/vqa/qwen.yaml` for inference and
|
|
290
|
+
`opensportslib/configs/vqa/qwen_lora.yaml` for LoRA training.
|
|
291
|
+
- `opensportslib/configs/vqa/qwen3_vl_native.yaml`
|
|
292
|
+
Full end-to-end native QwenVL path. This is the single canonical QwenVL
|
|
293
|
+
config; change `MODEL.components.llm_decoder.params.repo_id` to switch model
|
|
294
|
+
IDs.
|
|
295
|
+
|
|
296
|
+
Use `opensportslib setup --vqa_qwen` for both the CLIP+Qwen and native QwenVL
|
|
297
|
+
paths. The CLIP+Qwen configs support `Qwen/Qwen2.5-7B-Instruct` and
|
|
298
|
+
`Qwen/Qwen3.5-9B-Base`. The native QwenVL config defaults to
|
|
299
|
+
`Qwen/Qwen3-VL-8B-Instruct` and supports:
|
|
300
|
+
|
|
301
|
+
- `Qwen/Qwen3-VL-8B-Instruct`
|
|
302
|
+
- `Qwen/Qwen2.5-VL-7B-Instruct`
|
|
288
303
|
|
|
289
304
|
For X-VARS, `feature_source: indexed_or_raw_clip` prefers indexed CLIP features
|
|
290
305
|
when available and falls back to extracting CLIP features from raw video during
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import logging
|
|
2
2
|
import os
|
|
3
3
|
import time
|
|
4
|
+
from types import SimpleNamespace
|
|
4
5
|
|
|
5
6
|
from opensportslib.apis.base_task_model import BaseTaskModel
|
|
6
7
|
from opensportslib.core.config.accessors import (
|
|
@@ -14,6 +15,7 @@ from opensportslib.core.config.accessors import (
|
|
|
14
15
|
get_split_annotation_path,
|
|
15
16
|
get_split_cfg,
|
|
16
17
|
set_split_annotation_path,
|
|
18
|
+
set_loader_backend,
|
|
17
19
|
get_model_family,
|
|
18
20
|
)
|
|
19
21
|
from opensportslib.core.utils.config import expand
|
|
@@ -22,6 +24,17 @@ from opensportslib.core.utils.config import expand
|
|
|
22
24
|
class LocalizationModel(BaseTaskModel):
|
|
23
25
|
"""Top-level task wrapper for localization / spotting."""
|
|
24
26
|
|
|
27
|
+
_HF_BACKEND_SPLIT_TYPES = {
|
|
28
|
+
"dali": {
|
|
29
|
+
"VideoGameWithOpencv": "VideoGameWithDali",
|
|
30
|
+
"VideoGameWithOpencvVideo": "VideoGameWithDaliVideo",
|
|
31
|
+
},
|
|
32
|
+
"opencv": {
|
|
33
|
+
"VideoGameWithDali": "VideoGameWithOpencv",
|
|
34
|
+
"VideoGameWithDaliVideo": "VideoGameWithOpencvVideo",
|
|
35
|
+
},
|
|
36
|
+
}
|
|
37
|
+
|
|
25
38
|
# def __init__(self, config=None, weights=None):
|
|
26
39
|
# super().__init__(config=config, weights=None)
|
|
27
40
|
# if weights is not None:
|
|
@@ -62,6 +75,82 @@ class LocalizationModel(BaseTaskModel):
|
|
|
62
75
|
device,
|
|
63
76
|
)
|
|
64
77
|
|
|
78
|
+
@staticmethod
|
|
79
|
+
def _device_type(device) -> str:
|
|
80
|
+
device_type = getattr(device, "type", device)
|
|
81
|
+
return str(device_type).split(":", 1)[0].lower()
|
|
82
|
+
|
|
83
|
+
@staticmethod
|
|
84
|
+
def _is_hf_repo_weights(weights: str | None) -> bool:
|
|
85
|
+
if not weights:
|
|
86
|
+
return False
|
|
87
|
+
from opensportslib.core.utils.config import is_local_path
|
|
88
|
+
|
|
89
|
+
return not is_local_path(weights)
|
|
90
|
+
|
|
91
|
+
@staticmethod
|
|
92
|
+
def _iter_split_items(splits):
|
|
93
|
+
if splits is None:
|
|
94
|
+
return []
|
|
95
|
+
if isinstance(splits, dict):
|
|
96
|
+
return list(splits.items())
|
|
97
|
+
return list(vars(splits).items())
|
|
98
|
+
|
|
99
|
+
@staticmethod
|
|
100
|
+
def _ensure_namespace(parent, attr: str):
|
|
101
|
+
current = getattr(parent, attr, None)
|
|
102
|
+
if current is None:
|
|
103
|
+
current = SimpleNamespace()
|
|
104
|
+
setattr(parent, attr, current)
|
|
105
|
+
return current
|
|
106
|
+
|
|
107
|
+
def _normalize_opencv_dataloader(self, split_name: str, split_cfg) -> None:
|
|
108
|
+
dataloader = getattr(split_cfg, "dataloader", None)
|
|
109
|
+
if dataloader is None:
|
|
110
|
+
dataloader = SimpleNamespace()
|
|
111
|
+
setattr(split_cfg, "dataloader", dataloader)
|
|
112
|
+
|
|
113
|
+
if getattr(dataloader, "batch_size", None) is None:
|
|
114
|
+
dataloader.batch_size = 1
|
|
115
|
+
if getattr(dataloader, "shuffle", None) is None:
|
|
116
|
+
dataloader.shuffle = split_name == "train"
|
|
117
|
+
if getattr(dataloader, "num_workers", None) is None:
|
|
118
|
+
dataloader.num_workers = 0
|
|
119
|
+
if getattr(dataloader, "pin_memory", None) is None:
|
|
120
|
+
dataloader.pin_memory = False
|
|
121
|
+
|
|
122
|
+
def _adapt_hf_backend_for_device(self, weights: str | None) -> None:
|
|
123
|
+
if not self._is_hf_repo_weights(weights):
|
|
124
|
+
return
|
|
125
|
+
|
|
126
|
+
from opensportslib.core.utils.config import select_device
|
|
127
|
+
|
|
128
|
+
device = select_device(self.config.SYSTEM)
|
|
129
|
+
backend = "dali" if self._device_type(device) == "cuda" else "opencv"
|
|
130
|
+
current_backend = get_loader_backend(self.config)
|
|
131
|
+
set_loader_backend(self.config, backend)
|
|
132
|
+
|
|
133
|
+
common = getattr(getattr(self.config, "DATA", None), "common", None)
|
|
134
|
+
if common is None:
|
|
135
|
+
return
|
|
136
|
+
splits = self._ensure_namespace(common, "splits")
|
|
137
|
+
remap = self._HF_BACKEND_SPLIT_TYPES[backend]
|
|
138
|
+
|
|
139
|
+
for split_name, split_cfg in self._iter_split_items(splits):
|
|
140
|
+
split_type = getattr(split_cfg, "type", None)
|
|
141
|
+
if split_type in remap:
|
|
142
|
+
setattr(split_cfg, "type", remap[split_type])
|
|
143
|
+
if backend == "opencv":
|
|
144
|
+
self._normalize_opencv_dataloader(split_name, split_cfg)
|
|
145
|
+
|
|
146
|
+
if current_backend != backend:
|
|
147
|
+
logging.info(
|
|
148
|
+
"HF localization runtime backend override: %s -> %s for weights=%s",
|
|
149
|
+
current_backend,
|
|
150
|
+
backend,
|
|
151
|
+
weights,
|
|
152
|
+
)
|
|
153
|
+
|
|
65
154
|
def load_weights(
|
|
66
155
|
self,
|
|
67
156
|
weights: str | None = None,
|
|
@@ -80,6 +169,7 @@ class LocalizationModel(BaseTaskModel):
|
|
|
80
169
|
if weights is None:
|
|
81
170
|
raise ValueError("`weights` must be provided to load_weights().")
|
|
82
171
|
|
|
172
|
+
self._adapt_hf_backend_for_device(weights)
|
|
83
173
|
device = select_device(self.config.SYSTEM)
|
|
84
174
|
self._gate_multi_gpu_by_device(device)
|
|
85
175
|
if self.model is None:
|
|
@@ -183,8 +273,10 @@ class LocalizationModel(BaseTaskModel):
|
|
|
183
273
|
# E2E validation mAP uses the `valid_data_frames` split; keep it in sync
|
|
184
274
|
# with explicit valid annotation overrides.
|
|
185
275
|
self._set_split_path("valid_data_frames", valid_set)
|
|
186
|
-
|
|
276
|
+
|
|
187
277
|
self.config = resolve_config_omega(self.config, weights=weights)
|
|
278
|
+
effective_weights = weights if weights is not None else self.last_loaded_weights
|
|
279
|
+
self._adapt_hf_backend_for_device(effective_weights)
|
|
188
280
|
check_config(self.config, split="train")
|
|
189
281
|
init_wandb(
|
|
190
282
|
self.config_path,
|
|
@@ -196,8 +288,6 @@ class LocalizationModel(BaseTaskModel):
|
|
|
196
288
|
logging.info("Configuration:")
|
|
197
289
|
logging.info(self.config)
|
|
198
290
|
|
|
199
|
-
effective_weights = weights if weights is not None else self.last_loaded_weights
|
|
200
|
-
|
|
201
291
|
def set_seed(seed):
|
|
202
292
|
random.seed(seed)
|
|
203
293
|
np.random.seed(seed)
|
|
@@ -298,6 +388,8 @@ class LocalizationModel(BaseTaskModel):
|
|
|
298
388
|
self._set_split_path("test", test_set)
|
|
299
389
|
|
|
300
390
|
self.config = resolve_config_omega(self.config, weights=weights)
|
|
391
|
+
effective_weights = weights if weights is not None else self.last_loaded_weights
|
|
392
|
+
self._adapt_hf_backend_for_device(effective_weights)
|
|
301
393
|
check_config(self.config, split="test")
|
|
302
394
|
self.config.infer_split = whether_infer_split(get_split_cfg(self.config, "test"))
|
|
303
395
|
|
|
@@ -313,8 +405,6 @@ class LocalizationModel(BaseTaskModel):
|
|
|
313
405
|
|
|
314
406
|
start = time.time()
|
|
315
407
|
|
|
316
|
-
effective_weights = weights if weights is not None else self.last_loaded_weights
|
|
317
|
-
|
|
318
408
|
if effective_weights is not None:
|
|
319
409
|
if self.model is None or self.last_loaded_weights != effective_weights:
|
|
320
410
|
self.load_weights(weights=effective_weights)
|
|
@@ -368,6 +458,8 @@ class LocalizationModel(BaseTaskModel):
|
|
|
368
458
|
test_set = self._resolve_split_path("test", test_set)
|
|
369
459
|
self._set_split_path("test", test_set)
|
|
370
460
|
self.config = resolve_config_omega(self.config, weights=weights)
|
|
461
|
+
effective_weights = weights if weights is not None else self.last_loaded_weights
|
|
462
|
+
self._adapt_hf_backend_for_device(effective_weights)
|
|
371
463
|
check_config(self.config, split="test")
|
|
372
464
|
self.config.infer_split = whether_infer_split(get_split_cfg(self.config, "test"))
|
|
373
465
|
|
|
@@ -51,6 +51,7 @@ class VQAModel(BaseTaskModel):
|
|
|
51
51
|
return_queue=None,
|
|
52
52
|
train_set=None,
|
|
53
53
|
valid_set=None,
|
|
54
|
+
resume_from_checkpoint=None,
|
|
54
55
|
use_wandb=False,
|
|
55
56
|
):
|
|
56
57
|
import torch
|
|
@@ -97,14 +98,10 @@ class VQAModel(BaseTaskModel):
|
|
|
97
98
|
train_data = build_dataset(config, train_set, None, split="train")
|
|
98
99
|
valid_data = build_dataset(config, valid_set, None, split="valid")
|
|
99
100
|
trainer = Trainer_VQA(config)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
rank=rank,
|
|
105
|
-
world_size=world_size,
|
|
106
|
-
use_wandb=use_wandb,
|
|
107
|
-
)
|
|
101
|
+
train_kwargs = {"rank": rank, "world_size": world_size, "use_wandb": use_wandb}
|
|
102
|
+
if resume_from_checkpoint is not None:
|
|
103
|
+
train_kwargs["resume_from_checkpoint"] = resume_from_checkpoint
|
|
104
|
+
ckpt = trainer.train(None, train_data, valid_data, **train_kwargs)
|
|
108
105
|
if rank == 0 and return_queue is not None:
|
|
109
106
|
return_queue.put(ckpt)
|
|
110
107
|
finally:
|
|
@@ -139,37 +136,73 @@ class VQAModel(BaseTaskModel):
|
|
|
139
136
|
train_set: str | None = None,
|
|
140
137
|
valid_set: str | None = None,
|
|
141
138
|
weights: str | None = None,
|
|
139
|
+
resume_from_checkpoint: str | None = None,
|
|
140
|
+
use_ddp: bool | None = None,
|
|
142
141
|
use_wandb: bool = True,
|
|
143
142
|
**kwargs,
|
|
144
143
|
) -> str | None:
|
|
145
144
|
del kwargs
|
|
145
|
+
|
|
146
|
+
self.config = resolve_config_omega(self.config, weights=weights)
|
|
147
|
+
execution = get_train_execution(self.config)
|
|
148
|
+
backend = str(execution.get("training_backend", "placeholder")).lower()
|
|
149
|
+
vqa_backend = get_vqa_backend(self.config)
|
|
150
|
+
if vqa_backend == "qwen_xvars_infer" and backend != "qwen_xvars_lora":
|
|
151
|
+
raise ValueError(
|
|
152
|
+
"The 'qwen_xvars_infer' backend requires TRAIN.execution.training_backend='qwen_xvars_lora' for train()."
|
|
153
|
+
)
|
|
154
|
+
if vqa_backend == "qwen_vl_native_infer" and backend != "qwen_vl_native_lora":
|
|
155
|
+
raise ValueError(
|
|
156
|
+
"The 'qwen_vl_native_infer' backend requires TRAIN.execution.training_backend='qwen_vl_native_lora' for train()."
|
|
157
|
+
)
|
|
146
158
|
import torch
|
|
147
159
|
import torch.multiprocessing as mp
|
|
148
160
|
|
|
149
|
-
self.config = resolve_config_omega(self.config, weights=weights)
|
|
150
|
-
if get_vqa_backend(self.config) == "qwen_xvars_infer":
|
|
151
|
-
raise ValueError("The 'qwen_xvars_infer' backend is inference-only and does not support train().")
|
|
152
161
|
train_set = self._resolve_split_path("train", train_set)
|
|
153
162
|
valid_set = self._resolve_split_path("valid", valid_set)
|
|
154
|
-
|
|
155
|
-
backend = str(execution.get("training_backend", "placeholder")).lower()
|
|
156
|
-
if backend == "xvars_videochatgpt_lora":
|
|
157
|
-
world_size = torch.cuda.device_count() or get_system_gpu_count(self.config)
|
|
163
|
+
if backend in {"xvars_videochatgpt_lora", "qwen_xvars_lora", "qwen_vl_native_lora"}:
|
|
158
164
|
requested_gpus = get_system_gpu_count(self.config)
|
|
159
|
-
|
|
165
|
+
available_gpus = int(torch.cuda.device_count() or 0)
|
|
166
|
+
if requested_gpus > 0:
|
|
167
|
+
world_size = min(available_gpus, int(requested_gpus)) if available_gpus > 0 else int(requested_gpus)
|
|
168
|
+
else:
|
|
169
|
+
world_size = available_gpus
|
|
170
|
+
effective_world_size = max(int(world_size), 1)
|
|
171
|
+
if use_ddp is None:
|
|
172
|
+
launch_ddp = effective_world_size > 1
|
|
173
|
+
else:
|
|
174
|
+
launch_ddp = bool(use_ddp) and effective_world_size > 1
|
|
175
|
+
if requested_gpus > 0 and available_gpus > 0 and requested_gpus != available_gpus:
|
|
176
|
+
logging.info(
|
|
177
|
+
"VQA train GPU selection | requested=%s | available=%s | launching=%s",
|
|
178
|
+
requested_gpus,
|
|
179
|
+
available_gpus,
|
|
180
|
+
effective_world_size if launch_ddp else 1,
|
|
181
|
+
)
|
|
160
182
|
logging.info(
|
|
161
|
-
"VQA train launch | mode=%s | world_size=%s",
|
|
162
|
-
"ddp" if
|
|
163
|
-
|
|
183
|
+
"VQA train launch | mode=%s | requested_gpus=%s | available_gpus=%s | world_size=%s",
|
|
184
|
+
"ddp" if launch_ddp else "single",
|
|
185
|
+
requested_gpus,
|
|
186
|
+
available_gpus,
|
|
187
|
+
effective_world_size if launch_ddp else 1,
|
|
164
188
|
)
|
|
165
189
|
|
|
166
190
|
ctx = mp.get_context("spawn")
|
|
167
191
|
queue = ctx.SimpleQueue()
|
|
168
|
-
if
|
|
192
|
+
if launch_ddp:
|
|
169
193
|
mp.spawn(
|
|
170
194
|
VQAModel._worker_ddp,
|
|
171
|
-
args=(
|
|
172
|
-
|
|
195
|
+
args=(
|
|
196
|
+
effective_world_size,
|
|
197
|
+
self.config_path,
|
|
198
|
+
self.config,
|
|
199
|
+
queue,
|
|
200
|
+
train_set,
|
|
201
|
+
valid_set,
|
|
202
|
+
resume_from_checkpoint,
|
|
203
|
+
use_wandb,
|
|
204
|
+
),
|
|
205
|
+
nprocs=effective_world_size,
|
|
173
206
|
)
|
|
174
207
|
else:
|
|
175
208
|
VQAModel._worker_ddp(
|
|
@@ -180,6 +213,7 @@ class VQAModel(BaseTaskModel):
|
|
|
180
213
|
return_queue=queue,
|
|
181
214
|
train_set=train_set,
|
|
182
215
|
valid_set=valid_set,
|
|
216
|
+
resume_from_checkpoint=resume_from_checkpoint,
|
|
183
217
|
use_wandb=use_wandb,
|
|
184
218
|
)
|
|
185
219
|
ckpt = queue.get()
|
|
@@ -189,7 +223,7 @@ class VQAModel(BaseTaskModel):
|
|
|
189
223
|
|
|
190
224
|
raise ValueError(
|
|
191
225
|
f"Unsupported VQA training backend '{backend}'. "
|
|
192
|
-
"Only 'xvars_videochatgpt_lora'
|
|
226
|
+
"Only 'xvars_videochatgpt_lora' and 'qwen_xvars_lora' are supported."
|
|
193
227
|
)
|
|
194
228
|
|
|
195
229
|
def infer(
|
|
@@ -216,8 +250,6 @@ class VQAModel(BaseTaskModel):
|
|
|
216
250
|
self.config = resolve_config_omega(self.config, weights=weights)
|
|
217
251
|
backend = get_vqa_backend(self.config)
|
|
218
252
|
effective_weights = weights if weights is not None else self.last_loaded_weights
|
|
219
|
-
if backend == "qwen_xvars_infer" and effective_weights is not None:
|
|
220
|
-
raise ValueError("The 'qwen_xvars_infer' backend does not support adapter weights for infer().")
|
|
221
253
|
_set_model_checkpoint_path(self.config, effective_weights)
|
|
222
254
|
self.trainer = Trainer_VQA(self.config)
|
|
223
255
|
if effective_weights is not None:
|
|
@@ -237,6 +269,8 @@ class VQAModel(BaseTaskModel):
|
|
|
237
269
|
"question": str(question).strip(),
|
|
238
270
|
"references": [],
|
|
239
271
|
"video_path": resolved_video_path,
|
|
272
|
+
"frame_paths": [],
|
|
273
|
+
"video_frames": [],
|
|
240
274
|
"video_spatio_temporal_features": None,
|
|
241
275
|
"prior_prediction_text": "",
|
|
242
276
|
"labels": {},
|
|
@@ -11,14 +11,14 @@ SYSTEM:
|
|
|
11
11
|
DATA:
|
|
12
12
|
common:
|
|
13
13
|
dataset_name: h5_headers
|
|
14
|
-
data_root:
|
|
14
|
+
data_root: /home/vorajv/dataset/silvio-h5/
|
|
15
15
|
classes:
|
|
16
16
|
- header
|
|
17
17
|
splits:
|
|
18
18
|
test:
|
|
19
19
|
type: H5OSLJsonSpotting
|
|
20
|
-
annotation_path:
|
|
21
|
-
source_path:
|
|
20
|
+
annotation_path: /home/vorajv/dataset/silvio-h5/h5_tiny.json
|
|
21
|
+
source_path: /home/vorajv/dataset/silvio-h5/
|
|
22
22
|
dataloader:
|
|
23
23
|
batch_size: 1
|
|
24
24
|
shuffle: false
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
SYSTEM:
|
|
2
|
+
paths:
|
|
3
|
+
save_dir: ./checkpoints_vqa_qwen3_vl_native
|
|
4
|
+
gpu:
|
|
5
|
+
count: 4
|
|
6
|
+
id: null
|
|
7
|
+
|
|
8
|
+
MODEL:
|
|
9
|
+
topology: []
|
|
10
|
+
components:
|
|
11
|
+
video_encoder:
|
|
12
|
+
kind: encoder
|
|
13
|
+
source:
|
|
14
|
+
provider: opensportslib
|
|
15
|
+
name: qwen_vl_native
|
|
16
|
+
params:
|
|
17
|
+
feature_source: raw_video
|
|
18
|
+
native_vl:
|
|
19
|
+
visual_input_mode: frames
|
|
20
|
+
num_frames: 8
|
|
21
|
+
min_pixels: 50176 # 28*28*64
|
|
22
|
+
max_pixels: 401408 # 28*28*512
|
|
23
|
+
overrides: {}
|
|
24
|
+
llm_decoder:
|
|
25
|
+
kind: decoder
|
|
26
|
+
source:
|
|
27
|
+
provider: huggingface
|
|
28
|
+
# Canonical end-to-end QwenVL config.
|
|
29
|
+
# Swap this model ID if you want another supported QwenVL checkpoint.
|
|
30
|
+
# - Qwen/Qwen3-VL-8B-Instruct
|
|
31
|
+
# - Qwen/Qwen2.5-VL-7B-Instruct
|
|
32
|
+
name: Qwen/Qwen3-VL-8B-Instruct
|
|
33
|
+
params:
|
|
34
|
+
# Supported examples:
|
|
35
|
+
# - Qwen/Qwen3-VL-8B-Instruct
|
|
36
|
+
# - Qwen/Qwen2.5-VL-7B-Instruct
|
|
37
|
+
repo_id: Qwen/Qwen3-VL-8B-Instruct
|
|
38
|
+
overrides: {}
|
|
39
|
+
metadata:
|
|
40
|
+
backend: qwen_vl_native_infer
|
|
41
|
+
|
|
42
|
+
TRAIN:
|
|
43
|
+
optimizer:
|
|
44
|
+
type: adamw_torch
|
|
45
|
+
lr: 0.0002
|
|
46
|
+
weight_decay: 0.001
|
|
47
|
+
execution:
|
|
48
|
+
acc_grad_iter: 4
|
|
49
|
+
training_backend: qwen_vl_native_lora
|
|
50
|
+
prompt:
|
|
51
|
+
system_prompt: You are a football video assistant. Answer the VQA question using the provided visual evidence and referee priors.
|
|
52
|
+
native_vl:
|
|
53
|
+
visual_input_mode: frames
|
|
54
|
+
num_frames: 8
|
|
55
|
+
min_pixels: 50176 # 28*28*64
|
|
56
|
+
max_pixels: 401408 # 28*28*512
|
|
57
|
+
hf:
|
|
58
|
+
tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
|
|
59
|
+
prefer_cuda: true
|
|
60
|
+
local_files_only: false
|
|
61
|
+
device_map: null
|
|
62
|
+
sft:
|
|
63
|
+
per_device_train_batch_size: 1
|
|
64
|
+
per_device_eval_batch_size: 1
|
|
65
|
+
max_seq_length: 1024
|
|
66
|
+
max_grad_norm: 1.0
|
|
67
|
+
memory_cache_rows: 0
|
|
68
|
+
gradient_checkpointing: true
|
|
69
|
+
ddp_find_unused_parameters: false
|
|
70
|
+
ddp_broadcast_buffers: false
|
|
71
|
+
resume_optimizer_state: false
|
|
72
|
+
cache_tokenized_rows: false
|
|
73
|
+
disable_tqdm: false
|
|
74
|
+
save_strategy: epoch
|
|
75
|
+
# save_steps: 100
|
|
76
|
+
# save_total_limit: 3
|
|
77
|
+
evaluation_strategy: "no"
|
|
78
|
+
lora:
|
|
79
|
+
prepare_kbit: false
|
|
80
|
+
quantization:
|
|
81
|
+
enabled: false
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
SYSTEM:
|
|
2
|
+
paths:
|
|
3
|
+
save_dir: ./checkpoints_vqa_qwen_lora
|
|
4
|
+
gpu:
|
|
5
|
+
count: 4
|
|
6
|
+
|
|
7
|
+
MODEL:
|
|
8
|
+
components:
|
|
9
|
+
video_encoder:
|
|
10
|
+
kind: encoder
|
|
11
|
+
source:
|
|
12
|
+
provider: opensportslib
|
|
13
|
+
name: xvars_clip_features
|
|
14
|
+
load:
|
|
15
|
+
weights_path: /home/vorajv/X-VARS/weights/14_model.pth.tar
|
|
16
|
+
params:
|
|
17
|
+
feature_source: indexed_or_raw_clip
|
|
18
|
+
vision_tower: openai/clip-vit-large-patch14
|
|
19
|
+
feature_dim: 1024
|
|
20
|
+
overrides: {}
|
|
21
|
+
mm_projector:
|
|
22
|
+
kind: projector
|
|
23
|
+
source:
|
|
24
|
+
provider: opensportslib
|
|
25
|
+
params:
|
|
26
|
+
input_dim: 1024
|
|
27
|
+
overrides: {}
|
|
28
|
+
llm_decoder:
|
|
29
|
+
kind: decoder
|
|
30
|
+
source:
|
|
31
|
+
provider: huggingface
|
|
32
|
+
name: Qwen/Qwen3.5-9B-Base
|
|
33
|
+
params:
|
|
34
|
+
repo_id: Qwen/Qwen3.5-9B-Base
|
|
35
|
+
overrides: {}
|
|
36
|
+
metadata:
|
|
37
|
+
backend: qwen_xvars_infer
|
|
38
|
+
|
|
39
|
+
TRAIN:
|
|
40
|
+
execution:
|
|
41
|
+
training_backend: qwen_xvars_lora
|
|
42
|
+
prompt:
|
|
43
|
+
system_prompt: You are a football video assistant. Answer the VQA question using the provided video context and referee priors.
|
|
44
|
+
hf:
|
|
45
|
+
tokenizer_id: ${MODEL.components.llm_decoder.params.repo_id}
|
|
46
|
+
prefer_cuda: true
|
|
47
|
+
local_files_only: false
|
|
48
|
+
sft:
|
|
49
|
+
per_device_train_batch_size: 1
|
|
50
|
+
per_device_eval_batch_size: 1
|
|
51
|
+
gradient_accumulation_steps: 8
|
|
52
|
+
max_seq_length: 480
|
|
53
|
+
gradient_checkpointing: true
|
|
54
|
+
disable_tqdm: true
|
|
55
|
+
save_strategy: epoch
|
|
56
|
+
evaluation_strategy: "no"
|
|
57
|
+
lora:
|
|
58
|
+
r: 16
|
|
59
|
+
alpha: 32
|
|
60
|
+
dropout: 0.05
|
|
61
|
+
bias: none
|
|
62
|
+
prepare_kbit: false
|
|
63
|
+
target_modules: [q_proj, v_proj, k_proj, o_proj]
|
|
64
|
+
quantization:
|
|
65
|
+
enabled: false
|
|
66
|
+
load_in_4bit: true
|
|
67
|
+
bnb_4bit_quant_type: nf4
|
|
68
|
+
compute_dtype: float16
|
|
69
|
+
bnb_4bit_use_double_quant: true
|