Простой классификатор изображений на Python с помощью библиотеки TensorFlow: пошаговое руководство

Это руководство поможет вам создать классификатор изображений, используя несколько строк кода и TensorFlow — библиотеку машинного обучения от Google.

Чтобы извлечь максимальную пользу из руководства, вам понадобится:

  • компьютер с 64-битной операционной системой Linux или macOS (пользователям Windows рекомендуем использовать виртуальную машину);
  • базовое знание Unix-команд и интерфейса командной строки;
  • базовое понимание устройства контейнеров Docker (поможет наше руководство) и виртуальных машин;
  • библиотека TensorFlow версии 1.2.0, установленная в контейнере Docker (смотрите ниже);
  • последняя версия библиотеки numpy (pip install numpy);
  • знание Python;
  • базовые навыки работы с Git (снова поможет наше руководство).

Постановка задачи

Что должен выполнить алгоритм:

  • проанализировать изображение и определить, есть ли на нём цветок;
  • если есть — определить, к какой из предложенных категорий он относится;
  • вывести процент уверенности в своём ответе.

Категории цветов, включенные во входной набор данных: ромашки, одуванчики, розы, подсолнухи и тюльпаны.

Мы будем использовать Inception v3 — готовую модель машинного обучения для тренировки на нашем собственном наборе данных. Эта нейронная сеть используется в «Кампании по широкомасштабному распознаванию образов ImageNet» (ILSVRC — ImageNet Large Scale Visual Recognition Challenge) и ранее на ней проводилось обучение описываемого алгоритма на определение категорий объектов на изображениях.

Настройка инструментов

Воспользуемся пакетом контейнеров Docker, предоставляемым TensorFlow. Одним из преимуществ контейнера является то, что все зависимости, необходимые для запуска TensorFlow, уже присутствуют в контейнере, поэтому нет необходимости устанавливать что-либо самостоятельно (тем не менее, необходимо убедиться, что в контейнере установлена последняя версия библиотеки TensorFlow. Для этого в консоли Docker необходимо ввести pip install --upgrade tensorflow). Следуйте этим указаниям для установки панели инструментов Docker на ПК.

Docker-контейнер работает по принципу небольшого компьютера, отделённого от вашего основного компьютера. Он имеет свою собственную файловую систему, а также ему будет назначен собственный IP-адрес после успешного завершения установки. Чтобы проверить, правильно ли установлен Docker, запустите Docker Daemon, введя следующую команду в основном терминале:

sudo service docker start

Запуск образа Docker TensorFlow

Установите образ Docker TensorFlow:

sudo docker run -it gcr.io/tensorflow/tensorflow:latest-devel

После того, как вы введёте данную команду, появится новый пользователь с рут-правами и длинным номером (root@xxx), как это показано на скриншоте ниже. Обратите внимание, что в Docker будет находиться папка tensorflow.

Чтобы убедиться в корректной работе TensorFlow, вы можете набрать следующий код на Python, состоящий из трёх строк, для отображения приветствия TensorFlow в терминале Docker:

Подготовка входных данных для обучения

Чтобы модель Inception v3 могла определять цветы на изображениях, необходимо подготовить входные данные, на которых алгоритм будет обучаться. Для этого сначала следует создать каталог на вашем основном компьютере / виртуальной машине с названием tf_files, путь может выглядеть примерно так: ~/Documents/tutorial_ML/tf_files.

Если вы всё ещё находитесь в терминале Docker, можете нажать Ctrl+D, чтобы выйти из Docker и вернуться в терминал вашего основного компьютера / виртуальной машины, либо создать новое окно терминала. Для загрузки набора изображений с цветами сначала перейдите в каталог tf_files, а затем введите следующую команду в основном терминале:

curl -O http://download.tensorflow.org/example_images/flower_photos.tgz

Разархивируйте полученный файл, введя эту команду:

tar xzf flower_photos.tgz

В каталоге flower_photos вы увидите поддиректории с именами: daisy (ромашки), dandelion (одуванчики), roses (розы), sunflowers (подсолнухи) и tulips (тюльпаны).

Привязка набора данных к образу Docker TensorFlow

Так как образ Docker TensorFlow не содержит входного набора данных с изображениями, нужно связать эти файлы, набрав команду в терминале вашего основного компьютера / виртуальной машины, которая активирует терминал Docker:

sudo docker run -it -v $HOME/tf_files:/tf_files gcr.io/tensorflow/tensorflow:latest-devel

Здесь $HOME соответствует директории ~/Documents/tutorial_ML/. Чтобы узнать, корректно ли связаны изображения, вы можете набрать следующую команду в терминале:

ls /tf_files

Вывод команды должен содержать папку с названием flower_photos.

Получение примера исходного кода

Перейдите в каталог tensorflow, который расположен в файловой системе Docker, и введите git pull, чтобы получить последнюю версию кода из git-репозитория TensorFlow. Полученный исходный код будет располагаться по следующему пути: /tensorflow/tensorflow/examples/image_retraining/.

Для обучения введите следующую команду и нажмите ENTER:

# python tensorflow/examples/image_retraining/retrain.py \
--bottleneck_dir=/tf_files/bottlenecks \
--how_many_training_steps 500 \
--model_dir=/tf_files/inception \
--output_graph=/tf_files/retrained_graph.pb \
--output_labels=/tf_files/retrained_labels.txt \
--image_dir /tf_files/flower_photos

Пока модель Inception обрабатывается (а это займёт продолжительное время), вы увидите, что сначала создаются критические параметры (bottlenecks), как это показано на скриншоте ниже. Критические параметры — это последний слой перед основным слоем начальной модели, который будет классифицировать изображения. В них заключается содержательное, но при этом компактное резюме изображения, которое помогает классификатору сделать наиболее точный выбор:

После того, как обучение критических параметров завершится, алгоритм перейдёт на финальный этап обучения. Во время обучения в терминале Docker будут отображены следующие параметры: точность обучения (train accuracy) и точность проверки (validation accuracy). Вы увидите аналогичную скриншоту ниже картину. В конце будет отображено значение точности от 85% до 99%:

Тестирование классификатора изображений

В каталоге /tensorflow/.git, который находится в корневой директории Docker, создайте файл label_image.py. Введите следующие строки кода и сохраните его:

# -*- coding: utf-8 -*-
import tensorflow as tf
import sys
from numpy import argsort

image_path = sys.argv[1]

# считывает файл image_data
image_data = tf.gfile.FastGFile(image_path, 'rb').read()

# загружает выбранный файл и удаляет символ разрыва строки
label_lines = [line.rstrip() for line in tf.gfile.GFile("/tf_files/retrained_labels.txt")]

# отделяет граф от файла
with tf.gfile.FastGFile("/tf_files/retrained_graph.pb", 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(graph_def, name='')

# загружает image_data как входные данные и отображает первые предположения 
with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('final_result:0')
    predictions = sess.run(softmax_tensor, {'DecodeJpeg/contents:0': image_data})

# сортирует категории после первых предположений в порядке роста уверенности
top_k = predictions[0].argsort()[-len(predictions[0]):][::-1]

for node_id in top_k:
    human_string = label_lines[node_id]
    score = predictions[0][node_id]
    print('%s (score = %.5f)' % (human_string, score))

Если вы вышли из Docker, введите следующую команду, чтобы перезапустить контейнер:

docker run -it -v $HOME/tf_files:/tf_files gcr.io/tensorflow/tensorflow:latest-devel

Выполните следующую команду в терминале Docker, чтобы протестировать, например, изображение, на котором присутствует ромашка:

# python /tensorflow/.git/label_image.py /tf_files/flower_photos/daisy/21652746_cc379e0eea_m.jpg

Как видно на скриншоте ниже, при тестировании выбранного изображения было получено число 0,98929. Это указывает на то, что классификатор на 98% уверен, что изображение содержит цветок ромашки. Если аналогичным образом протестировать изображения собаки и кота, будет получен низкий процент уверенности для всех категорий цветов. Это говорит о том, что алгоритм определил, что наличие какого-либо цветка маловероятно на тестируемом изображении:

Предлагаем поэкспериментировать, подготовив другой набор входных данных, чтобы создать свой собственный классификатор изображений. Удачи в обучении!

Перевод статьи «Machine Learning using TensorFlow in 10 Lines of Code»