[PYTHON] Rekonstruktion von bewegten Bildern mit dem Autoencoder unter Verwendung von 3D-CNN

Überblick

Wie geht es allen. Ich denke, dass die Epidemie der neuen Coronavirus-Infektion etwas abgeklungen ist und viele Menschen allmählich zur Arbeit oder zur Schule zurückkehren. Dieses Mal möchte ich mich auf die Rekonstruktionsaufgabe konzentrieren, bei der das Generierungsmodell wieder verwendet wird. Insbesondere ** werde ich versuchen, das "Video" zu rekonstruieren. ** ** ** (Was Sie in diesem Artikel verstehen können, sind die experimentellen Ergebnisse und die Berücksichtigung der Rekonstruktionsmethode unter Verwendung der Encoder-Decoder-basierten ** 3D-Faltung, die erweitert werden kann, um Anomalien in bewegten Bildern zu erkennen, und ** Theorien wie mathematische Formeln. Ich werde dem Hintergrund nicht folgen.) ** Die gesamte Implementierung ist unter [hier] verfügbar (https://github.com/satolab12/3D-CNN-Autoencoder). ** Implementiert von PyTorch.

Im vorherigen Artikel Überprüfung und Implementierung der Videorekonstruktionsmethode mit GRU und Autoencoder haben wir das folgende Modell betrachtet.

図4.png

Der Grund, warum ich über dieses Modell nachgedacht habe, ist, dass die latenten Variablen als Seriendaten ausgedrückt werden können. Mit anderen Worten, 3d-conv codiert ein Video in eine einzelne latente Variable, aber das ist doch übertrieben, oder? Das war die Motivation. Tatsächlich ist es in einigen Veröffentlichungen schwierig, 3d-conv zu "rekonstruieren". Es gibt eine Erwähnung. (Andererseits wird erwartet, dass CVPR in jüngster Zeit 3D-Conv verwendet, wenn eine große Datenmenge bei der Videoerkennung erfasst wird. Da es sich jedoch um eine Geschichte eines Identifikationsmodells handelt, handelt es sich um ein anderes Feld als diese Generierungsaufgabe.)

Jetzt wollte ich jedoch * experimentell bestätigen, dass die Rekonstruktion von 3d-conv funktionieren würde. ** Funktioniert die Videoerkennung, aber die Rekonstruktion funktioniert wirklich? Obwohl ich es irgendwie theoretisch verstanden habe, habe ich mich immer gefragt. Deshalb bin ich gekommen, um diesen Artikel zu schreiben. Ich werde sofort mit der Erklärung des Modells beginnen.

Videorekonstruktionsmodell

Das diesmal zu implementierende Modell ist unten dargestellt.

40.png

$ \ Boldsymbol {x_1, x_2, ..., x_T} $ bedeutet ein Video mit einer Länge von T, und $ \ boldsymbol {x_t} $ ist jedes Bild. Der Encoder, der 3D-CNN verwendet, empfängt das bewegte Bild und ordnet es einem Punkt von $ \ boldsymbol {z_T} $ zu. Auf diese Weise wird mit dem Decoder auf den Beobachtungsraum abgebildet. Da es sich um eine Rekonstruktionsaufgabe handelt, werden die Parameter so optimiert, dass der Unterschied zwischen Eingabe und Ausgabe minimiert wird.

Ich denke, dass die Methode mit 3D-CNN sehr einfach und leicht zu verstehen ist. Es ist möglich, die Merkmale von Zeit und Raum gleichzeitig ** durch dreidimensionale Faltung zu extrahieren, ohne das Zeitreihenmodell zu beißen. In Bezug auf die 3D-CNN-Verarbeitung gibt es andere Kommentarartikel, daher werde ich diese lol übergeben

Modelllernen / Verifikation

** Der Rekonstruktionsfluss ist wie folgt. ** ** **

  1. Bereiten Sie einen menschlichen Aktionsdatensatz vor
  2. Lernen Sie den 3D-CNN Autoencoder
  3. Rekonstruieren Sie das Video mit dem in 2 erlernten Modell.

1.human action dataset Verwenden Sie den bekannten Datensatz für menschliche Aktionen. Diese Daten wurden zur Überprüfung in einem Video-Generierungsmodell namens MocoGAN verwendet und zeigen, wie der Name schon sagt, Menschen, die gehen und winken.

epoch_real_60.png epoch_real_30.png

Sie können es von [hier] herunterladen (http://www.wisdom.weizmann.ac.il/~vision/SpaceTimeActions.html). (Das obige Bild stammt auch aus den Daten in diesem Link.)

2. Lernen des 3D-CNN-Autoencoders

Als nächstes werden wir das Modell unter Verwendung der obigen Daten trainieren. Die Verlustfunktion ist MSE, wodurch der Fehler zwischen Eingabe und Ausgabe natürlich minimiert wird. Einzelheiten zum Modell finden Sie unter hier. Nachfolgend finden Sie die Implementierung des Modells.

network.py



class ThreeD_conv(nn.Module):
    def __init__(self, opt, ndf=64, ngpu=1):
        super(ThreeD_conv, self).__init__()
        self.ngpu = ngpu
        self.ndf = ndf
        self.z_dim = opt.z_dim
        self.T = opt.T
        self.image_size = opt.image_size
        self.n_channels = opt.n_channels
        self.conv_size = int(opt.image_size/16)

        self.encoder = nn.Sequential(
            nn.Conv3d(opt.n_channels, ndf, 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf),
            nn.ReLU(inplace=True),
            nn.Conv3d(ndf, ndf * 2, 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf * 2),
            nn.ReLU(inplace=True),
            nn.Conv3d(ndf * 2, ndf * 4, 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf * 4),
            nn.ReLU(inplace=True),
            nn.Conv3d(ndf * 4, ndf * 8, 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf * 8),
            nn.ReLU(inplace=True),
        )
        self.fc1 = nn.Sequential(
            nn.Linear(int((ndf*8)*(self.T/16)*self.conv_size*self.conv_size),self.z_dim ),#6*6
            nn.ReLU(inplace=True),
        )
        self.fc2 = nn.Sequential(
            nn.Linear(self.z_dim,int((ndf*8)*(self.T/16)*self.conv_size*self.conv_size)),#6*6
            nn.ReLU(inplace=True),
        )
        self.decoder = nn.Sequential(
            nn.ConvTranspose3d((ndf*8), ndf*4, 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf * 4),
            nn.ReLU(inplace=True),
            nn.ConvTranspose3d(ndf*4, ndf * 2, 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf * 2),
            nn.ReLU(inplace=True),
            nn.ConvTranspose3d(ndf * 2, ndf , 4, 2, 1, bias=False),
            nn.BatchNorm3d(ndf),
            nn.ReLU(inplace=True),
            nn.ConvTranspose3d(ndf , opt.n_channels, 4, 2, 1, bias=False),
            nn.Tanh(),
        )

Das Lernen wurde 5.000 itr gedreht, und der Verlust änderte sich wie folgt. In der zweiten Hälfte wurde es fast 0, und ich sehe nicht viel Veränderung, aber ich habe den Eindruck, dass es sicher konvergiert hat.

image.png

3. Rekonstruktion des Videos nach Modell

Machen Sie Schlussfolgerungen mit dem Modell. In der obigen Implementierung wird das Rekonstruktionsergebnis in generate_videos im Protokollordner für jeden durch das Argument angegebenen Prüfpunkt gespeichert. Wie wir gelernt haben, haben wir das folgende Verhalten gezeigt. Die obere Reihe jedes itr ist die Eingabe und die untere Reihe ist die Ausgabe.

--0 itr Augen Natürlich kann es überhaupt nicht rekonstruiert werden. real_itr0_no1.png recon_itr0_no1.png

―― 1.500 itr Augen Oh. Das ist eine gute Idee. real_itr1500_no2.png recon_itr1500_no2.png

Zusammenfassung

Dieses Mal habe ich versucht, ein bewegtes Bild mit 3DCNN-AE zu rekonstruieren. Infolgedessen ist es wie erwartet, aber das generierte Video ist nicht gut. Es ist nicht so, dass die Bewegung nicht reproduziert werden kann, aber sie ist GRU-AE in Bezug auf die Schärfe jedes Bildes unterlegen. In den Papieren des Anomalieerkennungssystems gibt es viele Stimmen, die 3D-CNN als Problem betrachten, und diesmal konnte ich es experimentell verstehen. Auf der anderen Seite ist ** 3D-CNN ein vielversprechender Star bei Erkennungsaufgaben. ** In einer Umgebung, in der eine große Datenmenge erfasst werden kann, wird die Videoerkennung anscheinend eher als Favorit als als 2D-Ansatz wie GRU behandelt. Bei der Generierungsaufgabe ist dies jedoch anders. Es gibt nur wenige Daten, und es scheint, dass wir keine "starken Merkmale" wie bei Lehrern erwerben können. Es scheint, dass der Tag, an dem 3D-Conv als Favorit für die Erkennung von Videoanomalien verwendet wird, noch bevorsteht. .. .. Danke, dass du bis zum Ende zugesehen hast.

Recommended Posts

Rekonstruktion von bewegten Bildern mit dem Autoencoder unter Verwendung von 3D-CNN
Überprüfung und Implementierung der Videorekonstruktionsmethode mit GRU und Autoencoder
Schritt-für-Schritt-Approximation von Bildern mit niedrigem Rang durch HOSVD
Niedrigrangige Approximation des Bildes durch Tucker-Zerlegung
Gesichtserkennung durch Sammeln von Bildern von Angers.
Abnormalitätserkennung mit MNIST durch Autoencoder (PyTorch)
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
Niedrigrangige Approximation von Bildern durch Singularitätszerlegung
Niedrigrangige Approximation von Bildern durch HOSVD und HOOI
Anonymer Upload von Bildern mit der Imgur-API (mit Python)
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Rekonstruktion des sowjetischen Propagandaplakats von PyTorch x VAEGAN
Optischer Fluss, das von OpenCV aufgenommene dynamische Bild
Versuchen Sie, die Bildkonvertierung mit OpenCV mit Python zu projizieren
Ich verglich die Identität der Bilder nach Hu Moment
Sammlung und Automatisierung erotischer Bilder durch Deep Learning