【问题标题】:CNN-> LSTM network for videosCNN-> 用于视频的 LSTM 网络
【发布时间】:2017-08-18 02:17:35
【问题描述】:

我有 X 个视频,每个视频都有不同的帧数,比如说 Y(x)。所有视频 224X224X3 的帧大小相同。我将每一帧传递给 CNN,它输出一个 1024 的特征向量。现在,我想将它传递给 LSTM。对于 LSTM batch_size、time_steps、number_of_feature 是必需的。我应该如何决定这些价值?我有两种配置,但不知道应该如何进行。

  1. 我是否应该将 1024 分解为 32 X 32 以定义 time_steps 和 number_of_features 并且 batch_size 是帧数

  2. time_step 应该对应帧数,number_of_feature 应该是 1024,batch_size (?)

【问题讨论】:

    标签: video tensorflow deep-learning lstm


    【解决方案1】:

    所以这取决于您要解决的问题。

    使用视频的动作分类?

    如果您试图从视频中预测动作/事件,则必须使用 num_of_frames 作为 time_stepsbatch_size 将是您要一起处理的视频数量。

    每帧对象分类?

    在这种情况下,您可以将32x32 的特征拆分为time_steps

    【讨论】:

    • 我需要训练一个变分自动编码器。看起来num_of_frames 作为time_steps batch_size 作为多个视频是合适的。所有视频中的帧数是否应该相同?此外,每个视频包含大约 10000 帧。使用 batch_size 2 不是 20000 帧同时运行需要比 8GB 笔记本电脑更大的机器吗?
    • 如果使用dynamic_rnn,则不需要具有相同数量的帧。一般来说,一个视频有很多冗余帧,可以使用合理的帧数进行网络训练;提取较少数量的帧; frame_per_seconds 在阅读视频时减少帧数的参数类型。
    【解决方案2】:

    考虑使用 Keras 层构建一个模型,您可以在其中堆叠所有层,如下所示:

    model = Sequential()
    model.add(TimeDistributed(Conv2D...))
    model.add(TimeDistributed(MaxPooling2D...))
    model.add(TimeDistributed(Flatten()))
    model.add(TimeDistributed(LSTM, return_sequences=False...)) #or True, in case of Stacked
    model.add(TimeDistributed(Dense...))
    

    并尝试直接使用 OpenCV 预处理视频,例如从每个视频中读取多个帧并将它们存储到一个大张量中,您可以使用 sklearn train_test_split 对其进行拆分,如下所示:

    video_folder = '/path.../'
    X_data = []
    y_data = []
    list_of_videos = os.listdir(vide_folder)
    
    for i in list_of_videos:
        #Video Path
        vid = str(video_folder + i) #path to each video from list1 = os.listdir(path)
        #Reading the Video
        cap = cv2.VideoCapture(vid)
        #Reading Frames
        #fps = vcap.get(5)
        #To Store Frames
        frames = []
        for j in range(40): #here we get 40 frames, for example
            ret, frame = cap.read()
            if ret == True:
                print('Class 1 - Success!')
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #converting to gray
                frame = cv2.resize(frame,(30,30),interpolation=cv2.INTER_AREA)
                frames.append(frame)
            else:
                print('Error!')
        X_data.append(frames) #appending each tensor of 40 frames resized for 30x30
        y_data.append(1) #appending a class label to the set of 40 frames
    X_data = np.array(X_data)
    y_data = np.array(y_data) #ready to split! :)
    

    希望对您有所帮助! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 2014-04-23
      • 1970-01-01
      • 2020-07-14
      • 1970-01-01
      • 2021-04-28
      • 1970-01-01
      • 2021-06-07
      相关资源
      最近更新 更多