动态手势识别(VGG11)

news2024/12/23 10:53:22

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

import torch
import torch.nn as nn


class 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))  # 定义卷积层conv1
        self.pool1 = nn.MaxPool3d(kernel_size=(
            1, 2, 2), stride=(1, 2, 2))  # 定义池化层pool1

        self.conv2 = nn.Conv3d(64, 128, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # 定义卷积层conv2
        self.pool2 = nn.MaxPool3d(kernel_size=(
            2, 2, 2), stride=(2, 2, 2))  # 定义池化层pool2

        self.conv3a = nn.Conv3d(128, 256, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # conv3a
        self.conv3b = nn.Conv3d(256, 256, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # conv3b
        self.pool3 = nn.MaxPool3d(kernel_size=(
            2, 2, 2), stride=(2, 2, 2))  # 定义池化层pooL3

        self.conv4a = nn.Conv3d(256, 512, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # conv4a
        self.conv4b = nn.Conv3d(512, 512, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # conv4b
        self.pool4 = nn.MaxPool3d(kernel_size=(
            2, 2, 2), stride=(2, 2, 2))  # 定义池化层pool4

        self.conv5a = nn.Conv3d(512, 512, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # conv5a
        self.conv5b = nn.Conv3d(512, 512, kernel_size=(
            3, 3, 3), padding=(1, 1, 1))  # conv5b
        self.pool5 = nn.MaxPool3d(kernel_size=(2, 2, 2), stride=(
            2, 2, 2), padding=(0, 1, 1))  # 定义池化层pool5

        # self.fc6=nn.Linear(8192,  4096)# 定义线性全连接层fC6
        self.fc6 = nn.Linear(8192, 4096)  # 定义线性全连接层fC6
        self.fc7 = nn.Linear(4096, 4096)  # 定义线性全连接层fc7
        self.fc8 = nn.Linear(4096, num_classes)  # 定义线性全连接层fc8
        self.relu = nn.ReLU()  # 定义激活函数ReLU
        self.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 x

    def __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 summary

    device = 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 nn

from VGG_11_3D import VGG_11_3D
import torch
import os
import numpy as np

num_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)
         # 用模型进行识别z
         with 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.coloradmin.cn/o/1680534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

猫狗分类识别①将文件夹中图像统一转化为某一固定格式

一、 导入库 pip install Image 二、确保库中存在Image库,可以在Terminal或控制台中查看 pip list 三、图像后缀处理 import os from PIL import Image def convert_to_png(input_folder, output_folder):if not os.path.exists(output_folder):os.makedirs(outp…

虚拟机安装麒麟系统

官网:https://www.kylinos.cn/ 系统:银河麒麟高级服务器操作系统V10(Kylin-Server-10-8.2) 安装介质:虚拟机 兼容版下载地址: https://distro-images.kylinos.cn:8802/web_pungi/download/share/phHF6x7rta…

一物一码数字化营销进军调味品行业,五丰黎红“星厨俱乐部”火啦!

近日,由五丰黎红联合纳宝科技精心打造的小程序“星厨俱乐部”火啦!一经上线就吸引了大量用户注册和参与,可以说取得了非常成功的市场反馈,那究竟是一个什么样的小程序,竟然有这么大的吸引力呢? 介绍小程序之…

【Mysql数据库进阶02】第一范式~第四范式 Normal Form

第一范式~第四范式Normal Form 0 引言1 第一范式2 第二范式3 第三范式4 BC范式5 第四范式总结 0 引言 因为软考,我又重新拾起了数据库,那么到底如何去判断它属于第几范式呢 1 第一范式 设R是一个关系模式,R属于第一范式当且仅当R中每一个…

P8805 [蓝桥杯 2022 国 B] 机房

P8805 [蓝桥杯 2022 国 B] 机房 分析 是一道lca题目,可以直接套模板 前缀和处理点权 具体思路: 1.n台电脑用n-1条网线相连,任意两个节点之间有且仅有一条路径(拆分成各自到公共祖先节点的路径——lca);…

MLP的代替:KAN

受柯尔莫哥洛夫-阿诺德表示定理的启发,作者提出柯尔莫哥洛夫-阿诺德网络(KAN)作为多层感知器(MLP)有前途的替代品。MLP 在节点(“神经元”)上具有固定的激活函数,而 KAN 在边&#x…

SAP CS07复制BOM简介

在比较大型的集团公司中会应用到这样一个场景,所有的BOM都是由总部研发统一管控,然后在下发到下属的工厂进行生产,当发生变更的时候BOM也是会随之进行变更。 同样的在相同的两家工厂中,使用的是一套的设计方案,并且当物料发起变更的时候BOM也要随之进行变更处理。 在对BO…

Linux程序开发(一):Linux基础入门安装和实操手册

Tips:"分享是快乐的源泉💧,在我的博客里,不仅有知识的海洋🌊,还有满满的正能量加持💪,快来和我一起分享这份快乐吧😊! 喜欢我的博客的话,记得…

C语言之旅:自定义类型(联合和枚举)

目录 一.联合体 1.1 联合体的声明 1.2 联合体的使用 1.3 为什么输出 4呢? 1.4 相同成员的结构体和联合体对比 1.5 联合体大小对比 1.6使用联合体判断大小端 二.枚举类型 2.1枚举类型的例举: 2.2枚举类型的优点 2.3 枚举类型的使用 在上篇文章中…

如何利用命令提示符列出文件?这里提供了几个实例供你参考

序言 什么命令可以用来列出目录中的文件?如何在命令提示符Windows 10/11中列出文件?很多人对这些问题感到困惑。在这篇文章中,我们详细解释了命令提示符列出文件的主题。 CMD(命令提示符)是一个功能强大的Windows内置…

Python学习之路 | Python基础语法(二)

Python3 面向对象 封装、继承、多态。 基础 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。方法:类中定义的函数。类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中…

与禹老师学前端vue3学习汇总

24.5.15: 创建Vue3工程 1.确定自己电脑有没有nodejs环境,在cmd中输入node,如果出现Node.js的版本号说明已经有这个环境了,否则搜索Node.js安装 2.先在D盘创建一个文件夹Vue3_Study,然后在这个空文件夹中右键选择终端…

【069】基于SpringBoot+Vue实现的企业资产管理系统

系统介绍 基于SpringBootVue实现的企业资产管理系统管理员功能有个人中心,用户管理,资产分类管理,资产信息管理,资产借出管理,资产归还管理,资产维修管理。用户可以对资产进行借出和归还操作。因而具有一定…

Git系列:Git Switch 高效使用技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

实时网络监控 - 一目了然网络状况

网络问题排查一直是IT管理员头痛的问题。随着网络规模的不断扩大和业务复杂度的提升,如何快速定位和解决网络故障变得尤为关键。本文详细介绍了一款名为 AnaTraf 的网络流量分析工具,它能提供全流量回溯分析、实时网络监控、性能分析等功能,助力企业快速诊断和解决各…

每日两题 / 236. 二叉树的最近公共祖先 124. 二叉树中的最大路径和(LeetCode热题100)

236. 二叉树的最近公共祖先 - 力扣(LeetCode) dfs统计根节点到p,q节点的路径,两条路径中最后一个相同节点就是公共祖先 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* …

鸿蒙 DevEcoStudio:简单实现网络请求登录案例

使用http或axios实现登录案例 在entry/src/main/ets/pages路径下新建Page9.ets文件: import http from ohos.net.http import router from ohos.router Entry Component struct Page9 {State message: string Hello WorldState username: string State password:…

学习了java编程后,你就只能做java程序员吗?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 学习了Java编程后,…

KNN算法用于回归分析

生成数据集 from sklearn.datasets import make_regression import matplotlib.pyplot as plt# 生成特征数量为1, 噪音为50的数据集 X, y make_regression(n_features1, n_informative1, noise50, random_state8)# 散点图 plt.scatter(X, y, c"orange",…

CTF例题:[SWPU2019]Web1(无列名注入)

网址:BUUCTF在线评测 搜索web1 启动靶机 点击链接进入题目 进入题目后发现有登录和注册接口,直接注册登录。 首先通过1进行测试,查看是否有注入点 出现报错,说明可能存在注入点 然后继续测试发现该服务器过滤了: or、…