我有X个视频,每个视频都有不同的帧数,让我们说Y(x)。所有视频224X224X3的帧大小相同。我将每个帧传递给CNN,它输出1024的特征向量。现在,我想将它传递给LSTM。对于LSTM batch_size,time_steps,number_of_feature是必需的。我该如何决定这些价值?我有两种配置,但不知道我该怎么做。
我应该将1024分为32 X 32来定义time_steps和number_of_features,而batch_size是帧数
time_step应该与帧数相对应,number_of_feature应该是1024和batch_size(?)
答案 0 :(得分:1)
所以这取决于你试图解决的问题。
使用视频进行行动分类?
如果您尝试预测视频中的操作/事件,则必须使用num_of_frames
作为time_steps
,batch_size
将是您要一起处理的视频数量。
每帧对象分类?
在这种情况下,您可以将功能拆分为32x32
,time_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! :)
希望对您有所帮助! :)