使用深度学习进行视频修剪

介绍
在本教程中,我们将构建深度学习任务,自动修剪我们的视频使用标志!这样的应用程序可以让那些不擅长编辑视频的人们的生活变得更容易。
我们使用像“拇指朝上”和“拇指朝下”这样的标志来创建检查点,并且只保存我们想保存的部分视频。让我们做如下假设:“拇指朝上”👍 符号表示成功,意味着这些帧可以保存到最终的视频文件;“拇指向下”👎 符号将表示故障,意味着相应的视频帧将被丢弃,更多细节将在接下来我们继续讨论。

GOOGLE Teachable Machine概述

我们将使用Google Teachable Machine来训练我们的深度学习模型,并使用Python来实现我们的程序。
Google Teachable Machine允许我们为各种用例创建深度学习模型,而无需任何代码。
使用它非常简单。
单击“开始”按钮,你将看到下面的屏幕。如你所见,你可以为姿势估计、图像分类或音频分类创建模型,因为我们的任务是图像分类,所以选择“图像项目(Image Project)”。

构建深度学习模式

以上是我们项目的初始设置,类代表不同的分类类别。我们可以使用网络摄像头直接从网络浏览器记录样本(创建数据集),另外,我们也可以从本地机器或谷歌云端硬盘上传图片。
如下所示,创建3个类(thumb_up,thumb_down和random),另外我们需要第三个“random”类来检查用户是否在显示标志。
单击“ thumb_up”类中的“Webcam”按钮,然后单击左上角的裁剪按钮。
裁剪网络摄像头图像右上角的某个区域,这是因为我们假设用户在运行程序时在该区域中进行标记。
完成此操作后,单击蓝色的“完成裁剪”按钮以确认裁剪区域。
现在,点击“Hold to Record”按钮并记录你的样本。由于我们正在记录“ thumb_up”类的图片,所以请竖起拇指,从不同的距离和角度录制图片可以确保模型能够很好地概括,并且不会过拟合。
完成此操作后,可以从样本中选择单个图像,并删除或更改其标签(如果是错误录制的)。
对“thumb_down”类和“random”类重复此过程(收集背景图像)。
注意:尝试为所有类提供大致相等数量的图像,这样模型就不会偏向于任何一个特定的类。

训练模型

单击“Train Model”按钮开始在刚刚收集的图像上训练模型!也可以单击“高级”部分下拉列表来更改超参数。
在训练模型时,你可以单击“Under the hood”按钮以可视化各种性能指标。
训练完成后,你可以在浏览器上测试你的模型,以确定模型是否在所有可能的情况下都经过了充分训练,或者是否要添加更多图像。

导出模型

可以点击顶部的“Export Model”按钮来导出模型,选择Tensorflow->Keras的模型类型。你还可以将模型转换为其他格式,如Tensorflow.js或Tensorflow Lite,具体取决于你的用例。单击“Download my model”并解压Zip文件以获取模型权重和标签。
现在,模型已经准备好了,我们可以开始深入学习Python程序实现,它将使用这个模型并相应地调整我们的视频。

项目实施

Python程序,通过使用符号进行深度学习来修剪视频
# Import necessary libraries
import numpy as np
import cv2
import tensorflow.keras
from keras.preprocessing import image

# Access WebCam
cap = cv2.VideoCapture(0)
state = True

# Load the TensorFlow model weights
model = tensorflow.keras.models.load_model('keras_model.h5')
labels = ['thumb_up','thumb_down','random']

# Set the width and height of the frame for video to be saved
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# Create a writer object to save the frames
writer = cv2.VideoWriter(r'C:UsersSharan BabuDesktoptrimmed_video.mp4',cv2.VideoWriter_fourcc(*'XVID'),25, (width, height))
final_video = []   // List to store our video frames

# Video editing!
while True:
 success, image = cap.read()
 if success==True:
  final_video.append(image)
  img = image.copy()
  # Draw a rectangle to indicate the region of interest and crop it
  img = cv2.flip(img,1)
  cv2.rectangle(img,pt1=(450,100),pt2=(620,300),color=(0,255,0),thickness=3)
  cv2.imshow('Video',img)
  roi = img[102:298,448:618]

# Image pre-processing for making predictions
  data = cv2.resize(roi,(224,224))
  data = np.array(data,dtype=np.float32)
  data = np.expand_dims(data,axis=0)
  data = data/255

# Predict output class for the image and save video accordingly
  prediction = model.predict(data) 
  predicted_class = labels[np.argmax(prediction)]
  print(prediction, predicted_class)
  if predicted_class == 'thumb_up':
   for frame in final_video:
    writer.write(frame)
   final_video = []
  elif predicted_class == 'thumb_down':
      final_video = []

# Break the program when key 'q' is pressed
 if cv2.waitKey(1) & 0xFF == ord('q'):
     break

# Close webcam and other connections
writer.release()
cap.release()
cv2.destroyAllWindows()

程序讲解
  1. 导入所需的库:NumPy(图像处理)、cv2(用于视频捕获的OpenCV)、TensorFlow和Keras以加载模型。
  2. 使用OpenCV库连接网络摄像头。
  3. 将模型加载到“model”中,并创建一个名为“labels”的列表,该列表将存储模型的类名称。
  4. 创建writer对象,该对象负责写入新的视频帧。
  5. 我们把视频帧存储在一个名为“final_video”的Python列表中。
  6. 现在,当视频打开时,我们将不断地将当前帧附加到writer对象中。
  7. 创建此图像的副本。在这张图上画出一个矩形框来表示模型的感兴趣区域之后,我们会把它显示给用户。
  8. 仅裁剪该部分并对其进行预处理,以便将其输入到我们的模型中。
  9. 如果预测类是“thumb_up”,这意味着用户对拍摄的帧很满意,因此我们可以将它们写入新的视频文件,然后清空数组。
  10. 如果预测的类是“thumb_down”,则意味着用户希望重新获取视频的该部分,因此通过清空数组来删除这些视频帧。
  11. 当按下按钮“q”时,程序将结束,这相当于停止录制。
  12. 最后,我们释放所有打开的连接。
  13. 修整后的视频可以在创建writer对象时选择的路径中找到。
输出:
☆ END ☆
(0)

相关推荐