Контекст
Ради интереса я решил запрограммировать модель глубокого обучения для распознавания алфавитов американского языка жестов (ASL). Вы можете найти набор данных здесь от Kaggle. Приступим к коду!
Код
Обратите внимание, что я использовал Google Colab для этого проекта, поэтому мне пришлось импортировать набор данных с моего Google Диска в первых нескольких строках кода. Если вы не используете Google Colab, игнорируйте первые 2 строки кода.
Не забудьте изменить переменные train_path и test_path, поскольку они относятся к моему компьютеру в коде, который я собираюсь вам показать.
from google.colab import drive drive.mount('/content/drive') # imports import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Activation, Dropout from tensorflow.keras.losses import sparse_categorical_crossentropy from tensorflow.keras.optimizers import Adam from tensorflow.keras.preprocessing.image import ImageDataGenerator import tensorflow_hub as hub import numpy as np import matplotlib.pyplot as plt # setting variables and directories for training and testing paths img_size = 224 batch_size = 32 epochs = 5 train_path = '/content/drive/My Drive/ASL-recognition/asl_alphabet_train/asl_alphabet_train' test_path = '/content/drive/My Drive/ASL-recognition/asl_alphabet_test/asl_alphabet_test' # define image data generators for data augmentation and rescaling augment_train_data = ImageDataGenerator(horizontal_flip=True, rotation_range=50, zoom_range=0.2, width_shift_range=0.2, height_shift_range=0.2, rescale=1./255) augment_test_data = ImageDataGenerator(rescale=1./255) # run image data generators on training and testing dataset train_dataset = augment_train_data.flow_from_directory(train_path, shuffle=True, classes=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'space', 'del', 'nothing'], target_size=(img_size, img_size), batch_size=batch_size) test_dataset = augment_train_data.flow_from_directory(test_path, classes=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'space', 'del', 'nothing'], target_size=(img_size, img_size), batch_size=batch_size) # showing 8 images from training dataset fig = plt.figure(figsize=(15, 10)) for i in range(1,9): plt.subplot(4,2,i) plt.imshow(train_dataset[0][0][i-1]) plt.show() # getting pretrained model for transfer learning and defining model url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2 /classification/4" download_model = hub.KerasLayer(url,input_shape=(img_size,img_size,3)) model = Sequential([ download_model, Dense(29), Activation("softmax") ]) # compiling model model.compile(optimizer=Adam(1e-3), loss="categorical_crossentropy", metrics=['accuracy']) #training model print("\n Model summary: ") print(model.summary()) print("\n Model Training: ") model.fit(train_dataset, batch_size=batch_size, epochs=epochs) # evaluating model print("\n Model Evaluation: ") model.evaluate(test_dataset) # saving model model.save("/content/drive/My Drive/ASL-recognition/h5/asl_model.h5") # loading saved model load_model = tf.keras.models.load_model("/content/drive/My Drive/ASL-recognition/h5/asl_model.h5",custom_objects={"KerasLayer":hub.KerasLayer}) print(load_model.summary())
Что означает этот код? Я объясню:
from google.colab import drive drive.mount('/content/drive') # imports import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D, Activation, Dropout from tensorflow.keras.losses import sparse_categorical_crossentropy from tensorflow.keras.optimizers import Adam from tensorflow.keras.preprocessing.image import ImageDataGenerator import tensorflow_hub as hub import numpy as np import matplotlib.pyplot as plt
Здесь мы импортируем все необходимые библиотеки и модули из Tensorflow, Keras, Numpy и Matplotlib, которые нам понадобятся для остальной части программы.
# setting variables and directories for training and testing paths img_size = 224 batch_size = 32 epochs = 10 train_path = '/content/drive/My Drive/ASL-recognition/asl_alphabet_train/asl_alphabet_train' test_path = '/content/drive/My Drive/ASL-recognition/asl_alphabet_test/asl_alphabet_test'
Мы устанавливаем переменные, которые нам понадобятся для обучения и тестирования модели глубокого обучения, такие как желаемый размер изображения, размер пакета и количество эпох при обучении модели. Размер пакета - это количество изображений, которые будут распространяться по сети до обновления весов нашей модели.
# define image data generators for data augmentation and rescaling augment_train_data = ImageDataGenerator(horizontal_flip=True, rotation_range=50, zoom_range=0.2, width_shift_range=0.2, height_shift_range=0.2, rescale=1./255) augment_test_data = ImageDataGenerator(rescale=1./255) # run image data generators on training and testing dataset train_dataset = augment_train_data.flow_from_directory(train_path, shuffle=True, classes=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'space', 'del', 'nothing'], target_size=(img_size, img_size), batch_size=batch_size) test_dataset = augment_train_data.flow_from_directory(test_path, classes=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'space', 'del', 'nothing'], target_size=(img_size, img_size), batch_size=batch_size)
Мы определяем 2 генератора данных изображений (1 для обучения и 1 для тестирования) для выполнения увеличения данных на наших изображениях, которые затем будут загружены в нашу модель глубокого обучения. Мы будем манипулировать нашими изображениями с помощью горизонтального переворота, поворота, вертикального / горизонтального сдвига, а также масштабировать наши изображения так, чтобы каждый пиксель имел значение от 0 до 1. Если он работает правильно, вы должны увидеть это для обучающего и тестового изображения. генераторы данных соответственно:
# showing 8 images from training dataset fig = plt.figure(figsize=(15, 10)) for i in range(1,9): plt.subplot(4,2,i) plt.imshow(train_dataset[0][0][i-1]) plt.show()
Просто настройте фигуру и покажите первые 8 изображений из нашего набора обучающих данных с помощью matplotlib. Если все пойдет правильно, вы должны увидеть что-то подобное, хотя отдельные изображения будут разными.
# getting pretrained model for transfer learning and defining model url = "https://tfhub.dev/google/tf2-preview/mobilenet_v2 /classification/4" download_model = hub.KerasLayer(url,input_shape=(img_size,img_size,3)) model = Sequential([ download_model, Dense(29), Activation("softmax") ])
Мы используем модель CNN классификации ImageNet (опубликованную Google) для передачи обучения и переопределения последнего плотного слоя для вывода вероятности каждого из 29 классов, которые мы определили. Подробнее о трансферном обучении вы можете узнать здесь.
# compiling model model.compile(optimizer=Adam(1e-3), loss="categorical_crossentropy", metrics=['accuracy'])
Мы компилируем нашу модель и решаем, как рассчитать ее потерю (категориальная кросс-энтропия), какой оптимизатор мы используем для обновления весов (Адам) и как мы измеряем успешность модели (точность).
#training model print("\n Model summary: ") print(model.summary()) print("\n Model Training: ") model.fit(train_dataset, batch_size=batch_size, epochs=epochs)
Наконец, мы можем обучить нашу модель. Сначала мы просматриваем сводку модели, а затем обучаем модель (model.fit ()) на нашем обучающем наборе данных, используя указанный размер пакета и количество эпох. Если весь ваш код правильный, он должен выглядеть примерно так (за исключением того, что будет 10 эпох, а не 5):
# evaluating model print("\n Model Evaluation: ") model.evaluate(test_dataset)
После того, как наша модель обучена до удовлетворительной точности, мы можем оценить ее на тестовом наборе данных, чтобы определить, была ли наша модель переоборудована. Вы должны увидеть что-то вроде этого:
# saving model model.save("/content/drive/My Drive/ASL-recognition/h5/asl_model.h5")
Если модель нас устраивает, мы можем сохранить ее в указанном каталоге для дальнейшего использования. Я решил сохранить его в формате h5, так как он небольшой и не требует слишком большого количества места для хранения.
# loading saved model load_model = tf.keras.models.load_model("/content/drive/My Drive/ASL-recognition/h5/asl_model.h5",custom_objects={"KerasLayer":hub.KerasLayer}) print(load_model.summary())
Если мы захотим получить доступ к нашей модели позже, мы сможем загрузить ее из указанного выше каталога и сделать все, что можно было бы делать с обычной моделью (например, обучать, прогнозировать, показывать сводку, оценивать , так далее.).
Заключение
Если вы хотите увидеть готовый код, вы можете просмотреть его в моем репозитории Github здесь.
С учетом сказанного, надеюсь, вам понравилась моя статья! Не стесняйтесь ознакомиться с другими моими статьями, и скоро их будет гораздо больше!
Если у вас есть какие-либо вопросы или вы хотите связаться, напишите мне по адресу: [email protected]
Чтобы узнать обо мне больше: LinkedIn