【发布时间】:2019-01-05 16:21:22
【问题描述】:
大家,
我有一个在 keras 中训练的 CNN-LSTM 模型。作为输入,我为每个视频加载了 15 帧的集合,分辨率为 30x30,并且只有一个通道(15、30、30、1)。
我从总共 279 个视频中提取它们,并将它们存储在一个维度为 (279, 15, 30, 30, 1) 的大张量中。
X_data.shape = (279, 15, 30, 30, 1)
y_data.shape = (279,)
我正在处理两类视频(因此目标是 0 和 1)。
我的时间分布式CNN的输入层(在我的LSTM层之前)是:
input_layer = Input(shape=(None, 30, 30, 1))
好的,他们输入了我的网络,一切正常,但现在我需要预测这些视频,我想在我正在分类的视频中显示输出。
我写这个是为了阅读视频并显示文字:
vid = cv2.VideoCapture(video_path)
while(vid.isOpened()):
ret, frame = vid.read()
if ret == True:
texto = predict_video(frame)
frame = cv2.resize(frame,(750,500),interpolation=cv2.INTER_AREA)
frame = cv2.putText(frame,str(texto),(0,130), cv2.FONT_HERSHEY_SIMPLEX, 2.5, (255, 0, 0), 2, cv2.LINE_AA)
cv2.imshow('Video', frame)
if cv2.waitKey(25) & 0xFF == ord('q'):
break
else:
break
vid.release()
cv2.destroyAllWindows()
predict_video() 用于将预测输出生成为文本,如您所见:
def predict_video(frame):
count_frames = 0
frame_list = []
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
frame = cv2.resize(frame,(30,30),interpolation=cv2.INTER_AREA)
while count_frames < 15:
frame_list.append(frame)
count_frames = 0
frame_set = np.array(frame_list)
frame_set = frame_set.reshape(1, 15, 30, 30, 1)
pred = model.predict(frame_set)
pred_ = np.argmax(pred,axis=1) #i'm using the Model object from Keras
if pred_ == 1:
return 'Archery'
elif pred_ == 0:
return 'Basketball'
由于 CNN-LSTM 的输入维度等于 (None, 30, 30, 1),我需要使用 model.predict(sample) 预测具有维度的样本像这样 (1, 15, 30, 30, 1)。 一旦我不想逐帧预测而是使用基于 15 帧集的模型,如何实时预测视频?
实际的 predict_video() 函数“冻结”我的计算机。
感谢关注!
【问题讨论】:
标签: python opencv keras deep-learning artificial-intelligence