Обучите детектор рук с помощью API обнаружения объектов Tensorflow 2 в 2021 году

Мы используем Google Colab, чтобы обучить наш детектор пользовательских объектов на наборе данных эгоцентрических изображений рук.

Я хотел создать приложение для компьютерного зрения, которое могло бы обнаруживать мои руки в реальном времени. В Интернете было так много статей, в которых использовались API обнаружения объектов Tensorflow и Google Colab, но я все еще изо всех сил пытался заставить все работать. Причина? Версии библиотек и изменение кода!

Вот пример использования этого детектора в виртуальном терменвоксе:

В этой статье вы узнаете, что работает прямо сейчас (март 2021 г.).
Я предполагаю, что вы знаете базовые навыки Python и достаточно ноу-хау, чтобы найти то, чего вы не знаете из других руководств! 😂

Что мы будем использовать:

Шаги:
1. Настройте среду
2. Загрузите и установите Tensorflow 2 Object Detection API
3. Загрузите набор данных, сгенерируйте tf_records
4. Загрузите модель и отредактируйте конфигурацию
5. Обучите модель и экспортируйте в сохраненный формат модели

Благодарности:
Большое спасибо пользователям github molyswu, datitran и gilberttanner, у которых я взял код и немного изменил его. Пожалуйста, ознакомьтесь также с их учебными пособиями.

1. Настройте среду

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

from google.colab import drive
drive.mount('/content/drive')
%cd /content/drive/MyDrive

Теперь мы находимся на вашем Google Диске. (Возможно, вам придется изменить этот последний% cd, если ваш диск монтируется на немного другой путь).

Google Colab будет использовать Tensorflow 2, но на всякий случай сделайте это явно:

%tensorflow_version 2.x

2. Загрузите и установите Tensorflow 2 Object Detection API.

Прежде всего, необходимо загрузить и установить Tensorflow 2 Object Detection API. Самый простой способ - сначала зайти в корневой каталог, а затем клонировать его из git:

%cd /content/drive/MyDrive
!git clone https://github.com/tensorflow/models.git

Затем скомпилируйте протоколы - кстати, вывода нет.
(protoc должен работать как есть, потому что в Google Colab он уже установлен):

%cd /content/drive/MyDrive/models/research
!protoc object_detection/protos/*.proto --python_out=.

Теперь установите актуальный API:

!cp object_detection/packages/tf2/setup.py . 
!python -m pip install .

Протестируйте установку API 2 для обнаружения объектов tensorflow! Все должно быть «ОК». (это нормально, если некоторые тесты автоматически пропускаются).

#TEST IF YOU WANT
!python object_detection/builders/model_builder_tf2_test.py

3. Загрузите набор данных, сгенерируйте аннотации в виде файлов .csv и тензорного потока tf_records.

Я опишу здесь на высшем уровне, что вам нужно сделать, так как эта часть практически не изменилась по сравнению с другими руководствами. Таким образом, мы собираемся загрузить набор данных Egohands, но использовать только подмножество множества изображений, так как мы выполняем переносное обучение.
Мы разделим их на каталог поездов и тестовый каталог и сгенерируйте XML-файлы для каждого из них (содержащие аннотации ограничивающего прямоугольника для каждого изображения).

Я создал общий сценарий, который:

  • Скачивает весь набор данных Egohands и извлекает его
  • Хранит только небольшое количество (4) папок на нем
  • Разделяет изображения на поезд и тестовый набор
  • Создает CSV-файлы аннотаций с координатами ограничивающей рамки.

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

%cd /content/drive/MyDrive
!git clone https://github.com/aalpatya/detect_hands.git

Из моего загруженного репо скопируйте файл egohands_dataset_to_csv.py в корневую папку и запустите его. Это сделает все за вас - по умолчанию он возьмет только 4 случайные папки (то есть 400 изображений) из фактического набора данных Egohands, разделит их на поезд и тестовый набор и сгенерирует файлы .csv.

!cp detect_hands/egohands_dataset_to_csv.py .
!python egohands_dataset_to_csv.py

Большое спасибо https://github.com/molyswu/hand_detection, от которого я получил оригинальный скрипт. Я просто немного привел его в порядок и сделал несколько настроек. 😁

Создать tf_records

Только что созданные файлы test_labels.csv и train_labels.csv содержат местоположения ограничивающей рамки для каждого изображения, но удивительно, что Tensorflow нужна эта информация в другом формате, tf_record.

Мы создадим необходимые файлы train.record и test.record, используя generate_tfrecord.py из моего репозитория git (я изменил это из замечательное руководство по datitran на https://github.com/datitran/raccoon_dataset).

%cd /content/drive/MyDrive
!cp detect_hands/generate_tfrecord.py .
# For the train dataset
!python generate_tfrecord.py --csv_input=images/train/train_labels.csv  --output_path=train.record
# For the test dataset
!python generate_tfrecord.py --csv_input=images/test/test_labels.csv  --output_path=test.record

К настоящему времени у вас должен быть каталог, который выглядит так:

/content/drive/MyDrive (or whatever your root is called)
  |__ egohands
  |__ detect_hands
  |__ images
    |__ train
      |__ <lots of images>
      |__ train.csv
    |__ test
      |__ <lots of images>
      |__ test.csv
  |__ train.record
  |__ test.record

4. Скачивание модели для трансферного обучения.

Загрузите модель Tensorflow 2 по вашему выбору

Получите ссылку для загрузки нужной модели на https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/tf2_detection_zoo.md

Здесь я использую SSD Mobilenet V2 fpnlite 320x320. Я обнаружил, что некоторые модели не работают с tenorflow 2, поэтому используйте эту, если хотите быть уверенным.

%cd /content/drive/MyDrive
!wget http://download.tensorflow.org/models/object_detection/tf2/20200711/ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz
# Unzip
!tar -xzvf ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8.tar.gz

Изменить параметры тренировки

Сначала создайте файл с именем label_map.pbtxt, который содержит ваш класс рук. Должно получиться так:

item {
  id: 1
  name: 'hand'
}

Или вы можете просто записать путь к тому, который уже есть в моем репозитории git, который у вас уже должен быть: /content/drive/MyDrive/detect_hands/model_data/ssd_mobilenet_v2_fpn_320/label_map.pbtxt

Затем мы отредактируем pipeline.config , который прилагается к загруженной модели тензорного потока. Он будет внутри каталога модели модели, которую вы скачали из зоопарка моделей тензорного потока. Например: ssd_mobilenet_v2_fpnlite_320x320_coco17_tpu-8 / pipeline.config

Рядом с началом pipeline.config:

  • Измените количество классов на 1:

К середине / концу pipeline.config:

  • Задайте путь к контрольной точке модели. Нам нужна только начальная часть имени контрольной точки до числа. Например: «ckpt-0», а не «ckpt-0.index».
  • Установите тип контрольной точки как «обнаружение».
  • Вы также можете изменить размер партии. В целом, чем меньше размер партии, тем быстрее уменьшатся потери вашей модели, но потребуется больше времени, чтобы рассчитаться по значению убытков. Я выбрал размер пакета из 4, потому что просто хотел, чтобы обучение проходило быстрее, я не ищу здесь высочайшей точности. Поиграйте с этим числом и прочтите эту статью.

В конце pipeline.config:

  • Задайте путь к label_map.pbtxt (для этого есть два места: одно для тестирования, а другое для обучения)
  • Задайте путь к файлам train.record и test.record

МЫ НАКОНЕЦ ГОТОВЫ НАЧАТЬ ТРЕНИРОВКУ!

5. Обучите модель и экспортируйте ее в формат «сохраненной модели».

Загрузка Tensorboard

Сначала мы загрузим тензорную доску, чтобы после начала обучения мы могли визуализировать прогресс в красивых графиках.

Аргумент logdir - это путь к каталогу журнала, который будет создан в процессе обучения. В нашем случае это будет называться output_training, и журналы автоматически сохранятся в output_training / train.

%load_ext tensorboard
%tensorboard --logdir=/content/drive/MyDrive/output_training/train

Обучение модели

Теперь приступим к обучению, задав правильные пути к нашему файлу конфигурации конвейера, а также путь к каталогу output_training (который еще не создан).

%cd /content/drive/MyDrive/models/research/object_detection/
#train 
!python model_main_tf2.py \
--pipeline_config_path=/content/drive/MyDrive/detect_hands/model_data/ssd_mobilenet_v2_fpn_320/pipeline.config \
--model_dir=/content/drive/MyDrive/output_training --alsologtostderr

Это запустит процесс тренировки, а вы просто сядете и ждете. Либо вы ждете долго, пока процесс обучения завершится, либо просто отмените процесс через некоторое время (возможно, вы видите на графике потерь, что потери выравниваются). Это нормально, потому что в процессе обучения постоянно сохраняются контрольные точки модели.

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

Теперь мы экспортируем результаты обучения в формат savedmodel, чтобы мы могли использовать его для вывода.

%cd /content/drive/MyDrive/models/research/object_detection
!python exporter_main_v2.py \
--trained_checkpoint_dir=/content/drive/MyDrive/output_training \
--pipeline_config_path=/content/drive/MyDrive/detect_hands/model_data/ssd_mobilenet_v2_fpn_320/pipeline.config \
--output_directory /content/drive/MyDrive/inference

Важной частью всего этого является папка inference.
Это единственное, что нам действительно нужно, если мы хотим выполнить логический вывод.

ПОЗДРАВЛЯЕМ! Вы обучили детектор рук! 🎈🎉🎊

Загрузка модели для вывода

Модель может быть загружена с тензорным потоком 2 как

detect_fn = tf.saved_model.load(PATH_TO_SAVED_MODEL)

и оттуда вы можете использовать функцию detect_fn и продолжить вывод, но я оставлю это для другого урока 😉