在本文中,将探讨如何构建一个深度学习程序,以自动根据手势剪辑视频。这样的应用程序将极大地方便那些不擅长视频编辑的人们。
将使用“点赞”和“不点赞”的手势来创建检查点,并且只保存想要的视频部分。假设“点赞”手势表示成功,意味着这些帧可以保存到最终的视频文件中,而“不点赞”手势则表示失败,意味着相应的视频帧将被丢弃。这是项目的高层次概览,将在实施过程中讨论更多细节。
将使用Google Teachable Machine来训练深度学习模型,并使用Python来实现程序。Google Teachable Machine允许为多种用例创建深度学习模型,而无需编写任何代码。使用它非常简单。点击“开始”按钮,将看到下面的屏幕。如所见,可以为姿态估计、图像分类或音频分类创建模型。选择“图像项目”,因为任务是图像分类。
上述是项目的初始设置。类别代表不同的分类类别。可以直接从网络浏览器使用网络摄像头记录样本(创建数据集)。或者,也可以上传来自本地机器或Google Drive的图像。
如下所示,创建3个类别(点赞、不点赞和随机)。需要第三个“随机”类别来检查用户是否在显示手势。点击“点赞”类别中的“网络摄像头”按钮,并点击左上角的裁剪按钮。
裁剪网络摄像头图像右上角的某个区域,因为假设用户在运行程序时会抬起他的/她的手在那个区域做出手势。完成后,点击蓝色“完成裁剪”按钮以确认裁剪区域。
现在,点击“按住录制”按钮并录制样本。由于正在为“点赞”类别录制图片,竖起大拇指并从不同的距离和角度录制图像。这是为了确保模型能够很好地泛化,而不会过度拟合到一些特定的例子。
完成此操作后,可以选择样本中的单个图像,并在录制错误时删除或更改其标签。重复“不点赞”类别和“随机”类别的过程(收集背景图像)。
注意:尽量使所有类别的图像数量大致相等,以便模型不会偏向任何一个特定类别。
点击“训练模型”按钮以开始训练刚刚收集的图像上的模型!还可以点击“高级”部分下拉菜单以更改超参数。
在模型训练期间,可以点击“幕后”按钮来可视化各种性能指标。训练完成后,可以在浏览器本身上测试模型,以决定模型是否在所有可能的情况下都训练得足够,或者是否需要添加更多图像。
现在,点击顶部的“导出模型”按钮,并选择Tensorflow -> Keras。还可以根据自己的用例将模型转换为其他格式,如Tensorflow.js或Tensorflow Lite。点击“下载模型”并解压缩Zip文件以获得模型权重和标签。
import numpy as np
import cv2
import tensorflow.keras
from keras.preprocessing import image
# 访问网络摄像头
cap = cv2.VideoCapture(0)
state = True
# 加载TensorFlow模型权重
model = tensorflow.keras.models.load_model('keras_model.h5')
labels = ['点赞', '不点赞', '随机']
# 设置要保存视频的帧的宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 创建一个写入对象以保存帧
writer = cv2.VideoWriter(r'C:UsersSharan BabuDesktoptrimmed_video.mp4',
cv2.VideoWriter_fourcc(*'XVID'), 25, (width, height))
final_video = [] # 用于存储视频帧的列表
# 视频编辑!
while True:
success, image = cap.read()
if success == True:
final_video.append(image)
img = image.copy()
# 绘制一个矩形以指示感兴趣区域并裁剪它
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]
# 图像预处理以进行预测
data = cv2.resize(roi, (224, 224))
data = np.array(data, dtype=np.float32)
data = np.expand_dims(data, axis=0)
data = data / 255
# 预测图像的输出类别并相应地保存视频
prediction = model.predict(data)
predicted_class = labels[np.argmax(prediction)]
print(prediction, predicted_class)
if predicted_class == '点赞':
for frame in final_video:
writer.write(frame)
final_video = []
elif predicted_class == '不点赞':
final_video = []
# 按'q'键退出程序
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 关闭网络摄像头和其他连接
writer.release()
cap.release()
cv2.destroyAllWindows()