Вступление

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

Но я уверен, что вы прекрасно понимаете, что не так уж много вещей совпадают в теории и на практике. Недавно была опубликована статья (Luo, Wenjie, et al.), Которая показала, что рецептивные поля не растут линейно с количеством сверточных слоев, более того, они сильно ограничены. Кроме того, рецептивное поле зависит от различных других факторов, таких как схемы инициализации. Так какое же решение?

Графики приходят на помощь

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

Вообще говоря, все вершины графа будут представлять разные области изображения. Края будут представлять отношение или сходство между регионами.

Круг представляет регионы, которым соответствует вектор признаков, представляющий этот регион. Края - это сходства между регионами.

Семантическая сегментация

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

Как работает сегментация? Давайте возьмем очень простой пример, предположим, что есть изображение, которое состоит только из красного, синего и зеленого цветов, как показано на

Рис. 1 и предположим, что эти цвета представляют некоторые объекты. Теперь предположим, кто хочет сегментировать изображение на три объекта, представленные цветами. Какие векторы функций вам понадобятся для этого? Правильно для этого достаточно только цветов. Если мы говорим в терминах вектора признаков, то каждый вектор признаков имеет глубину 3; для красного [0,0,1], для синего [1,0,0], для зеленого [0, 1, 0]. Как видите, этих функций достаточно, чтобы разбить изображение на 3 области. Теперь рассмотрим реальное изображение, подобное изображенному на рис. Сможете ли вы выполнить задачу, используя только цвета? Без прав. Нам нужно функциональное представление каждого объекта, присутствующего в изображении, которое отделяет его от других объектов и приближает похожие объекты, именно здесь кодировщик входит в изображение. Он преобразует представление цветного изображения в некоторое представление скрытого пространства, в котором характеристики одного и того же объекта ближе, а характеристики отдельных объектов находятся далеко друг от друга. Очевидно, кодировщик нужно обучить. Как только у нас есть функции в некотором скрытом пространстве, которое разделяет отдельные объекты, нам нужно распространить информацию на уровень пикселей, и здесь в игру вступает декодер.

Давайте разберемся, как графы могут быть полезны в семантической сегментации. Графики вступают в игру после извлечения векторов признаков с помощью кодировщика. Рассмотрим изображения на рис. Изображения расположены в следующем порядке: фактическое изображение, базовая информация, сегментация с использованием FCN, сегментация с использованием GCU соответственно сверху вниз. На этом изображении вероятность подушки и класса кровати очень близка при использовании FCN. Следовательно, вы можете видеть на Рис. 2, что подушка и кровать объединены.

Теперь предположим, что графическое представление следует за кодировщиком. Представление вектора признаков изображения, которое получается из кодировщика, вынуждено делиться на целых 8 областей (т. Е. Граф из 8 вершин)], если я говорю с точки зрения потерь, потери выше, если вершина пуста, т. Е. Нет пикселей. назначенный на это. В этом случае на начальных этапах обучения подушка и кровать будут отнесены к одному классу. Но по мере дальнейшего обучения сети каждый вектор признаков присваивается вершине, т.е. ни одна вершина не бывает пустой. Вероятные области, в которых изображение будет сегментировано в графическом представлении, являются областями, лежащими в основе истины. Благодаря этому к концу тренировки подушка и кровать будут разделены на две разные области. Признаки, назначенные вершине, далее обрабатываются путем умножения на некоторые веса, и полученный вектор признаков вместе с вектором признаков из кодировщика в дальнейшем используются для сегментации. Таким образом, графическое представление еще больше улучшило представление характеристик изображения.

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

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

Единицы свертки графа (GCU)

Подобно тому, как свертка работает с сетчатыми структурами, GCU работает с графоподобной структурой. В GCU есть 3 основных шага

  1. Проекция графика. На этом этапе сеточное представление изображения преобразуется в графическое представление. График параметризуется следующими параметрами:
  • V: номер вершины в графе, который подразумевает количество областей, в которых изображение будет сегментировано.
  • W: векторы признаков, которые представляют регион. Форма - (d, V), где d - размерность векторов признаков.
  • Дисперсия: это дисперсия по каждому измерению по всем пикселям, назначенным определенной вершине. Форма - (d, V), где d - размер вектора признаков.

V является фиксированным, а W и дисперсия изучаются во время обучения. Предположим, что имеется двухмерная карта характеристик изображения с высотой H и шириной W, и каждый элемент имеет размер d. Вычисляется вероятность того, что каждый вектор признаков принадлежит каждой вершине, в результате чего получается матрица вероятностей Q. Приведенное ниже уравнение используется для вычисления вероятностей:

где xᵢⱼ - вектор признаков строки iᵗʰ и столбца jᵗʰ двумерной карты признаков, wₖ - признак, представляющий область kᵗʰ (вершину), а σₖ - дисперсия по всем измерениям вершины k. Теперь кодирование признаков для всех вершин вычисляется путем взятия среднего взвешенного значения остатков. Чем больше остаток, тем меньше его вклад в вычисление закодированного признака. Используются приведенные ниже уравнения:

где zₖ - закодированный объект. Матрица смежности вычисляется по ZᵀZ, что дает косинусное сходство между разными вершинами. Всего на этом этапе рассчитываются 3 вещи.

  • Матрица вероятностей Q, форма (HW, d)
  • Закодированный элемент Z, форма (d, V)
  • Матрица смежности A, форма (V, V) - представление сходства между регионами, таким образом, оно фиксирует дальнодействующие зависимости в изображении.

2. Свертка графа: этот шаг аналогичен прямому шагу свертки, то есть свертка выполняется на сгенерированном графе. Используется приведенное ниже уравнение:

где W g - весовая матрица формы (d, dₒᵤₜ). Как вы можете видеть, в уравнении есть матрица смежности A, дальнодействующие зависимости учитываются при вычислении новых закодированных функций. Таким образом, новые закодированные функции зависят от всех регионов (A) и текущих закодированных функций (Z). Чтобы прочитать о свертке графа, обратитесь к этой статье и этой. В этих статьях дается очень легко понять и достаточно информации.

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

Архитектура и реализация

Используемая архитектура предварительно обучена ResNet 50/101, расширения добавляются к последним двум слоям, таким образом, выходные данные субдискретизируются на 8. За ним следует GCU. В исходной реализации выходы 4 GCU объединены с выходом ResNet, как показано на схеме ниже.

В этом случае d равно 1024, а dₒᵤₜ равно 256. Глубина вывода после конкатенации будет 1024 (из ResNet50) + 256x4 = 2048. Конкатенированный вывод подвергается повышающей дискретизации с использованием билинейной интерполяции. Затем сверточные слои используются для присвоения пикселей различным классам. Функция потерь, используемая для минимизации ошибки, представляет собой функцию потерь отрицательного логарифма правдоподобия.

Моя реализация Pytorch доступна здесь. Подробности реализации я привел ниже. Используемый набор данных - ADE20K.

  • Используется ResNet50 расширенный, предварительно обученный на ADE20K, доступный здесь. Глубина вывода ResNet50 - 2048.
  • GCU следуют за ResNet50. В статье было объединено 4 блока GCU, но я использовал только 1 GCU с 16 вершинами из-за ограниченной вычислительной мощности. Я написал обобщенный код, чтобы вы могли легко изменить код для 4 GCU. Подробнее о реализации GCU читайте в моем следующем посте.
  • В этом случае d равно 2048, а dₒᵤₜ равно 256. Глубина вывода после объединения будет 2048 (из ResNet50) + 256 = 2304
  • За ним следует операция билинейной передискретизации, а затем 1 сверточный слой.
  • Перед подачей в сеть размер изображений изменяется до 512 × 512.
  • Из-за ограниченных вычислений я использовал размер пакета 1 и обучал 120 эпох, каждая из которых имела 1000 итераций.
  • SGD использовался с импульсом 0,9. Скорость обучения начинается с 0,01 и уменьшается по мере продолжения обучения.
  • В настоящее время в модели используется 2 графических процессора. Один графический процессор предназначен для ResNet, а другой - для всех других вычислений, таких как GCU, повышающая дискретизация и свертки.

График потерь при обучении показан на рисунке 3. После тренировки с заданными гиперпараметрами точность обучения составила около 78%.

Этот пост основан на бумаге Инь Ли и Абхинава Гупты.

Если возникнут сомнения или предложения, пишите мне 😃. Также найдите меня в Twitter и Linkedin. Прощай !!