|
7 | 7 | # |
8 | 8 | from __future__ import annotations |
9 | 9 |
|
10 | | -import math |
11 | 10 | from typing import Any, Literal, Sequence |
12 | 11 |
|
13 | 12 | from albumentations import BboxParams |
14 | | -from lightning_utilities.core.imports import RequirementCache |
15 | 13 | from pydantic import Field |
16 | 14 |
|
17 | 15 | from lightly_train._task_models.object_detection_components.ltdetr_geometry import ( |
18 | 16 | ltdetr_image_size_divisor, |
19 | 17 | ) |
20 | | -from lightly_train._transforms.object_detection_transform import ( |
21 | | - ObjectDetectionTransform, |
22 | | - ObjectDetectionTransformArgs, |
| 18 | +from lightly_train._transforms.ltdetr_transforms.object_detection import ( |
| 19 | + LTDETRObjectDetectionTransform, |
| 20 | + LTDETRObjectDetectionTransformArgs, |
| 21 | +) |
| 22 | +from lightly_train._transforms.ltdetr_transforms.utils import ( |
| 23 | + ALBUMENTATIONS_VERSION_GREATER_EQUAL_1_4_5, |
| 24 | + ALBUMENTATIONS_VERSION_GREATER_EQUAL_2_0_1, |
| 25 | + resolve_image_size_for_patch_size, |
23 | 26 | resolve_ltdetr_step_schedule_for_augmentation, |
24 | 27 | ) |
25 | 28 | from lightly_train._transforms.transform import ( |
|
39 | 42 | ) |
40 | 43 | from lightly_train.types import ImageSizeTuple |
41 | 44 |
|
42 | | -ALBUMENTATIONS_VERSION_GREATER_EQUAL_1_4_5 = RequirementCache("albumentations>=1.4.5") |
43 | | -ALBUMENTATIONS_VERSION_GREATER_EQUAL_2_0_1 = RequirementCache("albumentations>=2.0.1") |
44 | | - |
45 | | - |
46 | | -def _resolve_image_size_for_patch_size( |
47 | | - model_init_args: dict[str, Any], |
48 | | - *, |
49 | | - default_image_size: tuple[int, int], |
50 | | - patch_size: int | None, |
51 | | -) -> tuple[int, int]: |
52 | | - provided_image_size = model_init_args.get("image_size") |
53 | | - if provided_image_size is not None: |
54 | | - image_size = ( |
55 | | - int(provided_image_size[0]), |
56 | | - int(provided_image_size[1]), |
57 | | - ) |
58 | | - if patch_size is not None: |
59 | | - divisor = ltdetr_image_size_divisor(patch_size) |
60 | | - if any(size % divisor != 0 for size in image_size): |
61 | | - raise ValueError( |
62 | | - "When providing an image size in model_init_args, it must be divisible by 2 * the patch size." |
63 | | - ) |
64 | | - return image_size |
65 | | - |
66 | | - if patch_size is None: |
67 | | - return default_image_size |
68 | | - |
69 | | - divisor = ltdetr_image_size_divisor(patch_size) |
70 | | - return ( |
71 | | - math.ceil(default_image_size[0] / divisor) * divisor, |
72 | | - math.ceil(default_image_size[1] / divisor) * divisor, |
73 | | - ) |
74 | | - |
75 | 45 |
|
76 | 46 | class LTDETRObjectDetectionRandomPhotometricDistortArgs(RandomPhotometricDistortArgs): |
77 | 47 | prob: float = 0.5 |
@@ -229,7 +199,7 @@ class LTDETRObjectDetectionResizeArgs(ResizeArgs): |
229 | 199 | width: int | Literal["auto"] = "auto" |
230 | 200 |
|
231 | 201 |
|
232 | | -class LTDETRObjectDetectionTrainTransformArgs(ObjectDetectionTransformArgs): |
| 202 | +class LTDETRObjectDetectionTrainTransformArgs(LTDETRObjectDetectionTransformArgs): |
233 | 203 | channel_drop: ChannelDropArgs | None = None |
234 | 204 | num_channels: int | Literal["auto"] = "auto" |
235 | 205 | photometric_distort: LTDETRObjectDetectionRandomPhotometricDistortArgs | None = ( |
@@ -284,7 +254,7 @@ def resolve_auto(self, model_init_args: dict[str, Any]) -> None: |
284 | 254 | patch_size: int | None = model_init_args.get("patch_size") |
285 | 255 |
|
286 | 256 | if self.image_size == "auto": |
287 | | - self.image_size = _resolve_image_size_for_patch_size( |
| 257 | + self.image_size = resolve_image_size_for_patch_size( |
288 | 258 | model_init_args, |
289 | 259 | default_image_size=(640, 640), |
290 | 260 | patch_size=patch_size, |
@@ -350,7 +320,7 @@ def resolve_step_schedule( |
350 | 320 | ) |
351 | 321 |
|
352 | 322 |
|
353 | | -class LTDETRObjectDetectionValTransformArgs(ObjectDetectionTransformArgs): |
| 323 | +class LTDETRObjectDetectionValTransformArgs(LTDETRObjectDetectionTransformArgs): |
354 | 324 | channel_drop: None = None |
355 | 325 | num_channels: int | Literal["auto"] = "auto" |
356 | 326 | photometric_distort: None = None |
@@ -387,7 +357,7 @@ def resolve_auto(self, model_init_args: dict[str, Any]) -> None: |
387 | 357 | patch_size: int | None = model_init_args.get("patch_size") |
388 | 358 |
|
389 | 359 | if self.image_size == "auto": |
390 | | - self.image_size = _resolve_image_size_for_patch_size( |
| 360 | + self.image_size = resolve_image_size_for_patch_size( |
391 | 361 | model_init_args, |
392 | 362 | default_image_size=(640, 640), |
393 | 363 | patch_size=patch_size, |
@@ -421,11 +391,11 @@ def resolve_auto(self, model_init_args: dict[str, Any]) -> None: |
421 | 391 | self.num_channels = len(self.normalize.mean) |
422 | 392 |
|
423 | 393 |
|
424 | | -class LTDETRObjectDetectionTrainTransform(ObjectDetectionTransform): |
| 394 | +class LTDETRObjectDetectionTrainTransform(LTDETRObjectDetectionTransform): |
425 | 395 | transform_args_cls = LTDETRObjectDetectionTrainTransformArgs |
426 | 396 |
|
427 | 397 |
|
428 | | -class LTDETRObjectDetectionValTransform(ObjectDetectionTransform): |
| 398 | +class LTDETRObjectDetectionValTransform(LTDETRObjectDetectionTransform): |
429 | 399 | transform_args_cls = LTDETRObjectDetectionValTransformArgs |
430 | 400 |
|
431 | 401 |
|
@@ -592,7 +562,9 @@ class DINOv2LTDETRObjectDetectionResizeArgsV2(ResizeArgs): |
592 | 562 | width: int | Literal["auto"] = "auto" |
593 | 563 |
|
594 | 564 |
|
595 | | -class DINOv2LTDETRObjectDetectionTrainTransformArgsV2(ObjectDetectionTransformArgs): |
| 565 | +class DINOv2LTDETRObjectDetectionTrainTransformArgsV2( |
| 566 | + LTDETRObjectDetectionTransformArgs |
| 567 | +): |
596 | 568 | channel_drop: None = None |
597 | 569 | num_channels: int | Literal["auto"] = "auto" |
598 | 570 | photometric_distort: ( |
@@ -694,7 +666,7 @@ def resolve_step_schedule( |
694 | 666 | ) |
695 | 667 |
|
696 | 668 |
|
697 | | -class DINOv2LTDETRObjectDetectionValTransformArgsV2(ObjectDetectionTransformArgs): |
| 669 | +class DINOv2LTDETRObjectDetectionValTransformArgsV2(LTDETRObjectDetectionTransformArgs): |
698 | 670 | channel_drop: None = None |
699 | 671 | num_channels: int | Literal["auto"] = "auto" |
700 | 672 | photometric_distort: None = None |
@@ -761,9 +733,9 @@ def resolve_auto(self, model_init_args: dict[str, Any]) -> None: |
761 | 733 | self.num_channels = len(self.normalize.mean) |
762 | 734 |
|
763 | 735 |
|
764 | | -class DINOv2LTDETRObjectDetectionTrainTransformV2(ObjectDetectionTransform): |
| 736 | +class DINOv2LTDETRObjectDetectionTrainTransformV2(LTDETRObjectDetectionTransform): |
765 | 737 | transform_args_cls = DINOv2LTDETRObjectDetectionTrainTransformArgsV2 |
766 | 738 |
|
767 | 739 |
|
768 | | -class DINOv2LTDETRObjectDetectionValTransformV2(ObjectDetectionTransform): |
| 740 | +class DINOv2LTDETRObjectDetectionValTransformV2(LTDETRObjectDetectionTransform): |
769 | 741 | transform_args_cls = DINOv2LTDETRObjectDetectionValTransformArgsV2 |
0 commit comments