Распознавание жестов — открытая проблема в области машинного зрения, области информатики, которая позволяет системам эмулировать человеческое зрение. Распознавание жестов имеет множество применений для улучшения взаимодействия человека с компьютером, и одно из них находится в области перевода жестового языка, где видеопоследовательность символических жестов рук переводится на естественный язык.
Набор данных
Формат набора данных разработан таким образом, чтобы точно соответствовать классическому 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-й сверточный слой с
relu
- 1-й максимальный пул
- 2-й сверточный слой с
relu
- 2-й максимальный пул
- Уплощение
- Первый полный слой с
relu
- Выходной слой с
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%
Полный код с набором данных
Отправьте запрос на включение для любых предложений и ошибок…