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

Мужчина бежит к вам с ножом. Что вы делаете? Что ж, у большинства людей в голове будет только одна мысль: БЕГАТЬ. Ну, а зачем тебе бежать? Потому что, наблюдая за агрессивной позой этого мужчины, можно сделать вывод, что он хочет причинить вам вред. А поскольку вы хотите дожить до завтрашнего дня, вы решаете бежать как можно быстрее.

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

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

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

Шаг назад

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

Сверточные нейронные сети (CNN)

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

Ресурсы для дальнейшего изучения: Видео, Курс, Статья.

Остаточные сети (ResNets)

  • Значение: позволяет использовать более глубокие сети за счет замедления сходимости градиента сети при обратном распространении.

Ресурсы для дальнейшего изучения: Статья, Статья, Статья, Статья.

Полностью сверточные сети (FCN)

  • Значение: заменяет плотные слои свертками 1x1, позволяя сети принимать входные данные с различными размерами.

Ресурсы для дальнейшего изучения: Статья, Видео.

Сети кодировщика-декодера

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

Мы поговорим о кодировщиках-декодерах больше, так как это в основном и есть сети песочных часов, но если вам нужны другие интересные ресурсы, вот некоторые: видео, поток темы, статья, GitHub.

Сеть на высоком уровне

Итак, надеюсь, вам было интересно узнать обо всех этих сетевых архитектурах, но теперь пришло время объединить их все.

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

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

  • ПРИМЕЧАНИЕ. Матрица признаков имеет низкое пространственное понимание, что означает, что я на самом деле не знает, где находятся объекты на изображении. Это связано с тем, что для того, чтобы извлечь характеристики объекта, мы должны отбросить все пиксели, не являющиеся характеристиками объекта. Это означает отбрасывание всех пикселей фона и, таким образом, удаляет все сведения о местоположении объекта на изображении.
  • Комбинируя матрицу признаков с ранними слоями в сети, которые имеют более высокое пространственное понимание, это позволяет нам многое понять о вводе (что это такое + где он находится на изображении).

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

Узкие места - это новый тип остатков. Вместо 2 сверток 3x3 у нас есть свертка 1 1 x 1, свертка 1 3 x 3 и свертка 1 1 x 1. Это значительно упрощает вычисления на компьютере (свертки 3x3 намного сложнее выполнять в масштабе, чем свертки 1X1), что означает, что мы можем сэкономить много памяти.

Таким образом,

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

Пошаговое понимание процесса

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

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

  • Сверточные слои: извлекайте элементы из изображения.
  • Слои MaxPooling. Удалите части изображения, которые не нужны для извлечения элементов.
  • Остаточные слои: продвигайте слои глубже в сеть.
  • Слои узких мест. Освободите память, включив менее интенсивные свертки.
  • Слои с повышением частоты дискретизации: увеличьте размер ввода (в нашем случае, используя метод ближайшего соседа - посмотрите видео, чтобы узнать больше)

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

Итак, здесь мы можем увидеть несколько вещей:

  • Есть 2 раздела: кодирование и декодирование.
  • В каждой секции по 4 кубика.
  • Кубики слева переходят в правую сторону, чтобы сформировать кубики справа.

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

Итак, на схеме всей сети каждый куб является узким местом (как показано выше). После каждого слоя объединения мы добавляем один из этих слоев узких мест.

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

Так выглядит первый куб. Прежде всего, входные данные передаются в свертку 7X7 в сочетании со слоем BatchNormalization и ReLu. Затем он передается в слой узкого места, и слой дублируется: один проходит через MaxPool и выполняет извлечение признаков, а другой только позже присоединяется к сети в части повышения дискретизации (декодирования).

Следующие кубы (кубы 2, 3 и 4) имеют похожую структуру друг на друга, но отличаются от структуры куба 1. Вот как выглядят другие кубы (в разделе кодирования):

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

Мы собираемся повторить этот процесс 3 раза (в кубах 2, 3 и 4), а затем создадим карты характеристик.

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

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

Чтобы добраться до этого, он прошел через все 4 куба кодирования и 3 слоя узких мест внизу. Теперь мы готовы повышать дискретизацию. Вот как выглядят слои с повышающей дискретизацией:

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

Мы собираемся повторить этот процесс 4 раза, а затем передать последний слой (4-й куб в части декодирования) в последний раздел, где мы определяем точность каждого прогноза.

  • ПРИМЕЧАНИЕ. Это называется немедленный контроль. Это когда вы вычисляете потери в конце каждого этапа, а не в конце всей сети. В нашем случае мы вычисляем потери в конце каждой сети песочных часов, а не в конце объединения всех сетей (поскольку для оценки позы человека мы используем несколько сетей песочных часов, сложенных вместе).

Вот как будет выглядеть последний слой:

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

А затем повторите!

Ага, вот и все. Вы просто прошли через всю сеть песочных часов. На практике мы собираемся использовать многие из этих сетей вместе, поэтому название было «и повторить». Надеюсь, эта, казалось бы, устрашающая тема теперь стала удобоваримой. В моей следующей статье мы будем кодировать сеть.

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

В целом, я надеюсь, что вам понравилось читать эту статью, и если у вас возникнут проблемы с пониманием этой концепции, не стесняйтесь обращаться ко мне по электронной почте, в LinkedIn или даже в Instagram (insta: @nushaine), и я сделаю все возможное, чтобы помочь вам понять. В остальном, удачного дня и удачного кодирования :)

Ресурсы

Действительно классные статьи

Замечательные репозитории на GitHub