繁体   English   中英

图像的多路输入CNN

[英]Multiple input CNN for images

我想创建一个将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])

看到您必须了解,当您向神经网络提供信息时,它会从中学习某些东西,将其实现到内存中(更新权重),并且忘记了输入的内容,这意味着当您按顺序给它提供帧时,它不会真的很在乎您给它的帧顺序,它只关注您当前正在向其馈送的帧,这不是我们在处理视频时想要的,我们希望它跟踪以前帧的一些历史,从而建立链接在当前帧及其前身之间,这通常是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

附加信息编辑:

传统NN

参照上面的图像,它显示了传统的NN,我们要做的是将输入层的所有节点馈送到下一层的所有节点,因此,如果输入节点实际上是5个彼此叠放的图像所有图像都将到达所有节点,因此NN必须学会区分图像,这不是我们想要的

在此处输入图片说明

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM