albumentations

Par mkurman · zorai

npx skills add https://github.com/mkurman/zorai --skill albumentations

name: albumentations description: "Bibliothèque rapide d'augmentation d'images (Albumentations). 70+ transformations pour classification, segmentation, détection d'objets, points clés et estimation de pose. Pipeline optimisé basé sur OpenCV avec API unifiée pour toutes les tâches de vision par ordinateur. Prend en charge les images, masques, boîtes englobantes et points clés simultanément. Note : Albumentations classique (MIT) n'est plus maintenu ; le successeur AlbumentationsX utilise AGPL-3.0. Pour les augmentations natives de torchvision, utilisez torchvision.transforms.v2." license: MIT license tags: [image-augmentation, object-detection, semantic-segmentation, keypoint-augmentation, albumentations] metadata: skill-author: K-Dense Inc. -------|---------------|----------| | Pixel-level | BrightnessContrast, Gamma, HueSaturationValue, CLAHE, Blur, GaussNoise, ISONoise, RGBShift, ChannelShuffle, ToGray, Solarize, Posterize, Equalize, ColorJitter | Variation de couleur/éclairage | | Spatial-level | RandomCrop, CenterCrop, Resize, Rotate, Flip, ShiftScaleRotate, Affine, ElasticTransform, GridDistortion, OpticalDistortion, Perspective, PiecewiseAffine | Variation géométrique | | Weather | RandomRain, RandomSnow, RandomFog, RandomSunFlare | Conditions adverses | | Advanced | CoarseDropout, Cutout, MixUp, Mosaic | Régularisation, réduction du décalage domaine | | Special | CLAHE, Emboss, Sharpen, Superpixels, FDA, HistogramMatching, PixelDistributionAdaptation | Médical, adaptation de domaine |

5. Probabilité et composition OneOf

# OneOf: appliquer exactement une transformation d'une liste
transform = A.Compose([
    A.OneOf([
        A.RandomBrightnessContrast(p=1.0),
        A.RandomGamma(p=1.0),
        A.HueSaturationValue(p=1.0),
    ], p=0.8),
    A.HorizontalFlip(p=0.5),
])

# SomeOf: appliquer jusqu'à N transformations d'une liste
transform = A.Compose([
    A.SomeOf([
        A.GaussNoise(p=1.0),
        A.ISONoise(p=1.0),
        A.MultiplicativeNoise(p=1.0),
    ], n=2, replace=False, p=0.5),
])

# Probabilité par transformation
transform = A.Compose([
    A.RandomCrop(256, 256, p=1.0),       # Toujours appliquée
    A.HorizontalFlip(p=0.5),             # 50% de chance
    A.RandomBrightnessContrast(p=0.2),    # 20% de chance
])

6. Formats de boîtes englobantes

# Formats supportés :
# pascal_voc: [x_min, y_min, x_max, y_max] (pixels)
# albumentations: normalisé [x_center, y_center, width, height]
# coco: [x_min, y_min, width, height] (pixels)
# yolo: normalisé [x_center, y_center, width, height]

transform = A.Compose([
    A.HorizontalFlip(p=0.5),
], bbox_params=A.BboxParams(
    format="coco",
    min_visibility=0.3,      # Supprimer les bbox <30% visibles après transformation
    label_fields=["class_labels", "class_ids"],  # Champs supplémentaires à transformer
))

7. Mode Replay (augmentations reproductibles)

Appliquer les mêmes paramètres d'augmentation à plusieurs images :

transform = A.Compose([
    A.RandomCrop(256, 256),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.5),
])

# Appliquer à la première image, obtenir les paramètres de replay
data = transform(image=image1, mask=mask1)
replay_params = data["replay"]

# Réappliquer les MÊMES transformations à la deuxième image
data2 = A.ReplayCompose.replay(replay_params, image=image2, mask=mask2)

8. Sérialisation (sauvegarder/charger des pipelines)

import albumentations as A

transform = A.Compose([
    A.RandomCrop(256, 256),
    A.HorizontalFlip(p=0.5),
    A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])

# Sauvegarder en YAML/JSON
A.save(transform, "augmentation_pipeline.yaml")
A.save(transform, "augmentation_pipeline.json")

# Charger
loaded = A.load("augmentation_pipeline.yaml")

9. Intégration PyTorch

import albumentations as A
from albumentations.pytorch import ToTensorV2

train_transform = A.Compose([
    A.RandomResizedCrop(224, 224),
    A.HorizontalFlip(p=0.5),
    A.ColorJitter(brightness=0.2, contrast=0.2, p=0.5),
    A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ToTensorV2(),  # Convertir HWC numpy → CHW tensor
])

val_transform = A.Compose([
    A.Resize(256, 256),
    A.CenterCrop(224, 224),
    A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
    ToTensorV2(),
])

# Dans PyTorch Dataset :
class MyDataset(Dataset):
    def __getitem__(self, idx):
        image = cv2.imread(self.images[idx])
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

        if self.transform:
            augmented = self.transform(image=image)
            image = augmented["image"]

        return image, self.labels[idx]

10. Transformations avancées

MixUp (fusion alpha de deux images) :

transform = A.Compose([
    A.MixUp(reference_data=reference_dataset, alpha=0.4, p=0.5),
    A.HorizontalFlip(p=0.5),
])

CoarseDropout (régularisation Cutout) :

transform = A.Compose([
    A.CoarseDropout(max_holes=8, max_height=32, max_width=32, p=0.5),
])

FDA (adaptation de domaine Fourier) :

# Échanger les composantes basse fréquence entre images du domaine source et cible
transform = A.Compose([
    A.FDA(reference_images=target_domain_images, beta_limit=0.1, p=0.5),
])

Motifs clés

  1. Toujours convertir BGR en RGB lors de l'utilisation d'OpenCV — Albumentations travaille en RGB
  2. Utiliser A.Compose avec probabilités pour contrôler la force d'augmentation
  3. Utiliser OneOf pour les transformations mutuellement exclusives (par exemple, choisir une méthode de flou)
  4. Normaliser à la FIN du pipeline — après toutes les autres transformations
  5. Utiliser ToTensorV2() pour une conversion PyTorch transparente
  6. Mode Replay pour des augmentations cohérentes entre paires d'images (stéréo, temporelle)
  7. Sauvegarder/charger des pipelines pour la reproductibilité entre exécutions d'entraînement
  8. Albumentations est sous licence MIT mais non maintenu — considérer AlbumentationsX pour les projets actifs

Références

Skills similaires