*** Процедуры в этой статье не применимы к последним репозиториям моделей Tensorflow. Ожидайте обновления. ***

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

Вместо того, чтобы обучать собственную модель с нуля, вы можете использовать существующие модели и настраивать их для своих целей, не требуя при этом больших вычислительных мощностей.

В этом руководстве мы собираемся запачкать руки и обучить наш собственный детектор корги, используя предварительно обученную модель SSD MobileNet V2.

1. Установка

Это руководство основано на виртуальной среде Anaconda с Python 3.6.

1.1 Тензорный поток

Установите Tensorflow, используя следующую команду:

$ pip install tensorflow

Если у вас есть графический процессор, который можно использовать с Tensorflow:

$ pip install tensorflow-gpu

1.2 Другие зависимости

$ pip install pillow Cython lxml jupyter matplotlib

Установите protobuf с помощью Homebrew (подробнее о Homebrew вы можете узнать здесь)

$ brew install protobuf

Для установки protobuf на другую ОС следуйте инструкциям здесь.

1.3 Клонировать репозиторий моделей Tensorflow

В этом руководстве мы собираемся использовать ресурсы из репозитория моделей Tensorflow. Поскольку он не поставляется с установкой Tensorflow, нам нужно клонировать его из их репозитория Github:

Сначала перейдите в каталог Tensorflow:

# For example: ~/anaconda/envs/<your_env_name>/lib/python3.6/site-packages/tensorflow
$ cd <path_to_your_tensorflow_installation>

Клонируйте репозиторий моделей Tensorflow:

$ git clone https://github.com/tensorflow/models.git

С этого момента этот каталог будет называться models каталог.

1.4 Настройка среды

Каждый раз, когда вы запускаете новое окно терминала для работы с предварительно обученными моделями, важно скомпилировать Protobuf и изменить свой PYTHONPATH.

Запустите со своего терминала следующее:

$ cd <path_to_your_tensorflow_installation>/models/research/
$ protoc object_detection/protos/*.proto --python_out=.
$ export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

Выполните быстрый тест, чтобы убедиться, что API обнаружения объектов работает правильно:

$ python object_detection/builders/model_builder_test.py

Если результат выглядит следующим образом, вы готовы перейти к следующим шагам!

...............
----------------------------------------------------------------------
Ran 15 tests in 0.123s

OK

1.5 Рекомендуемая структура папок

Чтобы упростить изучение этого руководства, создайте следующую структуру папок в каталоге models, который вы только что клонировали:

models 
    ├── annotations
    |   └── xmls    
    ├── images
    ├── checkpoints
    ├── tf_record
    ├── research
    ...

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

2. Собирайте изображения.

Подготовка данных - самая важная часть обучения вашей собственной модели. Поскольку мы собираемся обучать детектор корги, мы должны собирать фотографии корги! Их хватило бы примерно на 200 штук.

Я рекомендую использовать google-images-download для загрузки изображений. Он выполняет поиск изображений Google, а затем загружает изображения на основе предоставленных вами входных данных. Во входных данных вы можете указать параметры поиска, такие как ключевые слова, количество изображений, формат изображения, размер изображения и права использования.

Поскольку мы загружаем более 100 изображений за раз, нам нужен chromedriver в каталоге models (скачать здесь). Когда у вас будет chromedriver готово, вы можете использовать этот пример команды для загрузки изображений. Убедитесь, что все изображения в формате jpg:

# From the models directory
$ googleimagesdownload --keywords 'welsh corgi dog' \
--limit 200 \
--size medium \
--chromedriver ./chromedriver \
--format jpg

После загрузки сохраните все изображения в models/images/. Чтобы упростить последующие процессы, давайте переименуем изображения в числа (например, 1.jpg, 2.jpg), запустив следующий скрипт:

3. Обозначьте свой набор данных.

После того, как вы собрали все нужные изображения, вам нужно пометить их вручную. Есть много пакетов, которые служат этой цели. LabelImg - популярный выбор.

labelImg предоставляет удобный графический интерфейс. Кроме того, он сохраняет файлы этикеток (.xml) в популярном формате Pascal VOC. Вот как помеченное изображение выглядит в labelImg:

Дважды проверьте, что каждому изображению соответствует .xml файл, и сохраните их в models/annotations/xmls/.

4. Создайте карту меток (.pbtxt)

Классы должны быть указаны на карте меток. Поскольку мы обнаруживаем только корги, карта надписей должна содержать только один элемент, например следующий:

Обратите внимание, что id должен начинаться с 1, потому что 0 - это зарезервированный идентификатор.

Сохраните этот файл как label_map.pbtxt в models/annotations/

5. Создайте trainval.txt

trainval.txt - это список имен изображений без расширений файлов. Поскольку у нас есть порядковые номера для имен изображений, список должен выглядеть так:

Сохраните этот файл как trainval.txt в models/annotations/

6. Создайте TFRecord (.record)

TFRecord - важный формат данных, разработанный для Tensorflow. (Об этом подробнее здесь"). Прежде чем вы сможете обучать свой детектор пользовательских объектов, вы должны преобразовать свои данные в формат TFRecord.

Поскольку нам нужно обучать, а также проверять нашу модель, набор данных будет разделен на обучающий (train.record) и проверочный (val.record). Цель обучающего набора проста - это набор примеров, на которых модель учится. Набор для проверки - это набор примеров, используемых ВО ВРЕМЯ ОБУЧЕНИЯ для итеративной оценки точности модели.

Мы собираемся использовать create_tf_record.py для преобразования нашего набора данных в train.record и val.record. Скачайте здесь и сохраните в models/research/object_detection/dataset_tools/.

Этот сценарий предварительно сконфигурирован для разделения 70–30 поездов. Выполните его, запустив:

# From the models directory
$ python research/object_detection/dataset_tools/create_tf_record.py

Если сценарий выполнен успешно, в вашем models/research/ каталоге должны появиться train.record и val.record. Переместите их в каталог models/tf_record/.

7. Скачать предварительно обученную модель.

В модельном зоопарке доступно множество предварительно обученных моделей обнаружения объектов. Чтобы обучить их с помощью нашего настраиваемого набора данных, модели необходимо восстановить в Tensorflow, используя их контрольные точки (.ckpt файлы), которые являются записями предыдущих состояний модели.

В этом руководстве мы загрузим ssd_mobilenet_v2_coco здесь и сохраним файлы контрольных точек модели (model.ckpt.meta, model.ckpt.index, model.ckpt.data-00000-of-00001) в нашем models/checkpoints/ каталоге.

8. Измените файл конфигурации (.config).

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

Файлы конфигурации включены в каталог models, который вы клонировали в самом начале. Вы можете найти их в:

models/research/object_detection/samples/configs

В нашем случае мы изменим файл конфигурации для ssd_mobilenet_v2_coco. Сначала сделайте его копию и сохраните в каталоге models/.

Вот что нам нужно изменить:

  1. Поскольку мы только пытаемся обнаружить корги, измените num_classes на 1
  2. fine_tune_checkpoint сообщает модели, какой файл контрольной точки использовать. Установите это значение checkpoints/model.ckpt
  3. Модель также должна знать, где находятся файлы TFRecord и карты меток как для обучающих, так и для проверочных наборов. Поскольку наши train.record и val.record сохранены в папке tf_record, наша конфигурация должна отражать это:
train_input_reader: {
  tf_record_input_reader {
    input_path: "tf_record/train.record"
  }
  label_map_path: "annotations/label_map.pbtxt"
}

eval_input_reader: {
  tf_record_input_reader {
    input_path: "tf_record/val.record"
  }
  label_map_path: "annotations/label_map.pbtxt"
  shuffle: false
  num_readers: 1
}

9. Поезд

На этом этапе ваш каталог models должен выглядеть так:

models 
    ├── annotations
    |   ├── label_map.pbtxt
    |   ├── trainval.txt
    |   └── xmls
    |       ├── 1.xml
    |       ├── 2.xml
    |       ├── ...
    |
    ├── images
    |   ├── 1.jpg
    |   ├── 2.jpg
    |   ├── ...    
    |
    ├── checkpoints
    |   ├── model.ckpt.data-00000-of-00001
    |   ├── model.ckpt.index
    |   └── model.ckpt.meta
    |
    ├── tf_record
    |   ├── train.record
    |   └── val.record
    |
    ├── research
    |   ├── ...
    ...

Если вы успешно выполнили все предыдущие шаги, вы готовы приступить к тренировке!

Следуйте инструкциям ниже:

# Change into the models directory
$ cd tensorflow/models

# Make directory for storing training progress
$ mkdir train

# Make directory for storing validation results
$ mkdir eval

# Begin training
$ python research/object_detection/train.py \
    --logtostderr \
    --train_dir=train \
    --pipeline_config_path=ssd_mobilenet_v2_coco.config

Время обучения зависит от вычислительной мощности вашего компьютера.

10. Оценка

Оценку можно проводить параллельно с обучением. Сценарий eval.py проверяет каталог train на предмет прогресса и оценивает модель на основе самой последней контрольной точки.

# From the models directory
$ python research/object_detection/eval.py \
    --logtostderr \
    --pipeline_config_path=ssd_mobilenet_v2_coco.config \
    --checkpoint_dir=train \
    --eval_dir=eval

Вы можете визуализировать прогресс обучения модели с помощью Tensorboard:

# From the models directory
$ tensorboard --logdir=./

На основе графиков, выводимых Tensorboard, вы можете решить, когда вы хотите прекратить обучение. Обычно вы можете остановить процесс, когда функция потерь сужается и больше не уменьшается на значительную величину. В моем случае я остановился на шаге 3258.

11. Экспорт модели

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

# From the models directory
$ mkdir fine_tuned_model 
$ python research/object_detection/export_inference_graph.py \    
--input_type image_tensor \    
--pipeline_config_path ssd_mobilenet_v2_coco.config \    
--trained_checkpoint_prefix  train/model.ckpt-<the_highest_checkpoint_number> \    
--output_directory fine_tuned_model

12. Классифицируйте изображения

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

В каталоге models находится файл записной книжки (.ipynb), который мы можем использовать для вывода с помощью нескольких настроек. Он расположен по адресу models/research/object_detection/object_detection_tutorial.ipynb. Выполните следующие действия, чтобы настроить ноутбук:

  1. MODEL_NAME = 'ssd_mobilenet_v2_coco_2018_03_29'
  2. PATH_TO_CKPT = 'path/to/your/frozen_inference_graph.pb'
  3. PATH_TO_LABELS = 'models/annotations/label_map.pbtxt'
  4. NUM_CLASSES = 1
  5. Полностью закомментируйте ячейку 5 (чуть ниже Download Model)
  6. Поскольку мы тестируем только одно изображение, закомментируйте PATH_TO_TEST_IMAGES_DIR и TEST_IMAGE_PATHS в ячейке № 9 (чуть ниже Detection).
  7. В ячейке № 11 (последняя ячейка) удалите цикл for, удалите его содержимое и добавьте путь к тесту:

imagepath = 'path/to/image_you_want_to_test.jpg

Выполнив указанные действия, запустите блокнот, и вы должны увидеть корги на тестовом изображении, выделенные ограничивающей рамкой!

Вот и ваш индивидуальный детектор корги! В следующем уроке я расскажу вам, как настроить обнаружение объектов в реальном времени на вашей веб-камере. Будьте на связи!

Подробнее

Документация по модели обнаружения объектов Tensorflow