В курсе “Глубокое обучение на Python” мы научились обучать нейронные сети для распознавания рукописных цифр и объектов из набора данных CIFAR-10. Давайте посмотрим, как применять эти нейронные сети для анализа своих изображений.

Распознавание рукописных цифр

Начнем с распознавания рукописных цифр. Читатели прислали мне несколько отсканированных картинок с рукописными цифрами. Вот одна из них:

Рукописная цифра 2

Для распознавания рукописных цифр воспользуемся сверточной нейронной сетью.

Keras содержит специальный модуль для работы с изображениями, который называется image. С его помощью можно быстро загрузить изображение из файла и преобразовать его в массив numpy, который мы можем передать модели для распознавания:

import numpy as np
from keras.preprocessing import image

# Загружаем изображение
img_path = '2.png'
img = image.load_img(img_path, target_size=(28, 28), grayscale=True)

# Преобразуем изображением в массив numpy
x = image.img_to_array(img)

# Инвертируем и нормализуем изображение
x = 255 - x
x /= 255
x = np.expand_dims(x, axis=0)

Загружаем из файла обученную сверточную нейронную сеть:

json_file = open("mnist_model.json", "r")
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("mnist_model.h5")

Компилируем модель перед использованием

loaded_model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

Теперь мы готовы к распознаванию цифры. Для распознавания вызываем метод модели predict:

prediction = loaded_model.predict(x)

Модель выдает массив из 10 значений в формате One Hot Encoding. Выбираем индекс максимального значения и печатаем его:

print(np.argmax(prediction))

[2]

Распознавание объектов на изображениях

Давайте рассмотрим более сложную задачу - распознавание объектов на изображении. Будем использовать нейронную сеть, обученную на наборе данных CIFAR-10. Попробуем распознать картинку самолета, которую сеть не видела в процессе обучения:

Фотография самолета

Загружаем изображение в Keras:

import numpy as np
from keras.preprocessing import image

img_path = 'plane.jpg'
img = image.load_img(img_path, target_size=(32, 32))

В отличие от рукописных цифр, в этот раз изображение цветное и его размер 32х32, в соответствии с форматом CIFAR-10. Преобразуем картинку в массив numpy:

x = image.img_to_array(img)
x /= 255
x = np.expand_dims(x, axis=0)

Загружаем сеть, обученную на наборе данных CIFAR-10, и компилируем модель:

json_file = open("cifar10_model.json", "r")
loaded_model_json = json_file.read()
json_file.close()
loaded_model = model_from_json(loaded_model_json)
loaded_model.load_weights("cifar10_model.h5")
loaded_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

Запускаем распознавание объекта:

prediction = loaded_model.predict(x)

Для удобства вывода задаем список с названиями классов объектов:

classes=['самолет', 'автомобиль', 'птица', 'кот', 'олень', 'собака', 'лягушка', 'лошадь', 'корабль', 'грузовик']

Печатаем результат распознавания:

print(classes[np.argmax(prediction)])

[самолет]

Как видим, нейронная сеть справилась с задачей, несмотря на то, что обучение проводилось на изображениях размером 32х32. Наше изображение пришлось уменьшить до этого размера, но сеть все равно распознала на картинке самолет.

Давайте попробуем дать нейронной сети более сложную задачу - распознать не фотографию объекта, а рисунок. Например, вот такой рисунок лошади:

Фотография самолета

Запускаем программу и получаем результат:

[лошадь]

Нейронная сеть сумела распознать объект даже на рисунке, хотя мы обучали ее только на фотографиях!

Итоги

Мы научились применять нейронные сети для анализа любых изображений, а не только тех, которые входят в стандартные наборы данных для обучения. В Keras для этого есть класс image из модуля keras.preprocessing.

Попробуйте провести эксперименты со своими изображениями и пишите в комментариях, что у вас получилось.

Полезные ссылки

  1. Курс “Глубокое обучение на Python”.
  2. Сверточная нейронная сеть для распознавания рукописных цифр.
  3. Сверточная нейронная сеть для распознавания объектов из набора данных CIFAR-10.
  4. Сохранение обученных нейронных сетей.