用于图像的多输入 CNN

jun*_*ndo 1 python deep-learning conv-neural-network

我想创建一个网络,它将 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])
Run Code Online (Sandbox Code Playgroud)

Imt*_*har 6

看到你必须明白,当你将信息提供给神经网络时,它会从中学习一些东西,将其实现到内存中(更新权重)并忘记给出的输入,这意味着当你按顺序给它帧时,它不会真正关心你给它帧的顺序,它只关注你现在给它的帧,这不是我们在处理视频时想要的,我们希望它跟踪建立链接的先前帧的一些历史记录在当前帧和它的前辈之间,这通常是 LSTM 或 RNN 所做的,它们将历史编码到 NN 中,所以我们所做的是将传统 CNN 和 LSTM 合并以将帧历史编码到我们的 CNN 中。所以不要分别使用 Alexnet 和 LSTM,而是使用CNN-LSTMS,你可以使用 Alexnet 作为这个网络的主干,它应该可以工作

200-400 帧将获得 100-200,200,3 像素,依此类推。但话又说回来,您无法确保您的神经网络是否会学到任何东西。

除非您一心不使用 LSTM-CNNs,否则您可以尝试上述方法,但我不确认您会获得可行的结果,您最好的方法是使用 LSTM-CNNS

附加信息编辑:

传统神经网络

参考上图,它显示了一个传统的神经网络,我们所做的是将我们输入层的所有节点馈送到下一层的所有节点,所以如果输入节点实际上是 5 个相互堆叠的图像所有图像都会发送到所有节点,这样神经网络就必须学会区分图像,这不是我们想要的

在此处输入图片说明

我建议的做法如上图所示,您将 5 个图像堆叠在一起,而不是将整个图像堆栈提供给每个输入节点,我们将输入节点划分为多个分区,因此如果我们堆叠 5 个图像,我们做 5 个分区,现在分区 1 中的节点只会得到第一个图像像素,而分区 2 中的节点只会得到第二个图像像素,依此类推,所以如果你有 1000 个输入节点,前 200 个将得到图像 1,节点200-400 将获得图像 2 ,节点 400-600 将获得图像 3,节点 600-800 将获得图像 4 和节点 800-1000 图像 5,然后您可以稍后互连输入层的输出节点,您可以实现一个可行的架构。我希望这能更好地说明我的观点:)