www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Игра с обнаружением объекта

Дата публикации Oct 11, 2019

Пару месяцев назад гуглобъявленный5-й выпуск набора открытых изображений (OID) вместе с некоторыми предварительно обученными моделями для задачи обнаружения объектов. Давайте поиграем с одной из этих моделей и проверим, как она работает.

фотоКоманда Icons8наUnsplash

Введение

Примерно, последняя версияOIDсостоит из 15M аннотированных ограничительных рамок по 601 категориям, 2,5M экземпляров сегментов по 350 категориям, 36M меток на уровне изображений в 20k категориях и 391k аннотаций отношений из 329 отношений. Это довольно большой объем данных, который, безусловно, предоставляет множество возможностей для исследования компьютерного зрения.

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

Изображение из Open Images Dataset V5

Как уже упоминалось, некоторые модели, предварительно обученные OID, были выпущены. Последние были обучены наверсия 4из набора данных, и я буду играть с лучшим (с точки зрениякарта) - и медленнее (с точки зрения скорости) - в этом посте. Эти модели и многие другие можно найти в зоопарке модели обнаружения Tensorflow.хранилище,

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


Код

Я буду следить за своей записной книжкой Jupyter, чтобы упростить показ вещей. Не стесняйтесь либо просто запустить его, либо реализовать код самостоятельно. Имейте в виду, что некоторые фрагменты кода используют функции, реализованные в предыдущих фрагментах, поэтому порядок появления имеет значение.

Все упомянутые файлы в этом посте доступны в моем GitHub. Проверьтеэто реповне!

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

Предполагая, что вы знакомы санакондаЯ подготовилYMLфайл, так что вы можете быстро настроить среду, как у меня, даже ту же версию библиотеки. Вот содержимое файла.

name: object-detection-oidv4
channels:
- conda-forge
- anaconda
dependencies:
- python=3.6.9
- numpy=1.16.5
- tensorflow=1.13.1
- matplotlib=3.1.1
- pillow=6.1.0
- pandas=0.25.1
- jupyter=1.0.0
- ipython=7.8.0

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

$ conda env create -f environment.yml

Активируйте среду после завершения установки.

$ conda activate object-detection-oidv4

Все готово! Давайте погрузимся в некоторый код Python.

Проверка версии TensorFlow

Из-за недавнеговыпускTensorflow 2.0, давайте удостоверимся, что вы используете ту же версию, на которой был построен этот код - все в порядке, еслиImportErrorне поднят. Вам не нужно беспокоиться об этом, если вы создали среду, используя мой файл.

Проверка версии TensorFlow

Конфигурирование прорисовки

НастройкаMatplotlibдля отображения изображений, если вы используетеблокнот Jupyter, В противном случае, просто сделайте импорт.

Конфигурирование прорисовки

Импорт некоторых общих библиотек

Нам понадобятся некоторые библиотеки для работы с файлами, так что вот импорт. Я также импортируюNumPyтак как мы будем использовать его по всей записной книжке.

Импорт некоторых общих библиотек

Получение файла модели

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

faster_rcnn_inception_resnet_v2_atrous_oidv4

Если вы хотите проверить конфигурацию модели,вот файл,

Теперь давайте загрузим сжатый файл модели, если он еще не существует. Вы можете играть с другими моделями, если они совместимы с OID; в противном случае это потребует дополнительных изменений кода.

Получение файла модели

Получение файла описания коробки

Нам также нужен файл описания коробки. Как вы увидите, код вывода вернет несколько чисел, соответствующих классам (от 1 до 601). Таким образом, нам нужен этот файл описания для сопоставления полученного числа с понятным человеку именем класса. Подобно файлу модели, он не будет загружен, если файл существует. Обратите внимание, что каждый класс рассматривается как объект, например, животные и люди. Поэтому, пожалуйста, не обижайтесь, если я называю человека объектом. :-)

Получение файла описания коробки

Если вам интересны 601 классы, доступные в OID для обнаружения объектов, проверьте этохорошая дендрограмма,

Получение тестовых изображений

Я подготовил блокнот для тех, кто хочет просто запустить его и посмотреть результаты, и, возможно, выполнить некоторые настройки. Фактически, это было основано на некотором коде из моделей Tensorflowхранилище, но я изменил его по-своему, чтобы сделать его понятным для всех. Таким образом, продолжая упростить вам задачу, следующий код загрузит несколько тестовых изображений. Не стесняйтесь изменять URL-адреса, чтобы вы могли проверить с другими изображениями

Получение тестовых изображений

Извлечение файлов модели

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

Извлечение файлов модели

Загрузка описания коробок в словарь

Давайте создадим словарь для сопоставления классов, где ключ - это просто индекс, а значение - это другой словарь, который содержит идентификатор и имя класса в качестве ключа и значения соответственно.

Загрузка описания коробок в словарь

Проверка некоторых ярлыков

Вот как отображаются классы, однако мы не будем использовать идентификатор. Вместо этого мы будем использовать индекс, чтобы упростить его. Просто для примера, если мы получим класс # 100, то он соответствуетСыр,

Проверка некоторых ярлыков

Загрузка замороженной модели из файла

Теперь нам нужно создать наш график из файла замороженной модели.

Загрузка замороженной модели из файла

Проверка оригинальных тестовых изображений

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

Проверка оригинальных тестовых изображений

Интересуетесь фотографиями, которые я выбрал? Вот они:

Тестовые изображения взяты из Flicker

Собаки и кошки. Классика я бы сказал.

Определение некоторого вспомогательного кода

Нам понадобится еще немного вспомогательного кода. Вот как я их реализовал - я добавил несколько комментариев, чтобы им было легче следовать.

Константы шрифта и цвета
Класс ObjectResult
Преобразует изображение PIL в массив Numpy (высота х ширина х каналов)
Обрабатывает классы, оценки и ящики, собирая их в список ObjectResult
Рисует помеченные прямоугольники в соответствии с результатами на данном изображении
Вычисляет подходящий шрифт для изображения с учетом текста и дроби
Рисует рамку и метку на заданном изображении.

Выполнение вывода

Все готово! Давайте проведем вывод для всех тестовых изображений.

Выполнение вывода

Отображение результатов

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

Отображение результатов

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

Обнаруженные объекты: кошка
Обнаруженные объекты: собака
Обнаруженные объекты: кошка и собака

Более сложные результаты

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

Фотографии взяты из Unsplash

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

Обнаруженные объекты: джинсы, одежда, солнцезащитные очки, дерево, человеческое лицо, женщина и платье

улица: В основном, автомобили были обнаружены в этом. Я надеялся получитьЗданиеи возможноДорожный знак, Возможно, прогрессирующий размытый фон усложнил задачу, но эти дорожные знаки слева, несомненно, могли быть обнаружены с некоторой разумной достоверностью.

Обнаруженные объекты: автомобиль, колесо и такси

ШляпыЯ не ожидал многого от этого изображения из-за условий освещения. Однако два из трех видимых фетров были обнаружены. Другие возможные вещи, которые могли быть обнаруженыШапкаа такжеШляпа солнцано давайте немного расслабимся.

Обнаруженные объекты: федора и ковбойская шляпа

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

Обнаруженные объекты: окно, дерево, скамейка и дом

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

Обнаруженные объекты: грейпфрут, сок, апельсин, банан и ананас

Заключительные замечания

В этом посте я показал, как играть с обнаружением объектов с помощью Tensorflow. Из множества подходов и множества предварительно обученных моделей я выбрал конкретную, обученную на наборе данных Open Images, огромном маркированном наборе данных изображений. Хотя мы видели довольно хорошие результаты, я позволю вам рассказать о модели:

  1. Он слишком медленно запускается на процессоре, если приложение требует обработки в реальном времени. Пожалуйста, дайте мне знать результаты, если вы попробуете это на GPU.
  2. Вы ограничены классами, которые предоставляет модель. Включение нового класса потребовало бы сбора помеченных изображений и переподготовки модели. И, мой друг, переобучение этой модели по OID заняло бы огромное количество времени.
  3. Вам нужно будет оценить производительность каждого интересующего вас объекта, если вы хотите использовать эту модель в своем приложении. Некоторые классы определенно лучше, чем другие. Кроме того, порог оценки играет важную роль при определении того, что обнаружено или нет. Наконец, вам также необходимо рассмотреть возможность игнорирования некоторых классов, поскольку, вероятно, не все из них будут иметь отношение к вашему приложению.

И это все на сегодня. Спасибо за чтение! 🙂

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map