如何使用OpenCV在视频中显示CNN-LSTM预测输出?

时间:2018-07-29 02:00:47

标签: python opencv keras deep-learning artificial-intelligence

所有人

我有一个在喀拉拉邦训练过的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()函数会“冻结”我的计算机。

感谢您的关注!

1 个答案:

答案 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>