Skip to content

Commit 440f815

Browse files
committed
dry run
1 parent 5063ecb commit 440f815

File tree

11 files changed

+93
-36
lines changed

11 files changed

+93
-36
lines changed

library/src/otx/backend/native/callbacks/ema.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ def __init__(
371371
self,
372372
device: Optional[Union[torch.device, str, int]] = None,
373373
use_buffers: bool = True,
374-
decay: float = 0.999,
374+
decay: float = 0.9999,
375375
update_every_n_steps: int = 1,
376376
update_starting_at_step: Optional[int] = None,
377377
update_starting_at_epoch: Optional[int] = None,

library/src/otx/backend/native/models/base.py

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@ def __init__(
167167

168168
self._label_info = self._dispatch_label_info(label_info)
169169
self.model_name = model_name
170+
self.log_all_losses = False
170171
if isinstance(data_input_params, dict):
171172
data_input_params = DataInputParams(**data_input_params)
172173
elif data_input_params is None:
@@ -212,14 +213,15 @@ def training_step(self, batch: OTXDataBatch, batch_idx: int) -> Tensor:
212213
)
213214
return train_loss
214215
if isinstance(train_loss, dict):
215-
for k, v in train_loss.items():
216-
self.log(
217-
f"train/{k}",
218-
v,
219-
on_step=True,
220-
on_epoch=False,
221-
prog_bar=True,
222-
)
216+
if self.log_all_losses:
217+
for k, v in train_loss.items():
218+
self.log(
219+
f"train/{k}",
220+
v,
221+
on_step=True,
222+
on_epoch=False,
223+
prog_bar=True,
224+
)
223225

224226
total_train_loss = train_loss.get("total_loss", sum(train_loss.values()))
225227
self.log(

library/src/otx/backend/native/models/detection/deimv2.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ def _create_model(self, num_classes: int | None = None) -> DETR:
106106
num_classes=num_classes,
107107
eval_spatial_size=self.data_input_params.input_size,
108108
)
109+
109110
criterion = DEIMCriterion(
110111
weight_dict={
111112
"loss_vfl": 1,

library/src/otx/data/transform_libs/torchvision.py

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import numpy as np
1919
import PIL.Image
2020
import torch
21+
import uuid
2122
import torchvision.transforms.v2 as tvt_v2
2223
import typeguard
2324
from lightning.pytorch.cli import instantiate_class
@@ -2124,8 +2125,56 @@ def forward(self, *_inputs: OTXDataItem) -> OTXDataItem | None:
21242125

21252126
inputs.polygons = [mixup_gt_polygons[i] for i in np.where(inside_inds)[0]]
21262127

2128+
# self.visualize(inputs, output_path=f"/home/kprokofi/debug_images/{str(uuid.uuid4())}.jpg")
21272129
return self.convert(inputs)
21282130

2131+
def visualize(
2132+
self,
2133+
inputs: OTXDataItem,
2134+
output_path: str | None = None,
2135+
show_blended: bool = True,
2136+
) -> np.ndarray:
2137+
"""Visualize CopyBlend augmentation for debugging.
2138+
2139+
Args:
2140+
inputs: OTXDataItem to visualize.
2141+
output_path: Optional path to save visualization.
2142+
show_blended: Whether to show blended boxes in different color.
2143+
2144+
Returns:
2145+
Visualization as numpy array.
2146+
"""
2147+
import cv2
2148+
2149+
img = to_np_image(inputs.image).copy()
2150+
bboxes = inputs.bboxes
2151+
labels = inputs.label
2152+
2153+
# Draw bboxes
2154+
for idx, bbox in enumerate(bboxes):
2155+
x1, y1, x2, y2 = bbox.int().tolist()
2156+
label = labels[idx].item() if hasattr(labels[idx], "item") else labels[idx]
2157+
2158+
# Use different colors for original vs blended
2159+
# Assume last N boxes are blended (where N = num_objects)
2160+
color = (0, 255, 0)
2161+
2162+
cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)
2163+
cv2.putText(
2164+
img,
2165+
f"{label}",
2166+
(x1, y1 - 5),
2167+
cv2.FONT_HERSHEY_SIMPLEX,
2168+
0.5,
2169+
color,
2170+
2,
2171+
)
2172+
2173+
if output_path:
2174+
cv2.imwrite(output_path, img)
2175+
2176+
return img
2177+
21292178
def __repr__(self):
21302179
repr_str = self.__class__.__name__
21312180
repr_str += f"(dynamic_scale={self.dynamic_scale}, "
@@ -2403,7 +2452,6 @@ def forward(self, *_inputs: OTXDataItem) -> OTXDataItem | None:
24032452
canvas_size=(img_h, img_w),
24042453
)
24052454
inputs.label = combined_labels
2406-
24072455
return self.convert(inputs)
24082456

24092457
def visualize(

library/src/otx/recipe/detection/deimv2_l.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ callbacks:
3535
init_args:
3636
max_interval: 1
3737
min_lrschedule_patience: 3
38+
# - class_path: otx.backend.native.callbacks.EMAWeightAveraging
39+
# init_args:
40+
# update_starting_at_epoch: 10
41+
# decay: 0.999
3842
- class_path: otx.backend.native.callbacks.adaptive_early_stopping.EarlyStoppingWithWarmup
3943
init_args:
4044
mode: max
@@ -117,7 +121,7 @@ callbacks:
117121
transforms:
118122
- class_path: otx.data.transform_libs.torchvision.CachedMosaic
119123
init_args:
120-
random_pop: false
124+
random_pop: true
121125
max_cached_images: 20
122126
img_scale: [640, 640]
123127
- class_path: otx.data.transform_libs.torchvision.CachedMixUp
@@ -127,7 +131,7 @@ callbacks:
127131
- 1.0
128132
- 1.0
129133
probability: 0.5
130-
random_pop: false
134+
random_pop: true
131135
max_cached_images: 10
132136
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
133137
init_args:
@@ -160,6 +164,7 @@ callbacks:
160164
init_args:
161165
fill: 0
162166
p: 0.5
167+
side_range: [1.0, 2.0]
163168
- class_path: otx.data.transform_libs.torchvision.RandomIoUCrop # Can't be used when using CachedMosaic
164169
init_args:
165170
probability: 0.8
@@ -176,7 +181,7 @@ callbacks:
176181
- 1.0
177182
- 1.0
178183
probability: 0.5
179-
random_pop: false
184+
random_pop: true
180185
max_cached_images: 10
181186
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
182187
init_args:

library/src/otx/recipe/detection/deimv2_m.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ callbacks:
117117
transforms:
118118
- class_path: otx.data.transform_libs.torchvision.CachedMosaic
119119
init_args:
120-
random_pop: false
120+
random_pop: true
121121
max_cached_images: 20
122122
img_scale: [640, 640]
123123
- class_path: otx.data.transform_libs.torchvision.CachedMixUp
@@ -127,7 +127,7 @@ callbacks:
127127
- 1.0
128128
- 1.0
129129
probability: 0.5
130-
random_pop: false
130+
random_pop: true
131131
max_cached_images: 10
132132
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
133133
init_args:
@@ -176,7 +176,7 @@ callbacks:
176176
- 1.0
177177
- 1.0
178178
probability: 0.5
179-
random_pop: false
179+
random_pop: true
180180
max_cached_images: 10
181181
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
182182
init_args:

library/src/otx/recipe/detection/deimv2_s.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ callbacks:
117117
transforms:
118118
- class_path: otx.data.transform_libs.torchvision.CachedMosaic
119119
init_args:
120-
random_pop: false
120+
random_pop: true
121121
max_cached_images: 20
122122
img_scale: [640, 640]
123123
- class_path: otx.data.transform_libs.torchvision.CachedMixUp
@@ -127,7 +127,7 @@ callbacks:
127127
- 1.0
128128
- 1.0
129129
probability: 0.5
130-
random_pop: false
130+
random_pop: true
131131
max_cached_images: 10
132132
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
133133
init_args:
@@ -176,7 +176,7 @@ callbacks:
176176
- 1.0
177177
- 1.0
178178
probability: 0.5
179-
random_pop: false
179+
random_pop: true
180180
max_cached_images: 10
181181
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
182182
init_args:

library/src/otx/recipe/detection/deimv2_x.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ callbacks:
117117
transforms:
118118
- class_path: otx.data.transform_libs.torchvision.CachedMosaic
119119
init_args:
120-
random_pop: false
120+
random_pop: true
121121
max_cached_images: 20
122122
img_scale: [640, 640]
123123
- class_path: otx.data.transform_libs.torchvision.CachedMixUp
@@ -127,7 +127,7 @@ callbacks:
127127
- 1.0
128128
- 1.0
129129
probability: 0.5
130-
random_pop: false
130+
random_pop: true
131131
max_cached_images: 10
132132
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
133133
init_args:
@@ -176,7 +176,7 @@ callbacks:
176176
- 1.0
177177
- 1.0
178178
probability: 0.5
179-
random_pop: false
179+
random_pop: true
180180
max_cached_images: 10
181181
- class_path: torchvision.transforms.v2.SanitizeBoundingBoxes
182182
init_args:

library/tests/perf_v2/benchmark.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ def __init__(
9797
num_epoch: int = 0,
9898
eval_upto: str = "train",
9999
tags: dict[str, str] | None = None,
100-
dry_run: bool = False,
101100
deterministic: bool = False,
102101
accelerator: str = "gpu",
103102
reference_results: pd.DataFrame | None = None,
@@ -109,7 +108,6 @@ def __init__(
109108
self.num_epoch = num_epoch
110109
self.eval_upto = eval_upto
111110
self.tags = tags or {}
112-
self.dry_run = dry_run
113111
self.deterministic = deterministic
114112
self.accelerator = accelerator
115113
self.reference_results = reference_results
@@ -641,7 +639,6 @@ def check(self, result: pd.DataFrame, criteria: list[Criterion]):
641639
num_epoch=args.num_epoch,
642640
eval_upto=args.eval_upto,
643641
tags=tags,
644-
dry_run=args.dry_run,
645642
deterministic=(
646643
False if args.deterministic is None else {"true": True, "false": False, "warn": "warn"}[args.deterministic]
647644
),

library/tests/perf_v2/run.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from __future__ import annotations
66

7+
from email.policy import default
78
import json
89
import logging
910
import subprocess
@@ -99,7 +100,6 @@ def load_failed_jobs(file_path: Path) -> list[list[str]]:
99100
if (output_root / model.name / dataset.name / str(seed)).exists():
100101
logger.info(f"Skipping existing job for {model.name} on {dataset.name} with seed {seed}")
101102
continue
102-
103103
cmd = [
104104
"python",
105105
"-m",
@@ -116,8 +116,12 @@ def load_failed_jobs(file_path: Path) -> list[list[str]]:
116116
str(output_root),
117117
"--seed",
118118
str(seed),
119+
"--eval-upto",
120+
str(args.eval_upto),
119121
"--num-epoch",
120122
str(args.num_epoch),
123+
"--deterministic",
124+
str(args.deterministic),
121125
"--device",
122126
args.device,
123127
"--user-name",

0 commit comments

Comments
 (0)