Multi-Target chez Albumentations





Ce texte est une traduction du billet de blog Multi-Target in Albumentations du 27 juillet 2020. L'auteur est sur Habré , mais j'étais trop paresseux pour traduire le texte en russe. Et cette traduction a été faite à sa demande.



J'ai traduit tout ce que je peux en russe, mais certains termes techniques en anglais semblent plus naturels. Ils sont laissés sous cette forme. Si une traduction adéquate vous vient à l'esprit - commentez et corrigez-la.



L'augmentation d'image est une technique de régularisation interprétée. Vous convertissez les données balisées existantes en nouvelles données, augmentant ainsi la taille de l'ensemble de données.







Vous pouvez utiliser des Albumentations dans PyTorchKerasTensorflow ou tout autre framework capable de traiter une image comme un tableau numpy.



La bibliothèque fonctionne mieux avec les tâches standard de classification, de segmentation, de détection d'objets et de points clés. Les problèmes sont légèrement moins courants lorsque chaque élément de l'échantillon d'apprentissage contient non pas un, mais plusieurs objets différents.



Pour ce genre de situations, la fonctionnalité multi-cibles a été ajoutée.

Situations où cela pourrait être utile:



  • Réseaux siamois
  • Traitement des images en vidéo
  • Tâches Image2image
  • Multilabel semantic segmentation
  • Instance segmentation
  • Panoptic segmentation






Depuis trois ans, nous travaillons à l'optimisation des fonctionnalités et des performances.



Pour l'instant, nous nous concentrons sur la   documentation  et les  tutoriels.



Au moins une fois par semaine, les utilisateurs demandent d'ajouter la prise en charge de la transformation pour plusieurs masques de segmentation.





Nous l'avons depuis longtemps.



Dans cet article, nous partagerons des exemples sur la façon de travailler avec plusieurs cibles dans les albumentations.



Scénario 1: une image, un masque







Le cas d'utilisation le plus courant est la segmentation d'image. Vous avez une image et un masque. Vous souhaitez leur appliquer un ensemble de transformations spatiales et elles doivent être du même ensemble.



Dans ce code, nous utilisons   HorizontalFlip  et  ShiftScaleRotate .



import albumentations as A

transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.ShiftScaleRotate(border_mode=cv2.BORDER_CONSTANT, 
                          scale_limit=0.3,
                          rotate_limit=(10, 30),
                          p=0.5)
], p=1)

transformed = transform(image=image, mask=mask)

image_transformed = transformed['image']
mask_transformed = transformed['mask']


-> Lien vers gistfile1.py







Scénario 2: une image et plusieurs masques







Pour certaines tâches, vous pouvez avoir plusieurs étiquettes correspondant au même pixel.



Appliquons   HorizontalFlipGridDistortionRandomCrop .



import albumentations as A

transform = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.GridDistortion(p=0.5),    
    A.RandomCrop(height=1024, width=1024, p=0.5),    
], p=1)

transformed = transform(image=image, masks=[mask, mask2])

image_transformed = transformed['image']
mask_transformed = transformed['masks'][0]
mask2_transformed = transformed['masks'][1]


-> Lien vers gistfile1.py



Scénario 3: plusieurs images, masques, points clés et boîtes







Vous pouvez appliquer des transformations spatiales à plusieurs cibles.



Dans cet exemple, nous avons deux images, deux masques, deux boîtes et deux ensembles de points clés.



Appliquons une séquence de  HorizontalFlip  et  ShiftScaleRotate .



 import albumentations as A

transform = A.Compose([A.HorizontalFlip(p=0.5),
                       A.ShiftScaleRotate(border_mode=cv2.BORDER_CONSTANT, scale_limit=0.3, p=0.5)],
                         bbox_params=albu.BboxParams(format='pascal_voc', label_fields=['category_ids']),
                         keypoint_params=albu.KeypointParams(format='xy'),
                         additional_targets={
                             "image1": "image",
                             "bboxes1": "bboxes",
                             "mask1": "mask",
                             'keypoints1': "keypoints"},
                         p=1)

transformed = transform(image=image,
                        image1=image1,
                        mask=mask,
                        mask1=mask1,
                        bboxes=bboxes,
                        bboxes1=bboxes1,
                        keypoints=keypoints,
                        keypoints1=keypoints1,
                        category_ids=["face"]
                        )

image_transformed = transformed['image']
image1_transformed = transformed['image1']

mask_transformed = transformed['mask']
mask1_transformed = transformed['mask1']

bboxes_transformed = transformed['bboxes']
bboxes1_transformed = transformed['bboxes1']

keypoints_transformed = transformed['keypoints']
keypoints1_transformed = transformed['keypoints1']


Lien vers gistfile1.py







Q: Est-il possible de travailler avec plus de deux images?

R: Vous pouvez prendre autant d'images que vous le souhaitez.



Q: Le nombre d'images, de masques, de boîtes et de points clés doit-il être le même?

R: Vous pouvez avoir N images, M masques, K points clés et B. cases. N, M, K et B peuvent être différents.



Q: Y a-t-il des situations dans lesquelles la fonctionnalité multi-cible ne fonctionne pas ou ne fonctionne pas comme prévu?

R: En général, vous pouvez utiliser des cibles multiples pour un ensemble d'images de différentes tailles. Certaines transformations dépendent de l'entrée. Par exemple, vous ne pouvez pas recadrer un recadrage plus grand que l'image elle-même. Un autre exemple: MaskDropout , qui peut dépendre du masque d'origine. Comment il se comportera lorsque nous aurons un ensemble de masques n'est pas clair. En pratique, ils sont extrêmement rares.



Q: Combien de transformations peuvent être combinées ensemble?

R : Vous pouvez combiner des transformations dans un pipeline complexe de différentes manières.



La bibliothèque contient plus de 30 transformations spatiales . Ils prennent tous en charge les images et les masques, la plupart des boîtes de support et des points clés.





Lien vers la source



Ils peuvent être combinés avec   plus de 40 transformations qui modifient les valeurs de pixels d'une image. Par exemple:  RandomBrightnessContrast Blur, ou quelque chose de plus exotique comme  RandomRain .



Documentation supplémentaire





Conclusion



Travailler sur un projet open-source est difficile, mais très excitant. Je tiens à remercier l'équipe de développement:





et tous les contributeurs qui ont aidé à créer la bibliothèque et à l'amener à son niveau actuel.



All Articles