2017-03-06 61 views
7

Chcę przewidzieć kolejną klatkę filmu (skali szarości) podaną N poprzednich klatek - używając CNN lub RNN w Keras. Większość samouczków i innych informacji dotyczących predykcji szeregów czasowych i Keras używa 1-wymiarowego wejścia w ich sieci, ale mój byłby 3D (N frames x rows x cols)Używanie Keras do prognozowania wideo (szeregi czasowe)

Obecnie nie jestem pewien, jakie jest dobre podejście do tego problemu. Moje pomysły obejmują:

  • Używanie jednej lub więcej warstw LSTM. Problem polega na tym, że nie jestem pewien, czy nadają się do zrobienia serii obrazów zamiast serii skalarów jako danych wejściowych. Czy zużycie pamięci nie wybuchnie? Jeśli można z nich korzystać: Jak mogę używać ich w Keras w przypadku wyższych wymiarów?

  • Użycie splotu 3D na wejściu (stos poprzednich klatek wideo). Rodzi to inne pytania: Dlaczego miałoby to pomóc, gdy nie robię klasyfikacji, ale przewidywania? Jak mogę ułożyć warstwy w taki sposób, aby dane wejściowe sieci miały wymiary (N x cols x rows) i dane wyjściowe (1 x cols x rows)?

Jestem całkiem nowy dla CNN/RNN i Keras i byłbym wdzięczny za wskazówkę we właściwym kierunku.

Odpowiedz

14

W zasadzie każde podejście ma swoje zalety i wady. Chodźmy throught te, które przewidziane, a następnie inne, aby znaleźć najlepsze podejście:

  1. LSTM: Wśród swoich największych zalet jest zdolność do uczenia się długoterminowy dependiencies wzorców w danych. Zostały one zaprojektowane w celu umożliwienia analizy długich sekwencji, np. mowa lub tekst. Może to również powodować problemy z powodu parametrów liczbowych, które mogą być naprawdę wysokie. Inne typowe powtarzające się architektury sieciowe, takie jak GRU, mogą przezwyciężyć te problemy. Główną wadą jest to, że w ich standardowej (sekwencyjnej implementacji) nie można dopasować go do danych wideo z tego samego powodu, dla którego gęste warstwy są złe dla danych zdjęciowych - mnóstwo czasu i przestrzennych niezmienności musi się nauczyć dzięki topologii, która jest całkowicie nieodpowiedni do złapania ich w efektywny sposób. Przesunięcie wideo o piksel po prawej może całkowicie zmienić wydajność sieci.

    Inne rzeczy, które warto wspomnieć, że szkolenie LSTM jest belived być podobna do znalezienia równowagi pomiędzy dwoma procesami rywalizacja - znalezienie dobrej ciężarów przez gęstej jak obliczeń wyjściowych i znalezienie dobrego wewnętrznej pamięci dynamicznej w przetwórstwie sekwencje. Znalezienie tej równowagi może trwać bardzo długo, ale gdy już się jej znajdzie - zwykle jest dość stabilna i daje naprawdę dobre wyniki.

  2. Conv3D: Wśród ich największych zalet można łatwo znaleźć zdolność do wychwytywania przestrzennych i czasowych niezmienników w taki sam sposób, jak Conv2D w przypadku obrazowania. To sprawia, że ​​przekleństwo wymiarowości jest o wiele mniej szkodliwe. Z drugiej strony - w ten sam sposób, w jaki Conv1D może nie dawać dobrych wyników przy dłuższych sekwencjach - w ten sam sposób brak jakiejkolwiek pamięci może utrudnić uczenie się długiej sekwencji.

Oczywiście jeden może korzystać z różnych metod, takich jak:

  1. TimeDistributed + Conv2D: stosując TimeDistributed opakowania - można stosować pewne pretrained convnet jak np Inception przeglądaj i kolejno analizuj mapy obiektów. Naprawdę ogromną zaletą tego podejścia jest możliwość uczenia się transferu. Jako wadę - można pomyśleć o tym jako o Conv2.5D - brakuje w nim czasowej analizy danych.

  2. ConvLSTM: architektura ta nie jest jeszcze obsługiwany przez najnowszą wersją Keras (6 marca 2017), ale jak można zobaczyć here należy przewidzieć w przyszłości. Jest to mieszanka LSTM i Conv2D i uważa się, że jest lepsza niż układanie w stosy Conv2D i LSTM.

Oczywiście nie są jedynym sposobem, aby rozwiązać ten problem, będę wspomnieć jeszcze jeden, który może być przydatny:

  1. Stacking: jeden może łatwo układać górne metody w celu zbudowania ostatecznego rozwiązania. Na przykład. można zbudować sieć, w której na początku wideo jest przekształcane przy użyciu TimeDistributed(ResNet), a następnie dane wyjściowe są przesyłane do Conv3D z wielokrotnym i agresywnym przestrzennym łączeniem i ostatecznie przekształcane przez warstwę GRU/LSTM.

PS:

Jeszcze jedna rzecz, która jest również warto wspomnieć, że kształt danych wideo jest rzeczywiście 4D z (frames, width, height, channels).

PS2:

W przypadku, gdy dane są faktycznie 3D z (frames, width, hieght) faktycznie przydałby klasyczny Conv2D (zmieniając channels do frames) analiza tych danych (które faktycznie może bardziej efektywny obliczeniowo). W przypadku uczenia transferu transferu powinieneś dodać dodatkowy wymiar, ponieważ większość modeli CNN została przeszkolona na danych o kształcie (width, height, 3). Można zauważyć, że twoje dane nie mają 3 kanałów. W tym przypadku zwykle stosowana technika polega na trzykrotnym powtórzeniu macierzy przestrzennej.

PS3:

Przykładem tego 2.5D podejścia jest:

input = Input(shape=input_shape) 
base_cnn_model = InceptionV3(include_top=False, ..) 
temporal_analysis = TimeDistributed(base_cnn_model)(input) 
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(temporal_analysis) 
conv3d_analysis = Conv3D(nb_of_filters, 3, 3, 3)(conv3d_analysis) 
output = Flatten()(conv3d_analysis) 
output = Dense(nb_of_classes, activation="softmax")(output) 
+0

bardzo przydatne informacje, zwłaszcza warstwę TimeDistributed. Kształt moich danych wideo to 3D, ponieważ istnieje tylko jeden kanał, czy powinienem go zmienić? A może mógłbyś podać jakiś (pseudo) kod dla 5. podejścia do łączenia warstw? Wymiary wciąż mnie mylą. Dziękuję Ci bardzo! – Isa

+0

Nadal mam kilka dodatkowych pytań. Pseudokod odnosi się do nb_of_classes, ale nie potrzebuję klasyfikacji, ale ramki w następnym takcie. Czy nie ma prostszego rozwiązania? Nie potrzebuję nauki transferu (jeszcze), tylko prostej sieci, która zabrała N poprzednich ramek i przepowiedziała następną. – Isa

+1

Chciałbym odpowiedzieć jutro? Ok? –

4

Po wykonaniu wielu badań, w końcu natknął się na Keras Example dla ConvLSTM2D warstwy (już wspomniano Marcin Możejko) , który robi dokładnie to, czego potrzebuję.

W aktualnej wersji Keras (v1.2.2), warstwa ta jest już wliczone w cenę i mogą być importowane przy użyciu

from keras.layers.convolutional_recurrent import ConvLSTM2D 

Aby skorzystać z tej warstwy, dane wideo musi być sformatowany w następujący sposób:

[nb_samples, nb_frames, width, height, channels] # if using dim_ordering = 'tf' 
[nb_samples, nb_frames, channels, width, height] # if using dim_ordering = 'th'