图像的多输入CNN

2024-06-26 01:40:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter for my target network to understand me

我想建立两个网络

第一:用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])

Tags: sample网络forcv2colorimg1meother
1条回答
网友
1楼 · 发布于 2024-06-26 01:40:00

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

至于为什么叠加通道是错误的,你基本上是把它和这个合并的信息混淆了,叠加通道使它把N个图像当作一个,所以这不是我们想要的,另外,你可以垂直/水平地堆叠N个图像,所以每个帧的部分都包含在输入中,但这只会给NN带来更多的工作,并可能导致它什么都不学习,所以你可以做的是,不是把输入输入输入到所有节点,而是对这些节点进行N个相等的分区,并将每个堆栈图像输入到一组唯一的节点上,所以你要做的是,你将得到一个形状为100200,3和假设N是5,那么如果你垂直堆叠图像,那么你的NN的输入形状将是500200,3,你可以有1000个输入节点,所以0-200节点将得到0-100200,3个像素,200-400帧将得到100-200200,3个像素,依此类推。但是你不能保证你的神经网络能学到什么。在

除非你执意不使用LSTM-CNNs,否则你可以尝试上述方法,但我不确定你会得到可行的结果,你最好的方法是使用LSTM-CNNs

附加信息编辑:

Traditional 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,随后,您可以互连输入层的输出节点,从而实现一个可行的体系结构。我希望这能更好地说明我的观点:)

相关问题 更多 >