opensportslib 0.0.1.dev17__tar.gz → 0.0.1.dev19__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. {opensportslib-0.0.1.dev17/opensportslib.egg-info → opensportslib-0.0.1.dev19}/PKG-INFO +1 -1
  2. opensportslib-0.0.1.dev19/opensportslib/config/localization-json_calf_resnetpca512.yaml +169 -0
  3. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization-json_netvlad++_resnetpca512.yaml +5 -3
  4. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/calf.py +2 -2
  5. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/localization_trainer.py +51 -16
  6. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/checkpoint.py +17 -8
  7. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/metrics/localization_metric.py +4 -4
  8. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/contextaware.py +2 -2
  9. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/utils.py +1 -1
  10. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19/opensportslib.egg-info}/PKG-INFO +1 -1
  11. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/SOURCES.txt +1 -0
  12. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/pyproject.toml +1 -1
  13. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/LICENSE +0 -0
  14. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/LICENSE-COMMERCIAL +0 -0
  15. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/MANIFEST.in +0 -0
  16. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/README.md +0 -0
  17. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_classification.py +0 -0
  18. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_localization.py +0 -0
  19. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/__init__.py +0 -0
  20. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/__init__.py +0 -0
  21. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/classification.py +0 -0
  22. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/localization.py +0 -0
  23. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/classification.yaml +0 -0
  24. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization-e2e-ocv.yaml +0 -0
  25. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization.yaml +0 -0
  26. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-frames.yaml +0 -0
  27. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-tracking.yaml +0 -0
  28. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/__init__.py +0 -0
  29. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/__init__.py +0 -0
  30. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/builder.py +0 -0
  31. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/ce.py +0 -0
  32. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/combine.py +0 -0
  33. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/nll.py +0 -0
  34. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/__init__.py +0 -0
  35. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/builder.py +0 -0
  36. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/sampler/weighted_sampler.py +0 -0
  37. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/__init__.py +0 -0
  38. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/builder.py +0 -0
  39. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/__init__.py +0 -0
  40. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/classification_trainer.py +0 -0
  41. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/config.py +0 -0
  42. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/data.py +0 -0
  43. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/ddp.py +0 -0
  44. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/default_args.py +0 -0
  45. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/lightning.py +0 -0
  46. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/load_annotations.py +0 -0
  47. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/seed.py +0 -0
  48. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/video_processing.py +0 -0
  49. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/wandb.py +0 -0
  50. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/__init__.py +0 -0
  51. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/builder.py +0 -0
  52. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/classification_dataset.py +0 -0
  53. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/localization_dataset.py +0 -0
  54. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/__init__.py +0 -0
  55. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/tracking.py +0 -0
  56. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/metrics/classification_metric.py +0 -0
  57. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/__init__.py +0 -0
  58. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/backbones/builder.py +0 -0
  59. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/e2e.py +0 -0
  60. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/learnablepooling.py +0 -0
  61. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/tracking.py +0 -0
  62. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/vars.py +0 -0
  63. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video.py +0 -0
  64. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video_mae.py +0 -0
  65. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/builder.py +0 -0
  66. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/heads/builder.py +0 -0
  67. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/neck/builder.py +0 -0
  68. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/common.py +0 -0
  69. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/__init__.py +0 -0
  70. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/asformer.py +0 -0
  71. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/calf.py +0 -0
  72. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gsm.py +0 -0
  73. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gtad.py +0 -0
  74. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/tsm.py +0 -0
  75. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/litebase.py +0 -0
  76. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/modules.py +0 -0
  77. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/shift.py +0 -0
  78. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/dependency_links.txt +0 -0
  79. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/requires.txt +0 -0
  80. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/top_level.txt +0 -0
  81. {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensportslib
3
- Version: 0.0.1.dev17
3
+ Version: 0.0.1.dev19
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
@@ -0,0 +1,169 @@
1
+ TASK: localization
2
+
3
+ dali: false
4
+
5
+ DATA:
6
+ dataset_name: SoccerNet
7
+ data_dir: /home/vorajv/opensportslib/SoccerNet/
8
+ classes:
9
+ - Penalty
10
+ - Kick-off
11
+ - Goal
12
+ - Substitution
13
+ - Offside
14
+ - Shots on target
15
+ - Shots off target
16
+ - Clearance
17
+ - Ball out of play
18
+ - Throw-in
19
+ - Foul
20
+ - Indirect free-kick
21
+ - Direct free-kick
22
+ - Corner
23
+ - Yellow card
24
+ - Red card
25
+ - Yellow->red card
26
+
27
+ epoch_num_frames: 500000
28
+ mixup: true
29
+ modality: rgb
30
+ crop_dim: -1
31
+ dilate_len: 0 # Dilate ground truth labels
32
+ clip_len: 100
33
+ input_fps: 25
34
+ extract_fps: 2
35
+ imagenet_mean: [0.485, 0.456, 0.406]
36
+ imagenet_std: [0.229, 0.224, 0.225]
37
+ target_height: 224
38
+ target_width: 398
39
+
40
+ train:
41
+ type: FeatureClipChunksfromJson
42
+ classes: ${DATA.classes}
43
+ output_map: [data, label]
44
+ video_path: ${DATA.data_dir}
45
+ path: ${DATA.train.video_path}/annotations-2024-224p-train.json
46
+ framerate: 2
47
+ chunk_size: 120
48
+ receptive_field: 40
49
+ chunks_per_epoch: 6000
50
+ dataloader:
51
+ batch_size: 256
52
+ shuffle: true
53
+ num_workers: 4
54
+ pin_memory: true
55
+
56
+ valid:
57
+ type: FeatureClipChunksfromJson
58
+ classes: ${DATA.classes}
59
+ output_map: [data, label]
60
+ video_path: ${DATA.data_dir}
61
+ path: ${DATA.valid.video_path}/annotations-2024-224p-valid.json
62
+ framerate: 2
63
+ chunk_size: 120
64
+ receptive_field: 40
65
+ chunks_per_epoch: 6000
66
+ dataloader:
67
+ batch_size: 256
68
+ shuffle: true
69
+ num_workers: 4
70
+ pin_memory: true
71
+
72
+ test:
73
+ type: FeatureVideosChunksfromJson
74
+ classes: ${DATA.classes}
75
+ output_map: [data, label]
76
+ video_path: ${DATA.data_dir}
77
+ path: ${DATA.test.video_path}/annotations-2024-224p-test.json
78
+ results: results_spotting_test_calf_resnetpca512
79
+ framerate: 2
80
+ chunk_size: 120
81
+ receptive_field: 40
82
+ chunks_per_epoch: 6000
83
+ metric: loose
84
+ dataloader:
85
+ batch_size: 1
86
+ shuffle: false
87
+ num_workers: 1
88
+ pin_memory: true
89
+
90
+ MODEL:
91
+ type: ContextAware
92
+ runner:
93
+ type: runner_JSON
94
+ backbone:
95
+ type: PreExtactedFeatures
96
+ encoder: ResNET_TF2_PCA512
97
+ feature_dim: 512
98
+ output_dim: 512
99
+ framerate: 2
100
+ neck:
101
+ type: CNN++
102
+ input_size: 512
103
+ num_classes: 17
104
+ chunk_size: 120
105
+ dim_capsule: 16
106
+ receptive_field: 40
107
+ num_detections: 15
108
+ framerate: 2
109
+ head:
110
+ type: SpottingCALF
111
+ dim_capsule: 16
112
+ num_detections: 15
113
+ chunk_size: 120
114
+ num_classes: 17
115
+ load_weights: null
116
+
117
+ TRAIN:
118
+ type: trainer_CALF
119
+ max_epochs: 200
120
+ evaluation_frequency: 200
121
+ framerate: 2
122
+ batch_size: 32
123
+ monitor: valid_loss
124
+ mode: min
125
+
126
+ criterion:
127
+ type: Combined2x
128
+ w_1: 0.000367
129
+ loss_1:
130
+ type: ContextAwareLoss
131
+ K: [[-100, -98, -20, -40, -96, -5, -8, -93, -99, -31, -75, -10, -97, -75, -20, -84, -18],
132
+ [-50, -49, -10, -20, -48, -3, -4, -46, -50, -15, -37, -5, -49, -38, -10, -42, -9],
133
+ [50, 49, 60, 10, 48, 3, 4, 46, 50, 15, 37, 5, 49, 38, 10, 42, 9],
134
+ [100, 98, 90, 20, 96, 5, 8, 93, 99, 31, 75, 10, 97, 75, 20, 84, 18]]
135
+ framerate: 2
136
+ hit_radius: 0.1
137
+ miss_radius: 0.9
138
+ w_2: 1.0
139
+ loss_2:
140
+ type: SpottingLoss
141
+ lambda_coord: 5.0
142
+ lambda_noobj: 0.5
143
+
144
+ optimizer:
145
+ type: Adam
146
+ lr: 0.001
147
+ betas: [0.9, 0.999]
148
+ eps: 1e-07
149
+ weight_decay: 0
150
+ amsgrad: false
151
+
152
+ scheduler:
153
+ type: ReduceLROnPlateau
154
+ mode: min
155
+ factor: 1e-03
156
+ min_lr: 1e-06
157
+ patience: 25
158
+ verbose: true
159
+
160
+
161
+ SYSTEM:
162
+ log_dir: ./logs
163
+ save_dir: ./checkpoints
164
+ work_dir: ${SYSTEM.save_dir}
165
+ seed: 42
166
+ GPU: 4 # number of gpus to use
167
+ device: cuda # auto | cuda | cpu
168
+ gpu_id: 0 # device id for single gpu training
169
+
@@ -74,7 +74,7 @@ DATA:
74
74
  results: results_spotting_test_netvlad++_resnetpca512
75
75
  framerate: 2
76
76
  window_size: 20
77
- metric: tight
77
+ metric: loose
78
78
  dataloader:
79
79
  batch_size: 1
80
80
  shuffle: false
@@ -109,10 +109,12 @@ MODEL:
109
109
 
110
110
  TRAIN:
111
111
  type: trainer_pooling
112
- max_epochs: 1000
113
- evaluation_frequency: 1000
112
+ max_epochs: 200
113
+ evaluation_frequency: 200
114
114
  framerate: 2
115
115
  batch_size: 256
116
+ monitor: valid_loss
117
+ mode: min
116
118
 
117
119
  criterion:
118
120
  type: NLLLoss
@@ -26,7 +26,7 @@ class ContextAwareLoss(torch.nn.Module):
26
26
 
27
27
  super(ContextAwareLoss, self).__init__()
28
28
 
29
- self.K = torch.FloatTensor(K * framerate).cuda()
29
+ self.K = torch.FloatTensor(K * framerate)
30
30
  self.hit_radius = float(hit_radius)
31
31
  self.miss_radius = float(miss_radius)
32
32
 
@@ -40,7 +40,7 @@ class ContextAwareLoss(torch.nn.Module):
40
40
  Returns:
41
41
  torch.Tensor: The returned loss.
42
42
  """
43
- K = self.K
43
+ K = self.K.to(output.device)
44
44
  hit_radius = self.hit_radius
45
45
  miss_radius = self.miss_radius
46
46
 
@@ -42,6 +42,7 @@ import tqdm
42
42
  import numpy as np
43
43
  from opensportslib.core.utils.config import load_gz_json, load_json
44
44
  from abc import ABC, abstractmethod
45
+
45
46
  import logging
46
47
  logger = logging.getLogger(__name__)
47
48
 
@@ -159,14 +160,29 @@ class Trainer_pl(Trainer):
159
160
 
160
161
  def __init__(self, cfg, work_dir):
161
162
  from opensportslib.core.utils.lightning import CustomProgressBar, MyCallback
163
+ from pytorch_lightning.callbacks import ModelCheckpoint
162
164
  import pytorch_lightning as pl
165
+ from pytorch_lightning.loggers import WandbLogger
166
+
167
+ wandb_logger = None
168
+ if wandb.run is not None: # means init_wandb already ran
169
+ wandb_logger = WandbLogger(experiment=wandb.run)
163
170
 
164
171
  self.work_dir = work_dir
165
172
  call = MyCallback()
173
+ checkpoint_callback = ModelCheckpoint(
174
+ dirpath=self.work_dir,
175
+ filename="best",
176
+ monitor=getattr(cfg.TRAIN, 'monitor', 'valid_loss'), # or your metric
177
+ mode=getattr(cfg.TRAIN, 'mode', 'min'),
178
+ save_top_k=1,
179
+ )
166
180
  self.trainer = pl.Trainer(
167
- max_epochs=cfg.TRAIN.max_epochs,
168
- devices=cfg.SYSTEM.GPU,
169
- callbacks=[call, CustomProgressBar(refresh_rate=1)],
181
+ logger=wandb_logger,
182
+ max_epochs=getattr(cfg.TRAIN, 'max_epochs', 200),
183
+ devices="auto",
184
+ accelerator="auto",
185
+ callbacks=[call, CustomProgressBar(refresh_rate=1), checkpoint_callback],
170
186
  num_sanity_val_steps=0,
171
187
  )
172
188
  self.best_checkpoint_path = None
@@ -174,16 +190,27 @@ class Trainer_pl(Trainer):
174
190
  def train(self, **kwargs):
175
191
  self.trainer.fit(**kwargs)
176
192
 
177
- best_model = kwargs["model"].best_state
193
+ # best_model = kwargs["model"].best_state
194
+
195
+ # logging.info("Done training")
196
+ # logging.info("Best epoch: {}".format(best_model.get("epoch")))
197
+ # best_path = os.path.join(self.work_dir, "model.pth.tar")
198
+ # self.best_checkpoint_path = best_path
199
+ # torch.save(best_model, best_path)
200
+
201
+ # logging.info("Model saved")
202
+ # logging.info(best_path)
178
203
 
179
- logging.info("Done training")
180
- logging.info("Best epoch: {}".format(best_model.get("epoch")))
181
- best_path = os.path.join(self.work_dir, "model.pth.tar")
182
- self.best_checkpoint_path = best_path
183
- torch.save(best_model, best_path)
204
+ self.best_checkpoint_path = self.trainer.checkpoint_callback.best_model_path
184
205
 
185
- logging.info("Model saved")
186
- logging.info(best_path)
206
+ from pytorch_lightning.utilities.rank_zero import rank_zero_only
207
+
208
+ @rank_zero_only
209
+ def log():
210
+ logging.info("Done training")
211
+ logging.info(f"Best model saved at: {self.best_checkpoint_path}")
212
+
213
+ log()
187
214
 
188
215
 
189
216
  class Trainer_e2e(Trainer):
@@ -531,12 +558,19 @@ class Inferer:
531
558
  # Run Inference on Dataset
532
559
  from opensportslib.core.utils.lightning import CustomProgressBar, MyCallback
533
560
  import pytorch_lightning as pl
561
+ from pytorch_lightning.loggers import WandbLogger
562
+
563
+ wandb_logger = None
564
+ if wandb.run is not None: # means init_wandb already ran
565
+ wandb_logger = WandbLogger(experiment=wandb.run)
534
566
 
535
567
  if cfg.SYSTEM.work_dir is not None and dataloader is not None:
536
568
 
537
569
  evaluator = pl.Trainer(
570
+ logger=wandb_logger,
538
571
  callbacks=[CustomProgressBar()],
539
- devices=cfg.SYSTEM.GPU,
572
+ devices=1,
573
+ accelerator="auto",
540
574
  num_sanity_val_steps=0,
541
575
  )
542
576
  evaluator.predict(model, dataloader)
@@ -770,7 +804,6 @@ class Evaluator:
770
804
 
771
805
  # detect v2 prediction
772
806
  pred_is_v2 = isinstance(pred_data, dict) and pred_data is not None and "data" in pred_data
773
- print("PRED V2 :", pred_is_v2)
774
807
  # --------------------------------------------------
775
808
  # CLASSES
776
809
  # --------------------------------------------------
@@ -815,7 +848,6 @@ class Evaluator:
815
848
 
816
849
  # ---------------- GT ----------------
817
850
  if gt_is_v2:
818
- print("Game: ", game)
819
851
  video_path = game["inputs"][0]["path"]
820
852
  labels = [{"label": e.get("label"),
821
853
  "gameTime": e.get("gameTime"),
@@ -1048,10 +1080,13 @@ class Evaluator:
1048
1080
  "{:0.2f}".format(results["a_mAP_unshown"] * 100),
1049
1081
  )
1050
1082
  )
1051
-
1083
+ header = ["", "Any", "Visible", "Unseen"]
1084
+ result = tabulate(rows, headers=header)
1085
+ from opensportslib.core.utils.wandb import log_table_wandb
1086
+ log_table_wandb(name=f"Final Scores (Metric : {metric})", rows=rows, headers=header)
1052
1087
  logging.info("Best Performance at end of training ")
1053
1088
  logging.info("Metric: " + metric)
1054
- print(tabulate(rows, headers=["", "Any", "Visible", "Unseen"]))
1089
+ logging.info("\n" + result)
1055
1090
  # logging.info("a_mAP visibility all: " + str(results["a_mAP"]))
1056
1091
  # logging.info("a_mAP visibility all per class: " + str( results["a_mAP_per_class"]))
1057
1092
 
@@ -184,16 +184,25 @@ def load_checkpoint(
184
184
  model_keys = list(model.state_dict().keys())
185
185
  ckpt_keys = list(state_dict.keys())
186
186
 
187
- ckpt_has_module = ckpt_keys[0].startswith("module.")
188
- model_has_module = model_keys[0].startswith("module.")
187
+ # ckpt_has_module = ckpt_keys[0].startswith("module.")
188
+ # model_has_module = model_keys[0].startswith("module.")
189
189
 
190
- # Case 1: checkpoint has module., model doesn't
191
- if ckpt_has_module and not model_has_module:
192
- state_dict = {k.replace("module.", "", 1): v for k, v in state_dict.items()}
190
+ # # Case 1: checkpoint has module., model doesn't
191
+ # if ckpt_has_module and not model_has_module:
192
+ # state_dict = {k.replace("module.", "", 1): v for k, v in state_dict.items()}
193
193
 
194
- # Case 2: checkpoint doesn't have module., model does
195
- elif not ckpt_has_module and model_has_module:
196
- state_dict = {f"module.{k}": v for k, v in state_dict.items()}
194
+ # # Case 2: checkpoint doesn't have module., model does
195
+ # elif not ckpt_has_module and model_has_module:
196
+ # state_dict = {f"module.{k}": v for k, v in state_dict.items()}
197
+
198
+ def strip_prefix(state_dict, prefix):
199
+ return {
200
+ k[len(prefix):] if k.startswith(prefix) else k: v
201
+ for k, v in state_dict.items()
202
+ }
203
+
204
+ state_dict = strip_prefix(state_dict, "module.")
205
+ state_dict = strip_prefix(state_dict, "model.")
197
206
 
198
207
  # Optional custom remap
199
208
  if key_remap_fn:
@@ -880,9 +880,9 @@ def label2vector(
880
880
 
881
881
  else:
882
882
  time = annotation["gameTime"]
883
- print(time)
884
- minutes = int(time[-5:-3])
885
- seconds = int(time[-2::])
883
+ if time is not None:
884
+ minutes = int(time[-5:-3])
885
+ seconds = int(time[-2::])
886
886
  # annotation at millisecond precision
887
887
  if "position" in annotation:
888
888
  frame = int(framerate * (int(annotation["position"]) / 1000))
@@ -931,7 +931,7 @@ def predictions2vector(
931
931
 
932
932
  event = annotation["label"]
933
933
 
934
- if "frame" in annotation:
934
+ if "frame" in annotation and annotation["frame"] is not None:
935
935
  frame = int(annotation["frame"])
936
936
  else:
937
937
  time = int(annotation["position"])
@@ -249,10 +249,10 @@ class LiteContextAwareModel(LiteBaseModel):
249
249
  self.json_data = json_data
250
250
  elif self.runner == "runner_JSON":
251
251
  list_videos = self.trainer.predict_dataloaders.dataset.data_json[0][
252
- "videos"
252
+ "data"
253
253
  ]
254
254
  for index in np.arange(len(list_videos)):
255
- video = list_videos[index]["path"]
255
+ video = list_videos[index]["inputs"][0]["path"]
256
256
 
257
257
  if self.infer_split:
258
258
  video = os.path.splitext(video)[0]
@@ -275,7 +275,7 @@ def predictions2json_runnerjson(
275
275
 
276
276
  confidence = predictions_video[frame_index, class_index]
277
277
 
278
- json_data["predictions"].append(
278
+ json_data["data"][0]["events"].append(
279
279
  get_prediction_data(
280
280
  True,
281
281
  frame_index,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: opensportslib
3
- Version: 0.0.1.dev17
3
+ Version: 0.0.1.dev19
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
@@ -16,6 +16,7 @@ opensportslib/apis/classification.py
16
16
  opensportslib/apis/localization.py
17
17
  opensportslib/config/classification.yaml
18
18
  opensportslib/config/localization-e2e-ocv.yaml
19
+ opensportslib/config/localization-json_calf_resnetpca512.yaml
19
20
  opensportslib/config/localization-json_netvlad++_resnetpca512.yaml
20
21
  opensportslib/config/localization.yaml
21
22
  opensportslib/config/sngar-frames.yaml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "opensportslib"
7
- version = "0.0.1.dev17"
7
+ version = "0.0.1.dev19"
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"