Это первая часть моей серии сообщений в блоге о сверточных нейронных сетях. Вот следующие части этой серии:

Во время прохождения онлайн-курса сверточной нейронной сети (CNN) из специализации Deep Learning на Coursera Эндрю Нг я заметил, что нет слайдов, нет конспектов лекций и нет предписанного учебника (кроме того, учебник глубокого обучения мог бы быть запутанным, не каламбур, для некоторых новичков в области глубокого обучения). Это вдохновило меня на создание серии сообщений в блогах, целью которых является прояснение и обобщение того, что обсуждалось в курсе CNN 4/5 по данной специализации.

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

1. Обнаружение вертикального края

Обратите внимание, как отличается интенсивность света по краям кибер-грузовика и в окружающей среде. В частности, в верхней части грузовика у грузовика есть более яркие пиксели, а у окружающей среды - более темные пиксели. В то время как внизу пол имеет более яркие пиксели, чем панель рычага управления грузовиком. Таким образом, там, где есть резкие изменения яркости, есть края объекта (вертикальные края, горизонтальные края, 45 градусов, 78 градусов, углы 62 градусов и т. Д.). Цель обнаружения резких изменений яркости изображения - зафиксировать важные события и изменения свойств мира. А пока давайте сосредоточимся на обнаружении вертикальных краев.

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

Сетка слева на рисунке 1 выше представляет изображение в градациях серого с разрешением 6 на 6. Цифры - это значения интенсивности. Да, интенсивность - это измеримая величина в физике, и в контексте света интенсивность - это просто мера яркости. Существует настоящая математическая формула для расчета интенсивности света, в основном, чем ярче изображение, тем выше значения интенсивности в левой сетке / матрице 6 на 6. Поскольку это изображение в градациях серого, это всего лишь матрица 6 на 6 на 1, а не 6 на 6 на 3, когда это цветное изображение с 3 отдельными каналами (красный, зеленый и синий каналы).

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

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

Результатом свертки матрицы 6 на 6 с матрицей 3 на 3 будет матрица 4 на 4. Вы вычисляете этот результат 4 на 4 следующим образом: чтобы вычислить первые элементы, верхний левый элемент этой матрицы 4 на 4, вы собираетесь взять фильтр 3 на 3 и вставить его поверх 3 на 3 области исходного входного изображения. Обратите внимание, что элементы матрицы свертки (1, 1, 1, 0, 0, 0, -1, -1, -1) написаны в правом верхнем углу синей области и обведены зеленым кружком.

И что вам нужно сделать, так это взять поэлементное произведение записей в синей области 3 на 3 и соответствующих записей матрицы фильтров, которые обозначены кружками зеленого цвета. Затем сложите их все, и вы должны получить -5. Это значение -5 будет первой записью вывода 4 на 4, как показано на рисунке 2 справа.

Затем, чтобы выяснить, что это за вторая запись, вы возьмете синий квадрат и сдвинете его на один шаг вправо, вот так, и вы собираетесь проделать то же поэлементное произведение, а затем сложить. Вы делаете то же самое для третьей, четвертой записи и так далее, как показано на GIF 1 ниже.

Так почему это обнаруживает вертикальные края? Давайте посмотрим на другой пример.

Чтобы проиллюстрировать обнаружение вертикального края, мы будем использовать упрощенное изображение на рисунке 3 слева. 10s дают вам более яркие значения интенсивности пикселей, а правая половина дает вам более темные значения интенсивности пикселей (Эндрю Нг использовал оттенок серого для обозначения нулей, хотя, возможно, его также можно было бы нарисовать черным). Когда вы сворачиваете входную матрицу 6 на 6 с фильтром 3 на 3, и поэтому этот фильтр 3 на 3 можно визуализировать следующим образом, где светлее, ярче пиксели слева, а затем этот средний тон обнуляется в середине, а затем темнее справа (маленькое изображение с 3 оттенками под фильтром на рисунке 4 ниже), и вы получаете эту матрицу справа, как показано на рисунке 4 ниже.

Теперь, если вы нарисуете это изображение самой правой матрицы, оно будет выглядеть так, где есть эта более светлая область прямо посередине, и это соответствует обнаружению этого вертикального края посередине вашего изображения 6 на 6, как показано на GIF 2 ниже. .

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

Неудивительно, что есть некоторые вопросы, которые возникают в связи с идеями, упомянутыми до сих пор в этом разделе. Остальные разделы отвечают на некоторые ключевые вопросы.

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

Итак, 10 теперь находятся в правой половине изображения, а нули - в левой. Если вы свернете его с тем же фильтром обнаружения краев, вы получите отрицательные 30 секунд вместо 30 посередине, и вы можете изобразить это как изображение, которое может выглядеть так, как в GIF 3 ниже. Таким образом, поскольку оттенок переходов инвертирован, 30-е годы также меняются. А отрицательные 30-е показывают, что это переход от темного к светлому, а не от светлого к темному.

3. Второй вопрос: как насчет горизонтальных краев?

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

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

Вы можете использовать

  1. Фильтр Собела, показанный на рисунке 5 ниже. И преимущество этого фильтра Собеля в том, что он придает немного больше веса центральному ряду, центральному пикселю, и это, возможно, делает его немного более надежным.
  2. Также и фильтр Шарра.

Примечание. Эти 2 фильтра на рисунке 5 представляют вертикальные краевые фильтры. Вы можете перевернуть их 2 на 90 градусов, чтобы получить горизонтальные краевые фильтры.

С развитием глубокого обучения можно узнать правильные числа, и мы узнали, что когда вы действительно хотите обнаружить края на каком-то сложном изображении, возможно, вам не нужно, чтобы исследователи компьютерного зрения вручную выбирали эти девять чисел. Может быть, вы можете просто выучить их и рассматривать девять чисел этой матрицы как параметры, которые затем можно выучить с помощью обратного распространения. Цель состоит в том, чтобы изучить девять параметров, чтобы, когда вы берете изображение, изображение размером шесть на шесть, и сворачиваете его с помощью фильтра три на три, это дает вам хороший детектор границ, на рисунке 6 показаны значения, которые необходимо изучить (w1 , w2, w3,… w9).

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

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

Спасибо за Ваше внимание. Хлопайте и делитесь, если вам понравился этот пост. Не стесняйтесь комментировать, если у вас есть отзывы или вопросы.

ССЫЛКИ: