TensorFlow2.X結(jié)合OpenCV 實(shí)現(xiàn)手勢(shì)識(shí)別功能
使用Tensorflow 構(gòu)建卷積神經(jīng)網(wǎng)絡(luò),訓(xùn)練手勢(shì)識(shí)別模型,使用opencv DNN 模塊加載模型實(shí)時(shí)手勢(shì)識(shí)別
效果如下:

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

構(gòu)建模型進(jìn)行訓(xùn)練
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加載模型,實(shí)時(shí)檢測(cè)
這里為了簡(jiǎn)化檢測(cè)使用了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ù)測(cè)結(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ì)上還是一個(gè)圖像分類任務(wù)。而且,樣本數(shù)量較少。優(yōu)化的時(shí)候需要做數(shù)據(jù)增強(qiáng),還需要防止過(guò)擬合。
到此這篇關(guān)于TensorFlow2.X結(jié)合OpenCV 實(shí)現(xiàn)手勢(shì)識(shí)別功能的文章就介紹到這了,更多相關(guān)TensorFlow OpenCV 手勢(shì)識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲實(shí)戰(zhàn)之使用Scrapy爬取豆瓣圖片
在用Python的urllib和BeautifulSoup寫過(guò)了很多爬蟲之后,本人決定嘗試著名的Python爬蟲框架——Scrapy.本次分享將詳細(xì)講述如何利用Scrapy來(lái)下載豆瓣名人圖片,需要的朋友可以參考下2021-06-06
通俗的講解深度學(xué)習(xí)中CUDA,cudatookit,cudnn和pytorch的關(guān)系
有些剛?cè)胄械呐笥芽偸歉悴磺宄﨏UDA,cudatookit,cudnn和pytorch的關(guān)系,那么今天這篇文章用通俗易懂的話講解了他們之間的關(guān)系,需要的朋友可以參考下,相信會(huì)對(duì)你有所幫助2023-03-03
Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案
小編在使用opencv讀取帶有中文路徑的圖片時(shí),發(fā)現(xiàn)會(huì)出現(xiàn)亂碼的情況,當(dāng)讀取的文件路徑出現(xiàn)中文時(shí),(文件夾名為中文或者文件為中文)出現(xiàn)錯(cuò)誤,所以本文給大家介紹了Python讀取中文路徑出現(xiàn)亂碼問(wèn)題的解決方案,需要的朋友可以參考下2024-06-06
python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù)
這篇文章主要為大家詳細(xì)介紹了python微信公眾號(hào)之關(guān)鍵詞自動(dòng)回復(fù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
在spyder IPython console中,運(yùn)行代碼加入?yún)?shù)的實(shí)例
這篇文章主要介紹了在spyder IPython console中,運(yùn)行代碼加入?yún)?shù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具
這篇文章主要為大家詳細(xì)介紹了如何利用Python+tkinter實(shí)現(xiàn)網(wǎng)站下載工具,實(shí)現(xiàn)所有數(shù)據(jù)一鍵獲取,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-03-03

