Многократный ввод CNN для изображений - PullRequest
0 голосов
/ 27 октября 2018

Я хочу создать сеть, которая принимает n кадров в качестве одного входа и помечает его одним классификатором.

введите для моей целевой сети, чтобы понять меня

Я хочу построить 2 сети,

Во-первых: для этого нужно использовать модель Alexnet, Googlenet и т. Д. Второе: использование модели LSTM для этого.

Кстати, n кадров - это последовательные кадры из видеокадров. Я думаю, это не имеет значения для первой модели. Важно для второго.

Я очень новичок в мире глубокого изучения образов. Я использую Keras, но я не знаю, как я могу построить эту сеть, что я должен сделать. Особенно для первого. Архитектура Alexnet хочет только фрейм для входа, но я хочу дать n фрейма для входа.

Это только один пример из того, что я пытаюсь. Я выбираю n = 5. Чтобы дать n кадров в качестве входных данных, я складываю n кадров в качестве каналов. Когда я говорю вам, что я сделал, люди говорили: «О, Боже, что ты делаешь». Я не понимаю почему. (Архитектура FlowNet не использует этот способ?) И все же я не знаю, как мне это сделать.

img1 = cv2.cvtColor(cv2.imread('frame0'),cv2.COLOR_BGR2GRAY) # 64x64x1
img2 = cv2.cvtColor(cv2.imread('frame1'),cv2.COLOR_BGR2GRAY) # 64x64x1
img3 = cv2.cvtColor(cv2.imread('frame2'),cv2.COLOR_BGR2GRAY) # 64x64x1
img4 = cv2.cvtColor(cv2.imread('frame3'),cv2.COLOR_BGR2GRAY) # 64x64x1
img5 = cv2.cvtColor(cv2.imread('frame4'),cv2.COLOR_BGR2GRAY) # 64x64x1

# this is only a sample for label1. (a sample = 5 sequential frames)
a_sample_for_label1 = np.stack([img1,img2,img3,img4,img5],axis=2) # gives me 64x64x5

img1_ = cv2.cvtColor(cv2.imread('other_frame0'),cv2.COLOR_BGR2GRAY) # 64x64x1
img2_ = cv2.cvtColor(cv2.imread('other_frame1'),cv2.COLOR_BGR2GRAY) # 64x64x1
img3_ = cv2.cvtColor(cv2.imread('other_frame2'),cv2.COLOR_BGR2GRAY) # 64x64x1
img4_ = cv2.cvtColor(cv2.imread('other_frame3'),cv2.COLOR_BGR2GRAY) # 64x64x1
img5_ = cv2.cvtColor(cv2.imread('other_frame4'),cv2.COLOR_BGR2GRAY) # 64x64x1

# this is only a sample for label2. (a sample = 5 sequential frames)
a_sample_for_label2 = np.stack([img1_,img2_,img3_,img4_,img5_],axis=2) # gives me 64x64x5


model = alexnet(shape=(64,64,5))
model.compile(...)
model.fit(np.array[a_sample_for_label1,a_sample_for_label2],[1,2])

1 Ответ

0 голосов
/ 28 октября 2018

Понимаете, вы должны понимать, что когда вы передаете информацию в нейронную сеть, она узнает что-то из нее, внедряет ее в память (обновляет веса) и забывает, какой ввод ей был дан, что означает, что когда вы даете ей кадры в последовательности, онана самом деле не имеет значения, в каком порядке вы даете ему кадры, он фокусируется только на кадрах, которые вы передаете ему прямо сейчас, это не то, что мы хотим при обработке видео, мы хотим, чтобы оно отслеживало некоторую историю из предыдущих кадров, которыеустанавливает связь между текущим кадром и его предшественниками, как правило, это то, что делают LSTM или RNN, они кодируют историю в NN, поэтому мы объединяем традиционные CNN и LSTM для кодирования истории кадров в наши CNN.Поэтому вместо того, чтобы использовать Alexnet и LSTM по отдельности, используйте CNN-LSTMS , вы можете использовать Alexnet в качестве магистрали для этой сети, и она должна работать

Теперь о том, почему стекирование каналов является неправильным, заключается в том, чтоВы в основном путаете это с этой объединенной информацией, объединение каналов изображений заставляет его обрабатывать N изображений как одно и, следовательно, это не то, что мы хотим, кроме того, вы можете сложить N изображений вертикально / горизонтально, так что части из каждого кадра включенына входе, но это просто создает дополнительную работу для NN и может привести к тому, что он ничего не изучит, так что вы могли бы сделать так, чтобы вместо подачи ввода на все узлы вы делали N равных разделов этих узлов и передавали каждыйстекировать изображение с уникальным набором узлов, так что вы бы хотели, чтобы у вас было видео с кадрами формы 100, 200, 3, и, скажем, N равно 5, поэтому, если вы вертикально складываете изображения, то входная форма вашего NNбудет 500,200,3, и вы можете иметь 1000 входных узлов, так что узлы 0-200 получат 0-100 200,3 пикселей, кадры 200-400 получат 100-200 200,3 пикселей и так далее.Но опять же, вы не можете гарантировать, что ваш NN узнает что-нибудь.

Если вы не одержимы использованием LSTM-CNN, вы можете попробовать описанный выше подход, но я не подтверждаю, что вы получите приемлемые результаты, ваш лучший подходиспользует LSTM-CNNS

Дополнительная информация Редактировать:

Traditional NN

См. изображение выше, оно показывает традиционный NN, что мы делаемзаключается в том, что мы передаем все узлы нашего входного слоя всем узлам в следующем слое, поэтому, если бы входными узлами были фактически 5 изображений, наложенных друг на друга, все изображения были бы направлены на все узлы, и таким образом NN будетнужно научиться различать изображения, это не то, что мы хотим

enter image description here

То, что я предлагаю сделать, проиллюстрировано на диаграмме выше, вы складываете 5 изображенийдруг на друга, и вместо того, чтобы подавать весь стек изображений на каждый входной узел, мы разделяем наши входные узлы на разделы, поэтому, если мы сложим 5 изображений, мы получим 5 разделов, нетw узлы в разделе 1 получат только 1-е пиксели изображения, а узлы в разделе 2 получат только 2-е пиксели изображения и т. д., поэтому, если у вас есть 1000 входных узлов, первые 200 получат изображение 1, узлы 200-400 будутполучить изображение 2, узлы 400-600 получат изображение 3, узлы 600-800 получат изображение 4, а узлы 800-1000 изображение 5, затем вы можете позже соединить выходные узлы входных слоев и получить жизнеспособную архитектуру.Я надеюсь, что это лучше иллюстрирует мою точку зрения:)

...