获取数据集
26字母手势识别数据集.csv格式
提取码:jzyc
加载数据
import csv
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import cv2
# 获取数据
def get_data(file_name):
with open(file_name) as f:
csv_reader = csv.reader(f, delimiter=',')
first_line = True # csv文件中第一行维标题行,不能载入数据
temp_images = []
temp_labels = []
for row in csv_reader:
if first_line:
first_line = False
continue
else:
temp_labels.append(row[0])# csv文件中第一列为图片的label
image_data = row[1 : 785]# 后面784列为图像每一个像素点对应的亮度值,读出来的是一个列表,需要将其划分为28*28的图像
image_array = np.array_split(image_data, 28)
temp_images.append(image_array)
images = np.array(temp_images).astype('float')
labels = np.array(temp_labels).astype('float')
return images, labels
training_images, training_labels = get_data('E:/datasets/tmp/sign-language-mnist/sign_mnist_train.csv')
testing_images, testing_labels = get_data('E:/datasets/tmp/sign-language-mnist/sign_mnist_test.csv')
print(training_images.shape)
print(training_labels.shape)
print(testing_images.shape)
print(testing_labels.shape)
图像预处理
图像生成器,图像形态学操作
training_images = np.expand_dims(training_images, axis=3)
testing_images = np.expand_dims(testing_images, axis=3)
#
train_datagen = ImageDataGenerator(
rescale=1. / 255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
train_generator = train_detagen.flow(training_images, training_labels, batch_size=32)
validation_datagen = ImageDataGenerator(
rescale=1. / 255)
validation_generator = validation_datagen.flow(testinng_images, testing_labels, batch_size=32)
搭建神经网络
上一篇文章搭建的简单的网络的准确率有点低,这次我准备搭建一个深一点的网络VGG16
model = tf.keras.Sequential()
# 卷积组-1
model.add(layers.Conv2D(64, (3, 3), activation='relu', input_shape=(28, 28, 1), padding='same', name='conv-1'))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same', name='conv-2'))
# 池化-1
model.add(layers.MaxPool2D((2, 2), name='maxpooling-1'))
# 卷积组-2
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same', name='conv-3'))
model.add(layers.Conv2D(128, (3, 3), activation='relu', padding='same', name='conv-4'))
# 池化-2
model.add(layers.MaxPooling2D((2, 2), name='maxpooling-2'))
# 卷积组-3
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same', name='conv-5'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same', name='conv-6'))
model.add(layers.Conv2D(256, (3, 3), activation='relu', padding='same', name='conv-7'))
# 池化-3
model.add(layers.MaxPooling2D((2, 2), name="maxpooling-3"))
# 卷积组-4
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='conv-8'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='conv-9'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='conv-10'))
# 池化-4
model.add(layers.MaxPooling2D((2, 2), name="maxpooling-4"))
# 卷积组-5
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='conv-11'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='conv-12'))
model.add(layers.Conv2D(512, (3, 3), activation='relu', padding='same', name='conv-13'))
# 展平
model.add(layers.Flatten())
# 全连接-1
model.add(layers.Dense(4096, activation='relu', name='fully-1'))
# 全连接-2
model.add(layers.Dense(4096, activation='relu', name='fully-2'))
# 全连接-3
model.add(layers.Dense(4096, activation='relu', name='fully-3'))
# softmax
model.add(layers.Dense(26, activation='softmax', name='softmax'))
model.summary()
model.compile(optimizer = tf.optimizers.Adam(),
loss = 'sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(train_generator,
steps_per_epoch=len(training_images) / 32,
epochs=1,
validation_data=validation_generator,
validation_steps=len(testing_images) / 32)
model.evaluate(testing_images, testing_labels)
13层卷积,3层全连接刚好16层
结果算一个epoch就需要14分钟
所以劝诫大家,对于视觉神经网络的实现能用GPU版本就不要用CPU,太慢了,浪费大把时间
跑一遍下来,准确率还很低
算了,不跑了,自己跑了两轮,loss没降落,accuracy没升
损失,准确值散点图
import matplotlib.pyplot as plt
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(len(acc))
plt.plot(epochs, acc, 'r', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.legend()
plt.figure()
plt.plot(epochs, loss, 'r', label='Training Loss')
plt.plot(epochs, val_loss, 'b', label='Validation Loss')
plt.title('Training and validation loss')
plt.legend()
plt.show()
没跑完,就♣