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

小结

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

到此这篇关于TensorFlow2.X结合OpenCV 实现手势识别功能的文章就介绍到这了,更多相关TensorFlow OpenCV 手势识别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 结合OpenCV与TensorFlow进行人脸识别的实现

    作为新手来说,这是一个最简单的人脸识别模型,难度不大,代码量也不算多,下面就逐一来讲解,数据集的准备就不多说了,因人而异. 一. 获取数据集的所有路径 利用os模块来生成一个包含所有数据路径的list def my_face(): path = os.listdir("./my_faces") image_path = [os.path.join("./my_faces/",img) for img in path] return image_path def ot

  • opencv实现静态手势识别 opencv实现剪刀石头布游戏

    本文实例为大家分享了opencv实现静态手势识别的具体代码,供大家参考,具体内容如下 要想运行该代码,请确保安装了:python 2.7,opencv 2.4.9 效果如下: 算法如下: 把图片先进行处理,处理过程: 1.用膨胀图像与腐蚀图像相减的方法获得轮廓. 2.用二值化获得图像 3. 反色 经过如上的处理之后,图片为: 这之后就简单了,设计一个办法把三种图像区分开来即可. 代码如下: # -*- coding: cp936 -*- import cv2 import numpy impor

  • OpenCV+python手势识别框架和实例讲解

    基于OpenCV2.4.8和 python 2.7实现简单的手势识别. 以下为基本步骤 1.去除背景,提取手的轮廓 2. RGB->YUV,同时计算直方图 3.进行形态学滤波,提取感兴趣的区域 4.找到二值化的图像轮廓 5.找到最大的手型轮廓 6.找到手型轮廓的凸包 7.标记手指和手掌 8.把提取的特征点和手势字典中的进行比对,然后判断手势和形状 提取手的轮廓 cv2.findContours() 找到最大凸包cv2.convexHull(),然后找到手掌和手指的相对位置,定位手型的轮廓和关键点

  • 利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统

    基于python opencv人脸识别的签到系统前言先看下效果实现的功能开始准备页面的构建功能实现代码部分总结 前言 一个基于opencv人脸识别和TensorFlow进行模型训练的人脸实时签到系统,作者某二本大学里的末流学生,写于2019/09/,python学习期间. 今年7月份开始接触python的,最近闲着无事就开始做了这个人脸识别的系统,一开始的话就想着简单的弄下,就去了百度智能云用的api接口实现的,写完以后我就想为什么我不自己写一个人脸识别签到,不去调用百度api接口,然后就诞生了

  • python3读取图片并灰度化图片的四种方法(OpenCV、PIL.Image、TensorFlow方法)总结

    在处理图像的时候经常是读取图片以后把图片转换为灰度图.作为一个刚入坑的小白,我在这篇博客记录了四种处理的方法. 首先导入包: import numpy as np import cv2 import tensorflow as tf from PIL import Image 方法一:在使用OpenCV读取图片的同时将图片转换为灰度图: img = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE) print("cv2.imread(imgfile, cv2.I

  • 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.pyt

  • 札记:android手势识别功能实现(利用MotionEvent)

    摘要 本文是手势识别输入事件处理的完整学习记录.内容包括输入事件InputEvent响应方式,触摸事件MotionEvent的概念和使用,触摸事件的动作分类.多点触摸.根据案例和API分析了触摸手势Touch Gesture的识别处理的一般过程.介绍了相关的GestureDetector,Scroller和VelocityTracker.最后分析drag和scale等一些手势的识别. 输入源分类 虽然android本身是一个完整的系统,它主要运行在移动设备的特性决定了我们在它上面开的app绝大数

  • OpenCV实现马赛克功能

    本文实例为大家分享了OpenCV实现马赛克功能的具体代码,供大家参考,具体内容如下 实现用按下鼠标左键拖动时,在鼠标经过的路径上打上马赛克. 马赛克的原理是将图像中选中区域的像素用这个选中区域中的某一像素覆盖. 为了不让鼠标重复经过图像中同一个的时候,选取不一样的像素,该程序将在输入图片的时候,就实现了全图的马赛克效果.而当鼠标划过的时候,程序只是将实现马赛克的图片的指定位置复制到显示的图像中. 效果类似于QQ截图中的马赛克. #include <opencv2\core\core.hpp>

  • Opencv实现画笔功能

    本文实例为大家分享了Opencv实现画笔功能的具体代码,供大家参考,具体内容如下 #include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; Rect g_rectangle; bool g_bDrawing = false; RNG g_rng(12345); Point g_nCurrPoint; int g_nThick = 0, g_nBlue = 255,

  • C++基于OpenCV实现手势识别的源码

    先给大家上效果图: 源码在下面 使用 RGB 值分割手部区域,即手部的 GB 值将与背景不同 或者使用边缘检测 或者 背景减法. 我这里使用了背景减法模型.OpenCV为我们提供了不同的背景减法模型,codebook   它的作用是对某些帧进行一段时间的精确校准.其中对于它获取的所有图像:它计算每个像素的平均值和偏差,并相应地指定框. 在前景中它就像一个黑白图像,只有手是白色的 用 Convex Hull 来找到指尖.Convex hull 基本上是包围手部区域的凸集. 包围手的红线是凸包.基本

  • Python+Opencv实现图像匹配功能(模板匹配)

    本文实例为大家分享了Python+Opencv实现图像匹配功能的具体代码,供大家参考,具体内容如下 1.原理 简单来说,模板匹配就是拿一个模板(图片)在目标图片上依次滑动,每次计算模板与模板下方的子图的相似度,最后就计算出了非常多的相似度: 如果只是单个目标的匹配,那只需要取相似度最大值所在的位置就可以得出匹配位置: 如果要匹配多个目标,那就设定一个阈值,就是说,只要相似度大于比如0.8,就认为是要匹配的目标. 1.1 相似度度量指标 差值平方和匹配 CV_TM_SQDIFF 标准化差值平方和匹

  • OpenCv实现绘图功能

    本文实例为大家分享了OpenCv实现绘图功能的具体代码,供大家参考,具体内容如下 绘制一个图像在上面画线: import numpy as np import matplotlib.pyplot as plt import cv2 #画图 def show(image): plt.imshow(image) plt.axis('off') plt.show() image = np.zeros((300,300,3),dtype='uint8') #画线 green = (0,255,0) cv

  • 利用Java+OpenCV实现拍照功能

    由于项目需要拍照,看了好多的资料不是C语言的就是python,开始用的JavaCv但是有好多问题,所以改成了OpenCv 只能硬着上了,查了好的网上的资料,终于找到了 依赖jar包:只有一个OpenCv的jar包,可以直接从官网上下载 下面上代码 import java.awt.Graphics; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.Buffered

  • Python如何使用opencv进行手势识别详解

    目录 前言 原理 程序部分 附另一个手势识别实例 总结 前言 本项目是使用了谷歌开源的框架mediapipe,里面有非常多的模型提供给我们使用,例如面部检测,身体检测,手部检测等. 原理 首先先进行手部的检测,找到之后会做Hand Landmarks. 将手掌的21个点找到,然后我们就可以通过手掌的21个点的坐标推测出来手势,或者在干什么. 程序部分 第一安装Opencv pip install opencv-python 第二安装mediapipe pip install mediapipe

随机推荐