Multi-Target di Albumentations





Teks ini adalah terjemahan dari posting blog Multi-Target dalam Albumentations tertanggal 27 Juli 2020. Penulis ada di Habré , tapi saya terlalu malas untuk menerjemahkan teks ke dalam bahasa Rusia. Dan terjemahan ini dibuat atas permintaannya.



Saya telah menerjemahkan semua yang saya bisa ke dalam bahasa Rusia, tetapi beberapa istilah teknis dalam bahasa Inggris terdengar lebih alami. Mereka tertinggal dalam bentuk ini. Jika terjemahan yang memadai muncul di benak Anda - komentari dan perbaiki.



Augmentasi gambar adalah teknik regularisasi yang ditafsirkan. Anda mengonversi data yang diberi tag ke data baru, sehingga meningkatkan ukuran kumpulan data.







Anda dapat menggunakan Albumentations di PyTorchKerasTensorflow, atau kerangka kerja lainnya yang dapat memproses gambar sebagai array numpy.



Pustaka berfungsi paling baik dengan tugas standar klasifikasi, segmentasi, deteksi objek, dan poin-poin penting. Masalah yang sedikit kurang umum adalah saat setiap elemen sampel pelatihan berisi tidak hanya satu, tetapi banyak objek yang berbeda.



Untuk situasi seperti ini, fungsionalitas multi-target telah ditambahkan.

Situasi di mana ini mungkin berguna:



  • Jaringan Siam
  • Memproses frame dalam video
  • Image2image Tasks
  • Multilabel semantic segmentation
  • Instance segmentation
  • Panoptic segmentation






Selama tiga tahun terakhir kami telah mengerjakan pengoptimalan fungsionalitas dan kinerja.



Untuk saat ini, kami fokus pada   dokumentasi  dan  tutorial.



Setidaknya seminggu sekali, pengguna meminta untuk menambahkan dukungan transformasi untuk beberapa masker segmentasi.





Kami sudah memilikinya sejak lama.



Pada artikel ini, kami akan membagikan contoh bagaimana bekerja dengan banyak target dalam albumentation.



Skenario 1: Satu Gambar, Satu Topeng







Kasus penggunaan yang paling umum adalah segmentasi gambar. Anda memiliki gambar dan topeng. Anda ingin menerapkan satu set transformasi spasial padanya, dan mereka harus set yang sama.



Dalam kode ini, kami menggunakan   HorizontalFlip  dan  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']


-> Tautan ke gistfile1.py







Skenario 2: Satu gambar dan banyak topeng







Untuk beberapa tugas, Anda mungkin memiliki beberapa label yang sesuai dengan piksel yang sama.



Mari terapkan   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]


-> Tautan ke gistfile1.py



Skenario 3: Beberapa Gambar, Masker, Poin Utama, dan Kotak







Anda dapat menerapkan transformasi spasial ke beberapa target.



Dalam contoh ini, kami memiliki dua gambar, dua topeng, dua kotak, dan dua set titik kunci.



Mari terapkan urutan  HorizontalFlip  dan  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']


Tautan ke gistfile1.py







T: Apakah mungkin bekerja dengan lebih dari dua gambar?

J: Anda dapat mengambil gambar sebanyak yang Anda suka.



T: Haruskah jumlah gambar, topeng, kotak, dan titik kunci sama?

J: Anda dapat memiliki gambar N, M topeng, K titik kunci dan kotak B. N, M, K dan B bisa berbeda.



T: Apakah ada situasi di mana fungsionalitas multi target tidak berfungsi atau tidak berfungsi seperti yang diharapkan?

J: Secara umum, Anda dapat menggunakan multi-target untuk sekumpulan gambar dengan ukuran berbeda. Beberapa transformasi bergantung pada input. Misalnya, Anda tidak dapat memotong potongan yang lebih besar dari gambar itu sendiri. Contoh lain: MaskDropout , yang mungkin bergantung pada topeng aslinya. Bagaimana dia akan berperilaku ketika kita memiliki satu set topeng tidak jelas. Dalam praktiknya, mereka sangat jarang.



T: Berapa banyak transformasi yang dapat Anda gabungkan?

J : Anda dapat menggabungkan transformasi menjadi pipeline yang kompleks dengan berbagai cara.



Perpustakaan berisi lebih dari 30 transformasi spasial . Semuanya mendukung gambar dan topeng, sebagian besar kotak dukungan dan titik tombol.





Tautkan ke sumber



Mereka dapat dikombinasikan dengan   lebih dari 40 transformasi yang mengubah nilai piksel suatu gambar. Misalnya:  RandomBrightnessContrast Blur, atau sesuatu yang lebih eksotis seperti  RandomRain .



Dokumentasi tambahan





Kesimpulan



Mengerjakan proyek open source itu sulit, tetapi sangat mengasyikkan. Saya ingin berterima kasih kepada tim pengembangan:





dan semua kontributor yang membantu membuat perpustakaan dan membawanya ke level saat ini.



All Articles