基于手势的视频剪辑深度学习程序

在本文中,将探讨如何构建一个深度学习程序,以自动根据手势剪辑视频。这样的应用程序将极大地方便那些不擅长视频编辑的人们。

项目概述

将使用“点赞”和“不点赞”的手势来创建检查点,并且只保存想要的视频部分。假设“点赞”手势表示成功,意味着这些帧可以保存到最终的视频文件中,而“不点赞”手势则表示失败,意味着相应的视频帧将被丢弃。这是项目的高层次概览,将在实施过程中讨论更多细节。

Google Teachable Machine简介

将使用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()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485