Что такое Керас?
KERAS — это библиотека нейросетей с открытым исходным кодом, написанная на Python и работающая поверх Theano или Tensorflow. Он разработан, чтобы быть модульным, быстрым и простым в использовании. Он был разработан Франсуа Шоле, инженером Google.
Keras не обрабатывает вычисления низкого уровня. Вместо этого он использует другую библиотеку, называемую «Backend». Таким образом, Keras — это высокоуровневая оболочка API для низкоуровневого API, способная работать поверх TensorFlow, CNTK или Theano.
Keras High-Level API управляет тем, как мы создаем модели, определяем слои или настраиваем несколько моделей ввода-вывода. На этом уровне Keras также собирает нашу модель с функциями потерь и оптимизатора, тренировочный процесс с функцией подгонки. Keras не обрабатывает низкоуровневые API, такие как создание вычислительного графа, создание тензоров или других переменных, потому что он был обработан механизмом «бэкэнда».
В этом уроке вы узнаете
- Что такое Керас?
- Что такое бэкэнд?
- Theano, Tensorflow и CNTK Backend
- Сравнение Бэкэндов
- Керас против Тензорфлоу
- Преимущества Кераса
- Установка Кераса
- Прямая установка или виртуальная среда
- Amazon Web Service (AWS)
- Amazon SageMaker
- Как установить Keras в Windows
- Keras Fundamental для глубокого обучения
- Тонкая настройка предварительно обученных моделей в Керасе и как их использовать
- Нейронная сеть распознавания лиц с Keras
Что такое бэкэнд?
Backend — это термин в Keras, который выполняет все низкоуровневые вычисления, такие как тензорные произведения, свертки и многое другое, с помощью других библиотек, таких как Tensorflow или Theano. Таким образом, «бэкэнд-движок» будет выполнять вычисления и разработку моделей. Tensorflow — это по умолчанию «движок бэкэнда», но мы можем изменить его в конфигурации.
Theano, Tensorflow и CNTK Backend
Theano — проект с открытым исходным кодом, разработанный группой MILA в университете Монреаля, Квебек, Канада. Это был первый широко используемый Framework. Это библиотека Python, которая помогает в многомерных массивах для математических операций с использованием Numpy или Scipy. Theano может использовать графические процессоры для более быстрых вычислений, он также может автоматически строить символьные графики для вычисления градиентов. На своем веб-сайте Theano утверждает, что он может распознавать численно нестабильные выражения и вычислять их с помощью более стабильных алгоритмов, что очень полезно для наших нестабильных выражений.
С другой стороны, Tensorflow является восходящей звездой в сфере глубокого обучения. Разработанный командой Google Brain, это самый популярный инструмент глубокого обучения. Имея множество функций, исследователи вносят свой вклад в разработку этой основы для целей глубокого обучения.
Другим внутренним движком для Keras является Microsoft Cognitive Toolkit или CNTK. Это среда глубокого обучения с открытым исходным кодом, разработанная командой Microsoft. Он может работать на нескольких графических процессорах или на нескольких машинах для обучения модели глубокого обучения в массовом масштабе. В некоторых случаях о CNTK сообщалось быстрее, чем о других средах, таких как Tensorflow или Theano.
Сравнение Бэкэндов
Нам нужно сделать бенчмарк, чтобы узнать сравнение между этими двумя бэкэндами. Как вы можете видеть в тесте Jeong-Yoon Lee, сравнивается производительность 3 разных бэкэндов на разных аппаратных средствах. И в результате Theano работает медленнее, чем другой бэкэнд, о нем сообщается в 50 раз медленнее, но точность близка друг к другу.
Еще один контрольный тест проводится Jasmeet Bhatia . Он сообщил, что Theano медленнее, чем Tensorflow для некоторого теста. Но общая точность почти одинакова для каждой протестированной сети.
Итак, между Theano, Tensorflow и CTK очевидно, что TensorFlow лучше, чем Theano. С TensorFlow время вычислений намного короче, а CNN лучше других.
Керас против Тензорфлоу
параметры | Keras | Tensorflow |
Тип | Оболочка API высокого уровня | API низкого уровня |
сложность | Прост в использовании, если вы Python язык | Вы должны изучить синтаксис использования некоторых функций Tensorflow |
Цель | Быстрое развертывание для создания модели со стандартными слоями | Позволяет сделать произвольный расчетный граф или слои модели |
инструменты | Использует другой инструмент отладки API, такой как TFDBG | Вы можете использовать инструменты визуализации Tensorboard |
сообщество | Большие активные сообщества | Большие активные сообщества и широко используемые ресурсы |
Преимущества Кераса
Быстрое развертывание и простота понимания
Керас очень быстро делает сетевую модель. Если вы хотите создать простую модель сети с несколькими линиями, Keras поможет вам в этом. Посмотрите на пример ниже:
from keras.models import Sequential from keras.layers import Dense, Activation model = Sequential() model.add(Dense(64, activation='relu', input_dim=50)) #input shape of 50 model.add(Dense(28, activation='relu')) #input shape of 50 model.add(Dense(10, activation='softmax'))
Благодаря дружественному API, мы можем легко понять процесс. Написание кода с простой функцией и не нужно устанавливать несколько параметров.
Поддержка большого сообщества
Существует множество сообществ искусственного интеллекта, которые используют Keras для своей среды глубокого обучения. Многие из них публикуют свои коды, а также учебники для широкой публики.
Иметь несколько бэкэндов
Вы можете выбрать Tensorflow, CNTK и Theano в качестве бэкэнда с Keras. Вы можете выбрать другой бэкэнд для разных проектов в зависимости от ваших потребностей. Каждый бэкэнд имеет свое уникальное преимущество.
Кроссплатформенность и простота развертывания моделей
Благодаря множеству поддерживаемых устройств и платформ вы можете развернуть Keras на любом устройстве, например
- iOS с CoreML
- Android с Tensorflow Android,
- Веб-браузер с поддержкой .js
- Облачный движок
- Raspberry Pi
Поддержка нескольких графических процессоров
Вы можете тренировать Keras на одном GPU или использовать несколько GPU одновременно. Потому что Keras имеет встроенную поддержку параллелизма данных, поэтому он может обрабатывать большие объемы данных и сокращать время, необходимое для их обучения.
Недостатки Кераса
Не может обработать низкоуровневый API
Keras работает только с высокоуровневым API, который работает поверх других фреймворков или бэкэнд-движков, таких как Tensorflow, Theano или CNTK. Так что это не очень полезно, если вы хотите создать собственный абстрактный слой для исследовательских целей, потому что в Keras уже есть предварительно настроенные слои.
Установка Кераса
В этом разделе мы рассмотрим различные методы, доступные для установки Keras.
Прямая установка или виртуальная среда
Какой лучше? Прямая установка на текущий питон или использование виртуальной среды? Я предлагаю использовать виртуальную среду, если у вас много проектов. Хотите знать почему? Это потому, что разные проекты могут использовать разные версии библиотеки.
Например, у меня есть проект, для которого требуется Python 3.5 с использованием OpenCV 3.3 с более старой версией Keras-Theano, но в другом проекте мне нужно использовать Keras с последней версией и Tensorflow, так как он поддерживается с поддержкой Python 3.6.6.
Мы не хотим, чтобы библиотека конфликтовала друг с другом, верно? Таким образом, мы используем виртуальную среду для локализации проекта с определенным типом библиотеки, или мы можем использовать другую платформу, такую как облачная служба, для наших вычислений, например Amazon Web Service.
Amazon Web Service (AWS)
Amazon Web Service — это платформа, которая предлагает облачные вычисления и продукты для исследователей или для любых других целей. AWS арендует свое оборудование, сети, базы данных и т. Д., Чтобы мы могли использовать их непосредственно из Интернета. Одним из популярных сервисов AWS для целей глубокого обучения является сервис глубокого обучения Amazon Machine Image или DL.
Подробные инструкции по использованию AWS см. В этом руководстве.
Примечание по AMI: у вас будет следующий AMI
AWS Deep Learning AMI — это виртуальная среда в AWS EC2 Service, которая помогает исследователям или практикам работать с Deep Learning. DLAMI предлагает от небольших процессорных процессоров до мощных многоядерных процессоров с предварительно сконфигурированными CUDA, cuDNN и поставляется с различными средами глубокого обучения.
Если вы хотите использовать его мгновенно, вы должны выбрать Deep Learning AMI, потому что он предустановлен с популярными средами глубокого обучения.
Но если вы хотите попробовать пользовательскую среду глубокого обучения для исследования, вам следует установить AMI базы глубокого обучения, поскольку она поставляется с базовыми библиотеками, такими как CUDA, cuDNN, драйверы графических процессоров и другими необходимыми библиотеками для работы в среде глубокого обучения.
Amazon SageMaker
Amazon SageMaker — это платформа глубокого обучения, которая поможет вам в обучении и развертывании сети глубокого обучения с лучшим алгоритмом.
Для новичка это самый простой способ использовать Keras.
Шаг 1) Откройте консоль Amazon Sagemaker и нажмите «Создать экземпляр ноутбука».
Шаг 2)
- Введите имя вашего ноутбука.
- Создать роль IAM. Это создаст роль AMI. Роль Amazon IAM в формате AmazonSageMaker-Executionrole-YYYYMMDD | HHmmSS.
- Наконец, выберите Создать блокнот. Через несколько секунд Amazon Sagemaker запускает экземпляр ноутбука.
Примечание . Если вы хотите получить доступ к ресурсам с вашего VPC, установите прямой доступ к Интернету как включенный. В противном случае этот экземпляр ноутбука не будет иметь доступа в Интернет, поэтому невозможно обучать или размещать модели
Шаг 3) Нажмите Open, чтобы запустить экземпляр
Шаг 4) В Jupyter, нажмите New> conda_tensorflow_p36, и вы готовы к коду
Установите Keras в Linux
Чтобы включить Keras с Tensorflow в качестве внутреннего механизма, нам нужно сначала установить Tensorflow. Запустите эту команду, чтобы установить тензор потока с процессором (без графического процессора)
pip install --upgrade tensorflow
если вы хотите включить поддержку GPU для tenorflow, вы можете использовать эту команду
pip install --upgrade tensorflow-gpu
давайте проверим в Python, чтобы увидеть, если наша установка прошла успешно, набрав
user@user:~$ python Python 3.6.4 (default, Mar 20 2018, 11:10:20) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import tensorflow >>>
если нет сообщения об ошибке, процесс установки успешен
Установить Керас
После того, как мы установим Tensorflow, давайте начнем установку keras. Введите эту команду в терминале
pip install keras
он начнет установку Keras, а также всех его зависимостей. Вы должны увидеть что-то вроде этого:
Теперь в нашей системе установлены Keras!
Проверка
Прежде чем мы начнем использовать Keras, мы должны проверить, использует ли наш Keras Tensorflow в качестве бэкэнда, открыв файл конфигурации:
gedit ~/.keras/keras.json
вы должны увидеть что-то вроде этого
{ "floatx": "float32", "epsilon": 1e-07, "backend": "tensorflow", "image_data_format": "channels_last" }
Как видите, в «бэкэнде» используется тензор потока. Это означает, что керасы используют Tensorflow в качестве бэкенда, как мы и ожидали
и теперь запустите его на терминале, набрав
user@user:~$ python3 Python 3.6.4 (default, Mar 20 2018, 11:10:20) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import keras Using TensorFlow backend. >>>
Как установить Keras в Windows
Перед установкой Tensorflow и Keras мы должны установить Python, pip и virtualenv. Если вы уже установили эти библиотеки, вам следует перейти к следующему шагу, в противном случае сделайте следующее:
Установите Python 3, загрузив по этой ссылке
Установите pip, запустив этот
Установите virtualenv с помощью этой команды
pip3 install –U pip virtualenv
Установите распространяемое обновление 3 для Microsoft Visual C ++ 2015
- Перейдите на сайт загрузки Visual Studio https://www.microsoft.com/en-us/download/details.aspx?id=53587.
- Выберите распространяемые и инструменты сборки
- Загрузите и установите распространяемое обновление 3 для Microsoft Visual C ++ 2015
Затем запустите этот скрипт
pip3 install virtualenv
Настройка виртуальной среды
Это используется для изоляции работающей системы с основной системой.
virtualenv –-system-site-packages –p python3 ./venv
Активировать среду
.\venv\Scripts\activate
После подготовки среды установка Tensorflow и Keras остается такой же, как в Linux.
Основы Keras для глубокого обучения
Основной структурой в Keras является Модель, которая определяет полный граф сети. Вы можете добавить больше слоев к существующей модели, чтобы создать собственную модель, которая вам нужна для вашего проекта.
Вот как сделать последовательную модель и несколько часто используемых слоев в глубоком обучении
1. Последовательная модель
from keras.models import Sequential from keras.layers import Dense, Activation,Conv2D,MaxPooling2D,Flatten,Dropout model = Sequential()
2. Сверточный слой
Это пример сверточного слоя в качестве входного слоя с входной формой 320x320x3, с 48 фильтрами размером 3×3 и использованием ReLU в качестве функции активации.
input_shape=(320,320,3) #this is the input shape of an image 320x320x3 model.add(Conv2D(48, (3, 3), activation='relu', input_shape= input_shape))
другой тип
model.add(Conv2D(48, (3, 3), activation='relu'))
3. MaxPooling Layer
Чтобы уменьшить входное представление, используйте MaxPool2d и укажите размер ядра
model.add(MaxPooling2D(pool_size=(2, 2)))
4. Плотный слой
добавление полностью связанного слоя с указанием размера вывода
model.add(Dense(256, activation='relu'))
5. Dropout Layer
Добавление выпадающего слоя с вероятностью 50%
model.add(Dropout(0.5))
Компиляция, обучение и оценка
После того, как мы определим нашу модель, давайте начнем обучать их. Сначала необходимо скомпилировать сеть с функцией потерь и оптимизатором. Это позволит сети менять вес и минимизировать потери.
model.compile(loss='mean_squared_error', optimizer='adam')
Теперь, чтобы начать обучение, используйте метод fit, чтобы подать данные обучения и проверки в модель. Это позволит вам обучать сеть партиями и устанавливать эпохи.
model.fit(X_train, X_train, batch_size=32, epochs=10, validation_data=(x_val, y_val))
Наш последний шаг — оценить модель с данными испытаний.
score = model.evaluate(x_test, y_test, batch_size=32)
Давайте попробуем использовать простую линейную регрессию
import keras from keras.models import Sequential from keras.layers import Dense, Activation import numpy as np import matplotlib.pyplot as plt x = data = np.linspace(1,2,200) y = x*4 + np.random.randn(*x.shape) * 0.3 model = Sequential() model.add(Dense(1, input_dim=1, activation='linear')) model.compile(optimizer='sgd', loss='mse', metrics=['mse']) weights = model.layers[0].get_weights() w_init = weights[0][0][0] b_init = weights[1][0] print('Linear regression model is initialized with weights w: %.2f, b: %.2f' % (w_init, b_init)) model.fit(x,y, batch_size=1, epochs=30, shuffle=False) weights = model.layers[0].get_weights() w_final = weights[0][0][0] b_final = weights[1][0] print('Linear regression model is trained to have weight w: %.2f, b: %.2f' % (w_final, b_final)) predict = model.predict(data) plt.plot(data, predict, 'b', data , y, 'k.') plt.show()
После тренировки данных вывод должен выглядеть следующим образом
с начальным весом
Linear regression model is initialized with weights w: 0.37, b: 0.00
и окончательный вес
Linear regression model is trained to have weight w: 3.70, b: 0.61
Тонкая настройка предварительно обученных моделей в Керасе и как их использовать
Почему мы используем Fine Tune Models и когда мы их используем
Точная настройка является задачей настройки предварительно обученной модели так, чтобы параметры адаптировались к новой модели. Когда мы хотим тренироваться с нуля на новой модели, нам нужен большой объем данных, чтобы сеть могла найти все параметры. Но в этом случае мы будем использовать предварительно обученную модель, поэтому параметры уже изучены и имеют вес.
Например, если мы хотим обучить нашу собственную модель решению проблемы классификации, но у нас есть только небольшой объем данных, то мы можем решить это с помощью метода Transfer Learning + Fine-Tuning.
Используя предварительно обученную сеть и веса, нам не нужно обучать всю сеть. Нам просто нужно обучить последний слой, который используется для решения нашей задачи, так как мы называем его методом точной настройки.
Подготовка сетевой модели
Для предварительно обученной модели мы можем загрузить различные модели, которые Keras уже имеет в своей библиотеке, такие как:
- VGG16
- InceptionV3
- RESNET
- MobileNet
- Xception
- InceptionResNetV2
Но в этом процессе мы будем использовать модель сети VGG16 и imageNet в качестве веса для модели. Мы настроим сеть для классификации 8 различных типов классов, используя изображения из набора данных Kaggle Natural Images.
Архитектура модели VGG16
Загрузка наших данных в AWS S3 Bucket
Для нашего тренировочного процесса мы будем использовать изображение естественных изображений из 8 различных классов, таких как самолеты, автомобиль, кошка, собака, цветок, фрукты, мотоцикл и человек. Во-первых, нам нужно загрузить наши данные в Amazon S3 Bucket.
Amazon S3 Bucket
Шаг 1) После входа в свою учетную запись S3 давайте создадим корзину, нажав кнопку « Создать корзину».
Шаг 2) Теперь выберите Bucket Name и ваш регион в соответствии с вашей учетной записью. Убедитесь, что имя корзины доступно. После этого нажмите « Создать».
Шаг 3) Как видите, ваш Bucket готов к использованию. Но, как вы видите, Доступ не является общедоступным, для вас будет полезно, если вы хотите сохранить его в тайне для себя. Вы можете изменить это поле для общего доступа в свойствах корзины.
Шаг 4) Теперь вы начинаете загружать данные тренировок в Bucket. Здесь я буду загружать файл tar.gz, который состоит из картинок для обучения и тестирования.
Шаг 5) Теперь нажмите на свой файл и скопируйте ссылку, чтобы мы могли ее скачать.
Подготовка данных
Нам нужно сгенерировать данные о тренировках с помощью Keras ImageDataGenerator.
Сначала вы должны скачать с помощью wget со ссылкой на ваш файл из S3 Bucket.
!wget https://s3.us-east-2.amazonaws.com/naturalimages02/images.tar.gz !tar -xzf images.tar.gz
После загрузки данных давайте начнем процесс обучения.
from keras.preprocessing.image import ImageDataGenerator import numpy as np import matplotlib.pyplot as plt train_path = 'images/train/' test_path = 'images/test/' batch_size = 16 image_size = 224 num_class = 8 train_datagen = ImageDataGenerator(validation_split=0.3, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( directory=train_path, target_size=(image_size,image_size), batch_size=batch_size, class_mode='categorical', color_mode='rgb', shuffle=True)
ImageDataGenerator создаст данные X_training из каталога. Подкаталог в этом каталоге будет использоваться как класс для каждого объекта. Изображение будет загружено в цветовом режиме RGB, в режиме категориального класса для данных Y_training с размером пакета 16. Наконец, перемешайте данные.
Давайте посмотрим наши изображения в случайном порядке, построив их с помощью matplotlib
x_batch, y_batch = train_generator.next() fig=plt.figure() columns = 4 rows = 4 for i in range(1, columns*rows): num = np.random.randint(batch_size) image = x_batch[num].astype(np.int) fig.add_subplot(rows, columns, i) plt.imshow(image) plt.show()
После этого давайте создадим нашу сетевую модель из VGG16 с предварительно обученным весом imageNet. Мы заморозим эти слои, чтобы слои не были обучаемыми, чтобы помочь нам сократить время вычислений.
Создание нашей модели из VGG16
import keras from keras.models import Model, load_model from keras.layers import Activation, Dropout, Flatten, Dense from keras.preprocessing.image import ImageDataGenerator from keras.applications.vgg16 import VGG16 #Load the VGG model base_model = VGG16(weights='imagenet', include_top=False, input_shape=(image_size, image_size, 3)) print(base_model.summary()) # Freeze the layers for layer in base_model.layers: layer.trainable = False # # Create the model model = keras.models.Sequential() # # Add the vgg convolutional base model model.add(base_model) # # Add new layers model.add(Flatten()) model.add(Dense(1024, activation='relu')) model.add(Dense(1024, activation='relu')) model.add(Dense(num_class, activation='softmax')) # # Show a summary of the model. Check the number of trainable parameters print(model.summary())
Как вы можете видеть ниже, краткое описание нашей сетевой модели. Из входных данных слоев VGG16 мы добавляем 2 полностью подключенных слоя, которые будут извлекать 1024 объекта, и выходной слой, который будет вычислять 8 классов с активацией softmax.
Layer (type) Output Shape Param # ================================================================= vgg16 (Model) (None, 7, 7, 512) 14714688 _________________________________________________________________ flatten_1 (Flatten) (None, 25088) 0 _________________________________________________________________ dense_1 (Dense) (None, 1024) 25691136 _________________________________________________________________ dense_2 (Dense) (None, 1024) 1049600 _________________________________________________________________ dense_3 (Dense) (None, 8) 8200 ================================================================= Total params: 41,463,624 Trainable params: 26,748,936 Non-trainable params: 14,714,688
Подготовка
# # Compile the model from keras.optimizers import SGD model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=1e-3), metrics=['accuracy']) # # Start the training process # model.fit(x_train, y_train, validation_split=0.30, batch_size=32, epochs=50, verbose=2) # # #save the model # model.save('catdog.h5') history = model.fit_generator( train_generator, steps_per_epoch=train_generator.n/batch_size, epochs=10) model.save('fine_tune.h5') # summarize history for accuracy import matplotlib.pyplot as plt plt.plot(history.history['loss']) plt.title('loss') plt.ylabel('loss') plt.xlabel('epoch') plt.legend(['loss'], loc='upper left') plt.show()
Результаты
Epoch 1/10 432/431 [==============================] - 53s 123ms/step - loss: 0.5524 - acc: 0.9474 Epoch 2/10 432/431 [==============================] - 52s 119ms/step - loss: 0.1571 - acc: 0.9831 Epoch 3/10 432/431 [==============================] - 51s 119ms/step - loss: 0.1087 - acc: 0.9871 Epoch 4/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0624 - acc: 0.9926 Epoch 5/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0591 - acc: 0.9938 Epoch 6/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0498 - acc: 0.9936 Epoch 7/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0403 - acc: 0.9958 Epoch 8/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0248 - acc: 0.9959 Epoch 9/10 432/431 [==============================] - 51s 119ms/step - loss: 0.0466 - acc: 0.9942 Epoch 10/10 432/431 [==============================] - 52s 120ms/step - loss: 0.0338 - acc: 0.9947
Как видите, наши потери значительно упали, а точность составляет почти 100%. Для тестирования нашей модели мы случайным образом выбирали изображения через Интернет и помещали их в тестовую папку с другим классом для тестирования.
Тестирование нашей модели
model = load_model('fine_tune.h5') test_datagen = ImageDataGenerator() train_generator = train_datagen.flow_from_directory( directory=train_path, target_size=(image_size,image_size), batch_size=batch_size, class_mode='categorical', color_mode='rgb', shuffle=True) test_generator = test_datagen.flow_from_directory( directory=test_path, target_size=(image_size, image_size), color_mode='rgb', shuffle=False, class_mode='categorical', batch_size=1) filenames = test_generator.filenames nb_samples = len(filenames) fig=plt.figure() columns = 4 rows = 4 for i in range(1, columns*rows -1): x_batch, y_batch = test_generator.next() name = model.predict(x_batch) name = np.argmax(name, axis=-1) true_name = y_batch true_name = np.argmax(true_name, axis=-1) label_map = (test_generator.class_indices) label_map = dict((v,k) for k,v in label_map.items()) #flip k,v predictions = [label_map[k] for k in name] true_value = [label_map[k] for k in true_name] image = x_batch[0].astype(np.int) fig.add_subplot(rows, columns, i) plt.title(str(predictions[0]) + ':' + str(true_value[0])) plt.imshow(image) plt.show()
И наш тест, как показано ниже! Только 1 изображение предсказано неправильно из теста из 14 изображений!
Нейронная сеть распознавания лиц с Keras
Почему нам нужно признание
Нам нужно распознавание, чтобы нам было легче распознать или идентифицировать лицо человека, тип объекта, предполагаемый возраст человека по его лицу или даже узнать выражение лица этого человека.
Возможно, вы понимаете, что каждый раз, когда пытаетесь пометить лицо вашего друга на фотографии, функция Facebook сделала это для вас, то есть помечает лицо вашего друга, и вам не нужно сначала это отмечать. Это приложение Face Recognition, применяемое Facebook, чтобы нам было легче отмечать друзей.
Итак, как это работает? Каждый раз, когда мы помечаем лицо нашего друга, ИИ Facebook изучает его и будет пытаться предсказать его, пока не получит правильный результат. Та же самая система, которую мы будем использовать для нашего собственного распознавания лиц. Давайте начнем делать наше собственное распознавание лиц с использованием глубокого обучения
Модель сети
Мы будем использовать сетевую модель VGG16, но с весом VGGFace.
Архитектура модели VGG16
Что такое VGGFace? это реализация Keras Deep Face Recognition, представленная Parkhi, Omkar M. et al. «Глубокое распознавание лица». BMVC (2015). Фреймворк использует VGG16 в качестве сетевой архитектуры.
Вы можете скачать VGGFace из GitHub
from keras.applications.vgg16 import VGG16 from keras_vggface.vggface import VGGFace face_model = VGGFace(model='vgg16', weights='vggface', input_shape=(224,224,3)) face_model.summary()
Как вы можете увидеть в сети резюме
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ conv1_1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ conv1_2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ pool1 (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ conv2_1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ conv2_2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ pool2 (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ conv3_1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ conv3_2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ conv3_3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ pool3 (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ pool4 (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ pool5 (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc6 (Dense) (None, 4096) 102764544 _________________________________________________________________ fc6/relu (Activation) (None, 4096) 0 _________________________________________________________________ fc7 (Dense) (None, 4096) 16781312 _________________________________________________________________ fc7/relu (Activation) (None, 4096) 0 _________________________________________________________________ fc8 (Dense) (None, 2622) 10742334 _________________________________________________________________ fc8/softmax (Activation) (None, 2622) 0 ================================================================= Total params: 145,002,878 Trainable params: 145,002,878 Non-trainable params: 0 _________________________________________________________________ Traceback (most recent call last):
мы сделаем Transfer Learning + Fine Tuning, чтобы ускорить обучение с небольшими наборами данных. Во-первых, мы заморозим базовые слои, чтобы они не были обучаемыми.
for layer in face_model.layers: layer.trainable = False
Затем мы добавляем наш собственный слой, чтобы распознать наши тестовые лица. Мы добавим 2 полностью подключенных слоя и выходной слой с 5 людьми для обнаружения.
from keras.models import Model, Sequential from keras.layers import Input, Convolution2D, ZeroPadding2D, MaxPooling2D, Flatten, Dense, Dropout, Activation person_count = 5 last_layer = face_model.get_layer('pool5').output x = Flatten(name='flatten')(last_layer) x = Dense(1024, activation='relu', name='fc6')(x) x = Dense(1024, activation='relu', name='fc7')(x) out = Dense(person_count, activation='softmax', name='fc8')(x) custom_face = Model(face_model.input, out)
Давайте посмотрим нашу сеть резюме
Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) (None, 224, 224, 3) 0 _________________________________________________________________ conv1_1 (Conv2D) (None, 224, 224, 64) 1792 _________________________________________________________________ conv1_2 (Conv2D) (None, 224, 224, 64) 36928 _________________________________________________________________ pool1 (MaxPooling2D) (None, 112, 112, 64) 0 _________________________________________________________________ conv2_1 (Conv2D) (None, 112, 112, 128) 73856 _________________________________________________________________ conv2_2 (Conv2D) (None, 112, 112, 128) 147584 _________________________________________________________________ pool2 (MaxPooling2D) (None, 56, 56, 128) 0 _________________________________________________________________ conv3_1 (Conv2D) (None, 56, 56, 256) 295168 _________________________________________________________________ conv3_2 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ conv3_3 (Conv2D) (None, 56, 56, 256) 590080 _________________________________________________________________ pool3 (MaxPooling2D) (None, 28, 28, 256) 0 _________________________________________________________________ conv4_1 (Conv2D) (None, 28, 28, 512) 1180160 _________________________________________________________________ conv4_2 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ conv4_3 (Conv2D) (None, 28, 28, 512) 2359808 _________________________________________________________________ pool4 (MaxPooling2D) (None, 14, 14, 512) 0 _________________________________________________________________ conv5_1 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_2 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ conv5_3 (Conv2D) (None, 14, 14, 512) 2359808 _________________________________________________________________ pool5 (MaxPooling2D) (None, 7, 7, 512) 0 _________________________________________________________________ flatten (Flatten) (None, 25088) 0 _________________________________________________________________ fc6 (Dense) (None, 1024) 25691136 _________________________________________________________________ fc7 (Dense) (None, 1024) 1049600 _________________________________________________________________ fc8 (Dense) (None, 5) 5125 ================================================================= Total params: 41,460,549 Trainable params: 26,745,861 Non-trainable params: 14,714,688
Как вы можете видеть выше, после слоя pool5 он будет сведен в один вектор объектов, который будет использоваться плотным слоем для окончательного распознавания.
Готовим наши лица
Теперь давайте подготовим наши лица. Я сделал каталог, состоящий из 5 известных людей
- Джек Ма
- Джейсон Стэтхэм
- Джонни Депп
- Роберт Дауни-младший
- Роуэн Аткинсон
Каждая папка содержит 10 изображений для каждого процесса обучения и оценки. Это очень мало данных, но это проблема, верно?
Мы будем использовать инструмент Keras, чтобы помочь нам подготовить данные. Эта функция выполняет итерацию в папке набора данных, а затем подготавливает ее для использования в обучении.
from keras.preprocessing.image import ImageDataGenerator batch_size = 5 train_path = 'data/' eval_path = 'eval/' train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) valid_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) train_generator = train_datagen.flow_from_directory( train_path, target_size=(image_size,image_size), batch_size=batch_size, class_mode='sparse', color_mode='rgb') valid_generator = valid_datagen.flow_from_directory( directory=eval_path, target_size=(224, 224), color_mode='rgb', batch_size=batch_size, class_mode='sparse', shuffle=True, )
Обучение нашей модели
Давайте начнем наш тренировочный процесс с компиляции нашей сети с функцией потерь и оптимизатором. Здесь мы используем sparse_categorical_crossentropy в качестве нашей функции потерь, с помощью SGD в качестве нашего оптимизатора обучения.
from keras.optimizers import SGD custom_face.compile(loss='sparse_categorical_crossentropy', optimizer=SGD(lr=1e-4, momentum=0.9), metrics=['accuracy']) history = custom_face.fit_generator( train_generator, validation_data=valid_generator, steps_per_epoch=49/batch_size, validation_steps=valid_generator.n, epochs=50) custom_face.evaluate_generator(generator=valid_generator) custom_face.save('vgg_face.h5') Epoch 25/50 10/9 [==============================] - 60s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5659 - val_acc: 0.5851 Epoch 26/50 10/9 [==============================] - 59s 6s/step - loss: 1.4882 - acc: 0.8998 - val_loss: 1.5638 - val_acc: 0.5809 Epoch 27/50 10/9 [==============================] - 60s 6s/step - loss: 1.4779 - acc: 0.8597 - val_loss: 1.5613 - val_acc: 0.5477 Epoch 28/50 10/9 [==============================] - 60s 6s/step - loss: 1.4755 - acc: 0.9199 - val_loss: 1.5576 - val_acc: 0.5809 Epoch 29/50 10/9 [==============================] - 60s 6s/step - loss: 1.4794 - acc: 0.9153 - val_loss: 1.5531 - val_acc: 0.5892 Epoch 30/50 10/9 [==============================] - 60s 6s/step - loss: 1.4714 - acc: 0.8953 - val_loss: 1.5510 - val_acc: 0.6017 Epoch 31/50 10/9 [==============================] - 60s 6s/step - loss: 1.4552 - acc: 0.9199 - val_loss: 1.5509 - val_acc: 0.5809 Epoch 32/50 10/9 [==============================] - 60s 6s/step - loss: 1.4504 - acc: 0.9199 - val_loss: 1.5492 - val_acc: 0.5975 Epoch 33/50 10/9 [==============================] - 60s 6s/step - loss: 1.4497 - acc: 0.8998 - val_loss: 1.5490 - val_acc: 0.5851 Epoch 34/50 10/9 [==============================] - 60s 6s/step - loss: 1.4453 - acc: 0.9399 - val_loss: 1.5529 - val_acc: 0.5643 Epoch 35/50 10/9 [==============================] - 60s 6s/step - loss: 1.4399 - acc: 0.9599 - val_loss: 1.5451 - val_acc: 0.5768 Epoch 36/50 10/9 [==============================] - 60s 6s/step - loss: 1.4373 - acc: 0.8998 - val_loss: 1.5424 - val_acc: 0.5768 Epoch 37/50 10/9 [==============================] - 60s 6s/step - loss: 1.4231 - acc: 0.9199 - val_loss: 1.5389 - val_acc: 0.6183 Epoch 38/50 10/9 [==============================] - 59s 6s/step - loss: 1.4247 - acc: 0.9199 - val_loss: 1.5372 - val_acc: 0.5934 Epoch 39/50 10/9 [==============================] - 60s 6s/step - loss: 1.4153 - acc: 0.9399 - val_loss: 1.5406 - val_acc: 0.5560 Epoch 40/50 10/9 [==============================] - 60s 6s/step - loss: 1.4074 - acc: 0.9800 - val_loss: 1.5327 - val_acc: 0.6224 Epoch 41/50 10/9 [==============================] - 60s 6s/step - loss: 1.4023 - acc: 0.9800 - val_loss: 1.5305 - val_acc: 0.6100 Epoch 42/50 10/9 [==============================] - 59s 6s/step - loss: 1.3938 - acc: 0.9800 - val_loss: 1.5269 - val_acc: 0.5975 Epoch 43/50 10/9 [==============================] - 60s 6s/step - loss: 1.3897 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.6432 Epoch 44/50 10/9 [==============================] - 60s 6s/step - loss: 1.3828 - acc: 0.9800 - val_loss: 1.5210 - val_acc: 0.6556 Epoch 45/50 10/9 [==============================] - 59s 6s/step - loss: 1.3848 - acc: 0.9599 - val_loss: 1.5234 - val_acc: 0.5975 Epoch 46/50 10/9 [==============================] - 60s 6s/step - loss: 1.3716 - acc: 0.9800 - val_loss: 1.5216 - val_acc: 0.6432 Epoch 47/50 10/9 [==============================] - 60s 6s/step - loss: 1.3721 - acc: 0.9800 - val_loss: 1.5195 - val_acc: 0.6266 Epoch 48/50 10/9 [==============================] - 60s 6s/step - loss: 1.3622 - acc: 0.9599 - val_loss: 1.5108 - val_acc: 0.6141 Epoch 49/50 10/9 [==============================] - 60s 6s/step - loss: 1.3452 - acc: 0.9399 - val_loss: 1.5140 - val_acc: 0.6432 Epoch 50/50 10/9 [==============================] - 60s 6s/step - loss: 1.3387 - acc: 0.9599 - val_loss: 1.5100 - val_acc: 0.6266
Как видите, наша точность проверки составляет до 64%, это хороший результат для небольшого количества обучающих данных. Мы можем улучшить это, добавив больше слоев или добавив больше тренировочных изображений, чтобы наша модель могла больше узнать о лицах и добиться большей точности.
Давайте проверим нашу модель с тестовой картинкой
from keras.models import load_model from keras.preprocessing.image import load_img, save_img, img_to_array from keras_vggface.utils import preprocess_input test_img = image.load_img('test.jpg', target_size=(224, 224)) img_test = image.img_to_array(test_img) img_test = np.expand_dims(img_test, axis=0) img_test = utils.preprocess_input(img_test) predictions = model.predict(img_test) predicted_class=np.argmax(predictions,axis=1) labels = (train_generator.class_indices) labels = dict((v,k) for k,v in labels.items()) predictions = [labels[k] for k in predicted_class] print(predictions) ['RobertDJr']
используя картинку Роберта Дауни-младшего в качестве нашей тестовой картинки, она показывает, что предсказанное лицо верно!
Прогнозирование с использованием Live Cam!
Как насчет того, чтобы проверить наше умение реализовать его с помощью входа с веб-камеры? Используя OpenCV с каскадом Haar Face, чтобы найти наше лицо, и с помощью нашей сетевой модели мы можем узнать человека.
Первый шаг — подготовить лица тебя и твоего друга. Чем больше у нас данных, тем лучше результат!
Подготовьте и обучите свою сеть, как на предыдущем шаге, после завершения обучения добавьте эту строку, чтобы получить исходное изображение с камеры.
#Load trained model from keras.models import load_model from keras_vggface import utils import cv2 image_size = 224 device_id = 0 #camera_device id model = load_model('my faces.h5') #make labels according to your dataset folder labels = dict(fisrtname=0,secondname=1) #and so on print(labels) cascade_classifier = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') camera = cv2.VideoCapture(device_id) while camera.isOpened(): ok, cam_frame = camera.read() if not ok: break gray_img=cv2.cvtColor(cam_frame, cv2.COLOR_BGR2GRAY) faces= cascade_classifier.detectMultiScale(gray_img, minNeighbors=5) for (x,y,w,h) in faces: cv2.rectangle(cam_frame,(x,y),(x+w,y+h),(255,255,0),2) roi_color = cam_frame [y:y+h, x:x+w] roi color = cv2.cvtColor(roi_color, cv2.COLOR_BGR2RGB) roi_color = cv2.resize(roi_color, (image_size, image_size)) image = roi_color.astype(np.float32, copy=False) image = np.expand_dims(image, axis=0) image = preprocess_input(image, version=1) # or version=2 preds = model.predict(image) predicted_class=np.argmax(preds,axis=1) labels = dict((v,k) for k,v in labels.items()) name = [labels[k] for k in predicted_class] cv2.putText(cam_frame,str(name), (x + 10, y + 10), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,255), 2) cv2.imshow('video image', cam_frame) key = cv2.waitKey(30) if key == 27: # press 'ESC' to quit break camera.release() cv2.destroyAllWindows()
Какой лучше? Керас или Тензорфлоу
Керас предлагает простоту при написании сценария. Мы можем начать писать и понимать непосредственно с Керасом, поскольку это не так сложно понять. Она более удобна и проста в реализации, не требует много переменных для запуска модели. Таким образом, нам не нужно понимать каждую деталь в бэкэнд-процессе.
С другой стороны, Tensorflow — это низкоуровневые операции, которые предлагают гибкость и расширенные операции, если вы хотите создать произвольный вычислительный граф или модель. Tensorflow также может визуализировать процесс с помощью TensorBoard и специального инструмента отладчика.
Так что, если вы хотите начать работать с глубоким обучением с небольшой сложностью, используйте Keras. Потому что Keras предлагает простоту и удобство использования и просты в реализации, чем Tensorflow. Но если вы хотите написать собственный алгоритм в проекте глубокого обучения или исследованиях, вам следует использовать Tensorflow.
Резюме
Итак, давайте подведем итоги всему, что мы обсудили и сделали в этом уроке.
- Keras в высокоуровневом API, который используется для облегчения сетей глубокого обучения с помощью внутреннего движка.
- Keras прост в использовании и понимании благодаря поддержке Python, поэтому он кажется более естественным, чем когда-либо. Это хорошо для новичков, которые хотят узнать о глубоком обучении, и для исследователей, которые хотят простой в использовании API.
- Процесс установки прост, и вы можете использовать виртуальную среду или внешнюю платформу, такую как AWS.
- Keras также поставляется с сетевыми моделями различного типа, поэтому нам легче использовать доступную модель для предварительной подготовки и точной настройки нашей собственной сетевой модели.
- Кроме того, есть много учебных пособий и статей об использовании Keras из кодов сообществ по всему миру для целей глубокого обучения.