动态手势识别(VGG11)

学校的大作业要做一个视频图像处理相关的,就做了动态手势识别
VGG代码

import torch
import torch.nn as nnclass VGG_11_3D(nn.Module):def __init__(self, num_classes, pretrained=False):super(VGG_11_3D, self).__init__()self.conv1 = nn.Conv3d(3, 64, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # 定义卷积层conv1self.pool1 = nn.MaxPool3d(kernel_size=(1, 2, 2), stride=(1, 2, 2))  # 定义池化层pool1self.conv2 = nn.Conv3d(64, 128, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # 定义卷积层conv2self.pool2 = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(2, 2, 2))  # 定义池化层pool2self.conv3a = nn.Conv3d(128, 256, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # conv3aself.conv3b = nn.Conv3d(256, 256, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # conv3bself.pool3 = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(2, 2, 2))  # 定义池化层pooL3self.conv4a = nn.Conv3d(256, 512, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # conv4aself.conv4b = nn.Conv3d(512, 512, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # conv4bself.pool4 = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(2, 2, 2))  # 定义池化层pool4self.conv5a = nn.Conv3d(512, 512, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # conv5aself.conv5b = nn.Conv3d(512, 512, kernel_size=(3, 3, 3), padding=(1, 1, 1))  # conv5bself.pool5 = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(2, 2, 2), padding=(0, 1, 1))  # 定义池化层pool5# self.fc6=nn.Linear(8192,  4096)# 定义线性全连接层fC6self.fc6 = nn.Linear(8192, 4096)  # 定义线性全连接层fC6self.fc7 = nn.Linear(4096, 4096)  # 定义线性全连接层fc7self.fc8 = nn.Linear(4096, num_classes)  # 定义线性全连接层fc8self.relu = nn.ReLU()  # 定义激活函数ReLUself.dropout = nn.Dropout(p=0.5)  # 定义Dropout层self.__init_weight()def forward(self, x):x = self.relu(self.conv1(x))  # 数据经过conv1层后经过激活函数激活x = self.pool1(x)  # 数据经过p0oL1层进行池化操作x = self.relu(self.conv2(x))  # 数据经过conv2层后经过激活函数激活x = self.pool2(x)  # 数据经过pooL2层进行池化操作x = self.relu(self.conv3a(x))  # 数据经过conv3a层后经过激活函数激活x = self.relu(self.conv3b(x))  # 数据经过conv3b层后经过激活函数激活x = self.pool3(x)  # 数据经过pooL3层进行池化操作x = self.relu(self.conv4a(x))  # 数据经过conv4a层后经过激活函数激活x = self.relu(self.conv4b(x))  # 数据经过conv4b层后经过激活函数激活x = self.pool4(x)  # 数据经过pool4层进行池化操作x = self.relu(self.conv5a(x))  # 数据经过conv4a层后经过激活函数激活x = self.relu(self.conv5b(x))  # 数据经过conv4b层后经过激活函数激活x = self.pool5(x)  # 数据经过pool4层进行池化操作# 经过p0o15池化以后特征图的大小为(512,1,4,4),利用vie函数将其转化为(1,8192)x = x.view(x.shape[0], -1)# x = x.view(-1, 73728)  # 经过p0o15池化以后特征图的大小为(512,1,4,4),利用vie函数将其转化为(1,8192)x = self.relu(self.fc6(x))  # 维度转化以后的数据经过fc6层,并经过激活函数x = self.dropout(x)  # 经过dropout层x = self.relu(self.fc7(x))  # 数据经过fc7层,并经过激活函数x = self.dropout(x)  # 经过dropout层x = self.fc8(x)  # 数据经过fc8层,并输出return xdef __init_weight(self):for m in self.modules():if isinstance(m, nn.Conv3d):torch.nn.init.kaiming_normal_(m.weight)if __name__ == "__main__":from torchsummary import summarydevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")net = VGG_11_3D(num_classes=27, pretrained=False).to(device)print(summary(net, (3, 16, 96, 96)))

主函数:

import cv2
import pandas as pd
from torch import nnfrom VGG_11_3D import VGG_11_3D
import torch
import os
import numpy as npnum_classes = 27
# C3D模型实例化
model = VGG_11_3D(num_classes, pretrained=False)
# 将模型放入到训练设备中
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)
pre_epoch = 50
checkpoint = torch.load(os.path.join('VGG-11-3D_epoch-' + str(pre_epoch) + '.pth.tar'))
# epoch = checkpoint['epoch']
model.load_state_dict(checkpoint['state_dict'])
# optimizer.load_state_dict(checkpoint['opt_dict'])
# 开始模型的测试
model.eval()# 获取对应视频的标签,并将标签转化为int的数字类型,同时转化为array格式
labels = list(pd.read_csv('./labels/labels.csv', header=None)[0].values)# 打开摄像头
cap = cv2.VideoCapture(0)
# cap.set(cv2.CAP_PROP_FPS, 16) # 设置帧速
# cap.set(cv2.CAP_PROP_FRAME_WIDTH, 176)  # 设置宽度
# cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 100)  # 设置高度
target_fps = 16  # 按16的帧率采样
cap_fps = cap.get(cv2.CAP_PROP_FPS)
delta = cap_fps // (target_fps - 1)  # 每delta帧采样1帧print(delta)
cnt = 0
# 循环读取摄像头数据
buffer = []
while True:ret, frame = cap.read()frame_ = cv2.resize(frame, (96, 96))if cnt % delta == 0:buffer.append(np.array(frame_).astype(np.float64))if len(buffer) > 16:buffer.pop(0)  # 弹出开头的帧if len(buffer) == 16:inputs = np.array(buffer, dtype='float32')inputs = np.expand_dims(inputs, axis=0)inputs = inputs.transpose((0, 4, 1, 2, 3))inputs = torch.from_numpy(inputs).contiguous()inputs = inputs.to(device)# 用模型进行识别zwith torch.no_grad():outputs = model(inputs)# 计算softmax的输出概率probs = nn.Softmax(dim=1)(outputs)# 计算最大概率值的标签preds = torch.max(probs, 1)[1]label_name = labels[preds.item()]print(label_name)cv2.putText(frame, label_name, (20, 20),cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)# 在窗口中显示摄像头画面cv2.imshow('Camera', frame)# print(frame.shape)cnt += 1# 按下 'q' 键停止摄像头if cv2.waitKey(1) & 0xFF == ord('q'):break# 关闭摄像头
cap.release()
cv2.destroyAllWindows()

运行效果图:
在这里插入图片描述
需要的找我私信要完整文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/704640.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADS FEM 仿真设置

1、EM Simulator 选择FEM。 2、在layout界面打开的EM功能,这里不需要操作。 3、Partitioning 不需要操作。 4、没有叠层的话需要新建,过孔可以在叠层处右键添加。 5、端口需要设置GND layer。 6、设置仿真频率。 7、Output plan。 8、Options 设置 介质…

红蓝对抗 网络安全 网络安全红蓝对抗演练

什么是红蓝对抗 在军事领域,演习是专指军队进行大规模的实兵演习,演习中通常分为红军、蓝军,演习多以红军守、蓝军进攻为主。类似于军事领域的红蓝军对抗,网络安全中,红蓝军对抗则是一方扮演黑客(蓝军&…

AI高清逼真换脸换装

在我们的最新AI换脸换装技术中,我们将高度真实的视觉效果与创新的人工智能技术相结合,提供了前所未有的个性化数字体验。无论是为了娱乐、广告、电影制作还是个人化虚拟体验,我们的技术都能让你的想象无缝转换为现实。通过我们的平台&#xf…

数据结构------二叉树经典习题1

博主主页: 码农派大星. 关注博主带你了解更多数据结构知识 1判断相同的树 OJ链接 这道题相对简单,运用我们常规的递归写法就能轻松写出 所以我们解题思路应该这样想: 1.如果p为空,q为空,那么就是两颗空树肯定相等 2.如果一个树为空另一棵树不为空那么…

DRF 跨域问题

【一】说明 CORS(跨来源资源共享,Cross-Origin Resource Sharing)是一种浏览器技术的规范,旨在解决浏览器同源策略(Same-Origin Policy)的限制,使得Web服务可以从不同的网域(源&…

计算机视觉与机器学习之文档解析与向量化技术加速多模态大模型训练与应用

目录 前言1、TextIn文档解析技术1.1、文档解析技术1.2、目前存在的问题1.2.1、不规则的文档信息示例 1.3、合合信息的文档解析1.3.1、合合信息的TextIn文档解析技术架构1.3.2、版面分析关键技术 Layout-engine1.3.3、文档树提取关键技术 Catalog-engine1.3.4、双栏1.3.5、非对称…

活字格如何复制指定单元格中的内容

1、安装插件“复制到剪贴板”后。 2、在需要执行复制的命令中,选择“复制到剪贴板” 3、选择源单元格。 4、执行看效果。

在线扭蛋机小程序:商家稳占市场的新突破口

近几年,扭蛋机进入了爆发期,动漫、游戏的发展更是推动了市场的发展,我国扭蛋机正在蓬勃发展中。 不过,在市场规模扩大下,扭蛋机行业的竞争力也在同时加大,企业商家需要在市场竞争中寻求发展新思路&#xf…

23.HashMap的put方法流程

一、put方法的流程图 二、put方法的执行步骤 首先,根据key值计算哈希值。然后判断table数组是否为空或者数组长度是否为0,是的话则要扩容,resize()。接着,根据哈希值计算数组下标。如果这个下标位置为空&a…

【Linux】Udp_Tcp协议

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Linux 目录 👉🏻再谈端口号pidof命令 👉🏻UDP协议报文的管理基于UDP协议的应用层协议 👉&#x1…

每日一日 kotori和气球

kotori和气球 (nowcoder.com) 题目描述,就是只要相邻的气球不相同即可, 解题思路 使用高中的排列组合:第一个位置 可以填n种情况 其次后推不可与前一个相同所以可以 填n -1中情况,结果相乘即可 可以使用bigInteger实现 或者说…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…