图像的多路输入CNN

时间:2018-10-27 10:20:29

标签: python deep-learning conv-neural-network

我想创建一个将n帧作为一个输入并将其标记为一个分类器的网络。

enter for my target network to understand me

我想建立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 :(得分:3)

您必须了解,当您向神经网络提供信息时,它会从中学习信息,将其实现到内存中(更新权重),而忘记了输入的内容,这意味着当您按顺序给它提供帧时并不真正在乎您以什么顺序给它添加帧,它只关注您现在正在向其馈送的帧,这不是我们在处理视频时想要的,我们希望它跟踪以前帧的一些历史记录,在当前框架与其前身之间建立链接,这通常是LSTM或RNN所做的事情,它们将历史编码为NN,因此我们要做的是将传统的CNN和LSTM合并以将框架历史编码为我们的CNN。因此,可以使用Alexnet作为该网络的骨干,而不是分别使用Alexnet和LSTM,而应使用CNN-LSTMS

现在关于为什么堆叠通道错误的原因是您基本上将其与此合并信息混淆了,图像的堆叠通道使其将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个分区,现在分区1中的节点将仅获取第一个图像像素,而分区2中的节点将仅获取第二个图像像素,依此类推,因此,如果您有1000个输入节点,则前200个将获取图像如图1所示,节点200-400将获取图像2,节点400-600将获取图像3,节点600-800将获取图像4,节点800-1000将获取图像5,然后可以在以后互连输入层的输出节点和您可以实现可行的架构。我希望这能更好地说明我的观点:)