最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

TensorFlow2.X結(jié)合OpenCV 實現(xiàn)手勢識別功能

 更新時間:2020年04月08日 14:23:14   作者:FlyDremever  
這篇文章主要介紹了TensorFlow2.X結(jié)合OpenCV 實現(xiàn)手勢識別功能,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

使用Tensorflow 構(gòu)建卷積神經(jīng)網(wǎng)絡(luò),訓(xùn)練手勢識別模型,使用opencv DNN 模塊加載模型實時手勢識別
效果如下:

在這里插入圖片描述

先顯示下部分數(shù)據(jù)集圖片(0到9的表示,感覺很怪)

在這里插入圖片描述

構(gòu)建模型進行訓(xùn)練

數(shù)據(jù)集地址

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):
 #構(gòu)建模型
 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']
 )
 #模型訓(xùn)練
 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("模型轉(zhuǎn)換完成,訓(xùn)練結(jié)束")


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("預(yù)測結(jié)果為:",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

小結(jié)

這里本質(zhì)上還是一個圖像分類任務(wù)。而且,樣本數(shù)量較少。優(yōu)化的時候需要做數(shù)據(jù)增強,還需要防止過擬合。

到此這篇關(guān)于TensorFlow2.X結(jié)合OpenCV 實現(xiàn)手勢識別功能的文章就介紹到這了,更多相關(guān)TensorFlow OpenCV 手勢識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python繪制直方圖的方法

    python繪制直方圖的方法

    這篇文章主要為大家詳細介紹了python繪制直方圖的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Flask??請求鉤子的實現(xiàn)

    Flask??請求鉤子的實現(xiàn)

    這篇文章主要給大家分享了Flask請求鉤子的實現(xiàn),在客戶端和服務(wù)器交互的過程中,有些準備工作或掃尾工作需要處理,比如:在請求開始時,建立數(shù)據(jù)庫連接;在請求開始時,根據(jù)需求進行權(quán)限校驗;在請求結(jié)束時,指定數(shù)據(jù)的交互格式;下面來看看文章詳細介紹內(nèi)容吧
    2021-11-11
  • Python如何查看兩個數(shù)據(jù)庫的同名表的字段名差異

    Python如何查看兩個數(shù)據(jù)庫的同名表的字段名差異

    這篇文章主要介紹了Python如何查看兩個數(shù)據(jù)庫的同名表的字段名差異,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Python守護進程和腳本單例運行詳解

    Python守護進程和腳本單例運行詳解

    本篇文章主要介紹了Python守護進程和腳本單例運行,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-01-01
  • 聽歌識曲--用python實現(xiàn)一個音樂檢索器的功能

    聽歌識曲--用python實現(xiàn)一個音樂檢索器的功能

    本篇文章中主要介紹了用python實現(xiàn)一個音樂檢索器,類似于QQ音樂的搖一搖識曲,有興趣的同學(xué)可以了解一下。
    2016-11-11
  • github配置使用指南

    github配置使用指南

    Git是一個分布式的版本控制系統(tǒng),最初由Linus Torvalds編寫,用作Linux內(nèi)核代碼的管理。在推出后,Git在其它項目中也取得了很大成功,尤其是在Ruby社區(qū)中。目前,包括Rubinius、Merb和Bitcoin在內(nèi)的很多知名項目都使用了Git,作為一個程序猿,不會github那確實有點坑了
    2014-11-11
  • Python數(shù)據(jù)擬合實現(xiàn)最小二乘法示例解析

    Python數(shù)據(jù)擬合實現(xiàn)最小二乘法示例解析

    這篇文章主要為大家介紹了Python數(shù)據(jù)擬合實現(xiàn)最小二乘法的示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-10-10
  • python數(shù)字圖像處理之骨架提取與分水嶺算法

    python數(shù)字圖像處理之骨架提取與分水嶺算法

    這篇文章主要介紹了python數(shù)字圖像處理之骨架提取與分水嶺算法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-04-04
  • Python實現(xiàn)跨平臺桌面應(yīng)用程序開發(fā)的完整指南

    Python實現(xiàn)跨平臺桌面應(yīng)用程序開發(fā)的完整指南

    在當今軟件開發(fā)領(lǐng)域,跨平臺應(yīng)用程序開發(fā)變得越來越重要,下面我們就來探討使用Python進行跨平臺桌面應(yīng)用程序開發(fā)的主要框架,工具和最佳實踐吧
    2025-04-04
  • 使用Python實現(xiàn)搖號系統(tǒng)的詳細步驟

    使用Python實現(xiàn)搖號系統(tǒng)的詳細步驟

    這篇文章主要介紹了如何使用Python構(gòu)建一個簡單的搖號系統(tǒng),包括需求分析、技術(shù)棧、實現(xiàn)步驟和完整代碼示例,該系統(tǒng)能夠從用戶輸入的參與者名單中隨機抽取指定數(shù)量的中獎?wù)?并將結(jié)果展示給用戶以及記錄到日志文件中,需要的朋友可以參考下
    2024-11-11

最新評論

宁乡县| 曲靖市| 福泉市| 山东省| 塔城市| 遂溪县| 青神县| 拉萨市| 玉田县| 汽车| 昭苏县| 罗山县| 合江县| 怀柔区| 莆田市| 双牌县| 舞阳县| 淳化县| 台江县| 威远县| 邵阳市| 平潭县| 霸州市| 卢氏县| 汪清县| 陇西县| 石泉县| 太和县| 比如县| 石家庄市| 科技| 义乌市| 彩票| 柏乡县| 永福县| 桂东县| 凤山市| 阳谷县| 海伦市| 田东县| 东城区|