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.
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.
Das diesmal zu implementierende Modell ist unten dargestellt.
$ \ 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
** Der Rekonstruktionsfluss ist wie folgt. ** ** **
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.
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.)
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.
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.
1.000 itrth Obwohl es verschwommen ist, hat es eine menschliche Form.
4.000 itr Augen Es ist ein wenig klar, aber es scheint, dass Unschärfe und Unschärfe aufgetreten sind und die Details wie menschliche Hände nicht reproduziert wurden. Vergleichen wir außerdem die Ergebnisse mit GRU-AE. Das Folgende ist das Ergebnis der Rekonstruktion durch GRU-AE. Dies ist ein Vergleich der Methoden im vorherigen Artikel unter den gleichen Bedingungen wie oben. Das 0 itr Auge wird weggelassen.
500 itr Augen Eindruck, dass es nicht zu schrecklich ist. Geht es gut?
―― 1.500 itr Augen Oh. Das ist eine gute Idee.
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