Распознавание жестов — открытая проблема в области машинного зрения, области информатики, которая позволяет системам эмулировать человеческое зрение. Распознавание жестов имеет множество применений для улучшения взаимодействия человека с компьютером, и одно из них находится в области перевода жестового языка, где видеопоследовательность символических жестов рук переводится на естественный язык.

Набор данных

Формат набора данных разработан таким образом, чтобы точно соответствовать классическому MNIST. Каждый обучающий и тестовый пример представляет собой метку (0–25) в виде взаимно однозначной карты для каждой буквы алфавита от A до Z (и нет случаев для 9 = J или 25 = Z из-за жестов). Размер обучающих данных (27 455 случаев) и тестовых данных (7172 случая) примерно вдвое меньше стандартного MNIST, но в остальном они аналогичны строке заголовка метки pixel1, pixel2….pixel784, которые представляют собой одно изображение размером 28x28 пикселей со значениями оттенков серого в диапазоне от 0 до 255.

Предварительная обработка данных

Поскольку в наборе данных уже указаны значения CSV для изображений, нам не нужно выполнять большую предварительную обработку. Если набор данных изображения был в необработанном формате, мы должны преобразовать их в массивы формата CSV, прежде чем выполнять какие-либо дальнейшие операции. Тем не менее, мы выполняем следующие шаги:

  • Отдельные функции (столбцы 784 пикселя) и вывод (метка результата)
  • Изменить черты
  • Одно горячее кодирование результата
X_train = train.drop(['label'],axis=1)
X_test = test.drop(['label'], axis=1)
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 = 26
y_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))

Модель

Мы будем использовать Keras для создания простой CNN (сверточной нейронной сети).

Всего в CNN 7 слоев:

  1. 1-й сверточный слой с relu
  2. 1-й максимальный пул
  3. 2-й сверточный слой с relu
  4. 2-й максимальный пул
  5. Уплощение
  6. Первый полный слой с relu
  7. Выходной слой с sigmoid
def model():
  classifier = Sequential()
  classifier.add(Convolution2D(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(Convolution2D(filters=16, 
                               kernel_size=(3,3),
                               strides=(1,1),
                               padding='same',
                               activation='relu'))
  classifier.add(MaxPooling2D(pool_size=(4,4)))
  classifier.add(Flatten())
  classifier.add(Dense(128, activation='relu'))
  classifier.add(Dense(26, activation='sigmoid'))
  classifier.compile(optimizer='adam',
                     loss='categorical_crossentropy', 
                     metrics=['accuracy'])
  return classifier

Затем поместите модель на тренировочный набор и проверьте точность на тестовом наборе.

classifier.fit(X_train, y_train, batch_size = 100, epochs = 100)
y_pred = classifier.predict(X_test)

Обратите внимание, что выходные данные, представленные в y_pred, имеют формат массива с 26 значениями для каждого обучающего примера. Мы должны посмотреть, какой из них максимальный, а затем снова создать y_pred.

Результат

  • Точность тренировочного набора: 96.06 %
  • Точность набора тестов: 87.77%

Полный код с набором данных



Отправьте запрос на включение для любых предложений и ошибок…