【问题标题】:How to Display CNN-LSTM predicted output in the Video with OpenCV?如何使用 OpenCV 在视频中显示 CNN-LSTM 预测输出?
【发布时间】: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


    【解决方案1】:

    这是一段代码,您可以使用它在每一帧上放置文本

    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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      相关资源
      最近更新 更多