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 PyTorch , Keras , Tensorflow 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
- Kaggle . Kaggle Grandmaster, Kaggle Masters, Kaggle Expert.
- , Deepfake Challenge , Albumentations .
- PyTorch ecosystem
- 5700 GitHub.
- 80 . .
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 HorizontalFlip , GridDistortion , RandomCrop .
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
- Fiche de conversion complète
- Transformations de masque pour les tâches de segmentation
- Augmentation de la détection d'objets des boîtes englobantes
- Transformations des points clés
- Conversion synchrone des masques, des boîtes et des points clés
- Avec quelle probabilité les transformations sont-elles appliquées dans le pipeline?
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.