Skip to content

Commit 727453f

Browse files
authored
Merge pull request #155 from invoke-ai/maryhipp/fix-original_size_hw
update flux image transform to resize properly
2 parents 0fde324 + 0121707 commit 727453f

1 file changed

Lines changed: 30 additions & 7 deletions

File tree

src/invoke_training/_shared/data/transforms/flux_image_transform.py

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import typing
22

33
from torchvision import transforms
4+
from torchvision.transforms.functional import crop
45

56
from invoke_training._shared.data.utils.aspect_ratio_bucket_manager import AspectRatioBucketManager, Resolution
67
from invoke_training._shared.data.utils.resize import resize_to_cover
@@ -43,32 +44,54 @@ def __call__(self, data: typing.Dict[str, typing.Any]) -> typing.Dict[str, typin
4344
for field_name in self.image_field_names:
4445
image_fields[field_name] = data[field_name]
4546

47+
# Get the first image to determine original size and resolution
48+
first_image = next(iter(image_fields.values()))
49+
original_size_hw = (first_image.height, first_image.width)
50+
4651
for field_name, image in image_fields.items():
4752
# Determine the target image resolution.
4853
if self.resolution is not None:
4954
resolution = self.resolution
5055
resolution_obj = Resolution(resolution, resolution)
5156
else:
52-
original_size_hw = (image.height, image.width)
5357
resolution_obj = self.aspect_ratio_bucket_manager.get_aspect_ratio_bucket(
5458
Resolution.parse(original_size_hw)
5559
)
5660

5761
image = resize_to_cover(image, resolution_obj)
62+
63+
# Apply cropping and record top left crop position
5864
if self.center_crop:
59-
image = transforms.CenterCrop(resolution)(image)
65+
top_left_y = max(0, (image.height - resolution_obj.height) // 2)
66+
top_left_x = max(0, (image.width - resolution_obj.width) // 2)
67+
image = transforms.CenterCrop(resolution_obj.to_tuple())(image)
6068
else:
61-
image = transforms.RandomCrop(resolution)(image)
62-
63-
image = transforms.ToTensor()(image)
69+
crop_transform = transforms.RandomCrop(resolution_obj.to_tuple())
70+
top_left_y, top_left_x, h, w = crop_transform.get_params(image, resolution_obj.to_tuple())
71+
image = crop(image, top_left_y, top_left_x, resolution_obj.height, resolution_obj.width)
6472

73+
# Apply random flip and update top left crop position accordingly
6574
if self.random_flip:
66-
image = transforms.RandomHorizontalFlip(p=0.5)(image)
67-
image_fields[field_name] = image
75+
# TODO: Use a seed for repeatable results
76+
import random
77+
78+
if random.random() < 0.5:
79+
top_left_x = original_size_hw[1] - image.width - top_left_x
80+
image = transforms.RandomHorizontalFlip(p=1.0)(image)
81+
82+
image = transforms.ToTensor()(image)
6883

6984
if field_name in self.fields_to_normalize_to_range_minus_one_to_one:
7085
image_fields[field_name] = transforms.Normalize([0.5], [0.5])(image)
86+
else:
87+
image_fields[field_name] = image
7188

89+
# Store the processed images and metadata
7290
for field_name, image in image_fields.items():
7391
data[field_name] = image
92+
93+
# Add metadata fields expected by VAE caching
94+
data["original_size_hw"] = original_size_hw
95+
data["crop_top_left_yx"] = (top_left_y, top_left_x)
96+
7497
return data

0 commit comments

Comments
 (0)