В комментариях к курсу по программированию глубоких нейронных сетей на Python мне чаще всего задают вопрос о том, как использовать обученую сеть для анализа своих изображений. Давайте рассмотрим это на примере набора данных MNIST. Вы написали цифру на бумаге, отсканировали (или сфотографировали), сохранили в размере 28х28 и вас получилось что-нибудь такое:

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

Спасибо Роману Толмаеву за пример картинок и кода.

Давайте рассмотрим, как с помощью Keras распознать цифру на картинке.

Для работы с изображениями мы будем использовать библиотеку Python Imaging Library (PIL). Импортируем из библиотеки класс Image.

from PIL import Image

Загружаем картинку из файла и преобразуем ее в массив Numpy.

im = Image.open('7.png')
im_grey = im.convert('L')
im_array = np.array(im_grey)
im_array=np.reshape(im_array, (1, 784)).astype('float32')

Особенность набора данных MNIST заключается в том, что в нем для представления черного цвета используется код 255, а для белого - 0. Поэтому перед распознаванием изображения необходимо провести его инверсию:

# Инвертируем изображение
x = 255 - im_array
# Нормализуем изображение
x /= 255

Теперь изображение готово к распознаванию. Если наша обученная сеть содержится в переменной model, то для распознавания можно использовать следующий код:

# Нейронная сеть предсказывает класс изображения
prediction = model.predict(x)
# Преобразуем ответ из категориального представления в метку класса
prediction = np_utils.categorical_probas_to_classes(prediction)
# Печатаем результат
print(prediction)

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

[2]

Можно видеть что значение, предсказанное сетью, совпало с цифрой на картинке. Обученная сеть действительно способна распознавать цифры, которые мы сами пишем от руки!