Рубрики
Без рубрики

Как играть в Quidditch, используя API обнаружения объекта Tensorflow

Автор оригинала: FreeCodeCapm Team.

Bharath Raj.

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

Классификация изображений с использованием сверточных нейронных сетей (CNNS) сегодня довольно проста, особенно с появлением мощных внешних обертков, таких как KERAS, с тензонофон. Но что, если вы хотите определить более одного объекта на изображении?

Эта проблема называется «локализация объекта и обнаружение». Это намного сложнее, чем простая классификация. Фактически, до 2015 года локализация изображения с использованием CNNS была очень медленной и неэффективной. Проверьте это Блог пост DHRUV, чтобы прочитать об истории обнаружения объекта в глубоком обучении, если вы заинтересованы.

Звучит круто. Но это трудно код?

Беспокойство нет, API обнаружения объекта Tensorflow приходит к спасению! Они сделали большую часть тяжелой подъема для вас. Все, что вам нужно сделать, это подготовить набор данных и установить некоторые конфигурации. Вы можете тренировать вашу модель и использовать тогда для вывода.

Tensorflow также предоставляет предварительно обученные модели, обученные на DS Coco, Kitti или наборах открытых изображений. Вы можете использовать их как таковые, если вы просто хотите использовать его для стандартного обнаружения объекта. Недостаток в том, что они заранее определены. Он может предсказать только классы, определенные наборами набора данных.

Но, что, если вы хотите обнаружить что-то, что это не На возможный список классов? Это цель этого блога. Я проведу вас через создание собственной программы обнаружения пользовательских объектов, используя забавный пример Quidditch от Вселенной Гарри Поттера! (Для всех вас фанатов «Звездных войн», вот Подобное блог POS T, что вы можете понравиться).

Начиная

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

Кроме того, вы можете клонировать Tensorflow Модели репо Отказ Если вы выберете последнее, вам нужны только папки с именем «Slim» и «Object_Detection», поэтому не стесняйтесь удалять остальные. Не переименовывайте что-нибудь внутри этих папок (если вы не уверены, что это не будет беспорядок с кодом).

Зависимости

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

pip install -r requirements.txt

API использует Protobufs для настройки параметров модели и обучения. Нам нужно компилировать библиотеки Protobuf перед ними. Во-первых, вы должны установить компилятор Protobuf, используя команду ниже:

sudo apt-get install protobuf-compiler

Теперь вы можете компилировать библиотеки Protobuf, используя следующую команду:

protoc object_detection/protos/*.proto --python_out=.

Вам нужно добавить путь вашего базового каталога, а также ваш Direm Director для вашей переменной пути Python. Обратите внимание, что вы должны выполнить этот шаг каждый раз, когда вы открываете новый терминал. Вы можете сделать это, выполняя команду ниже. Кроме того, вы можете добавить его в свой ~/.bashrc Файл для автоматизации процесса.

export PYTHONPATH=$PYTHONPATH:`pwd`:`pwd`/slim

Подготовка входов

Мой мотива был довольно простым. Я хотел построить искатель Quidditch, используя Tensorflow. В частности, я хотел написать программу, чтобы найти на каждом кадре.

Но тогда я решил по доли. Как насчет попытки определить все движущиеся кусочки оборудования, используемого в QuidDitch?

Начнем с готовности label_map.pbtxt файл. Это будет содержать все целевые названия меток, а также идентификационный номер для каждой этикетки. Обратите внимание, что идентификатор метки должен начать с 1. Вот содержимое файла, которое я использовал для моего проекта.

item { id: 1 name: 'snitch'}
item { id: 2 name: 'quaffle'}
item { id: 3 name: 'bludger'}

Теперь, пришло время собирать набор данных.

Веселье! Или скучно, в зависимости от вашего вкуса, но это обыденное задание все равно.

Я собрал набор данных, отбирая все кадры из видео зажима Harry Potter, используя небольшой фрагмент кода, который я писал, используя Framework OpenCV. Как только это было сделано, я использовал другой фрагмент кода для случайного образца 300 изображений из набора данных. Кодовые фрагменты доступны в Utils.py В моем Github репо Если вы хотели бы сделать то же самое.

Вы слышали меня правильно. Только 300 изображений. Да, мой набор данных не был огромным. Это в основном потому, что я не могу позволить себе аннотировать много изображений. Если вы хотите, вы можете выбрать платные услуги, такие как Amazon Mechanical Turk, чтобы аннотировать ваши изображения.

Аннотации

Каждая задача локализации изображения требует аннотаций наземной истины. Используемые здесь аннотации – это файлы XML с 4 координатами, представляющими местоположение ограничения, окружающего объект, и его метку. Мы используем формат PASCAL POC. Аннотация образца будет выглядеть так:

  182.jpg      1280    586    3    0      bludger          581      106      618      142            quaffle          127      406      239      526      

Вы можете думать: «Мне действительно нужно пройти боль вручную вручную в аннотациях в файлах XML?» Точно нет! Есть инструменты, которые позволяют использовать графический интерфейс для рисования коробок над объектами и аннотировать их. Веселье! LARFEIMG Это отличный инструмент для пользователей Linux/Windows. В качестве альтернативы, Rectlabel это хороший выбор для пользователей Mac.

Несколько сносок, прежде чем начать собирать ваш набор данных:

  • Не переименовывайте вас файлы изображений после того, как вы адаптируете их. Код пытается посмотреть изображение, используя имя файла, указанному внутри вашего файла XML (который LABLEIMG автоматически заполняет имя файла изображения). Кроме того, убедитесь, что ваш изображение и XML Файлы имеют Одно название Отказ
  • Убедитесь, что вы изменить размер Изображения до нужного размера до Вы начинаете аннотировать их. Если вы сделаете это позже, аннотации не имеют смысла, и вам придется масштабировать значения аннотации внутри XML.
  • LABLEIMG может выводить некоторые дополнительные элементы в файл XML (например, , <усеченные>, ). Вам не нужно удалять тех, кто не будет вмешиваться в код.

В случае, если вы испортили что-нибудь, Utils.py Файл имеет некоторые полезные функции, которые могут помочь вам. Если вы просто хотите бросить выстрел Quidditch, вы могли бы загрузить свой аннотированный набор данных. Оба доступны в моем github Репозиторий Отказ

Наконец, создайте текстовый файл с именем Работа Отказ Он должен содержать имена всех ваших файлов изображений/XML. Например, если у вас есть IMG1.jpg, img2.jpg и img1.xml, img2.xml в вашем наборе данных, вы должны выглядеть файл underval.txt:

img1img2

Отделите ваш набор данных на две папки, а именно Изображения и Аннотации Отказ Поместите label_map.pbtxt и rainval.txt Внутри ваших аннотаций папки. Создать папку с именем XMLS Внутри папки аннотаций и поместите все ваши XML внутри этого. В вашей каталоге иерархии должны выглядеть что-то подобное:

-base_directory|-images|-annotations||-xmls||-label_map.pbtxt||-trainval.txt

API принимает входы в Tfrecords формат файла. Не беспокойтесь, вы можете легко преобразовать ваш текущий набор данных в требуемый формат с помощью небольшой функции утилиты. Используйте create_tf_record.py Файл предоставлен в моем репо, чтобы преобразовать ваш набор данных в Tfrecords. Вы должны выполнить следующую команду в базовом каталоге:

python create_tf_record.py \    --data_dir=`pwd` \    --output_dir=`pwd`

Вы найдете два файла, rain.record и val.record После того, как программа заканчивает свое исполнение. Стандартный раздел набора данных составляет 70% для обучения и 30% для проверки. Вы можете изменить расколую фракцию в основной () функции файла, если это необходимо.

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

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

Короче говоря, SSDS быстро, но может не обнаружить меньшие объекты с достойной точностью, тогда как быстрее RCNNS относительно медленнее и больше, но имеют лучшую точность.

API обнаружения объекта Tensorflow предоставил нам кучу Предварительно обученные модели Отказ Настоятельно рекомендуется инициализировать обучение с использованием предварительно обученной модели. Это может сильно уменьшить время обучения.

Загрузите одну из этих моделей и извлеките содержимое в свой базовый каталог. Поскольку я был более сосредоточен на точности, но также хотел разумное время выполнения, я выбрал версию Resnet-50 более быстрой модели RCNN. После извлечения вы получите модель контрольно-пропускных пунктов, на замороженном диаграмме и файл PIPORION.config.

Одна последняя вещь остается! Вы должны определить «учебную работу» в Pipure.Config файл. Поместите файл в базовом каталоге. То, что действительно имеет значение, – это последние несколько строк файла – вам нужно только установить выделенные значения в соответствии с соответствующими местами файлов.

gradient_clipping_by_norm: 10.0  fine_tune_checkpoint: "model.ckpt"  from_detection_checkpoint: true  num_steps: 200000}train_input_reader {  label_map_path: "annotations/label_map.pbtxt"  tf_record_input_reader {    input_path: "train.record"  }}eval_config {  num_examples: 8000  max_evals: 10  use_moving_averages: false}eval_input_reader {  label_map_path: "annotations/label_map.pbtxt"  shuffle: false  num_epochs: 1  num_readers: 1  tf_record_input_reader {    input_path: "val.record"  }}

Если у вас есть опыт установления лучших гиперперечисленных параметров для вашей модели, вы можете сделать это. Создатели дали некоторые довольно краткие рекомендации здесь Отказ

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

python object_detection/train.py \--logtostderr \--pipeline_config_path=pipeline.config \--train_dir=train

Мой ноутбук GPU не мог справиться с размером модели (NVIDIA 950M, 2GB), поэтому я должен был запустить его на CPU вместо этого. Это заняло около 7-13 секунд на шаг на моем устройстве. После примерно 10 000 мучительных шагов модель достигла довольно хорошей точности. Я перестал тренироваться после того, как он достиг 20 000 шагов, исключительно потому, что он уже взял два дня.

Вы можете возобновить тренировку с контрольно-пропускного пункта, изменив атрибут «Fine_Tune_Checkpoint» от Model.Ckpt в Model.CKPT-XXXX, где XXXX представляет собой глобальный шаг номер сохраненного контрольной точки.

Экспорт модели для вывода

Какой смысл обучения модели, если вы не можете использовать его для обнаружения объекта? API на спасение снова! Но есть поймать. Их модуль вывода требует модель замороженного графа в качестве ввода. Не беспокойтесь, хотя: используя следующую команду, вы можете экспортировать обученную модель в модель замороженной графики.

python object_detection/export_inference_graph.py \--input_type=image_tensor \--pipeline_config_path=pipeline.config \--trained_checkpoint_prefix=train/model.ckpt-xxxxx \--output_directory=output

Аккуратный! Вы получите файл с именем frozen_inference_graph.pb вместе с кучей файлов контрольно-пропускных пунктов.

Вы можете найти файл с именем overference.py В моем Github Repo Отказ Вы можете использовать его для проверки или запустить модуль обнаружения объекта. Кодекс довольно объяснительный, и аналогичен демонстрационной демонстрации объекта, представленного создателями. Вы можете выполнить его, набрав в следующей команде:

python object_detection/inference.py \--input_dir={PATH} \--output_dir={PATH} \--label_map={PATH} \--frozen_graph={PATH} \--num_output_classes={NUM}

Заменить выделенные персонажи {Путь} с именем файла или путь соответствующего файла/каталога. Заменить {Num} С числом, которые вы определили для вашей модели для обнаружения (в моем случае, 3).

Полученные результаты

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

Довольно впечатляющий, я бы сказал! У него есть проблема с отличительными головками от объектов Quidditch. Но учитывая размер нашего набора данных, производительность довольно хорошая.

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

Спасибо за прочтение этой статьи! Нажмите эту кнопку Clap, если вы сделали! Надеюсь, это помогло вам создать собственную программу обнаружения объектов. Если у вас есть какие-либо вопросы, вы можете ударить меня на LinkedIn Или отправьте мне электронное письмо (bharathrajn98@gmail.com).