【问题标题】:Multiple input CNN for images图像的多输入 CNN
【发布时间】:2019-03-31 22:23:08
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    看到你必须明白,当你向神经网络提供信息时,它会从中学习一些东西,将其实现到内存中(更新权重)并忘记它的输入,这意味着当你按顺序给它帧时,它并不真正关心你给它帧的顺序,它只关注你现在提供给它的帧,这不是我们在处理视频时想要的,我们希望它跟踪之前帧的一些历史记录在当前帧与其前辈之间建立联系,这通常是 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个像素等等。但话又说回来,你不能确定你的神经网络是否会学到任何东西。

    除非你坚决不使用 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,然后您可以稍后互连输入层的输出节点和你可以实现一个可行的架构。我希望这能更好地说明我的观点:)

    【讨论】:

    • 谢谢 在“你让这些节点的 N 个相等分区”这句话之后我无法理解。你能用更解释的方式解释吗?
    • 我已经使用图表对答案进行了编辑以更好地解释我的观点,请看一下:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 2019-05-13
    • 2021-04-17
    相关资源
    最近更新 更多