Главная » Хабрахабр » [Перевод] AI, практический курс. Предобработка и дополнение данных с изображениями

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

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

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

Рассмотрим некоторые возможные методы трансформации при предобработке и их реализацию через Keras.

Данные

В этой и следующих статьях будет использован набор данных для анализа эмоциональной окраски изображений. Он содержит 1500 примеров изображений, разделенных на два класса — положительные и отрицательные. Рассмотрим некоторые примеры.


Отрицательные примеры


Положительные примеры

Трансформации по очистке

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

Все фрагменты кода можно найти в книге Preprocessing.ipynb.

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

Изображения, как правило, хранятся в формате RGB (Red Green Blue). В этом формате изображение представлено трехмерным (или трехканальным) массивом.

Диаграмма взята с Wikiwand
RGB-разложение изображения.

Таким образом, каждый пиксель кодируется тремя числами. Одно измерение используется для каналов (красного, зеленого и синего цветов), два других представляют местоположение. Каждое число обычно хранится в виде 8-битового беззнакового целого типа (от 0 до 255).

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

Здесь и далее будем использовать класс Keras ImageDataGenerator, позволяющий выполнять все трансформации «на лету». Например, перемасштабируем наши данные с диапазона [0; 255] в диапазон [0; 1].

Создадим два экземпляра этого класса: один для трансформированных данных, другой для исходных:

Необходимо лишь указать константу масштабирования.
(или для данных по умолчанию). Более того, класс ImageDataGenerator позволяет направлять данные потоком напрямую из папки на жестком диске, используя метод flow_from_directory.

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

Визуально оба изображения идентичны, но причина этого в том, что инструменты Python* автоматически перемасштабируют изображения

Рассмотрим сырые данные (массивы). в диапазон по умолчанию, чтобы их можно было отображать на экране. Как видно, сырые массивы отличаются ровно в 255 раз.

Перевод в оттенки серого

Еще один вид трансформации, который может оказаться полезным — это перевод в оттенки серого, который переводит цветное RGB-изображение в изображение, в котором все цвета представлены оттенками серого. Обычная обработка изображений может использовать перевод в оттенки серого в комбинации с последующим заданием порога. Эта пара трансформаций может отбрасывать шумные пиксели и определять формы на изображении. Сегодня все эти операции выполняются сверточными нейронными сетями (Convolutional Neural Network, CNN), но перевод в оттенки серого как этап предобработки по-прежнему может быть полезным. Запустим этот шаг в Keras с тем же классом генератора.

Второй генератор устанавливает параметр color_mode в “grayscale” (значение по умолчанию “RGB”). Здесь мы создаем только один экземпляр класса и берем из него два разных генератора.

Центрирование образцов

Мы уже видели, что значения необработанных данных находятся в диапазоне от 0 до 255. Таким образом, один образец представляет собой трехмерный массив чисел от 0 до 255. В свете принципов стабильности оптимизации (избавляться от проблемы исчезающих или насыщающих значений) может потребоваться нормализовать набор данных таким образом, чтобы среднее значение каждого образца данных равнялось 0.

Для этого необходимо рассчитать среднее значение по всему образцу и вычесть его из каждого числа в данном образце.
В Keras это делается при помощи параметра samplewise_center.

Нормализация СКО образцов

Данный этап предобработки основан на той же идее, что и центрирование образцов, но вместо установки среднего в 0 от устанавливает значение среднеквадратичного отклонения в 1.

Следует отметить, что эти два способа нормализации образцов часто используются совместно. Нормализация СКО управляется параметром samplewise_std_normalization.

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

Центрирование признаков

В двух предыдущих разделах использовалась техника нормализации, рассматривающая каждый отдельный образец данных. Существует альтернативный подход к процедуре нормализации. Рассмотрим каждое число в массиве изображения как признак. Тогда каждое изображение представляет собой вектор признаков. В наборе данных много таких векторов; следовательно, мы можем рассматривать их в виде некоторого неизвестного распределения. Это распределение является многопараметрическим, и размерность его будет равна количеству признаков, т. е. ширина × высота × 3. Хотя истинное распределение данных неизвестно, можно попытаться нормализовать его путем вычитания среднего значения распределения. Следует отметить, что среднее значение представляет собой вектор той же размерности, то есть, тоже является изображением. Другими словами, мы усредняем по всему набору данных, а не по одному образцу.

Сначала считаем весь набор данных в память (мы можем себе это позволить, так как имеем дело с небольшим набором данных). Существует специальный параметр Keras под названием featurewise_centering, но, к сожалению, по состоянию на август 2017 года в его реализации была ошибка; поэтому реализуем его самостоятельно. Затем рассчитаем среднее изображение по всему набору данных и, наконец вычтем его из тестового изображения. Мы сделали это, установив размер пакета равным размеру набора данных.

Нормализация СКО признаков

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

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

Трансформации с дополнением

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

Вращение

Этот вид трансформации вращает изображение в определенном направлении (по или против часовой стрелки).

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

Он поддерживает различные способы заполнения, но здесь мы в качестве примера используем метод constant. Режим заполнения устанавливается при помощи параметра fill_mode.

Горизонтальный сдвиг

Этот вид трансформации сдвигает изображение в определенном направлении по горизонтальной оси (влево или вправо).

Размер сдвига может определяться при помощи параметра width_shift_range и измеряется как часть полной ширины изображения.

Вертикальный сдвиг

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

Обрезка

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

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

Приближение/удаление


Этот вид трансформации осуществляет приближение или удаление исходного изображения. Параметр zoom_range управляет коэффициентом приближения.

Например, если zoom_range равен 0,5, то коэффициент приближения будет выбран из диапазона [0,5, 1,5].

Горизонтальный переворот

Его можно включить или выключить при помощи параметра horizontal_flip. Переворачивает изображение относительно вертикальной оси.

Вертикальный переворот

Параметр vertical_flip (типа Boolean) управляет наличием или отсутствием данной трансформации. Переворачивает изображение относительно горизонтальной оси.

Комбинация

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

Инициируем ImageDataGenerator со всеми доступными параметрами и проверим на изображении красного гидранта.

Теперь будем использовать более продвинутый режим заполнения, называемый nearest; этот режим назначает пустому пикселю цвет ближайшего к нему существующего пикселя. Заметим, что режим наполнения constant использовался лишь для лучшей визуализации.

Заключение

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


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

9 кругов автоматизации склада Lamoda

Наш склад размером с две Красные площади и высотой в 5 этажей работает круглый год и никогда не спит — 24/7 364 дня в году (единственный выходной — 1 января). У нас хранится и обслуживается более 8 000 000 товаров, ...

[Перевод] Каскадные SFU: улучшаем масштабируемость и качество медиа в WebRTC-приложениях

В развертывании медиасерверов для WebRTC есть две сложности: масштабирование, т.е. выход за рамки использования одного сервера и оптимизация задержек для всех пользователей конференции. В то время как простой шардинг в духе «отправить всех юзеров конференции X на сервер Y» легко ...