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

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

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

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

В этом посте позвольте мне начать с легкого введения в данные изображения, потому что не все читатели работают с данными изображения (пожалуйста, не стесняйтесь пропустить этот раздел, если вы уже знакомы с ним). Затем я описываю простую стандартную нейронную сеть для данных изображения. Это даст мне возможность продемонстрировать, почему сверточные автоэнкодеры являются предпочтительным методом работы с данными изображений. Прежде всего, я продемонстрирую, как сверточные автоэнкодеры уменьшают шумы на изображении. В этом посте я использую модуль Keras и данные MNIST. Ноутбук доступен по этой ссылке на github. Keras - это высокоуровневый API нейронных сетей, написанный на Python и способный работать поверх TensorFlow. Этот пост является продолжением моего предыдущего поста Что такое распознавание изображений?, На который я рекомендую вам взглянуть.

Я подумал, что полезно упомянуть три широкие категории данных. К трем категориям данных относятся: (1) многомерные данные (в отличие от последовательных данных), (2) последовательные данные (включая данные текстового и голосового потока) и (3) данные изображения. Глубокое обучение имеет три основных варианта для каждой категории данных: (1) стандартная нейронная сеть прямого распространения, (2) RNN / LSTM и (3) сверточная NN (CNN). Для читателей, которые ищут учебные пособия для каждого типа, рекомендуется проверить Объяснение глубокого обучения удобным для регрессии способом для (1) текущей статьи Техническое руководство для RNN / LSTM / GRU на складе. Прогноз цен »» для (2), Глубокое обучение с PyTorch не мучит, Что такое распознавание изображений? ,« Легкое обнаружение аномалий с помощью автоэнкодеров и Сверточные автоэнкодеры для изображений. Подавление шума для (3). Вы можете добавить в закладки сводную статью «Пути обучения Dataman - развивайте свои навыки, двигайте свою карьеру.

Анализ данных об изображениях

Изображение состоит из пикселей, как показано на рисунке (A). В черно-белом изображении каждый пиксель представлен числом от 0 до 255. Большинство изображений сегодня используют 24-битный цвет или выше. Цветное изображение RGB означает, что цвет в пикселе представляет собой комбинацию красного, зеленого и синего, каждый из цветов в диапазоне от 0 до 255. Цветовая система RGB создает все цвета из комбинации красного, зеленого и синего цветов как показано в этом генераторе цветов RGB. Таким образом, пиксель содержит набор из трех значений: RGB (102, 255, 102) относится к цвету # 66ff66.

Изображение шириной 800 пикселей и высотой 600 пикселей имеет размер 800 x 600 = 480 000 пикселей = 0,48 мегапикселя («мегапиксель» равен 1 миллиону пикселей). Изображение с разрешением 1024 × 768 представляет собой сетку с 1024 столбцами и 768 строками, что, следовательно, содержит 1024 × 768 = 0,78 мегапикселя.

MNIST

База данных MNIST (модифицированная база данных Национального института стандартов и технологий) - это большая база данных рукописных цифр, которая обычно используется для обучения различных систем обработки изображений. Набор обучающих данных в Keras содержит 60 000 записей, а набор тестовых данных - 10 000 записей. Каждая запись имеет размер 28 х 28 пикселей.

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

Накапливает данные изображения для обучения

Чтобы соответствовать структуре нейронной сети для обучения модели, мы можем сложить все 28 x 28 = 784 значения в столбец. Столбец с накоплением для первой записи выглядит так: (с использованием x_train[1].reshape(1,784)):

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

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

Мы видим огромную потерю информации при нарезке и наложении данных. Вместо того, чтобы складывать данные, автокодеры свертки сохраняют пространственную информацию входных данных изображения в том виде, в котором они есть, и аккуратно извлекают информацию в так называемом слое свертки. Рисунок (D) демонстрирует, что плоское 2D-изображение извлекается в толстый квадрат (Conv1), затем продолжает становиться длинным кубическим (Conv2) и другим более длинным кубическим (Conv3). Этот процесс предназначен для сохранения пространственных отношений в данных. Это процесс кодирования в автоэнкодере. Посередине находится полностью подключенный автокодер, скрытый слой которого состоит всего из 10 нейронов. После этого идет процесс декодирования, который выравнивает кубики, а затем превращает их в плоское 2D-изображение. Кодер и декодер симметричны на рисунке (D). Они не обязательно должны быть симметричными, но большинство практиков просто принимают это правило, как описано в Простое обнаружение аномалий с помощью автоэнкодеров.

Как работают сверточные автоэнкодеры?

Вышеупомянутое извлечение данных кажется волшебным. Как это на самом деле работает? Он включает следующие три уровня: слой свертки, слой reLu и слой объединения.

  1. Слой свертки

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

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

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

1.1 Отступ

Как характеристики определяют соответствие? Одним из гиперпараметров является Padding, который предлагает два варианта: (i) заполнение исходного изображения нулями, чтобы оно соответствовало функции, или (ii) удаление части исходного изображения, которая не подходит, и сохранение действительной части.

1,2 шага

Слой свертки включает еще один параметр: Stride. Это количество пикселей, сдвигающихся по входной матрице. Когда шаг равен 1, фильтры сдвигают на 1 пиксель за раз. Мы увидим это в нашем коде Keras как гиперпараметр.

2. ReLUs Step

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

3. Максимальный уровень объединения

Объединение уменьшает размер изображения. На рисунке (H) окно 2 x 2, называемое размером пула, просматривает каждое из отфильтрованных изображений и присваивает максимальное значение этого окна 2 x 2 квадрату 1 x 1 в новом изображение. Как показано на рисунке (H), максимальное значение в первом окне 2 x 2 - это высокий балл (обозначенный красным), поэтому высокий балл присваивается квадрату 1 x 1.

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

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

Модель в Керасе

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

  • Conv2D(filters, kernel_size, activation = 'reLu', strides=1): kernel_size - это высота и ширина окна двухмерной свертки. Поскольку на рисунке (E) мы используем квадрат 2 на 2, в нашем случае размер ядра будет (2,2). stride - это количество пикселей, сдвигающихся по входной матрице. Наш шаг равен 1, потому что мы перемещаем фильтры на 1 пиксель за раз.
  • MaxPooling2D(pool_size=(2,2)): На рисунке (H) мы используем окно 2 на 2 для размера пула. Поэтому мы будем использовать (2,2) в следующем коде.

Вы можете построить много слоев свертки в автоматических кодировщиках свертки. На рисунке (E) есть три уровня, обозначенных Conv1, Conv2 и Conv3 в части кодирования. Так что будем строить соответственно.

  • В приведенном ниже коде input_img = Input(shape=(28,28,1) объявляется, что входное 2D-изображение имеет размер 28 на 28.
  • Затем он строит три уровня Conv1, Conv2 и Conv3.
  • Обратите внимание, что Conv1 находится внутри Conv2, а Conv2 находится внутри Conv3.
  • padding указывает, что делать, если фильтр не подходит для входного изображения. padding='valid' означает отбрасывание части изображения, когда фильтр не подходит; padding='same' дополняет изображение нулями, чтобы оно соответствовало изображению.

Затем он продолжает добавлять процесс декодирования. Итак, часть decode ниже закодирована и декодирована.

Keras api требует объявления модели и метода оптимизации:

  • Model(inputs= input_img,outputs= decoded): Модель будет включать все слои, необходимые для вычисления выходных данных decoded с учетом входных данных input_img. compile(optimizer='adadelta',loss='binary_crossentropy'): Оптимизатор выполняет оптимизацию так же, как и градиент. Наиболее распространенными из них являются стохастический градиентный приличный (SGD), адаптированный градиент (Adagrad) и Adadelta, который является расширением Adagrad. Подробнее см. Документацию по оптимизатору Keras. Функции потерь можно найти в Документации по потерям Keras.

Ниже я обучаю модель, используя x_train как на входе, так и на выходе. batch_size - это количество выборок, а epoch - количество итераций. Я указываю shuffle=True требовать перетасовки данных поезда перед каждой эпохой.

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

Как создать сверточный автокодировщик с шумоподавлением изображения?

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

Первые десять зашумленных изображений выглядят следующим образом:

Затем мы обучаем модель, используя зашумленные данные в качестве входных данных, а чистые данные - в качестве выходных.

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

Ноутбук доступен по этой ссылке на github.

Могу ли я использовать какой-либо предварительно обученный код CNN?

да. Если вы заинтересованы в изучении кода, Keras имеет несколько предварительно обученных CNN, включая Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet. , NASNet и MobileNetV2. Стоит упомянуть об этой большой базе данных изображений ImageNet, которую вы можете добавить или загрузить для исследовательских целей.