opensportslib 0.0.1.dev18__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.dev18/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.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/localization-json_netvlad++_resnetpca512.yaml +3 -1
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/calf.py +2 -2
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/localization_trainer.py +45 -16
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/checkpoint.py +17 -8
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/contextaware.py +2 -2
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/utils.py +1 -1
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19/opensportslib.egg-info}/PKG-INFO +1 -1
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/SOURCES.txt +1 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/pyproject.toml +1 -1
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/LICENSE +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/LICENSE-COMMERCIAL +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/MANIFEST.in +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/README.md +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_classification.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_localization.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/apis/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/apis/classification.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/apis/localization.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/classification.yaml +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/localization-e2e-ocv.yaml +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/localization.yaml +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-frames.yaml +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-tracking.yaml +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/ce.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/combine.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/loss/nll.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/sampler/weighted_sampler.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/trainer/classification_trainer.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/config.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/data.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/ddp.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/default_args.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/lightning.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/load_annotations.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/seed.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/video_processing.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/wandb.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/classification_dataset.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/localization_dataset.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/tracking.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/metrics/classification_metric.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/metrics/localization_metric.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/backbones/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/e2e.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/learnablepooling.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/tracking.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/vars.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video_mae.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/heads/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/neck/builder.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/common.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/__init__.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/asformer.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/calf.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gsm.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gtad.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/tsm.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/litebase.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/modules.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/shift.py +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/dependency_links.txt +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/requires.txt +0 -0
- {opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/top_level.txt +0 -0
- {opensportslib-0.0.1.dev18 → 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
|
|
@@ -113,6 +113,8 @@ TRAIN:
|
|
|
113
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,9 +160,9 @@ 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
|
|
163
165
|
from pytorch_lightning.loggers import WandbLogger
|
|
164
|
-
import wandb
|
|
165
166
|
|
|
166
167
|
wandb_logger = None
|
|
167
168
|
if wandb.run is not None: # means init_wandb already ran
|
|
@@ -169,11 +170,19 @@ class Trainer_pl(Trainer):
|
|
|
169
170
|
|
|
170
171
|
self.work_dir = work_dir
|
|
171
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
|
+
)
|
|
172
180
|
self.trainer = pl.Trainer(
|
|
173
181
|
logger=wandb_logger,
|
|
174
|
-
max_epochs=cfg.TRAIN
|
|
175
|
-
devices=
|
|
176
|
-
|
|
182
|
+
max_epochs=getattr(cfg.TRAIN, 'max_epochs', 200),
|
|
183
|
+
devices="auto",
|
|
184
|
+
accelerator="auto",
|
|
185
|
+
callbacks=[call, CustomProgressBar(refresh_rate=1), checkpoint_callback],
|
|
177
186
|
num_sanity_val_steps=0,
|
|
178
187
|
)
|
|
179
188
|
self.best_checkpoint_path = None
|
|
@@ -181,16 +190,27 @@ class Trainer_pl(Trainer):
|
|
|
181
190
|
def train(self, **kwargs):
|
|
182
191
|
self.trainer.fit(**kwargs)
|
|
183
192
|
|
|
184
|
-
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)
|
|
203
|
+
|
|
204
|
+
self.best_checkpoint_path = self.trainer.checkpoint_callback.best_model_path
|
|
205
|
+
|
|
206
|
+
from pytorch_lightning.utilities.rank_zero import rank_zero_only
|
|
185
207
|
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
torch.save(best_model, best_path)
|
|
208
|
+
@rank_zero_only
|
|
209
|
+
def log():
|
|
210
|
+
logging.info("Done training")
|
|
211
|
+
logging.info(f"Best model saved at: {self.best_checkpoint_path}")
|
|
191
212
|
|
|
192
|
-
|
|
193
|
-
logging.info(best_path)
|
|
213
|
+
log()
|
|
194
214
|
|
|
195
215
|
|
|
196
216
|
class Trainer_e2e(Trainer):
|
|
@@ -538,12 +558,19 @@ class Inferer:
|
|
|
538
558
|
# Run Inference on Dataset
|
|
539
559
|
from opensportslib.core.utils.lightning import CustomProgressBar, MyCallback
|
|
540
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)
|
|
541
566
|
|
|
542
567
|
if cfg.SYSTEM.work_dir is not None and dataloader is not None:
|
|
543
568
|
|
|
544
569
|
evaluator = pl.Trainer(
|
|
570
|
+
logger=wandb_logger,
|
|
545
571
|
callbacks=[CustomProgressBar()],
|
|
546
|
-
devices=
|
|
572
|
+
devices=1,
|
|
573
|
+
accelerator="auto",
|
|
547
574
|
num_sanity_val_steps=0,
|
|
548
575
|
)
|
|
549
576
|
evaluator.predict(model, dataloader)
|
|
@@ -777,7 +804,6 @@ class Evaluator:
|
|
|
777
804
|
|
|
778
805
|
# detect v2 prediction
|
|
779
806
|
pred_is_v2 = isinstance(pred_data, dict) and pred_data is not None and "data" in pred_data
|
|
780
|
-
print("PRED V2 :", pred_is_v2)
|
|
781
807
|
# --------------------------------------------------
|
|
782
808
|
# CLASSES
|
|
783
809
|
# --------------------------------------------------
|
|
@@ -1054,10 +1080,13 @@ class Evaluator:
|
|
|
1054
1080
|
"{:0.2f}".format(results["a_mAP_unshown"] * 100),
|
|
1055
1081
|
)
|
|
1056
1082
|
)
|
|
1057
|
-
|
|
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)
|
|
1058
1087
|
logging.info("Best Performance at end of training ")
|
|
1059
1088
|
logging.info("Metric: " + metric)
|
|
1060
|
-
|
|
1089
|
+
logging.info("\n" + result)
|
|
1061
1090
|
# logging.info("a_mAP visibility all: " + str(results["a_mAP"]))
|
|
1062
1091
|
# logging.info("a_mAP visibility all per class: " + str( results["a_mAP_per_class"]))
|
|
1063
1092
|
|
{opensportslib-0.0.1.dev18 → 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.dev18 → 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.dev18 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_classification.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/examples/quickstart/basic_localization.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/apis/classification.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/classification.yaml
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/localization.yaml
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/config/sngar-frames.yaml
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → 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.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/optimizer/builder.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/scheduler/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → 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.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/default_args.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/lightning.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/core/utils/load_annotations.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → 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.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/datasets/utils/tracking.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/metrics/localization_metric.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/backbones/builder.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/tracking.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/base/video_mae.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/heads/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/neck/builder.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/common.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/__init__.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/asformer.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/calf.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gsm.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/gtad.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/impl/tsm.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/litebase.py
RENAMED
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib/models/utils/modules.py
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
{opensportslib-0.0.1.dev18 → opensportslib-0.0.1.dev19}/opensportslib.egg-info/top_level.txt
RENAMED
|
File without changes
|
|
File without changes
|