CNN->视频的LSTM网络

时间:2017-08-18 02:17:35

标签: video tensorflow deep-learning lstm

我有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(?)

2 个答案:

答案 0 :(得分:1)

所以这取决于你试图解决的问题。

  

使用视频进行行动分类?

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

  

每帧对象分类?

在这种情况下,您可以将功能拆分为32x32time_steps

答案 1 :(得分:1)

考虑使用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! :)

希望对您有所帮助! :)