[PYTHON] Nouvelle augmentation des données? [Grid Mix]

introduction

Vous pourriez penser, "Grid Mix? Je n'en ai jamais entendu parler." C'est vrai. Inspiré par Grid Mask et Cut Mix ** Je l'ai fait moi-même ** Augmentation comme indiqué ci-dessous. J'ai essayé un peu de voir si ça marche, donc je vais le laisser comme mémo. mixed_img.png

Aperçu

Objectif: qu'avez-vous fait

Conclusion: comment c'était

** Précision: La méthode proposée (Grid Mix) est légèrement meilleure ** ** Convergence: La méthode existante (CutMix) est excellente ** ** Réglage: la méthode proposée (Grid Mix) peut être plus gênante **

Je ne suis pas sûr car c'est juste pour le plaisir, mais j'ai pu confirmer le potentiel minimum.

Contexte

Présentation de Grid Mask

L'une des augmentations de données récemment annoncées est Grid Mask. Comme le montre la figure ci-dessous, il s'agit d'une méthode qui masque l'image dans un motif de grille, ce qui est supérieur à la méthode conventionnelle telle que la découpe.

Présentation de CutMix

Étant donné que diverses personnes l'ont déjà introduit dans Qiita, etc., je vais omettre les détails, mais ce sera une méthode pour découper au hasard une partie de l'image, la coller sur une autre image et donner un rapport étiquette par zone. Je vais. 3.png Document source: https://arxiv.org/abs/1905.04899

CutMix ⇒ Motivation pour GridMix

J'ai toujours eu des doutes sur CutMix. La quantité d'informations semble être plus grande près du centre, mais je me demande s'il est acceptable de simplement décider de l'étiquette en fonction du rapport de superficie.

Par exemple, dans la figure ci-dessous, la moitié des zones sont des chats et l'autre moitié sont des chiens, mais je pense qu'il est difficile de diviser les étiquettes en deux. Cela me ressemble seulement. 2.png

approche

Avec un modèle commun, la formation est effectuée sur l'ensemble de données cifer10 dans les trois cas suivants pour comparer la précision.

  1. Aucune augmentation
  2. Augmentation CutMix (méthode existante)
  3. GridMix (méthode proposée)

Modèle à utiliser

CNN peu profond de couche Conv8 (non pré-entraîné) input shape: 32x32x3

GridMix Augmentation La méthode proposée est comme un enfant de CutMix et GridMask, qui mélange des images avec une grille de taille appropriée. ** Le masque est essentiellement un motif en damier, mais il est probable qu'un motif de maillage ou aucun mélange ne se produise. ** **

La figure ci-dessous montre le motif en damier, le motif de maillage et aucun mélange dans l'ordre à partir de la gauche. gridmiximg.png

** Si seul le motif en damier était utilisé, le rapport de mélange était constant à environ 0,5 et la convergence était médiocre **, j'ai donc essayé de le rendre facile dans certains cas. En ajoutant un motif de maillage, il est possible de reproduire quelque chose de proche de la méthode existante CutMix.

def grid_mixer(img_1, img_2, interval_h, interval_w, thresh=0.3):
    #make checkerboad
    h, w, _ = img_1.shape
    h_start = np.random.randint(0,2*interval_h)
    w_start = np.random.randint(0,2*interval_w)
    h_grid = ((np.arange(h_start, h_start+h)//interval_h)%2).reshape(-1,1)
    w_grid = ((np.arange(w_start, w_start+w)//interval_w)%2).reshape(1,-1)
    checkerboard = np.abs(h_grid-w_grid)
    
    #reverse vertical and/or horizontal
    if np.random.rand()<thresh:
        checkerboard += h_grid*w_grid
    if np.random.rand()<thresh:
        checkerboard += (1-h_grid)*(1-w_grid)

    #mix images
    mixed_img = img_1*checkerboard[:, :, np.newaxis]+img_2*(1-checkerboard[:, :, np.newaxis])
    mix_rate = np.sum(checkerboard)/(h*w)
    return mixed_img, mix_rate

h,w,_=img_1.shape
interval_h = h//np.random.uniform(2, 4)
interval_w = w//np.random.uniform(2, 4)                        
img, mix_rate = grid_mixer(img_1, img_m_2, interval_h, interval_w, 0.3)

Comme indiqué ci-dessous, le manche est qu'il y a quelques paramètres.

** Espacement de la grille: ** Si la largeur de la grille est trop fine, il semble qu'elle ne puisse être captée que dans des couches peu profondes (puisque la taille par défaut de cifer-10 est de 32x32), j'ai donc défini l'image pour qu'elle soit divisée en 2 à 4 parties verticalement et horizontalement. Je pense que ce domaine dépend aussi du modèle. Le rapport hauteur / largeur de la grille est également défini pour être aléatoire, mais l'effet n'a pas été confirmé.

** Seuil de passage du motif à damier au motif maillé: ** Le masque horizontal est exclu avec une probabilité de 30% et le masque vertical est exclu avec une probabilité de 30%. En conséquence, 49% auront un motif en damier, 42% auront un motif en maille et les 9% restants n'auront aucun mélange. Après tout, cela fait la même chose que d'ajuster la distribution β utilisée dans CutMix et ainsi de suite.

Conditions d'apprentissage

Évaluation des résultats

Le tableau ci-dessous montre les valeurs moyennes exécutées trois fois après le réglage de la fréquence d'apprentissage et des paramètres de planification.

Case Epochs Val_Accuracy Val_Loss
No Augmentation 25 0.805 0.710
CutMix (beta=alpha=0.7) 32 0.841 0.505
GridMix 45 0.852 0.463

Grid Mix est lent à converger ... Vous voudrez peut-être couper les premières époques. Mais la précision est un peu meilleure. Ce n'est qu'un cas au plus, mais je ressens une petite possibilité.

Résumé

En conclusion, ** CutMixing comme une Grid peut être meilleur que CutMix normal **. La vérification étant insuffisante, elle n’est que possible. Je ne peux rien dire sans essayer un peu plus. Si quelqu'un en a envie, il pleurera et sera heureux si vous essayez. Si ça ne marche pas du tout, je pleure et je m'excuse.

Recommended Posts

Nouvelle augmentation des données? [Grid Mix]
Augmentation des données avec openCV
Apprenez de nouvelles données avec PaintsChainer
[PyTorch] Augmentation des données pour la segmentation
Comment augmenter les données avec PyTorch