Контекст

Ради интереса я решил запрограммировать модель глубокого обучения для распознавания алфавитов американского языка жестов (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