所有人
我有一个在喀拉拉邦训练过的CNN-LSTM模型。作为输入,我以30x30的分辨率和每个通道(15、30、30、1)加载了每帧15帧的视频。我从总共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帧的模型为基础进行预测,我如何实时预测视频?
实际的Forecast_video()函数会“冻结”我的计算机。
感谢您的关注!
答案 0 :(得分:2)
这是一段代码,您可以用来在每帧上放置文本
cv2.putText(img, text, (textX, textY ), font, 1, (255, 255, 255), 2)
此处“ img”是您的框架,“ text”是您的输出预测,而“ textX和textY”是您希望将文本居中的坐标。
回答另一部分时,您将以15帧为一组而不是单个帧进行预测。好,您可以做的是通过将批处理大小设置为15张图像并在每帧中显示真实标签,在keras中训练模型。
完成训练模型后,预计将输入15帧的批次。您稍后在while循环中可以执行的操作是检查通过的帧等于15时是否收集了这些帧,从而创建尺寸为(15,30,30,1)
这部分代码
frame_list = []
while count_frames < 15:
frame_list.append(frame)
不应在函数内部,因为调用函数的每个帧的frame_list都设置为零,因为其范围仅限于函数。您应该在for循环内编写此代码,并且当frame_list
中的帧数等于15时,您应该调用model.predict(batch)
函数,并首先扩展尺寸以将尺寸设置为(1,15,30,30,1)
< / p>