动态手势识别(VGG11)

学校的大作业要做一个视频图像处理相关的,就做了动态手势识别
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()

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

labelimg删除用不到的标签(yolo格式)以及 下载使用

问题:当我们标注完成新的类别后后直接删除classes.txt中不需要的类别之后再次打开labelimg会闪退,如何删除不需要的标签并且能够正确运行呢?(yolo格式) 原因:当我们打开labelimg进行标注的时候&#xff0c…

JumpServer堡垒机简单式部署与管理(v3.10.8) 上

目录 一. 环境准备 1.1 关闭防火墙 1.2 永久关闭SEliunx 1.3 重启虚拟机让seliunx文件生效 1.4 配置阿里源镜像 二. 安装部署 2.1 上传压缩包到虚拟机(v3.10.8) 2.2 解压 2.3 一键安装部署 2.4 安装完成界面 2.5 启动 2.6 浏览器访问IP 2.7 使…

“图生视频”技术创新:剪贴画秒变动画生成的实验验证与分析

在最近的研究进展中,AniClipart系统的问世标志着文本到视频生成技术的一个重要里程碑。这一系统由香港城市大学和莫纳什大学的研究者们共同开发,旨在解决将静态剪贴画图像根据文本提示自动转换成动画序列的挑战。传统的动画制作流程繁琐且耗时&#xff0…

基于物联网的教室人数检测系统-设计说明书

设计摘要: 本设计基于物联网技术,实现了一个教室人数检测系统。系统利用STM32单片机作为中控,通过红外对管检测人员进出教室,并实时统计应到人数和实到人数,同时使用OLED显示屏显示相关信息。系统还通过温湿度传感器检…

掌握Linux常用命令,扫平面试需求障碍

cd 切换目录。 > cd ../ #切换到父级目录 > cd /tmp # 切换到/tmp目录 > cd ~ # 切换到当前用户的家目录 ls命令 查看文件与目录的命令,list 的缩写。 > ls -l #列出长数据串,包含文件的属性与权限数据等 > ls -a #列出隐藏…

script标签以及defer和async属性

1. <script>标签 将JavaScript代码嵌入到HTML中主要方式是使用<script>元素。 使用<script>的方式有两种&#xff1a; &#xff08;1&#xff09;直接在网页中嵌入JavaScript代码&#xff1a; <script>function sayHi() {console.log("Hi"…

FreeRTOS【6】线程优先级

1.开发背景 基于上一篇指引&#xff0c;已经了解了线程的阻塞&#xff0c;这个篇章主要介绍线程优先级的影响 2.开发需求 设计实验验证高优先级会抢占低优先级线程 CPU 3.开发环境 window10 MDK STM32F429 FreeRTOS10.3.1 4.实现步骤 1&#xff09;创建测试线程&#xff…

Rust构造JSON和解析JSON

目录 一、Rust构造JSON和解析JSON 二、知识点 serde_json JSON 一、Rust构造JSON和解析JSON 添加依赖项 cargo add serde-json 代码&#xff1a; use serde_json::{Result, Value};fn main() -> Result<()>{//构造json结构 cpu_loadlet data r#"{"…

Django Rest Framework 全局异常处理

在Django Rest Framework&#xff08;DRF&#xff09;中&#xff0c;全局异常处理是一种重要的机制&#xff0c;它可以帮助我们更好地管理API中的异常情况&#xff0c;并返回统一的错误响应。本文将详细介绍两种全局异常处理的方法&#xff1a;使用中间件&#xff08;Middlewar…

Jenkins 忘记登录密码怎么办

在安装Jenkins中遇到忘记登录密码该怎么呢&#xff1f;下面是一个解决办法 1. 先停止jenkins服务 我是用tomcat启动的jenkis 2. 找到config.yaml文件 find / -name config.xml命令执行后找到如下结果&#xff1a; /root/.jenkins/config.xml /root/.jenkins/users/admin_839…

现在适合进入AIGC行业吗?

现在适合进入AIGC行业吗&#xff1f; 随着人工智能生成内容&#xff08;AIGC&#xff09;技术的快速发展&#xff0c;越来越多的人开始关注这个行业。那么&#xff0c;现在是否是进入AIGC行业的好时机呢&#xff1f;本文将从行业前景、市场需求以及个人选择与规划三个方向进行…

3D轻量化引擎HOOPS Communicator在PLM全生命周期管理中的应用

在当今快速发展的工业领域&#xff0c;产品生命周期管理&#xff08;PLM&#xff09;是确保产品从设计到市场再到最终退役过程中信息一致性和流程效率的关键。 随着3D模型的日益复杂化和数据量的不断增长&#xff0c;传统的PLM系统面临着数据管理和渲染效率的挑战。HOOPS Comm…

【Spring之依赖注入】2. Spring处理@Async导致的循环依赖失败问题

使用异步Async注解后导致的循环依赖失败详解 1 问题复现1.1 配置类1.2 定义Service1.3 定义Controller1.4 启动springboot报错 2.原因分析&#xff1a;看Async标记的bean注入时机2.1 循环依赖生成过程2.2 自检程序 doCreateBean方法 3.解决方案3.1 懒加载Lazy3.1.1 将Lazy写到A…

SDL系列(一)—— 小白入门

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套开放源代码的 跨平台多媒体开发库 &#xff0c;使用 C 语 言写成。 SDL 提供了数种控制图像、声音、输出入的函数&#xff0c;让开发者只要用相同或是相似的 代码就可以开发出 跨多个平台&#xff08; Linu…

公共字段填充(AOP的使用)

Thread是线程池,ThreadLocal是线程变量,每个线程变量是封闭的,与其它线程变量分隔开来,在sky-common下的com.sky.context包下有一个Basecontext类 public class BaseContext {//每一个上下文创建了一个线程变量,用来存储long类型的id//创建三个方法,用来设置,取用,删除idpubli…

基于微信小程序+JAVA Springboot 实现的【房屋租赁管理系统】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称&#xff1a; 基于微信小程序的房屋租赁管理系统 在本次项目开发中&#xff0c;我们成功构建了一款基于微信小程序的房屋租赁管理系统&#xff0c;旨在通过现代化信息技术提升房屋租赁服务的效率和质量。以下是对本项目的全面总结&#xff1a; 项目背景与目…

07-Fortran基础--Fortran指针(Pointer)的使用

07-Fortran基础--Fortran指针Pointer的使用 0 引言1 指针&#xff08;Poionter&#xff09;的有关内容1.1 一般类型指针1.2 数组指针1.3 派生类(type)指针1.4 函数指针 2 可运行code 0 引言 Fortran是一种广泛使用的编程语言&#xff0c;特别适合科学计算和数值分析。Fortran 9…

43k Star!推荐一款功能强大的开源笔记软件!

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

【2024系统架构设计】回顾历史,查缺补漏篇 ③

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

Lora训练Windows[笔记]

一. 使用kohya_ss的GUI版本&#xff08;https://github.com/bmaltais/kohya_ss.git&#xff09; 这个版本跟stable-diffusion-webui的界面很像&#xff0c;只不过是训练模型专用而已&#xff0c;打开的端口同样是7860。 1.双击setup.bat,选择1安装好xformers,pytorch等和cuda…