| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| """ |
| This example demonstrates how to use image transforms with LeRobot datasets for data augmentation during training. |
| |
| Image transforms are applied to camera frames to improve model robustness and generalization. They are applied |
| at training time only, not during dataset recording, allowing you to experiment with different augmentations |
| without re-recording data. |
| """ |
|
|
| import torch |
| from torchvision.transforms import v2 |
| from torchvision.transforms.functional import to_pil_image |
|
|
| from lerobot.datasets import LeRobotDataset |
| from lerobot.transforms import ImageTransformConfig, ImageTransforms, ImageTransformsConfig |
|
|
|
|
| def save_image(tensor, filename): |
| """Helper function to save a tensor as an image file.""" |
| if tensor.dim() == 3: |
| if tensor.max() > 1.0: |
| tensor = tensor / 255.0 |
| tensor = torch.clamp(tensor, 0.0, 1.0) |
| pil_image = to_pil_image(tensor) |
| pil_image.save(filename) |
| print(f"Saved: {filename}") |
| else: |
| print(f"Skipped {filename}: unexpected tensor shape {tensor.shape}") |
|
|
|
|
| def example_1_default_transforms(): |
| """Example 1: Use default transform configuration and save original vs transformed images""" |
| print("\n Example 1: Default Transform Configuration with Image Saving") |
|
|
| repo_id = "pepijn223/record_main_0" |
|
|
| try: |
| |
| dataset_original = LeRobotDataset(repo_id=repo_id) |
|
|
| |
| transforms_config = ImageTransformsConfig( |
| enable=True, |
| max_num_transforms=2, |
| random_order=False, |
| ) |
| dataset_with_transforms = LeRobotDataset( |
| repo_id=repo_id, image_transforms=ImageTransforms(transforms_config) |
| ) |
|
|
| |
| if len(dataset_original) > 0: |
| frame_idx = 0 |
| original_sample = dataset_original[frame_idx] |
| transformed_sample = dataset_with_transforms[frame_idx] |
|
|
| print(f"Saving comparison images (frame {frame_idx}):") |
|
|
| for cam_key in dataset_original.meta.camera_keys: |
| if cam_key in original_sample and cam_key in transformed_sample: |
| cam_name = cam_key.replace(".", "_").replace("/", "_") |
|
|
| |
| save_image(original_sample[cam_key], f"{cam_name}_original.png") |
| save_image(transformed_sample[cam_key], f"{cam_name}_transformed.png") |
|
|
| except Exception as e: |
| print(f"Could not load dataset '{repo_id}': {e}") |
|
|
|
|
| def example_2_custom_transforms(): |
| """Example 2: Create custom transform configuration and save examples""" |
| print("\n Example 2: Custom Transform Configuration") |
|
|
| repo_id = "pepijn223/record_main_0" |
|
|
| try: |
| |
| custom_transforms_config = ImageTransformsConfig( |
| enable=True, |
| max_num_transforms=2, |
| random_order=True, |
| tfs={ |
| "brightness": ImageTransformConfig( |
| weight=1.0, |
| type="ColorJitter", |
| kwargs={"brightness": (0.5, 1.5)}, |
| ), |
| "contrast": ImageTransformConfig( |
| weight=1.0, |
| type="ColorJitter", |
| kwargs={"contrast": (0.6, 1.4)}, |
| ), |
| "sharpness": ImageTransformConfig( |
| weight=0.5, |
| type="SharpnessJitter", |
| kwargs={"sharpness": (0.2, 2.0)}, |
| ), |
| }, |
| ) |
|
|
| dataset_with_custom_transforms = LeRobotDataset( |
| repo_id=repo_id, image_transforms=ImageTransforms(custom_transforms_config) |
| ) |
|
|
| |
| if len(dataset_with_custom_transforms) > 0: |
| sample = dataset_with_custom_transforms[0] |
| print("Saving custom transform examples:") |
|
|
| for cam_key in dataset_with_custom_transforms.meta.camera_keys: |
| if cam_key in sample: |
| cam_name = cam_key.replace(".", "_").replace("/", "_") |
| save_image(sample[cam_key], f"{cam_name}_custom_transforms.png") |
|
|
| except Exception as e: |
| print(f"Could not load dataset '{repo_id}': {e}") |
|
|
|
|
| def example_3_torchvision_transforms(): |
| """Example 3: Use pure torchvision transforms and save examples""" |
| print("\n Example 3: Pure Torchvision Transforms") |
|
|
| repo_id = "pepijn223/record_main_0" |
|
|
| try: |
| |
| torchvision_transforms = v2.Compose( |
| [ |
| v2.ColorJitter(brightness=0.3, contrast=0.3, saturation=0.3, hue=0.1), |
| v2.GaussianBlur(kernel_size=3, sigma=(0.1, 2.0)), |
| v2.RandomRotation(degrees=10), |
| ] |
| ) |
|
|
| dataset_with_torchvision = LeRobotDataset(repo_id=repo_id, image_transforms=torchvision_transforms) |
|
|
| |
| if len(dataset_with_torchvision) > 0: |
| sample = dataset_with_torchvision[0] |
| print("Saving torchvision transform examples:") |
|
|
| for cam_key in dataset_with_torchvision.meta.camera_keys: |
| if cam_key in sample: |
| cam_name = cam_key.replace(".", "_").replace("/", "_") |
| save_image(sample[cam_key], f"{cam_name}_torchvision.png") |
|
|
| except Exception as e: |
| print(f"Could not load dataset '{repo_id}': {e}") |
|
|
|
|
| def main(): |
| """Run all examples""" |
| print("LeRobot Dataset Image Transforms Examples") |
|
|
| example_1_default_transforms() |
| example_2_custom_transforms() |
| example_3_torchvision_transforms() |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|