[PYTHON] Neue Datenerweiterung? [Grid Mix]

Einführung

Sie könnten denken: "Grid Mix? Ich habe noch nie davon gehört." Korrekt. Inspiriert von Grid Mask und Cut Mix ** habe ich es selbst gemacht ** Augmentation wie unten gezeigt. Ich habe ein wenig versucht zu sehen, ob es funktioniert, also werde ich es als Memo hinterlassen. mixed_img.png

Überblick

Zweck: Was hast du gemacht?

Fazit: Wie war es?

** Genauigkeit: Die vorgeschlagene Methode (Grid Mix) ist etwas besser ** ** Konvergenz: Die vorhandene Methode (CutMix) ist ausgezeichnet ** ** Abstimmung: Die vorgeschlagene Methode (Grid Mix) kann problematischer sein **

Ich bin mir nicht sicher, weil es nur zum Spaß ist, aber ich konnte das minimale Potenzial bestätigen.

Hintergrund

Einführung in die Gittermaske

Eine der kürzlich angekündigten Datenerweiterungen ist die Gittermaske. Wie in der folgenden Abbildung gezeigt, ist es eine Methode, die das Bild in einem Rastermuster maskiert, das der herkömmlichen Methode wie dem Ausschneiden überlegen ist.

Einführung in CutMix

Da verschiedene Leute dies bereits in Qiita usw. eingeführt haben, werde ich die Details weglassen, aber es wird eine Methode sein, einen Teil des Bildes zufällig auszuschneiden, es auf ein anderes Bild einzufügen und ein Verhältnis von Beschriftung zu Fläche zu geben. Ich werde. 3.png Quellpapier: https://arxiv.org/abs/1905.04899

CutMix ⇒ Motivation für GridMix

Ich hatte schon immer Zweifel an CutMix. Es scheint, dass die Informationsmenge in der Nähe des Zentrums größer ist, aber ich frage mich, ob es in Ordnung ist, das Etikett einfach anhand des Flächenverhältnisses zu bestimmen.

In der folgenden Abbildung sind beispielsweise die Hälfte der Bereiche Katzen und die Hälfte Hunde, aber ich denke, es ist umständlich, die Etiketten in zwei Hälften zu teilen. Es sieht für mich nur so aus. 2.png

Ansatz

Mit einem gemeinsamen Modell wird in den folgenden drei Fällen ein Training für den cifer10-Datensatz durchgeführt, um die Genauigkeit zu vergleichen.

  1. Keine Augmentation
  2. CutMix Augmentation (vorhandene Methode)
  3. GridMix (vorgeschlagene Methode)

Modell zu verwenden

Conv8 Schicht flaches CNN (nicht vorgeübt) input shape: 32x32x3

GridMix Augmentation Die vorgeschlagene Methode ähnelt einem untergeordneten Element von CutMix und GridMask, bei dem Bilder mit einem Raster geeigneter Größe gemischt werden. ** Die Maske ist im Grunde ein Schachbrettmuster, aber es ist wahrscheinlich, dass ein Netzmuster oder keine Mischung auftritt. ** **.

Die folgende Abbildung zeigt das Schachbrettmuster, das Netzmuster und keine Mischung in der Reihenfolge von links. gridmiximg.png

** Wenn nur das Schachbrettmuster verwendet wurde, war das Mischungsverhältnis konstant bei etwa 0,5 und die Konvergenz war schlecht **, daher habe ich versucht, es in einigen Fällen einfach zu machen. Durch Hinzufügen eines Netzmusters ist es möglich, etwas zu reproduzieren, das der vorhandenen Methode CutMix nahe kommt.

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)

Wie unten gezeigt, gibt es am Hals einige Parameter.

** Gitterabstand: ** Wenn die Rasterbreite zu fein ist, kann sie anscheinend nur in flachen Schichten aufgenommen werden (da die Standardgröße von Cifer-10 32 x 32 ist). Daher habe ich das Bild so eingestellt, dass es vertikal und horizontal in 2 bis 4 Teile unterteilt ist. Ich bin der Meinung, dass dieser Bereich auch vom Modell abhängt. Das Seitenverhältnis des Gitters ist ebenfalls zufällig eingestellt, der Effekt wurde jedoch nicht bestätigt.

** Umschalten des Schwellenwerts vom Schachbrettmuster zum Netzmuster: ** Die horizontale Maske wird mit einer Wahrscheinlichkeit von 30% und die vertikale Maske mit einer Wahrscheinlichkeit von 30% ausgeschlossen. Infolgedessen haben 49% ein Schachbrettmuster, 42% ein Maschenmuster und die restlichen 9% keine Mischung. Schließlich funktioniert es genauso wie das Anpassen der in CutMix verwendeten β-Verteilung und so weiter.

Lernbedingungen

Ergebnisbewertung

Die folgende Tabelle zeigt den Durchschnittswert, der dreimal nach dem Einstellen der Lernrate und der Zeitplanparameter ausgeführt wird.

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 konvergiert nur langsam ... Vielleicht möchten Sie die ersten Epochen abschneiden. Aber die Genauigkeit ist etwas besser. Es ist höchstens ein Fall, aber ich fühle eine kleine Möglichkeit.

Zusammenfassung

Zusammenfassend kann ** CutMixing wie ein Raster besser sein als normales CutMix **. Da die Überprüfung unzureichend ist, ist dies nur möglich. Ich kann nichts sagen, ohne ein bisschen mehr zu versuchen. Wenn jemand Lust dazu hat, wird er weinen und glücklich sein, wenn Sie es versuchen. Wenn es überhaupt nicht funktioniert, weine ich und entschuldige mich.

Recommended Posts

Neue Datenerweiterung? [Grid Mix]
Datenerweiterung mit openCV
Lernen Sie neue Daten mit PaintsChainer
[PyTorch] Datenerweiterung zur Segmentierung
Aufblasen von Daten (Datenerweiterung) mit PyTorch