Multi-objetivo en albumentarias





Este texto es una traducción de la publicación de blog Multi-Target in Albumentations con fecha del 27 de julio de 2020. El autor está en Habré , pero fui demasiado perezoso para traducir el texto al ruso. Y esta traducción se hizo a pedido suyo.



He traducido todo lo que he podido al ruso, pero algunos términos técnicos en inglés suenan más naturales. Se dejan en esta forma. Si se le ocurre una traducción adecuada, coméntela y corríjala.



El aumento de imágenes es una técnica de regularización interpretada. Convierte datos etiquetados existentes en datos nuevos, lo que aumenta el tamaño del conjunto de datos.







Puede usar Albumentations en PyTorchKerasTensorflow o cualquier otro marco que pueda procesar una imagen como una matriz numpy.



La biblioteca funciona mejor con tareas estándar de clasificación, segmentación, detección de objetos y puntos clave. Un poco menos comunes son los problemas cuando cada elemento de la muestra de entrenamiento contiene no uno, sino muchos objetos diferentes.



Para este tipo de situaciones, se ha agregado la funcionalidad multi-target.

Situaciones en las que esto puede resultar útil:



  • Redes siamesas
  • Procesamiento de cuadros en video
  • Tareas de Image2image
  • Multilabel semantic segmentation
  • Instance segmentation
  • Panoptic segmentation






Durante los últimos tres años hemos estado trabajando en la optimización de la funcionalidad y el rendimiento.



Por ahora, nos centramos en la   documentación  y los  tutoriales.



Al menos una vez a la semana, los usuarios solicitan agregar soporte de transformación para múltiples máscaras de segmentación.





Lo hemos tenido durante mucho tiempo.



En este artículo, compartiremos ejemplos de cómo trabajar con múltiples objetivos en albumentarias.



Escenario 1: una imagen, una máscara







El caso de uso más común es la segmentación de imágenes. Tienes una imagen y una máscara. Desea aplicarles un conjunto de transformaciones espaciales, y deben ser el mismo conjunto.



En este código, estamos usando   HorizontalFlip  y  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']


-> Enlace a gistfile1.py







Escenario 2: una imagen y varias máscaras







Para algunas tareas, puede tener varias etiquetas correspondientes al mismo píxel.



Apliquemos   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]


-> Enlace a gistfile1.py



Escenario 3: varias imágenes, máscaras, puntos clave y cuadros







Puede aplicar transformaciones espaciales a varios objetivos.



En este ejemplo, tenemos dos imágenes, dos máscaras, dos cuadros y dos conjuntos de puntos clave.



Apliquemos una secuencia de  HorizontalFlip  y  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']


Enlace a gistfile1.py







P: ¿Es posible trabajar con más de dos imágenes?

R: Puede tomar tantas imágenes como desee.



P: ¿Debería ser el mismo el número de imágenes, máscaras, recuadros y puntos clave?

R: Puede tener N imágenes, M máscaras, K puntos clave y B cuadros. N, M, K y B pueden ser diferentes.



P: ¿Hay situaciones en las que la funcionalidad de varios objetivos no funciona o no funciona como se esperaba?

R: En general, puede utilizar varios objetivos para un conjunto de imágenes de diferentes tamaños. Algunas transformaciones dependen de la entrada. Por ejemplo, no puede recortar un recorte que sea más grande que la propia imagen. Otro ejemplo: MaskDropout , que puede depender de la máscara original. No está claro cómo se comportará cuando tengamos un juego de máscaras. En la práctica, son extremadamente raros.



P: ¿Cuántas transformaciones se pueden combinar?

R : Puede combinar transformaciones en una tubería compleja de muchas formas diferentes.



La biblioteca contiene más de 30 transformaciones espaciales . Todos admiten imágenes y máscaras, la mayoría de ellos apoyan cuadros y puntos clave.





Enlace a la fuente



Se pueden combinar con   más de 40 transformaciones que cambian los valores de píxeles de una imagen. Por ejemplo:  RandomBrightnessContrast Blur, o algo más exótico como  RandomRain .



Documentación adicional





Conclusión



Trabajar en un proyecto de código abierto es desafiante pero muy emocionante. Me gustaría agradecer al equipo de desarrollo:





y todos los colaboradores que ayudaron a crear la biblioteca y llevarla a su nivel actual.



All Articles