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

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

Причина, по которой CNN предпочтительнее при обработке изображений, связана с количеством используемых ими параметров. Если мы рассмотрим входные данные с размерами 1920x1080, у нас будет более 2 миллионов пикселей, обычно с тремя цветовыми каналами в каждом, в большинстве глубоких нейронных сетей это потребует огромного объема обработки, и результат будет не таким хорошим, поскольку данные будут сведены в одномерный массив, что приведет к некоторой потере информации из исходного изображения.

Как это работает

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

Сверточный слой

Чтобы уменьшить размер входных данных, к изображению применяются фильтры, называемые ядрами, обычно они имеют размер 3x3 или 5x5 и извлекают высокоуровневые функции, такие как края, или применяют преобразования, такие как размытие. Эти операции могут привести к тому, что свернутый объект будет увеличивать или сохранять те же размеры с помощью Того же заполнения или уменьшать с использованием Действительного заполнения. , Ядро перемещается по всему изображению по шаблону, показанному ниже:

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

Первые слои охватывают более мелкие и простые функции, такие как обнаружение краев. Когда вы комбинируете несколько слоев и фильтров, сеть может начать обнаруживать более сложные объекты.

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

Объединение слоев

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

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

Полностью подключенный слой

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

Проблема масштабирования

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

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

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

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

Применение CNN к проблеме масштабирования

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

Для начала нам нужно найти и импортировать набор изображений для обучения нашей модели. В этой статье мы будем использовать небольшой набор данных изображений из Беркли, 2011 г. (http://www.eecs.berkeley.edu/Research/Projects/CS/vision/grouping/BSR/BSR_bsds500.tgz) и Keras API от TensorFlow

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

После импорта набора данных изображения мы можем масштабировать диапазон цветовых каналов пикселей от 0 до 1 вместо 0–255 и изменить масштаб с RGB на YUV. Это упрощает процесс обучения, а конечный результат лучше воспринимается человеком, так как модель при обучении будет брать значение y каждого изображения. После этого мы разделим наборы данных для обучения и проверки и уменьшим размер изображений для обучения.

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

Теперь, когда у нас есть изображения, готовые к обучению, мы можем написать нашу модель с помощью Keras и начать процесс обучения. Наша CNN будет состоять из 4 основных слоев и последнего слоя преобразования. Мы будем использовать «tanh» в качестве функции активации и MSE в качестве функции потерь. Максимальное количество эпох будет равно 100, поскольку база данных довольно мала, и мы выберем ADAM в качестве алгоритма оптимизации.

Слои CNN:

  1. слой 64x5x5, используемый для идентификации признаков;
  2. Слой 32x3x3 используется для более тонкой идентификации признаков;
  3. Другой слой 32x3x3 используется для более тонкой идентификации признаков;
  4. Слой субпиксельной свертки, где каждый новый предсказанный пиксель размещается в соответствии с размером выходного изображения;
  5. Полученная матрица преобразуется в матрицу двумерного изображения;

После обучения нашей модели нам нужно будет применить ее к тестовым изображениям и преобразовать выходные изображения обратно в цветовое пространство RGB, прежде чем анализировать результаты. В нашем коде мы определили функцию upscale_image, которая сделает это за нас.

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

Полный код, а также более подробную информацию можно найти в нашем репозитории GitHub: https://github.com/guipleite/Image-Upscaling-CNN.

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

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

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

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

использованная литература

Авторы

Гильерме Лейте





Рафаэль Виейра Розенцвейг