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.
- {opensportslib-0.0.1.dev17/opensportslib.egg-info → opensportslib-0.0.1.dev19}/PKG-INFO +1 -1
- opensportslib-0.0.1.dev19/opensportslib/config/localization-json_calf_resnetpca512.yaml +169 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization-json_netvlad++_resnetpca512.yaml +5 -3
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/calf.py +2 -2
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/localization_trainer.py +51 -16
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/checkpoint.py +17 -8
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/metrics/localization_metric.py +4 -4
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/contextaware.py +2 -2
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/utils.py +1 -1
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19/opensportslib.egg-info}/PKG-INFO +1 -1
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/SOURCES.txt +1 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/pyproject.toml +1 -1
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/LICENSE +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/LICENSE-COMMERCIAL +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/MANIFEST.in +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/README.md +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_classification.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_localization.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/classification.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/localization.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/classification.yaml +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization-e2e-ocv.yaml +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization.yaml +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-frames.yaml +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-tracking.yaml +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/ce.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/combine.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/nll.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/sampler/weighted_sampler.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/classification_trainer.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/config.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/data.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/ddp.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/default_args.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/lightning.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/load_annotations.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/seed.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/video_processing.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/wandb.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/classification_dataset.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/localization_dataset.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/tracking.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/metrics/classification_metric.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/backbones/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/e2e.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/learnablepooling.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/tracking.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/vars.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video_mae.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/heads/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/neck/builder.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/common.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/__init__.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/asformer.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/calf.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gsm.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gtad.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/tsm.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/litebase.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/modules.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/shift.py +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/dependency_links.txt +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/requires.txt +0 -0
- {opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/top_level.txt +0 -0
- {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.
|
|
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:
|
|
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:
|
|
113
|
-
evaluation_frequency:
|
|
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)
|
|
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
|
-
|
|
168
|
-
|
|
169
|
-
|
|
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
|
-
|
|
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
|
-
|
|
186
|
-
|
|
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=
|
|
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
|
-
|
|
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
|
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/checkpoint.py
RENAMED
|
@@ -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
|
-
|
|
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
|
-
|
|
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:
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/metrics/localization_metric.py
RENAMED
|
@@ -880,9 +880,9 @@ def label2vector(
|
|
|
880
880
|
|
|
881
881
|
else:
|
|
882
882
|
time = annotation["gameTime"]
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
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"])
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/contextaware.py
RENAMED
|
@@ -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
|
-
"
|
|
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]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: opensportslib
|
|
3
|
-
Version: 0.0.1.
|
|
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.
|
|
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"
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_classification.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_localization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/apis/classification.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/classification.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/localization.yaml
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-frames.yaml
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-tracking.yaml
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/builder.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/default_args.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/lightning.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/load_annotations.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/video_processing.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/tracking.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/backbones/builder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/tracking.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video_mae.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/heads/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/neck/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/common.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/asformer.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/calf.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gsm.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gtad.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/tsm.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/litebase.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/modules.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev17 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|