- Оригинальный адрес:How to Configure Image Data Augmentation When Training Deep Learning Neural Networks
- Оригинальный автор:Jason Brownlee
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:ccJia
- Корректор:lsvih, Minghao23
Увеличение данных изображения — это способ искусственно увеличить обучающую выборку, в основном путем изменения изображений в наборе данных.
Больше обучающих данных приводит к более эффективным моделям глубокого обучения, в то время как методы увеличения данных создают больше вариантов изображений, которые улучшают способность модели обобщать новые изображения.
В рамках Keras,ImageDataGeneratorКлассы предоставляют соответствующие функции для увеличения данных.
В этом руководстве вы узнаете, как использовать методы увеличения данных изображения при обучении модели.
После завершения этого урока вы поймете следующее:
- Увеличение данных изображения предназначено для расширения набора обучающих данных для повышения точности и способности модели к обобщению.
- В рамках Keras вы можете передатьImageDataGeneratorКласс использует методы увеличения данных изображения.
- Как использовать методы увеличения данных для панорамирования, отражения, яркости и масштабирования.
Давайте начнем.
Обзор учебника
Это руководство разделено на следующие восемь частей:
- улучшение данных изображения
- Образец изображения
- Увеличение данных с помощью ImageDataGenerator
- Улучшения панорамирования в горизонтальном и вертикальном направлениях
- Улучшения горизонтального и вертикального флипа
- Улучшение случайного вращения
- Случайное усиление яркости
- Улучшение случайного масштабирования
увеличение данных
Производительность сетей глубокого обучения всегда пропорциональна количеству данных.
Аугментация данных — это метод искусственного добавления новых обучающих данных на основе исходных данных.
Увеличение данных изображения, вероятно, является наиболее известным методом увеличения данных и в основном включает создание деформированного изображения, принадлежащего к тому же классу, что и исходное изображение.
Из области обработки изображений мы можем получить множество методов деформации, таких как перемещение, отражение, масштабирование и так далее.
Основная цель этого состоит в том, чтобы расширить обучающие данные достаточно новыми данными. Другими словами, мы можем позволить модели видеть более разнообразные обучающие данные. Например, если мы отражаем кошку горизонтально, это имеет смысл, потому что угол обзора камеры может быть как левым, так и правым. Но делать вертикальное сальто не имеет смысла и не подходит, потому что модель с меньшей вероятностью поднимет кошку на голову.
Поэтому мы должны понимать, что мы должны тщательно выбирать метод увеличения данных, применяемый к обучающей выборке, в соответствии с обучающими данными и конкретными сценариями предметной области. Кроме того, более эффективный способ — провести несколько независимых экспериментов с небольшим набором данных прототипа, чтобы измерить, улучшится ли производительность расширенной модели.
Современные методы глубокого обучения, такие как сверточные нейронные сети (CNN), могут изучать особенности изображений, не зависящие от местоположения. Увеличение данных может помочь модели изучить это свойство и может сделать модель нечувствительной к изменениям, таким как порядок слева направо и сверху вниз, изменения освещения на фотографиях и т. д.
Увеличение этих данных изображения обычно применяется к тренировочному набору, а не к проверочному и тестовому наборам. Эти методы увеличения данных отличаются от методов предварительной обработки, таких как изменение размера изображений и масштабирование значений пикселей, которые должны быть согласованы между наборами данных, с которыми взаимодействует модель.
Хотите результатов в направлении компьютерного зрения?
Пройдите мой 7-дневный экспресс-курс по электронной почте (с образцом кода) прямо сейчас.
Существует также бесплатная PDF-версия курса, доступная по ссылке «Зарегистрироваться».
Образец изображения
Нам нужен пример изображения, чтобы продемонстрировать стандартные методы увеличения данных.
В этом уроке мы будем использовать уже лицензированный, сфотографированный AndYaDontStop по имениFeathered Friendфотографии птиц.
Загрузите это фото и сохраните его в своем рабочем каталоге с именем 'bird.jpg'.
Пернатый друг, автор AndYaDontStop.
Некоторые полномочия зарезервированы.
Увеличение данных изображения с помощью ImageDataGenerator
Фреймворк Keras может автоматически использовать увеличение данных при обучении модели.
годный к употреблениюКласс ImageDataGeneratorдостичь этой цели.
Во-первых, вы можете настроить соответствующий метод расширения, передав определенные параметры конструктору при создании экземпляра класса.
Этот класс поддерживает ряд методов увеличения, включая масштабирование значений пикселей, но мы сосредоточимся только на следующих пяти основных методах увеличения данных изображения:
- пройти через
width_shift_range
иheight_shift_range
Параметр задает перевод изображения. - пройти черезrotation_rangeПараметр задает переворот изображения.
- пройти черезbrightness_rangeПараметр устанавливает яркость изображения.
- пройти черезzoom_rangeПараметр задает масштабирование изображения.
Пример создания экземпляра ImageDataGenerator через конструктор.
# 创建数据生成器
datagen = ImageDataGenerator()
После построения создается итератор для этого набора данных.
Этот итератор возвращает пакет дополненных данных за итерацию.
использоватьflow()Функция может создать итератор из набора данных, прочитанного в память.Пример кода выглядит следующим образом:
# 读取图片数据集
X, y = ...
# 创建迭代器
it = dataset.flow(X, y)
В качестве альтернативы можно создать итератор для набора данных указанного пути к файлу.В этой папке данные разных подклассов должны храниться в разных подпапках.
...
# 创建迭代器
it = dataset.flow_from_directory(X, y, ...)
После создания итератора вы можете вызватьfit_generator()Функция для обучения нейронной сети.
steps_per_epoch
Параметр должен быть установлен на количество пакетов, которые могут содержать весь набор данных. Например, если ваши исходные данные составляют 10 000 изображений, а для параметра batch_size задано значение 32, то при обучении модели на дополненных данных разумнаяsteps_per_epoch
должен быть установлен наceil(10,000/32), или 313 партий.
# 定义模型
model = ...
# 在增强数据集上拟合模型
model.fit_generator(it, steps_per_epoch=313, ...)
Изображения в наборе данных не используются напрямую, а дополненные изображения предоставляются модели. Поскольку представление дополненного изображения является случайным, допускается, чтобы измененные изображения и данные, близкие к исходному изображению (например, изображения с небольшим увеличением), генерировались и использовались при обучении.
Генераторы данных также можно использовать для проверочных и тестовых наборов. Как правило, проверочный и тестовый наборыImageDataGeneratorбудет таким же, как тренировочный наборImageDataGeneratorСуществует та же конфигурация масштабирования значения пикселя (не описанная в этом руководстве), но увеличение данных не требуется. Это связано с тем, что целью увеличения данных является искусственное увеличение количества обучающих наборов данных, тем самым повышая производительность модели на необработанных наборах данных.
Теперь мы знакомы сImageDataGeneratorиспользование, то я рассмотрю несколько конкретных методов улучшения данных изображения.
Мы покажем улучшенные изображения каждого метода отдельно. Это хороший способ для событий, и рекомендуется сделать то же самое при настройке собственной аугментации данных. Также распространено использование нескольких методов аугментации одновременно во время обучения. Здесь, чтобы добиться эффекта демонстрации, мы обсуждаем каждый метод улучшения отдельно по главам.
Улучшения горизонтального и вертикального панорамирования
Панорамирование означает перемещение всех пикселей изображения в определенном направлении по горизонтали или вертикали, сохраняя при этом размер неизменным.
Это также означает, что некоторые исходные пиксели будут перемещены за пределы картинки, поэтому останется область значений пикселей, которую необходимо указать заново.
width_shift_range
иheight_shift_range
Два параметра используются для управления размером горизонтального и вертикального перемещения, они находятся вImageDataGeneratorПроходит при построении класса.
Эти два параметра могут быть указаны как десятичные числа от 0 до 1, представляющие расстояние перемещения в процентах от ширины или высоты. Кроме того, его можно указать как точное значение в пикселях.
В частности, фактическое значение перевода будет выбирать между отсутствием перевода и процентным значением (или определенным значением пикселя), которое используется для обработки изображения, а расстояние в терминах расстояния — это выбор между [0, значение]. В качестве альтернативы вы можете передать указанный набор кортежей или массивов, чтобы определить конкретные максимальные и минимальные значения для выборки, например: [-100, 100] или [-0,5, 0,5].
Ниже показан параметр переводаwidth_shift_range
Установите его на [-200, 200] пикселей и нарисуйте код, соответствующий результату.
# 水平平移增强的例子
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
# 读入图片
img = load_img('bird.jpg')
# 转换为 numpy 数组
data = img_to_array(img)
# 扩展维度
samples = expand_dims(data, 0)
# 生成数据增强迭工厂
datagen = ImageDataGenerator(width_shift_range=[-200,200])
# 准备迭代器
it = datagen.flow(samples, batch_size=1)
# 生成数据并画图
for i in range(9):
# 定义子图
pyplot.subplot(330 + 1 + i)
# 生成一个批次图片
batch = it.next()
# 转换为无符号整型方便显示
image = batch[0].astype('uint32')
# 画图
pyplot.imshow(image)
# 展示图片
pyplot.show()
Выполните этот код, настроивImageDataGeneratorГенерируется экземпляр улучшения изображения и создается итератор. Этот итератор выполняется 9 раз в цикле и каждый раз рисует улучшенное изображение.
Наблюдая за нарисованными результатами, я вижу, что изображение будет смещено в случайном положительном или отрицательном направлении, а пустая область, вызванная перемещением, будет заполнена пикселями из краевой области.
График результатов случайного увеличения данных перевода
Ниже приведен аналогичный пример, путем настройкиheight_shift_range
Параметр реализует вертикальный перенос, где этот параметр установлен на 0,5.
# 垂直平移增强的例子
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
# 读图
img = load_img('bird.jpg')
# convert to numpy array
data = img_to_array(img)
# 扩展维度
samples = expand_dims(data, 0)
# 创建一个生成器
datagen = ImageDataGenerator(height_shift_range=0.5)
# 准备迭代器
it = datagen.flow(samples, batch_size=1)
# 生成样本和画图
for i in range(9):
# 定义子图
pyplot.subplot(330 + 1 + i)
# 生成一个批次的图片
batch = it.next()
# 转换为整形显示
image = batch[0].astype('uint32')
# 画图
pyplot.imshow(image)
# 显示
pyplot.show()
Запуск этого кода будет случайным образом генерировать дополненные изображения с положительным или отрицательным переводом.
Можно обнаружить, что смещение по горизонтали или смещение по вертикали, положительное или отрицательное, может эффективно улучшить соответствующее изображение, но эти повторно заполненные части не имеют большого значения для модели.
Стоит отметить, что другие методы заполнения могут бытьfill_mode"параметр для указания.
Рендеринг вертикального случайного перевода
Улучшения горизонтального и вертикального флипа
Переворот изображения заключается в том, чтобы инвертировать значения пикселей всех строк при вертикальном отражении и инвертировать значения пикселей всех столбцов при горизонтальном отражении.
Аргумент для переворачивания - это конструкцияImageDataGeneratorПри использовании класса передаются параметры логического типа соответственноhorizontal_flipилиvertical_flipуказать. Для изображения птицы, упомянутого ранее, отражение по горизонтали имеет смысл, а отражение по вертикали — нет.
Для аэрофотоснимков, астрономических и микроскопических изображений вертикальный переворот, вероятно, будет эффективным.
Следующий пример — управлениеhorizontal_flipПараметры для достижения примера улучшения переворота изображения.
# 水平翻转示例
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
# 读图
img = load_img('bird.jpg')
# 转为 numpy 数组
data = img_to_array(img)
# 扩展维度
samples = expand_dims(data, 0)
# 创建生成器
datagen = ImageDataGenerator(horizontal_flip=True)
# 准备迭代器
it = datagen.flow(samples, batch_size=1)
# 生成图片并画图
for i in range(9):
# 定义子图
pyplot.subplot(330 + 1 + i)
# 生成一个批次图片
batch = it.next()
# 转化为整型方便显示
image = batch[0].astype('uint32')
# 画图
pyplot.imshow(image)
# 显示
pyplot.show()
Выполнение этой процедуры дает 9 улучшенных изображений.
Мы обнаружим, что горизонтальное отражение используется только на части изображения.
Дополнены результаты случайных горизонтальных переворотов
Улучшение случайного вращения
Улучшение вращения заключается в случайном вращении изображения по часовой стрелке от 0 до 360 градусов.
Вращение также приведет к тому, что некоторые данные будут перемещены за пределы кадра изображения, что приведет к появлению некоторых областей без значений пикселей, которые также необходимо заполнить.
Следующий пример управляетсяrotation_rangeПараметр поворачивает изображение на угол от 0 до 90 градусов, чтобы показать эффект случайного вращения.
# 旋转增强示例
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
# 读图
img = load_img('bird.jpg')
# 转为 numpy 数组
data = img_to_array(img)
# 扩展维度
samples = expand_dims(data, 0)
# 创建生成器
datagen = ImageDataGenerator(rotation_range=90)
# 准备迭代器
it = datagen.flow(samples, batch_size=1)
# 生成图片并画图
for i in range(9):
# 定义子图
pyplot.subplot(330 + 1 + i)
# 生成一个批次图片
batch = it.next()
# 转化为整型方便显示
image = batch[0].astype('uint32')
# 画图
pyplot.imshow(image)
# 显示
pyplot.show()
Выполнение этого примера создает пример повернутого изображения, в котором пустые области заполняются методом ближайшего соседа.
Улучшенный график случайного вращения
Случайное усиление яркости
Повышение яркости изображения может заключаться в повышении яркости изображения, затемнении изображения или в том и другом.
Это сделано для того, чтобы модель покрывала разные уровни яркости во время тренировки.
Я могуImageDataGenerator()передается в конструктореbrightness_rangeпараметр, чтобы указать диапазон максимальных и минимальных значений для выбора значения яркости.
Если значение меньше 1,0, изображение затемняется, например [0,5, 1,0], и наоборот, когда значение больше 1,0, изображение становится ярче, например, [1,0, 1,5]. значение 1.0, яркость не изменится.
В приведенном ниже примере показан эффект случайного повышения яркости при изменении яркости от 0,2 (20%) до 1.
# 亮度增强示例
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
# 读图
img = load_img('bird.jpg')
# 转为 numpy 数组
data = img_to_array(img)
# 扩展维度
samples = expand_dims(data, 0)
# 创建生成器
datagen = ImageDataGenerator(brightness_range=[0.2,1.0])
# 准备迭代器
it = datagen.flow(samples, batch_size=1)
# 生成图片并画图
for i in range(9):
# 定义子图
pyplot.subplot(330 + 1 + i)
# 生成一个批次图片
batch = it.next()
# 转化为整型方便显示
image = batch[0].astype('uint32')
# 画图
pyplot.imshow(image)
# 显示
pyplot.show()
Запустите пример, и вы увидите эффект затемнения изображения на разные значения.
Изображения, созданные случайным увеличением яркости
Улучшение случайного масштабирования
Улучшение масштабирования — это случайное масштабирование изображения, которое достигается путем добавления пикселей или интерполяции вокруг изображения.
существуетImageDataGeneratorпередается в конструктор классаzoom_rangeнастроить масштаб масштабирования. Параметр может быть числом с плавающей запятой, массивом или кортежем.
Если указано как число с плавающей запятой, масштаб находится в диапазоне [1 - значение, 1 + значение]. Например, если вы установите для параметра значение 0,3, ваш диапазон масштабирования будет между [0,7, 1,3], другими словами, между 70% (увеличение) и 130% (уменьшение).
Величина масштабирования равномерно случайным образом выбирается из области масштабирования для каждого измерения (ширина, высота).
Параметр масштабирования немного неинтуитивен. Следует понимать, что если значение меньше 1,0, изображение будет увеличено. Например, [0,5, 0,5] сделает цель на изображении больше или приблизит ее на 50%. Аналогично, если значение больше 1,0, головоломка будет уменьшена на 50%, например [ 1.5 , 1.5 ] Цель будет уменьшена или уменьшена. Когда коэффициент равен 1,0, картина не сильно меняется.
В следующем примере показан пример увеличения объекта на изображении.
# 尺度缩放增强示例
from numpy import expand_dims
from keras.preprocessing.image import load_img
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot
# 读图
img = load_img('bird.jpg')
# 转为 numpy 数组
data = img_to_array(img)
# 扩展维度
samples = expand_dims(data, 0)
# 创建生成器
datagen = ImageDataGenerator(zoom_range=[0.5,1.0])
# 准备迭代器
it = datagen.flow(samples, batch_size=1)
# 生成图片并画图
for i in range(9):
# 定义子图
pyplot.subplot(330 + 1 + i)
# 生成一个批次图片
batch = it.next()
# 转化为整型方便显示
image = batch[0].astype('uint32')
# 画图
pyplot.imshow(image)
# 显示
pyplot.show()
Запустите пример, чтобы получить увеличенное изображение, которое показывает пример изменения масштабов ширины и высоты, и соотношение сторон изображения также изменится из-за разных масштабов масштабирования ширины и высоты.
Улучшенные рендеринги со случайным масштабированием
Расширенное чтение
Этот раздел предоставит больше ресурсов для вашего дальнейшего изучения.
публикация
API
статья
Суммировать
В этом учебном пособии вы познакомитесь с использованием увеличения данных изображения для обучения модели.
У вас должны быть следующие достижения:
- Увеличение данных изображения предназначено для расширения набора обучающих данных, тем самым повышая производительность и способность модели к обобщению.
- Вы можете получить поддержку увеличения данных изображения в Keras, используя класс ImageDataGenerator.
- Как использовать методы панорамирования, отражения, яркости и масштабирования.
Другие вопросы? Пожалуйста, оставьте комментарий ниже, и я сделаю все возможное, чтобы ответить на ваши вопросы.
Если вы обнаружите ошибки в переводе или в других областях, требующих доработки, добро пожаловать наПрограмма перевода самородковВы также можете получить соответствующие бонусные баллы за доработку перевода и PR. начало статьиПостоянная ссылка на эту статьюЭто ссылка MarkDown этой статьи на GitHub.
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.