TensorFlow2.X结合OpenCV 实现手势识别

2023-11-14

TensorFlow2.X结合OpenCV 实现手势识别

使用Tensorflow 构建卷积神经网络,训练手势识别模型,使用opencv DNN 模块加载模型实时手势识别
效果如下:

在这里插入图片描述
先显示下部分数据集图片(0到9的表示,感觉很怪)
在这里插入图片描述
构建模型进行训练
数据集地址

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets,layers,optimizers,Sequential,metrics
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2
import os 
import pathlib
import random
import matplotlib.pyplot as plt

os.environ['TF_CPP_MIN_LOG_LEVEL']='2'



def read_data(path):
    path_root = pathlib.Path(path)
    # print(path_root)
    # for item in path_root.iterdir():
    #     print(item)
    image_paths = list(path_root.glob('*/*'))
    image_paths = [str(path) for path in image_paths]
    random.shuffle(image_paths)
    image_count = len(image_paths)
    # print(image_count)
    # print(image_paths[:10])

    label_names = sorted(item.name for item in path_root.glob('*/') if item.is_dir())
    # print(label_names)
    label_name_index = dict((name, index) for index, name in enumerate(label_names))
    # print(label_name_index)
    image_labels = [label_name_index[pathlib.Path(path).parent.name] for path in image_paths]
    # print("First 10 labels indices: ", image_labels[:10])
    return image_paths,image_labels,image_count


def preprocess_image(image):
    image = tf.image.decode_jpeg(image, channels=3)
    image = tf.image.resize(image, [100, 100])
    image /= 255.0  # normalize to [0,1] range
    # image = tf.reshape(image,[100*100*3])
    return image

def load_and_preprocess_image(path,label):
    image = tf.io.read_file(path)
    return preprocess_image(image),label

def creat_dataset(image_paths,image_labels,bitch_size):
    db = tf.data.Dataset.from_tensor_slices((image_paths, image_labels))
    dataset = db.map(load_and_preprocess_image).batch(bitch_size)    
    return dataset


def train_model(train_data,test_data):
    #构建模型
    network = keras.Sequential([
            keras.layers.Conv2D(32,kernel_size=[5,5],padding="same",activation=tf.nn.relu),
            keras.layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
            keras.layers.Conv2D(64,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
            keras.layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),
            keras.layers.Conv2D(64,kernel_size=[3,3],padding="same",activation=tf.nn.relu),
            keras.layers.Flatten(),
            keras.layers.Dense(512,activation='relu'),
            keras.layers.Dropout(0.5),
            keras.layers.Dense(128,activation='relu'),
            keras.layers.Dense(10)])
    network.build(input_shape=(None,100,100,3))
    network.summary()

    network.compile(optimizer=optimizers.SGD(lr=0.001),
            loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
            metrics=['accuracy']
    )
    #模型训练
    network.fit(train_data, epochs = 100,validation_data=test_data,validation_freq=2)  
    network.evaluate(test_data)

    tf.saved_model.save(network,'D:\\code\\PYTHON\\gesture_recognition\\model\\')
    print("保存模型成功")



    # Convert Keras model to ConcreteFunction
    full_model = tf.function(lambda x: network(x))
    full_model = full_model.get_concrete_function(
    tf.TensorSpec(network.inputs[0].shape, network.inputs[0].dtype))

    # Get frozen ConcreteFunction
    frozen_func = convert_variables_to_constants_v2(full_model)
    frozen_func.graph.as_graph_def()

    layers = [op.name for op in frozen_func.graph.get_operations()]
    print("-" * 50)
    print("Frozen model layers: ")
    for layer in layers:
        print(layer)

    print("-" * 50)
    print("Frozen model inputs: ")
    print(frozen_func.inputs)
    print("Frozen model outputs: ")
    print(frozen_func.outputs)

    # Save frozen graph from frozen ConcreteFunction to hard drive
    tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
            logdir="D:\\code\\PYTHON\\gesture_recognition\\model\\frozen_model\\",
            name="frozen_graph.pb",
            as_text=False)
    print("模型转换完成,训练结束")


if  __name__ == "__main__":
    print(tf.__version__)
    train_path = 'D:\\code\\PYTHON\\gesture_recognition\\Dataset'
    test_path = 'D:\\code\\PYTHON\\gesture_recognition\\testdata' 
    image_paths,image_labels,_ = read_data(train_path)
    train_data = creat_dataset(image_paths,image_labels,16)
    image_paths,image_labels,_ = read_data(test_path)
    test_data = creat_dataset(image_paths,image_labels,16)
    train_model(train_data,test_data)
    

OpenCV加载模型,实时检测
这里为了简化检测使用了ROI。

import cv2
from cv2 import dnn
import numpy as np
print(cv2.__version__)
class_name = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
net = dnn.readNetFromTensorflow('D:\\code\\PYTHON\\gesture_recognition\\model\\frozen_model\\frozen_graph.pb')
cap = cv2.VideoCapture(0)
i = 0
while True:
    _,frame= cap.read() 
    src_image = frame
    cv2.rectangle(src_image, (300, 100),(600, 400), (0, 255, 0), 1, 4)
    frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
    pic = frame[100:400,300:600]
    cv2.imshow("pic1", pic)
    # print(pic.shape)
    pic = cv2.resize(pic,(100,100))
    blob = cv2.dnn.blobFromImage(pic,     
                             scalefactor=1.0/225.,
                             size=(100, 100),
                             mean=(0, 0, 0),
                             swapRB=False,
                             crop=False)
    # blob = np.transpose(blob, (0,2,3,1))                         
    net.setInput(blob)
    out = net.forward()
    out = out.flatten()

    classId = np.argmax(out)
    # print("classId",classId)
    print("预测结果为:",class_name[classId])
    src_image =	cv2.putText(src_image,str(classId),(300,100), cv2.FONT_HERSHEY_SIMPLEX, 2,(0,0,255),2,4)
    # cv.putText(img, text, org, fontFace, fontScale, fontcolor, thickness, lineType)
    cv2.imshow("pic",src_image)
    if cv2.waitKey(10) == ord('0'):
        break

小结

这里本质上还是一个图像分类任务。而且,样本数量较少。优化的时候需要做数据增强,还需要防止过拟合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TensorFlow2.X结合OpenCV 实现手势识别 的相关文章

随机推荐

  • 前端常见难点面试题

    1 跨域 同源策略 同源策略 同源策略是浏览器的一个安全功能 不同源的客户端脚本在没有明确授权的情况下 不能读写对方资源 同源 就是协议 域名和端口号相同 降域 document domain 同源策略认为域和子域属于不同的域 如 chil
  • 《代码走查》杂记

    代码走查 一 定义 1 代码走查 code walkthrough 是一个开发人员与架构师集中与讨论代码的过程 代码走查的目的交换有关代码是如何书写的思路 并建立一个对代码的标准集体阐述 在代码走查的过程中 开发人员都应该有机会向其他人来阐
  • OpenGL: 视图矩阵的推导

    OpenGL 视图矩阵的推导 2014年03月04日 11 08 45 阅读数 6525 把物体从世界坐标系转化到视点坐标系的矩阵称为视图矩阵 下面我们先看下opengl视图矩阵的推导过程 假设视点或camera的局部坐标系为UVN UVN
  • webpack中的代码分离

    Tip 本指南继续沿用 起步 中的示例代码 请确保你已熟悉这些指南中提供的示例以及输出管理章节 代码分离是 webpack 中最引人注目的特性之一 此特性能够把代码分离到不同的 bundle 中 然后可以按需加载或并行加载这些文件 代码分离
  • Python 九九乘法表的7种实现方式

    Python 九九乘法表的7种实现方式 九九乘法表是初学者学习编程的必要练手题目之一 因此各种语言都有对应的实现方式 而 Python 也不例外 在 Python 中 我们可以使用多种方式来生成一个简单的九九乘法表 实现方式一 双重循环 f
  • 远程debug java_远程Debug Java进程的方法

    远程debug的意思是启动一个Java进程 启动一个debugger进程 将两者连接起来 利用debugger来debug Java进程 事实上目前所有的IDE的debug功能都是通过远程debug方式来实现的 它们都利用了一个叫做JDPA
  • 【行人重识别】Unsupervised Salience Learning for Person Re-identification

    Abstract 人眼可以基于 一些较小的显着区域来识别人的身份 然而 当使用现有方法计算图像的相似度时 通常会隐藏这种有价值的显着信息 此外 许多现有的方法学习区别性特征并以监督的方式处理急剧的视点变化 并要求为不同的摄像机视图对标注新的
  • QSqlQueryModle使用过滤器来完成数据库数据筛选

    原型 void QSqlTableModel setFilter const QString filter 注意 如果模型已从数据库中填充数据 则模型将其与新滤波器重新选择 否则 将在调用下一次select 中应用过滤器 model的sel
  • 15.服务数据的定义与使用

    学习视频 https www bilibili com video BV1zt411G7Vn p 15 目标 服务数据的自定义 客户端发布显示个人信息的请求 服务端处理请求及反馈应答 一 自定义服务数据 1 定义srv文件 mkdir ca
  • Python 判断None的三种方法

    1 if x is None 2 if not x 3 if not x is None 在Python 中 None False 空字符串 空列表 空元组 其实都相当于False 如果x为空列表 y为None 如果你做x is None的
  • 社区版pycharm官网下载安装教程

    1 官网下载安装包 官网地址 https www jetbrains com pycharm 选择所需版本 2 安装 安装前确认已完成python软件安装 建议不要安装到C盘 路径不要出现中文 直接install 等待安装 3 配置 点击桌
  • PyQt中的多线程使用方法(以PySide6为例)

    在Qt中 开启多线程的方法有多种 总体分成QThread QObject QRunnable QtConcurrent三大类方法 而放到PyQt和PySide具体的使用中 使用方法可以说十分类似 一 继承QThread类及run方法 此方法
  • while it seems to fit format ‘yyyy-MM-dd‘T‘HH:mm:ss.SSSX‘

    一 报错信息如下 2023 04 11 18 52 47 534 WARN 21608 nio 9090 exec 1 w s m s DefaultHandlerExceptionResolver Resolved org springf
  • 浅析CV下的无人驾驶技术

    报告题目 浅析CV下的无人驾驶技术 1 概述 2006年 Geoffrey Hinton老爷子针对传统的神经网络算法训练速度慢 面对多层Hidden Layer严重出现过拟合的现状 提出了无监督预训练对权值进行初始化 有监督训练微调的解决方
  • 三国群英传霸业之王服务器维护,《三国群英传2网络版》掌上助手APP曝光,三国群英传霸业之王...

    列位从公能否还为本人错过逛戏勾当而感应懊末路 能否曾身正在外但始末心系三国 又能否苦于只能侃侃而谈却无法展现本人的 宏图霸业 为了让大师可以或许随时随地查看逛戏情况 领会逛戏资讯 我们将正在逛戏上线后推出掌上帮手 列位从公能否还为本人错过逛
  • 【C/C++】日常学习7

    1 输入 输出流操作 2 构造函数参数参数列表初始化 3 C 中类的前向声明以及和 include的区别 4 在函数后加const的意义 1 输入 输出流操作 读取字符串的不同操作 cin 遇到空格 回车符就停止读取 空格 回车符是分隔符
  • ❓“想要创业项目,但又不知道互联网上有哪些好的项目?”

    想创业 但不知道从哪里入手 5大互联网创业项目 一起来了解一下吧 在互联网时代 创业项目不再局限于传统的实体店铺 下面介绍的是互联网创业项目 希望可以给想要创业的你提供一些启示 1 电商平台 电商平台是最为常见的互联网创业项目 可以选择开设
  • 实现Vue高德地图多边形编辑器吸附功能

    前言 之前做的高德地图多边形编辑器吸附功能 最近出现不能编辑 在修改的过程中顺便记录一下 实现效果 安装 npm i amap amap jsapi loader save 核心代码
  • windows7 搭建 Spark 详细图解

    第一步 下载Spark exe 可执行程序 程序的下载地址 http www igniterealtime org downloads index jsp openfire 如果遇到spark 无法正在安装的情况 可以参考该文章 安装Spa
  • TensorFlow2.X结合OpenCV 实现手势识别

    TensorFlow2 X结合OpenCV 实现手势识别 使用Tensorflow 构建卷积神经网络 训练手势识别模型 使用opencv DNN 模块加载模型实时手势识别 效果如下 先显示下部分数据集图片 0到9的表示 感觉很怪 构建模型进