Обучите детектор рук с помощью API обнаружения объектов Tensorflow 2 в 2021 году
Мы используем Google Colab, чтобы обучить наш детектор пользовательских объектов на наборе данных эгоцентрических изображений рук.
Я хотел создать приложение для компьютерного зрения, которое могло бы обнаруживать мои руки в реальном времени. В Интернете было так много статей, в которых использовались API обнаружения объектов Tensorflow и Google Colab, но я все еще изо всех сил пытался заставить все работать. Причина? Версии библиотек и изменение кода!
Вот пример использования этого детектора в виртуальном терменвоксе:
В этой статье вы узнаете, что работает прямо сейчас (март 2021 г.).
Я предполагаю, что вы знаете базовые навыки Python и достаточно ноу-хау, чтобы найти то, чего вы не знаете из других руководств! 😂
Что мы будем использовать:
- Google Colab
- API обнаружения объектов Tensorflow 2
- Набор данных Egohands: http://vision.soic.indiana.edu/projects/egohands/
Шаги:
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 и продолжить вывод, но я оставлю это для другого урока 😉