Можно ли реализовать модели обнаружения объектов с производительностью в реальном времени без графического процессора? faced - это доказательство концепции того, что можно построить настраиваемую модель обнаружения объектов для объекта одного класса (в данном случае лиц), работающего в реальном времени на ЦП. .

В чем проблема?

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

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

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

Существует множество обученных архитектур обнаружения объектов (например, FasterRCNN, SSD или YOLO), которые обеспечивают впечатляющую точность при работе в реальном времени, работающей на графических процессорах.

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

Тогда как мы можем вернуться к проблеме обнаружения объектов для объектов одного класса, чтобы добиться производительности в реальном времени, но на ЦП?

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

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

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

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

Тогда возникает вопрос: насколько малы мы можем достичь производительности ЦП в реальном времени, но сохраняя точность?

Это faced основная концепция: построение минимально возможной сети, которая (надеюсь) будет работать в режиме реального времени на CPU, сохраняя при этом точность.

Архитектура

faced представляет собой ансамбль из 2-х нейронных сетей, каждая из которых реализована с помощью Tensorflow.

Основная сеть

faced основная архитектура в значительной степени основана на архитектуре YOLO. По сути, это полностью сверточная сеть (FCN), которая запускает входное изображение 288x288 через серию сверточных и объединяющих слоев (никакие другие типы слоев не используются).

Сверточные слои отвечают за извлечение пространственных объектов. Объединение слоев увеличивает восприимчивое поле последующих сверточных слоев.

Результатом архитектуры является сетка 9x9 (по сравнению с сеткой 13x13 в YOLO). Каждая ячейка сетки отвечает за прогнозирование того, находится ли лицо внутри этой ячейки (по сравнению с YOLO, где каждая ячейка может обнаруживать до 5 различных объектов).

Каждая ячейка сетки имеет 5 связанных значений. Первый - это вероятность p той ячейки, в которой находится центр лица. Остальные 4 значения - это (x_center, y_center, width, height) обнаруженного лица (относительно ячейки).

Точная архитектура определяется следующим образом:

  • 2x [сверточный слой с 8 фильтрами на изображении 288x288]
  • Максимальное объединение (карта функций от 288x288 до 144x144)
  • 2x [сверточный слой с 16 фильтрами на карте объектов 144x144]
  • Максимальное объединение (карта функций от 144x144 до 72x72)
  • 2x [сверточный слой с 32 фильтрами на карте объектов 72x72]
  • Максимальное объединение (функциональная карта от 72 x 72 до 36 x 36)
  • 2x [сверточный слой с фильтром 64 на карте объектов 36x36]
  • Максимальное объединение (карта функций от 36x36 до 18x18)
  • 2x [128 фильтрующий сверточный слой на карте объектов 18x18]
  • Максимальное объединение (карта функций от 18x18 до 9x9)
  • 4x [192 фильтрующий сверточный слой на карте объектов 9x9]
  • 5 фильтруйте сверточный слой на карте характеристик 9x9 для окончательной сетки

Все функции активации leaky_relu.

faced has 6,993,517 параметров. YOLOv2 имеет 51 000 657 параметров. Его размер составляет 13% от размера YOLO!

Вспомогательная сеть

(x_center, y_center, width, height) выходы основной сети не были такими точными, как ожидалось. Следовательно, была реализована небольшая сеть CNN, чтобы принимать в качестве входных данных небольшое изображение, содержащее лицо (обрезанное с выходными данными основной архитектуры), и выводить регрессию на основе ограничивающего прямоугольника истинности лица.

Единственная задача - дополнить и улучшить выходные координаты основной архитектуры.

Конкретная архитектура этой сети не имеет значения.

Набор данных

Обе сети были обучены на наборе данных WIDER FACE.

«Набор данных WIDER FACE - это эталонный набор данных для обнаружения лиц […]. Мы выбираем 32 203 изображения и помечаем 393 703 лиц с высокой степенью вариативности по масштабу, позе и окклюзии, как показано на примерах изображений ».

Обучение

Обучение проводилось на графическом процессоре Nvidia Titan XP. Время обучения заняло ~ 20 часов. Техника пакетной нормализации использовалась, чтобы помочь сходимости, а выпадение использовалось (со скоростью 40%) в качестве метода регуляризации, чтобы избежать переобучения.

Вывод и подавление не макс.

При использовании faced для вывода сначала размер изображения изменяется до 288x288, чтобы его можно было передать в сеть. Изображение идет под FCN, что дает выходную сетку 9x9, описанную выше.

Каждая ячейка имеет вероятность p содержать изображение. Ячейки фильтруются по настраиваемому порогу (т. Е. Сохраняются только ячейки с p ›t). Для этих сохраненных ячеек лицо располагается с использованием значений ячейки (x_center, y_center, width, height).

Бывают случаи, когда несколько ячеек могут соревноваться за одно и то же лицо. Предположим, что центр лица находится именно в том месте, где пересекаются 4 ячейки. Эти 4 ячейки могут иметь высокое значение p (вероятность наличия центра лица внутри ячейки). Если мы сохраним все ячейки и спроецируем координаты лица каждой ячейки, то мы увидим одно и то же лицо с 4 похожими ограничивающими рамками вокруг него. Эта проблема решается с помощью техники, называемой подавление не до максимума. Результат показан на следующем изображении:

Представление

faced может достичь следующей скорости вывода:

Довольно неплохо, учитывая, что YOLOv2 не может достичь даже 1 FPS на i5 2015 MBP.

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

Посмотрим на результаты!

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

Как пользоваться столкнулся?

faced - действительно простая программа, которую можно использовать как встроенную в код Python, так и программу командной строки.

Для получения дальнейших инструкций перейдите в репозиторий github:



Понравился проект? Оставьте репо проекта!

Заключение

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