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

Python 如何使用OpenCV在视频中显示CNN-LSTM预测输出?,python,opencv,keras,deep-learning,artificial-intelligence,Python,Opencv,Keras,Deep Learning,Artificial Intelligence,各位, 我有一个CNN-LSTM模型在keras训练。作为输入,我用30x30和一个通道(15,30,30,1)加载了每个视频15帧的集 我从总共279个视频中提取了它们,并将它们存储在一个大的维度张量中(279,15,30,30,1) 我正在处理两类视频(所以目标是0和1) 我的时间分布CNN的输入层(在我的LSTM层之前)是: 好的,他们在我的网络中反馈,一切都很好,但是现在我需要预测这些视频,我想在我正在分类的视频中显示输出 我写这篇文章是为了阅读视频并显示文本: vid = cv2.Vi

各位,

我有一个CNN-LSTM模型在keras训练。作为输入,我用30x30和一个通道(15,30,30,1)加载了每个视频15帧的集

我从总共279个视频中提取了它们,并将它们存储在一个大的维度张量中(279,15,30,30,1)

我正在处理两类视频(所以目标是0和1)

我的时间分布CNN的输入层(在我的LSTM层之前)是:

好的,他们在我的网络中反馈,一切都很好,但是现在我需要预测这些视频,我想在我正在分类的视频中显示输出

我写这篇文章是为了阅读视频并显示文本:

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\u 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'
def predict_视频(帧):
计数\u帧=0
框架列表=[]
frame=cv2.CVT颜色(frame,cv2.COLOR\u BGR2GRAY)
frame=cv2.调整大小(frame,(30,30),插值=cv2.内部区域)
当计数_帧<15时:
框架列表。追加(框架)
计数\u帧=0
帧集合=np.数组(帧列表)
帧集=帧集。重塑(1,15,30,30,1)
pred=模型预测(帧集合)
argmax(pred,axis=1)#我使用的是来自Keras的模型对象
如果pred_uz==1:
返回“射箭”
elif pred_uz==0:
返回“篮球”
由于CNN-LSTM的输入维度等于(无、30、30、1),我需要使用模型进行预测。预测(样本)具有如下维度(1、15、30、30、1)的样本。 如果我不想一帧一帧地预测视频,而是想用一个基于15帧集的模型预测视频,那么我如何能够实时预测视频呢

实际的predict_video()函数“冻结”我的计算机


谢谢你的关注

下面是一段代码,您可以使用它在每个框架上放置文本

cv2.putText(img, text, (textX, textY ), font, 1, (255, 255, 255), 2)
这里的“img”是您的帧,“text”是您的输出预测,“textX和textY”是您要将文本居中的坐标。 而另一部分的答案是,你需要在15帧的集合上进行预测,而不是在单个帧上进行预测。你可以做的是在keras中训练一个模型,方法是将批量大小设置为15个图像,并且每个帧都有真实的标签。。 完成培训后,模型将期望您输入15帧的批次。稍后在while循环中可以做的是设置一个检查,当传递的帧等于15时,收集这些帧,创建一个维度的张量
(15,30,30,1)

这部分代码

frame_list = []
while count_frames < 15:
    frame_list.append(frame)
frame_list=[]
当计数_帧<15时:
框架列表。追加(框架)
不应位于函数内部,因为对于调用函数时的每个帧,frame_list设置为零,因为其作用域仅限于函数。您应该在for循环中编写此代码,当
frame\u list
中的帧数等于15时,您应该调用
model.predict(batch)
函数,并首先扩展维度以将维度设置为
(1,15,30,30,1)

cv2.putText(img, text, (textX, textY ), font, 1, (255, 255, 255), 2)
frame_list = []
while count_frames < 15:
    frame_list.append(frame)