jpg 神经网络 手势识别_使用CNN(卷积神经网络)和OpenCV进行手势识别

68ae309aaf18397c98f5f676c6a8f632.png

要构建SLR(手语识别),我们需要三件事:

  1. 机器学习数据集
  2. 构建机器学习模型(我们将使用CNN)
  3. 应用模型平台(我们将使用OpenCV)

1)数据集

可以在此处下载手势数据集(https://www.kaggle.com/datamunge/sign-language-mnist)。

我们的机器学习数据集包含24个(J和Z除外)American Sign Laguage字母表的许多图像。每个图像的大小为28x28像素,这意味着每个图像总共784个像素。

b7f9d0e5c1886a9737af34f5a555d012.png
  • 加载机器学习数据集

要加载数据集,请使用以下Python代码:

import kerasimport numpy as npimport pandas as pdimport cv2from matplotlib import pyplot as pltfrom keras.models import Sequential from keras.layers import Conv2D,MaxPooling2D, Dense,Flatten, Dropoutfrom keras.datasets import mnist import matplotlib.pyplot as pltfrom keras.utils import np_utilsfrom keras.optimizers import SGDtrain = pd.read_csv('train.csv')test = pd.read_csv('test.csv')y_train = train['label'].valuesy_test = test['label'].valuesX_train = train.drop(['label'],axis=1)X_test = test.drop(['label'], axis=1)
5925db0df23ed06acbdab23c839637c1.png

我们的数据集采用CSV(逗号分隔值)格式。train_X和test_X包含每个像素的值。train_Y和test_Y包含图像标签。您可以使用以下Python代码查看机器学习数据集:

display(X_train.info())display(X_test.info())display(X_train.head(n = 2))display(X_test.head(n = 2))
e89c4fec9dabb35b5c5551da17bbfc57.png
  • 预处理

train_X和test_X包含所有像素像素值的数组。我们从这些值创建了一个图像。我们的图像尺寸是28x28,因此我们必须将阵列分成28x28像素组。为此,我们将使用以下代码:

X_train = np.array(X_train.iloc[:,:])X_train = np.array([np.reshape(i, (28,28)) for i in X_train])X_test = np.array(X_test.iloc[:,:])X_test = np.array([np.reshape(i, (28,28)) for i in X_test])num_classes = 26y_train = np.array(y_train).reshape(-1)y_test = np.array(y_test).reshape(-1)y_train = np.eye(num_classes)[y_train]y_test = np.eye(num_classes)[y_test]X_train = X_train.reshape((27455, 28, 28, 1))X_test = X_test.reshape((7172, 28, 28, 1))
1eb66aa2ee6e424b7cd26f50d37374c3.png

现在我们可以使用这个数据集来训练我们的机器学习模型了。

2)建立和训练模型

我们将使用CNN(卷积神经网络)来识别字母。我们用keras。

机器学习模型的Python实现如下:

classifier = Sequential()classifier.add(Conv2D(filters=8, kernel_size=(3,3),strides=(1,1),padding='same',input_shape=(28,28,1),activation='relu', data_format='channels_last'))classifier.add(MaxPooling2D(pool_size=(2,2)))classifier.add(Conv2D(filters=16, kernel_size=(3,3),strides=(1,1),padding='same',activation='relu'))classifier.add(Dropout(0.5))classifier.add(MaxPooling2D(pool_size=(4,4)))classifier.add(Dense(128, activation='relu'))classifier.add(Flatten())classifier.add(Dense(26, activation='softmax'))
b2e74ffaca00c0469ac93c63554b46ff.png

我们的模型由Conv2D和MaxPooling层组成,然后是一些全连接层(Dense)。

第一个Conv2D(卷积)层采用(28,28,1)的输入图像。最后一个全连接层为我们提供了26个字母的输出。

我们正在使用第二个Conv2D层之后的Dropout来正则化我们的训练。

我们在最后一层使用softmax激活函数。

最后我们的模型看起来像这样:

6e42d6f1d3f984ba97e28861cbcc05d7.png

我们必须编译并拟合机器学习模型。为此,我们将使用如下Python代码:

classifier.compile(optimizer='SGD', loss='categorical_crossentropy', metrics=['accuracy'])classifier.fit(X_train, y_train, epochs=50, batch_size=100)
4ddda680029c5bd6b54e5ae37bd1d028.png

我们正在使用SGD优化器来编译我们的模型。您也可以将时期减少到25。

最后要检查准确性:

accuracy = classifier.evaluate(x=X_test,y=y_test,batch_size=32)print("Accuracy: 
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值